如何修改Redcarpet Markdown以便它可以处理类?

am-*_*ils 9 markdown rendering ruby-on-rails redcarpet github-flavored-markdown

我在我的Rails网站上使用Redcarpet Markdown.通常我想将类(或其他属性)添加到段落,表或其他元素中,但它不允许它.如果我用HTML替换markdown元素,那么我也需要用HTML替换内部markdown,这是一个麻烦.

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

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

示例更新

我想在div,table或paragraph中添加一个类,但仍然在元素中保留markdown.例如,我想生成以下HTML:

<p class="cool">
  <b>Hello world</b> <a href="http://google.com">Google</a>
</p>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

Uri*_*ssi 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)
Run Code Online (Sandbox Code Playgroud)

但也可以从头开始创建新的渲染器(请参阅 lib/redcarpet/render_man.rbManpage 渲染器的示例实现)

<<snip>>

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

<<snip>>

  • 表(标题、正文)

<<snip>>

  • raw_html(raw_html)

例如,要在原始 HTML 中启用 markdown,我建议声明一个<markdown>元素,您可以提取并渲染该元素(警告 - 前面未经测试的代码):

def raw_html(html)
  html.gsub(/<markdown>(.*)<\/markdown>/) { render $1 }
end
Run Code Online (Sandbox Code Playgroud)

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