防止红地毯解析特定的降价功能



我使用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

虽然我可以通过简单地将换行符重新添加到每个元素并在"- "前面来解决此问题,但我希望保留用于创建列表的特定字符,该字符可以是-+*中的任何一个(如果是有序列表,则为数字(。

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新