Как правильно отображать скобки в коде в комментариях пользователей?

Когда пользователь публикует комментарий на моем сайте, я запускаю его через дезинфицированный модуль форматирования уценки на серверной части, а затем отображаю его на сайте.

Однако это приводит к тому, что знаки «меньше» и «больше» (< и >) появляются со своими 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 %>

person am-rails    schedule 09.01.2014    source источник
comment
comment_markdown вызывается... откуда? Посмотреть код?   -  person Chowlett    schedule 09.01.2014
comment
@Chowlett, да, см. редактирование.   -  person am-rails    schedule 09.01.2014


Ответы (2)


Rails уже поддерживает HTML-безопасный текст для отображения в представлениях; поэтому с вашим вызовом .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
person Chowlett    schedule 09.01.2014
comment
.html_safe помечает строку, чтобы она не экранировалась. Если я удалю его, я получу <pre><code>3&amp;&lt;4</pre></code> вместо 3<4. - person am-rails; 09.01.2014
comment
Ах, извините, я неправильно понял суть. Как насчет поставить <%= raw(comment_markdown comment.text) %>? - person Chowlett; 10.01.2014

Я думаю, что просто воспользуюсь опцией Redcarpet filter_html: true, чтобы предотвратить любые проблемы с безопасностью из-за iframe и тому подобного. Тогда мне не нужно дезинфицировать текст, поэтому он не экранирует текст внутри тегов pre и отображается нормально. Мне просто нужно посмотреть, как настроить его, чтобы пользователи не могли использовать отвлекающие элементы, такие как заголовки.

person am-rails    schedule 09.01.2014