我在我的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>
有两种可能的解决方案,但我不知道如何使用Redcarpet Markdown进行解决方案:
获取类的特殊markdown语法,例如:
{class: cool}
**Hello world** [Google](http://google.com)
允许Markdown在HTML元素中工作:
<p class="cool">
**Hello world** [Google](http://google.com)
</p>
目前我只是在没有降价的纯HTML中执行此类元素。但我怎样才能让#1或#2工作?
答案 0 :(得分:2)
您可以构建自己的渲染器(基于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
用于示例的实现 Manpage渲染器)
<<snip>>
渲染器可以实现以下实例方法:
<<snip>>
- table(标题,正文)
<<snip>>
- raw_html(raw_html)
例如,要在原始HTML中启用markdown,我建议声明一个<markdown>
元素,您可以提取并渲染(警告 - 未经测试的代码):
def raw_html(html)
html.gsub(/<markdown>(.*)<\/markdown>/) { render $1 }
end
重写这些方法,将所需的类添加到表中,或者从原始HTML中的元素递归调用render
。