2012-02-15 58 views
3

如果我有降价这样的:如何使用包装在div中的Redcarpet在降价中呈现```代码块?

# A Header 

``` javascript 
$(document).ready(function() {}) 
``` 

它会呈现出这样的:

<h1>A Header</h1> 

<pre><code class="javascript">$(document).ready(function() {})</code></pre> 

的问题是,我想有这些三反斜杠代码块编译成HTML 当他们被包裹在一个div,所以降价将是这样的:

# A Header 

<div class="row"> 
<div class="span6"> 
``` javascript 
$(document).ready(function() {}) 
``` 
</div> 
</div> 

这样我可以TA例如,markdown和twitter bootstrap的优势。

但是当我这样做时,代码块永远不会被处理。有没有什么办法可以在不太深入编写HTML解析代码的情况下完成?

谢谢!

回答

5

Markdown spec(如它是):

减价格式化语法不块级HTML标签内进行处理。例如,您不能在HTML块中使用Markdown样式*emphasis*

Redcarpet GitHub页面上有feature request,但不幸的是没有任何结论可以帮助您。

也许这里阻力最小的路径是通过Redcarpet运行,然后通过Nokogiri运行生成的HTML,再次通过Redcarpet运行每个块级节点的内容。例如:

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块等减价块的HTML块)的多个级别这是递归地在你生成的任何新的HTML节点上。这很容易,但显然会影响性能,这就是为什么我说“阻力最小的路径”,而不是“所有情况下的最佳解决方案”。