9

我在我的 Rails 网站上使用Redcarpet Markdown 。通常我想为段落、表格或其他元素添加类(或其他属性),但它不允许这样做。如果我用 HTML 替换 markdown 元素,那么我也需要用 HTML 替换内部 markdown,这很麻烦。

例如,我想将“table”类添加到 markdown 表格元素(因此它获得了 Bootstrap 的表格样式),但是我需要用 HTML 替换 Markdown 表格。

对此最简单的解决方案是什么?有没有一种简单的方法来修改 Markdown 以便它可以处理类?或者,有没有办法在 HTML 元素中允许 Markdown?

示例更新

我想向 div、表格或段落添加一个类,但仍将 markdown 保留在元素内。例如,我想生成以下 HTML:

<p class="cool">
  <b>Hello world</b> <a href="http://google.com">Google</a>
</p>

有两种可能的解决方案,但我不知道如何使用 Redcarpet Markdown 来解决它们:

  1. 获取类的特殊降价语法,例如:

    {class: cool}
    **Hello world** [Google](http://google.com)

  2. 允许 Markdown 在 HTML 元素中工作:

    <p class="cool">
    **Hello world** [Google](http://google.com)
    </p>

目前我只是在没有降价的纯 HTML 中做这些元素。但是我怎样才能让#1 或#2 工作呢?

4

1 回答 1

3

您可以构建自己的渲染器(基于Redcarpet::Render::HTML),它将覆盖您有兴趣自定义的方法:

自定义渲染器是通过从现有渲染器继承来创建的。内置渲染器,HTML并且XHTML可以这样扩展:

# create a custom renderer that allows highlighting of code blocks
class HTMLwithPygments < Redcarpet::Render::HTML
  def block_code(code, language)
    Pygments.highlight(code, :lexer => language)
  end
end

markdown = Redcarpet::Markdown.new(HTMLwithPygments, :fenced_code_blocks => true)

但是也可以从头开始创建新的渲染器(参见 lib/redcarpet/render_man.rb手册页渲染器的示例实现)

<<snip>>

渲染器可以实现以下实例方法:

<<snip>>

  • 表(标题,正文)

<<snip>>

  • raw_html(raw_html)

例如,要在原始 HTML 中启用降价,我建议声明一个<markdown>可以提取和呈现的元素(警告 - 未测试代码):

def raw_html(html)
  html.gsub(/<markdown>(.*)<\/markdown>/) { render $1 }
end

覆盖这些方法以将所需的类添加到表中,或者render从原始 HTML 中的元素递归调用。

于 2014-02-18T20:38:40.953 回答