如何在用户注释中的代码中正确显示括号?

时间:2014-01-09 16:57:28

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

当用户在我的网站上发布评论时,我会通过后端的清理过的markdown格式化程序运行它,然后在网站上显示它。

但是,这会导致小于号和大于号(<>)的HTML代码(&lt;&rt;)用户的代码示例(标有<pre><code>标记)。括号在代码之外正确显示,但如何修复它们以便在代码中正确显示?

简而言之,我希望现在显示为:

 if(a &lt; b)

显示为:

if(a < b)

这是帮助器中用于标记用户注释的代码:

def comment_markdown(text)
  renderer = Redcarpet::Render::HTML.new()
  markdown = Redcarpet::Markdown.new(renderer)
  safe_text = sanitize text, tags: %w(b i code pre br p)
  markdown.render(safe_text).html_safe
end

在视图中调用:

 <%= comment_markdown comment.text %>

2 个答案:

答案 0 :(得分:0)

Rails已经是HTML-safe的文本,可以在视图中显示;因此,当您使用.html_safe方法调用comment_markdown时,它会被转义两次。

只需移除您对.html_safe的电话:

def comment_markdown(text)
  renderer = Redcarpet::Render::HTML.new()
  markdown = Redcarpet::Markdown.new(renderer)
  safe_text = sanitize text, tags: %w(b i code pre br p)
  markdown.render(safe_text)
end

答案 1 :(得分:0)

我想我会使用Redcarpet的filter_html: true选项来防止来自iframe等的任何安全问题。然后我不需要清理文本,因此它不会在预标签内转义文本,并且它会正常显示。我只需要看看如何配置它,以便用户不能使用像标题这样的令人分心的东西。