如何扩展redcarpet以支持自动链接用户提及?

had*_*ees 6 ruby markdown ruby-on-rails-3 redcarpet

在我的rails3应用程序上,我想使用redcarpet来处理用户的帖子和用户评论部分.因此,我想扩展redcarpet以支持将@username转换为指向我网站上用户的链接.我知道redcarpet是用C语言编写的,但无论如何都有简单的方法将其扩展为ruby?用C写它有多难?我应该在redcarpet之外做这件事吗?

此外,我对redcarpet的一些其他扩展感兴趣,这些扩展将是我的应用程序中链接到其他模型的简写.我不确定语法,但我猜它会与github处理问题的方式类似.

IAm*_*NaN 21

我发现很容易在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
Run Code Online (Sandbox Code Playgroud)

下一步是添加进行所需文本替换的方法.在这里,我使用正则表达式在带有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}<span class='mention'>#{$2}</span>"
    end
    text
  end

end
Run Code Online (Sandbox Code Playgroud)

您可以轻松查找用户的个人资料页面,并将@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)
}
Run Code Online (Sandbox Code Playgroud)

在您的视图中,您可以这样称呼它:

<%= flavored_markdown_to_html("This is something worth @mentioning") %>

输出将是:

This is something worth <span class='mention'>@mentioning</span>.

  • 对于那些不想在链接的 href 中使用 @ 符号的人:`/(^|\s)@(\w+)/` 和 `"#{$1}&lt;span class='mention'&gt;@#{$2 }&lt;/span&gt;“` (2认同)