使用Kramdown渲染跨度级别字符串

时间:2014-08-05 13:54:41

标签: ruby kramdown

我知道我可以使用类似

之类的内容解析并使用Kramdown在ruby中呈现HTML文档
require 'kramdown'

s = 'This is a _document_'
Kramdown::Document.new(s).to_html
# '<p>This is a <i>document</i></p>'

在这种情况下,字符串s可能包含markdown语法的完整文档。

然而,我想要做的是解析s,假设它只包含span-level markdown语法,并获取渲染的html。特别是在呈现的html中不应该有<p><blockquote>或者例如<table>

s = 'This is **only** a span-level string'
# .. ??? ...
# 'This is <b>only</b> a span-level string'

我该怎么做?

2 个答案:

答案 0 :(得分:1)

我会使用sanitize gem对输出进行后期处理。

require 'sanitize'

html = Kramdown::Document.new(s).to_html
output = Sanitize.fragment(html, elements:['b','i','em'])

元素是允许标记的白名单,只需添加所需的所有标记即可。宝石有一组预定义的白名单,但没有一个与您正在寻找的完全匹配。 (顺便说一句,如果你想要一个范围内允许的所有HTML5元素的列表,请参阅WHATWG's list of "phrasing content")。

我知道这并没有被标记为,但为了使用Rails的读者的利益:使用内置的sanitize helper

答案 1 :(得分:1)

您可以创建自定义解析器,并清空其内部块级解析器列表。

class Kramdown::Parser::SpanKramdown < Kramdown::Parser::Kramdown
  def initialize(source, options)
    super
    @block_parsers = []
  end
end

然后你可以像这样使用它:

text = Kramdown::Document.new(text, :input => 'SpanKramdown').to_html

这应该做你想要的“正确方法”。