如果我有这样的 Markdown :
# A Header
``` javascript
$(document).ready(function() {})
```
它会像这样呈现:
<h1>A Header</h1>
<pre><code class="javascript">$(document).ready(function() {})</code></pre>
问题是,我想让那些三重反斜杠代码块在被包裹在 div 中时编译成 HTML ,所以 markdown 看起来像这样:
# A Header
<div class="row">
<div class="span6">
``` javascript
$(document).ready(function() {})
```
</div>
</div>
例如,这样我就可以同时利用 markdown 和 twitter bootstrap。
但是当我这样做时,代码块永远不会被处理。有没有什么方法可以在不深入编写 HTML 解析代码的情况下完成?
谢谢!
最佳答案
根据 Markdown spec (如实):
Markdown formatting syntax is not processed within block-level HTML tags. E.g., you can’t use Markdown-style
*emphasis*
inside an HTML block.
有一个 feature request在 Redcarpet GitHub 页面上,但不幸的是,没有任何结论可以帮助您。
可能这里阻力最小的路径是通过 Redcarpet 运行它,然后通过 Nokogiri 运行生成的 HTML,再次通过 Redcarpet 运行其每个 block 级节点的内容。例如:
require 'redcarpet'
require 'nokogiri'
block_nodes = %w(p div blockquote ...) #¹
markdown = Redcarpet::Markdown.new Redcarpet::Render::HTML,
:fenced_code_blocks => true
html = markdown.render text
noko_doc = Nokogiri::HTML::DocumentFragment.parse html
noko_doc.css( *block_nodes ).each do |node|
node.content = markdown.render node.content if node.text?
end
html = noko_doc.to_html
¹ https://github.com/tanoku/sundown/blob/master/html_block_names.txt
当然,如果您有不止一层的嵌套(一个 HTML block 包含一个包含 HTML block 的 Markdown block 等等),您将不得不在您生成的任何新 HTML 节点上递归执行此操作。这很容易,但显然会影响性能,这就是为什么我说“阻力最小的路径”而不是“所有情况下的最佳解决方案”。
关于ruby - 如何使用包裹在 div 中的 Redcarpet 在 Markdown 中呈现 ``` 代码块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9300414/