2012-02-15 55 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節點上。這很容易,但顯然會影響性能,這就是爲什麼我說「阻力最小的路徑」,而不是「所有情況下的最佳解決方案」。