如何扩展红地毯以支持自动链接用户提及



在我的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的最新版本。)

相关内容

  • 没有找到相关文章

最新更新