ruby - 如何使用包裹在 div 中的 Redcarpet 在 Markdown 中呈现 ``` 代码块?

标签 ruby parsing markdown

如果我有这样的 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/

相关文章:

像 PHP nowdoc 这样的 Ruby 多行字符串?

.net - 你如何在 vb.net 中解析 HTML

html - 潘多克 : generate a html embedding Latex equation from markdown input

Matlab symvar 函数的 Python 替代品

html - 有没有办法阻止顺风覆盖 Markdown 默认间距?

ruby-on-rails - Rails 3.1 CKEditor gem 原始文本

ruby - 使用 rvm、自制软件或 macports 编译 ruby​​ 1.9.3 时出错

ruby - 什么是符号,我们如何使用它们?

ruby - 替换 rdoc 用法

json - 如何在 Notepad++ 中重新格式化 JSON?