Уценка внешних ссылок на изображения с Redcarpet

Я использую драгоценный камень redcarpet для уценки сгенерированного пользователем текста и хотел бы показывать изображения внешних ссылок / хостов изображений. До сих пор я пробовал что-то вроде этого:

def markdown(text)
   options = { ... }
   extension = { ... }
   text.gsub!(/(https?:\/\/[\S]*.jpg)/, '<img src="\1" width="100%">')
   renderer = Redcarpet::Render::HTML.new(options)
   markdown = Redcarpet::Markdown.new(renderer, extensions)
   markdown.render(text).html_safe
end

Тем не менее, я хотел бы escape_html или filter_html, потому что внедрение </div>, id и классов может действительно испортить сайт. Это удалит тег изображения.

Есть ли лучший способ рендеринга внешних изображений при сохранении безопасности HTML?


person D. v. Baboon    schedule 18.05.2016    source источник


Ответы (1)


Что-то вроде этого:

require "redcarpet"
require "action_view"

class HTMLBlockCode < Redcarpet::Render::HTML
  include ActionView::Helpers::AssetTagHelper

  def image(link, title, alt_text)
    image_tag(link, title: title, alt: alt_text, width: "100%")
  end
end

def markdown(text)
   renderer = HTMLBlockCode.new
   text.gsub!(/(https?:\/\/[\S]*.jpg)/, '![](\1)')
   markdown = Redcarpet::Markdown.new(renderer)
   markdown.render(text)
end

text = File.read("rc_test.md")

puts markdown(text)

При этом на RedCarpet устанавливается пользовательский рендерер изображений, который добавляет атрибут width="100%" к вашим элементам изображения. Он также преобразует ссылки на голые изображения в ссылки на изображения, распознаваемые уценкой, в вызове gsub. Это приводит к тому, что встроенный URL-адрес изображения отображается следующим образом:

<img width="100%" src="http://www.gettyimages.pt/gi-resources/images/Homepage/Hero/PT/PT_hero_42_153645159.jpg" />

И вам не нужно каким-либо образом изменять документ уценки; это автоматически вкусно.

person Michael Gaskill    schedule 18.05.2016
comment
Спасибо за ответ, но он, кажется, не работает для меня. На выходе теперь все элементы html в текстовом виде, изображения не отображаются. - person D. v. Baboon; 19.05.2016
comment
Я обновил ответ, и это будет намного лучше для того, что вы пытаетесь сделать. Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы. - person Michael Gaskill; 20.05.2016