用户输入中的自定义降价

Koc*_*r4d 9 ruby markdown ruby-on-rails redcarpet

我想在用户评论中添加一个简单的markdown.

当用户提交此评论时:

我刚拿到[卡:黑莲花]男人.POW!

我希望它显示如下:

我刚买了黑莲花男.POW!

但有额外的HTML标记:

I just got <span class="preview" data-card="/cards/card.id">Black Lotus</span> man. POW!

1)我看着Redcarpet,但无法弄清楚如何添加[card:...]降价.

2)或者我应该运行正则表达式并在将内容保存到数据库之前替换内容然后sanitize(ActionView::Helpers::SanitizeHelper) span在显示注释之前进行标记?

Koc*_*r4d 9

回答我自己的问题:

定义自定义渲染器并覆盖normal_text方法可以完成任务.

class HTMLwithCards < Redcarpet::Render::HTML
  def preprocess(full_document)
    full_document.gsub(/\[card:(.*)\]/) do
      card = Card.find_by_name($1)
      if card
        "<span class='preview' data-card='/cards/#{card.id}'>#{$1}</span>"
      else
        $1
      end 
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用它:

def markdown(text)
  renderer = HTMLwithCards.new(hard_wrap: true, filter_html: true)
  Redcarpet::Markdown.new(renderer).render(text).html_safe
end
Run Code Online (Sandbox Code Playgroud)