mirror of
https://github.com/gitlabhq/gitlabhq.git
synced 2025-08-15 23:30:46 +00:00
Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
@ -5,25 +5,46 @@ require 'nokogiri'
|
||||
module Gitlab
|
||||
module Email
|
||||
class HtmlToMarkdownParser < Html2Text
|
||||
ADDITIONAL_TAGS = %w[em strong img details].freeze
|
||||
IMG_ATTRS = %w[alt src].freeze
|
||||
extend Gitlab::Utils::Override
|
||||
|
||||
# List of tags to be converted by Markdown.
|
||||
#
|
||||
# All attributes are removed except for the defined ones.
|
||||
#
|
||||
# <tag> => [<attribute to keep>, ...]
|
||||
ALLOWED_TAG_ATTRIBUTES = {
|
||||
'em' => [],
|
||||
'strong' => [],
|
||||
'details' => [],
|
||||
'img' => %w[alt src]
|
||||
}.freeze
|
||||
private_constant :ALLOWED_TAG_ATTRIBUTES
|
||||
|
||||
# This redefinition can be removed once https://github.com/soundasleep/html2text_ruby/pull/30
|
||||
# is merged and released.
|
||||
def self.convert(html)
|
||||
html = fix_newlines(replace_entities(html))
|
||||
doc = Nokogiri::HTML(html)
|
||||
|
||||
HtmlToMarkdownParser.new(doc).convert
|
||||
new(doc).convert
|
||||
end
|
||||
|
||||
def iterate_over(node)
|
||||
return super unless ADDITIONAL_TAGS.include?(node.name)
|
||||
private
|
||||
|
||||
if node.name == 'img'
|
||||
node.keys.each { |key| node.remove_attribute(key) unless IMG_ATTRS.include?(key) } # rubocop:disable Style/HashEachMethods
|
||||
end
|
||||
override :iterate_over
|
||||
def iterate_over(node)
|
||||
allowed_attributes = ALLOWED_TAG_ATTRIBUTES[node.name]
|
||||
return super unless allowed_attributes
|
||||
|
||||
remove_attributes(node, allowed_attributes)
|
||||
|
||||
Kramdown::Document.new(node.to_html, input: 'html').to_commonmark
|
||||
end
|
||||
|
||||
def remove_attributes(node, allowed_attributes)
|
||||
to_remove = (node.keys - allowed_attributes)
|
||||
to_remove.each { |key| node.remove_attribute(key) }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user