3

我知道我可以使用类似的东西在 ruby​​ 中使用 Kramdown 解析和呈现 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假设它只包含跨度级别的降价语法,并获得渲染的 html。特别是在呈现的 html 中不应该有<p>, <blockquote>, or, 例如。<table>

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

我怎样才能做到这一点?

4

2 回答 2

2

我会用sanitizegem 对输出进行后处理。

require 'sanitize'

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

这些元素是允许标签的白名单,只需添加您想要的所有标签。gem 有一组预定义的白名单,但没有一个完全符合您的要求。(顺便说一句,如果您想要一个跨度中允许的所有 HTML5 元素的列表,请参阅 WHATWG 的“短语内容”列表)。

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

于 2014-08-05T17:16:20.593 回答
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

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

于 2015-05-26T20:18:06.933 回答