我发现在 Ruby 中为我的 rails 3 应用程序扩展 redcarpet 的解析器非常容易。这一点也不可怕。
首先,首先从 Redcarpet 的 HTML 渲染器派生一个类,并按照文档中的建议覆盖预处理方法。在 Rails 3.2 和 Rails 4 中,这个文件可以放在任何地方,你不需要它。我使用“服务”文件夹来保存这样的代码。
# app/services/my_flavored_markdown.rb
class MyFlavoredMarkdown < Redcarpet::Render::HTML
def preprocess(text)
text
end
end
下一步是添加进行所需文本替换的方法。在这里,我使用正则表达式将看起来像“@mention”的文本包装在带有 CSS 类“提及”的 HTML 跨度标记中。
# app/services/my_flavored_markdown.rb
class MyFlavoredMarkdown < Redcarpet::Render::HTML
def preprocess(text)
wrap_mentions(text)
end
def wrap_mentions(text)
text.gsub! /(^|\s)(@\w+)/ do
"#{$1}<span class='mention'>#{$2}</span>"
end
text
end
end
您可以轻松地查找用户的个人资料页面并将@mention 包装在锚标记中。就我而言,我还为表情符号和主题标签创建了以相同方式工作的方法,并将这些方法链接在一起。
最后一步是添加一个接受一些文本的帮助程序,创建 Redcarpet 派生类的实例,将文本传递给该类进行处理,然后返回 html 结果。
# app/helpers/application_helper.rb
def flavored_markdown_to_html(text)
renderer = MyFlavoredMarkdown.new()
# These options might be helpful but are not required
options = {
safe_links_only: true,
no_intra_emphasis: true,
autolink: true
}
Redcarpet::Markdown.new(renderer, options).render(text)
}
在您看来,您可以这样称呼它:
<%= flavored_markdown_to_html("This is something worth @mentioning") %>
输出将是:
This is something worth <span class='mention'>@mentioning</span>
.