【问题标题】:Render span-level string using Kramdown使用 Kramdown 渲染跨度级字符串
【发布时间】:2014-08-05 13:54:41
【问题描述】:

我知道我可以在 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,假设它只包含跨度级别的markdown语法,并获得渲染的html。特别是在呈现的 html 中不应有 &lt;p&gt;&lt;blockquote&gt;&lt;table&gt;

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

我该怎么做?

【问题讨论】:

  • 所以你想去掉所有的块级元素?这是 kramdown 的默认行为。见kramdown.gettalong.org/options.html
  • 这也是我读到的,但输出仍然包含p's。还没弄清楚如何让 kramdown 真正删除这些。
  • 似乎该选项用于解析原始 HTML;它对输出没有影响。输出是不可更改的,因为它们旨在与其他 Markdown 实现保持一致。您可能需要进行后期处理。
  • 你可以很容易地用 nokogiri 进行后期处理。
  • Sanitize 在引擎盖下使用 Nokogiri,它更容易。

标签: ruby kramdown


【解决方案1】:

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

require 'sanitize'

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

元素是允许标签的白名单,只需添加您想要的所有标签。 gem 有一组预定义的白名单,但没有一个完全符合您的要求。 (顺便说一句,如果您想要一个跨度中允许的所有 HTML5 元素的列表,请参阅WHATWG's list of "phrasing content")。

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

【讨论】:

  • 我宁愿不添加额外的标记也不愿删除它。但如果没有其他简单的解决方案,我可能会这样做。
  • 出于安全考虑,白名单优先于黑名单。如果内容是最终用户创建的并且应用程序生成公共页面,这尤其值得关注。
  • 当然,我始终牢记这一点。但是,就我而言,内容是由我自己创建的,而不是最终用户。卫生(在某种程度上)起到了我想要的副作用,但我的最终目标不是卫生。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-11-06
    • 2017-12-27
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多