我想在用户评论中添加一个简单的降价。
当用户提交此评论时:
我刚收到[卡:黑莲花]男子。 POW!
我希望它显示如下:
我刚买了黑莲花男。 POW!
但有额外的html标记:
I just got <span class="preview" data-card="/cards/card.id">Black Lotus</span> man. POW!
1)我查看了Redcarpet,但无法弄清楚如何为其添加[card:...]
降价。
2)或者我应该先运行regexp并在将内容保存到数据库之前替换内容,然后在显示评论之前再使用sanitize(ActionView::Helpers::SanitizeHelper)
span
标记?
答案 0 :(得分: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
然后你可以这样称呼它:
def markdown(text)
renderer = HTMLwithCards.new(hard_wrap: true, filter_html: true)
Redcarpet::Markdown.new(renderer).render(text).html_safe
end