代码块中的Markdown换行符

9
使用Redcarpet时,如果我在markdown中包含类似以下内容的代码,它将不会遵循任何换行或缩进。我已经尝试在行末添加两个空格,以及在代码之间添加额外的空行等方式。但是似乎没有任何作用。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<hash>
   <money>3</money>
</hash>

```

我明白:
<?xml version="1.0" encoding="UTF-8"?> <hash> <money>3</money> </hash>

以下是Redcarpet的设置:

Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true, :fenced_code_blocks => true, :no_intra_emphasis => true, :lax_html_blocks => true)

我需要怎样做才能使换行符正常工作并保留缩进,就像这里或GitHub上一样?

更新 - 源代码如下:

<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
                &lt;hash&gt;
                &lt;money&gt;3&lt;/money&gt;
                &lt;/hash&gt;  
                </code></pre>

这是您在Web浏览器中看到的,但您得到的是什么HTML? - Phrogz
如果您正在通过Github的gh-pages进行渲染,问题可能只是因为Github不支持redcarpet2,这允许使用围栏代码块。请参见此问题。 - cboettig
@cboettig 不错的猜测,但是 Github-Flavored Markdown 支持这个 - Phrogz
@Phrogz,Github风格的Markdown支持,但具有讽刺意味的是,Github使用Jekyll驱动的gh-pages不支持Github风格的Markdown(请参见上面我的评论中链接的问题)。因此,我可以通过将这样一个Markdown文件放入github上的gh-pages分支来重现所描述的错误。 - cboettig
4个回答

5
尝试使用 Haml 助手 find_and_preserve 包装 Markdown 结果。
# Assuming a setup like this:
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)
code_snippet = "    <xml>\n      <tag/>\n    </xml>"

# This should prevent undesirable spaces within code blocks:
find_and_preserve(markdown.render(code_snippet)).html_safe

当你使用 Haml 的 find_and_preserve 辅助函数包装渲染调用时,Markdown 输出中 <pre> 标签内的所有换行符都将被转义为等效的 HTML 实体,并且 Haml 的自动缩进将会忽略它们。

1
任何从谷歌搜索到这里的人,find_and_preserve 终于解决了我在渲染 Markdown 时遇到的奇怪缩进问题,我已经为此苦苦挣扎了数小时。 - nickcoxdotme

4

对于我来说,解析的结果在<pre>块中有换行符:

require 'redcarpet'
md = Redcarpet::Markdown.new(Redcarpet::Render::HTML, fenced_code_blocks:true)

puts md.render("```xml\n<foo>\n</foo>\n```")
#=> <pre><code class="xml">&lt;foo&gt;
#=> &lt;/foo&gt;
#=> </code></pre>
  1. Confirm that you are seeing a similar wrapper in your output HTML
  2. Set your CSS to use preformatting in <pre> blocks:

    pre { white-space:pre }
    

非常好!但它仍然混淆了空格。在原始帖子中,我添加了HTML源代码。第一行左对齐,但是后续行有太多的前导空格。有什么想法? - Karl
搞定了...问题出在 HAML 上。Markdown 源是从 HAML 布局调用的模板。在开发环境中,HAML 以漂亮的格式输出 HTML,缩进因此破坏了代码块的显示。而在使用 :ugly 输出的生产环境中,则看起来是正确的。另外,@Phrogz 的 pre { white-space:pre } 也是必要的,才能使它看起来是正确的。 - Karl
2
在 Haml 布局的开发中,这个代码可以正常工作:= preserve(yield) - Karl

3
在Github上,我只需要使用<pre></pre>标记来包装我的缩进/格式化文本。

0
尝试使用此脚本来隔离是您的应用程序还是redcarpet中的某些问题。
我无法重现您遇到的问题(使用redcarpet-2.1.1 gem)。将其放入文件中,然后运行它(ruby redcarpet_test.rb):
require 'rubygems'
require 'redcarpet'

md = %Q{...
```xml
<?xml version="1.0" encoding="UTF-8"?>
<hash>
   <money>3</money>
</hash>
```
...}

r = Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true, :fenced_code_blocks => true, :no_intra_emphasis => true, :lax_html_blocks => true)

puts r.render md

这将适当地返回结果:

<p>...
<code>xml
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;hash&gt;
   &lt;money&gt;3&lt;/money&gt;
&lt;/hash&gt;
</code>
...</p>

我在上面的测试中得到了与你相同的结果。但是在Rails视图中,它不会转义代码块内的任何内容。我应该补充说明,我正在使用带有自定义Redcarpet渲染器的markdown-rails gem。您可以在此处查看我的分支:https://github.com/threadhead/markdown-rails - Karl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接