【问题标题】:How to extend redcarpet to support auto linking user mentions?如何扩展 redcarpet 以支持自动链接用户提及?
【发布时间】:2012-09-12 04:28:08
【问题描述】:

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

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

【问题讨论】:

    标签: ruby ruby-on-rails-3 markdown redcarpet


    【解决方案1】:

    我发现在 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 span 标签中。

    # 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)
    }
    

    在你看来,你可以这样称呼它:

    &lt;%= flavored_markdown_to_html("This is something worth @mentioning") %&gt;

    然后输出将是:

    This is something worth &lt;span class='mention'&gt;@mentioning&lt;/span&gt;.

    【讨论】:

    • 另外,如果渲染结果不会被缓存,您可能不想在每次渲染期间都进行数据库查找。另一种方法是使用我这里的示例,然后使用 javascript 拦截对 span.mention 元素的点击,查找提及 url 并重定向用户。
    • 致那些不想在链接的href中使用@符号的人:/(^|\s)@(\w+)/"#{$1}&lt;span class='mention'&gt;@#{$2}&lt;/span&gt;"
    【解决方案2】:

    我曾经尝试扩展redcarpet,但发现非常困难。如果对redcarpet 没有其他依赖项,我建议您尝试rpeg-markdown,这是一个(有些过时的)Ruby gem,提供与优秀peg-markdown 的绑定。

    peg-markdown 是一个以形式语法编写的 Markdown 解释器。这意味着很容易用自己的语法扩展它。我已经成功地为我自己的项目扩展了peg-markdown(参见my fork here),我发现它比摆弄redcarpet 的自定义解析器代码要简单得多

    我还发现peg-markdown 的错误更少。

    Ruby 绑定可能必须通过更新 git 子模块来更新。 (我打算提交一个拉取请求,将rpeg-markdown 更新到最新版本的peg-markdown。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 2023-03-13
      相关资源
      最近更新 更多