Как отобразить блоки кода `` `в уценке с помощью Redcarpet, которые заключены в div? - PullRequest
3 голосов
/ 15 февраля 2012

Если у меня такая уценка:

# A Header

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

Это будет выглядеть так:

<h1>A Header</h1>

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

Проблема в том, что я хочу, чтобы эти блоки кода с тройной обратной косой чертой компилировались в HTML , когда они заключены в div , поэтому уценка будет выглядеть так:

# A Header

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

Таким образом, я могу воспользоваться преимуществами как уценки, так и начальной загрузки Twitter, например.

Но когда я это делаю, блок кода никогда не обрабатывается. Есть ли способ сделать это, не слишком углубляясь в написание HTML-кода для разбора?

Спасибо!

1 Ответ

5 голосов
/ 16 февраля 2012

Согласно спецификации Markdown (такой, как она есть):

Синтаксис форматирования Markdown не обрабатывается в тегах HTML уровня блока.Например, вы не можете использовать стиль Markdown *emphasis* внутри блока HTML.

На странице Redcarpet GitHub есть запрос функции , но, к сожалению, нет никакого заключения, которое поможетyou.

Вероятно, путь наименьшего сопротивления здесь будет проходить через Redcarpet, а затем запускать полученный HTML-код через Nokogiri, снова пропуская содержимое каждого из его узлов уровня блока через 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, содержащий блок Markdown, содержащий блок HTML и т. Д.)вам придется делать это рекурсивно на всех новых HTML-узлах, которые вы генерируете.Это было бы легко, но, очевидно, влияет на производительность, поэтому я сказал «путь наименьшего сопротивления», а не «лучшее решение во всех случаях».

...