Как заставить Redcarpet дополнительно фильтровать теги HTML?

Я хотел бы добавить в белый список некоторые теги HTML, например <kbd></kbd> так что я могу показать симпатичный значок клавиатуры для всех сочетаний клавиш. Как я могу это сделать?

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

  def markdown_to_html(markdown_str)
    options = {
      filter_html: true,
      link_attributes: { rel: 'nofollow', target: '_blank' },
      no_styles: true
    }

    extensions = {
      autolink: true,
      fenced_code_blocks: true,
      footnotes: true,
      highlight: true,
      no_intra_emphasis: true,
      quote: true,
      space_after_headers: true,
      strikethrough: true,
      superscript: true,
      tables: true
    }

    renderer = Redcarpet::Render::HTML.new(options)
    markdown = Redcarpet::Markdown.new(renderer, extensions)

    markdown.render(markdown_str).html_safe
  end

1 ответ

Решение

Использование sanitize и ваш собственный класс скруббера.

Этот класс может находиться в том же файле, что и ваш класс контроллера.

class MarkdownScrubber < Rails::Html::PermitScrubber
  def initialize
    super
    self.tags = %w( kbd )
    self.attributes = []
  end

  def skip_node?(node)
    node.text?
  end
end

Затем используйте это, когда вы звоните render:

renderer = Redcarpet::Render::HTML.new(options)
markdown = Redcarpet::Markdown.new(renderer, extensions)
sanitize(markdown.render(markdown_str), scrubber: MarkdownScrubber.new)
Другие вопросы по тегам