在我的rails3应用程序上,我想使用红地毯来处理用户的帖子和用户评论部分。因此,我想扩展红地毯,以支持将@username变成我网站上用户的链接。我知道红地毯是用C写的,但有没有简单的方法可以用ruby扩展它?用C写它有多难?我应该在红地毯外做这件事吗?
此外,我还对红地毯的其他一些扩展感兴趣,这将是链接到我的应用程序中其他模型的简写。我还不确定语法,但我猜它将类似于github处理链接到问题的方式。
我发现用Ruby为rails 3应用程序扩展redcarpet的解析器非常容易。一点也不可怕。
首先,从红地毯的HTML渲染器派生一个类,并按照文档中的建议覆盖预处理方法。在Rails3.2和Rails4中,这个文件可以放在任何地方,你不需要它。
# app/services/my_flavored_markdown.rb
class MyFlavoredMarkdown < Redcarpet::Render::HTML
def preprocess(text)
text
end
end
下一步是添加进行所需文本替换的方法。在这里,我使用regex将HTML span标记中看起来像"@reference"的文本用css类"recomment"包装起来。
# 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
你也可以很容易地查找用户的个人资料页面,并将@提及包装在锚标记中。在我的案例中,我还为表情符号和标签制定了同样的方法,并将这些方法链接在一起。
最后一步是添加一个助手,该助手接受一些文本,创建红地毯派生类的实例,将文本传递到该实例中进行处理,并返回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") %>
然后输出为:
CCD_ 2。
我曾经尝试扩展redcarpet
,但发现它非常困难。如果redcarpet
没有其他依赖项,我建议您尝试rpeg-markdown
,它是一个(有些过时的)Ruby宝石,提供了对优秀的peg标记的绑定。
peg-markdown
是一个作为形式语法编写的markdown解释器。这意味着用自己的语法扩展它非常容易。我已经成功地为我自己的项目扩展了peg-markdown
(请参阅这里的fork),我发现它比摆弄redcarpet
的自定义解析器代码要简单得多。
我还发现peg-markdown
的错误更少。
Ruby绑定可能必须通过更新git子模块来更新。(我计划提交一个拉取请求,将rpeg-markdown
更新为peg-markdown
的最新版本。)