如何扩展redcarpet以支持自动链接用户提及?
在我的rails3应用程序上,我想使用redcarpet来处理用户的post和用户评论部分。 因此,我想扩展redcarpet以支持将@username转换为指向我网站上用户的链接。 我知道redcarpet是用C语言编写的,但无论如何都有简单的方法将其扩展为ruby? 用C写它有多难? 我应该在redcarpet之外做这件事吗?
此外,我对redcarpet的其他一些扩展感兴趣,这些扩展将是我的应用程序中链接到其他模型的简写。 我不确定语法,但我猜它会与github处理问题的方式类似。
我发现很容易在Ruby中为我的rails 3应用程序扩展redcarpet的解析器。 这根本不可怕。
首先,从Redcarpet的HTML渲染器派生一个类,然后按照文档中的建议覆盖预处理方法。 在Rails 3.2和Rails 4中,这个文件可以放在任何地方,你不需要它。 我使用’services’文件夹来保存这样的代码。
# app/services/my_flavored_markdown.rb class MyFlavoredMarkdown < Redcarpet::Render::HTML def preprocess(text) text end end
下一步是添加进行所需文本替换的方法。 在这里,我使用正则表达式在带有css类'提及'的HTML span标记中包装看起来像“@mention”的文本。
# 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}#{$2}" 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 @mentioning
。
我曾试图延长redcarpet
,但发现它非常困难。 如果rpeg-markdown
上没有其他依赖项,我建议你尝试rpeg-markdown
这是一个(有点过时的)Ruby gem,它提供了对优秀的peg-markdown的绑定。
peg-markdown
是一种写作正式语法的降价翻译。 这意味着使用自己的语法扩展它非常容易。 我已经成功地为我自己的项目扩展了peg-markdown
(请参阅我的fork ),我发现它比摆弄redcarpet
的自定义解析器代码要简单得多。
我还发现peg-markdown
有更少的bug。
可能必须通过更新git子模块使Ruby绑定成为最新的。 (我打算提交拉取请求,将rpeg-markdown
更新到最新版本的peg-markdown
。)