【问题标题】:Prevent Redcarpet from parsing a specific markdown feature防止 Redcarpet 解析特定的降价功能
【发布时间】:2020-07-02 15:02:57
【问题描述】:

我使用 Redcarpet 来解析和呈现 markdown,尽管我需要对默认行为进行一些特定的更改。例如,虽然我确实需要自动链接,但我需要它不链接任何格式如电子邮件地址的东西。为此,我使用了这个自定义渲染器类:

class HTMLRenderer < Redcarpet::Render::HTML
  def block_code(code, language)
    "<pre><code>#{encode(code).gsub("\n", "<br/>")}</code></pre>"
  end

  def autolink(link, link_type)
    return link if link_type == :email
    Formatter.instance.link_url(link)
  end

  private

  def html_entities
    @html_entities ||= HTMLEntities.new
  end

  def encode(html)
    html_entities.encode(html)
  end
end

我需要做的下一个调整是让它根本不尝试处理列表。也就是说,如果我以这种形式输入:

- element 1
- element 2
- element 3

想要的是:

  • 元素 1
  • 元素 2
  • 元素 3

我希望它保持列表不变:

- 元素 1
- 元素 2
- 元素 3

首先,我尝试以与阻止电子邮件自动链接的方式非常相似的方式解决此问题:

def list(contents, list_type)
  contents
end

def list_element(text, list_type)
  text
end

但是在这种情况下,如果我给它之前的示例列表,我会得到这个输出:

元素1元素2元素3

虽然我可以通过简单地添加换行符并将"- " 添加到每个元素来解决此问题,但我想保留用于创建列表的特定字符,它可以是-+* 中的任何一个(或有序列表中的数字)。

所以我得出的结论是,在渲染器中乱搞是错误的解决方案;在呈现文本时,我已经丢失了我需要的信息。我认为我应该研究的是改变解析器的行为。不幸的是,虽然修改渲染器行为的文档和示例非常丰富,但除了支持的标志之外,我没有发现任何修改解析器行为的类型。

如何完全禁用 Markdown 功能的解析?

【问题讨论】:

    标签: ruby markdown redcarpet


    【解决方案1】:

    我找到了一个解决方案,虽然我不是特别喜欢它。

    def preprocess(document)
      document.gsub!(/^(\s*)(-|\+|\*) /, '\1\\\\\2 ')
      document.gsub(/^(\s*\d+)\. /, '\1\. ')
    end
    

    通过使用预处理器,我可以转义最终将成为列表的任何内容。不过,我宁愿有一个更强大的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 2019-08-19
      相关资源
      最近更新 更多