如何修改Redcarpet Markdown以处理类?

10

我在我的Rails网站上使用Redcarpet Markdown。但是,通常我想要向段落、表格或其他元素添加类(或其他属性),但它不允许这样做。如果我用HTML替换Markdown元素,则还需要用HTML替换里面的Markdown,这很麻烦。

例如,我想向Markdown表格元素添加"class"类(以使其获得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>

有两种可能的解决方案,但我不知道如何在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中使用这些元素,而不使用Markdown。但我该如何实现1或2?


你能添加一些所需语法和期望输出的示例吗? - Uri Agassi
如果可能的话,请提供您目前使用的样例,以便获得更接近的翻译。 - Davis Z. Cabral
@UriAgassi 我添加了一个例子。 - am-rails
@daviscabral,我目前正在使用HTML。 - am-rails
1个回答

3
你可以构建自己的渲染器(基于Redcarpet::Render::HTML),这将覆盖你感兴趣的定制方法。

Custom renderers are created by inheriting from an existing renderer. The built-in renderers, HTML and XHTML may be extended as such:

# 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)

But new renderers can also be created from scratch (see lib/redcarpet/render_man.rb for an example implementation of a Manpage renderer)

以下实例方法可由渲染器实现:
- table(header, body) - raw_html(raw_html)
例如,若要在原生HTML中启用Markdown,建议声明一个元素,您可以提取并呈现它(警告 - 未经测试的代码):
def raw_html(html)
  html.gsub(/<markdown>(.*)<\/markdown>/) { render $1 }
end

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


你如何递归调用渲染函数,例如从每个 div 中? - am-rails
谢谢。那么我应该将这个方法放在一个类MarkdownMore < Redcarpet::Render::HTML中的某个地方,是吗? - am-rails
是的,然后使用 markdown = new Redcarpet::Markdown.new(MarkdownMore, ...) - Uri Agassi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接