diff --git a/lib/excerpt_parser.rb b/lib/excerpt_parser.rb
index 80ba4a8bf2f..7c236d69afd 100644
--- a/lib/excerpt_parser.rb
+++ b/lib/excerpt_parser.rb
@@ -19,6 +19,7 @@ class ExcerptParser < Nokogiri::XML::SAX::Document
@keep_onebox_source = options[:keep_onebox_source] == true
@keep_onebox_body = options[:keep_onebox_body] == true
@keep_quotes = options[:keep_quotes] == true
+ @keep_svg = options[:keep_svg] == true
@remap_emoji = options[:remap_emoji] == true
@start_excerpt = false
@in_details_depth = 0
@@ -133,6 +134,17 @@ class ExcerptParser < Nokogiri::XML::SAX::Document
@in_summary = true
end
+ when "svg"
+ attributes = Hash[*attributes.flatten]
+ if attributes["class"].include?("d-icon") && @keep_svg
+ include_tag(name, attributes)
+ @in_svg = true
+ end
+
+ when "use"
+ if @in_svg && @keep_svg
+ include_tag(name, attributes)
+ end
end
end
@@ -178,6 +190,11 @@ class ExcerptParser < Nokogiri::XML::SAX::Document
@in_summary = false if @in_details_depth == 1
when "div", "span"
throw :done if @start_excerpt
+ when "svg"
+ characters("", truncate: false, count_it: false, encode: false)
+ @in_svg = false
+ when "use"
+ characters("", truncate: false, count_it: false, encode: false)
end
end
diff --git a/lib/oneboxer.rb b/lib/oneboxer.rb
index cf8e9a7e512..cd9e8115b86 100644
--- a/lib/oneboxer.rb
+++ b/lib/oneboxer.rb
@@ -322,7 +322,7 @@ module Oneboxer
return if !post || post.hidden || !allowed_post_types.include?(post.post_type)
if post_number > 1 && opts[:topic_id] == topic.id
- excerpt = post.excerpt(SiteSetting.post_onebox_maxlength)
+ excerpt = post.excerpt(SiteSetting.post_onebox_maxlength, keep_svg: true)
excerpt.gsub!(/[\r\n]+/, " ")
excerpt.gsub!("[/quote]", "[quote]") # don't break my quote
@@ -337,7 +337,7 @@ module Oneboxer
original_url: url,
title: PrettyText.unescape_emoji(CGI::escapeHTML(topic.title)),
category_html: CategoryBadge.html_for(topic.category),
- quote: PrettyText.unescape_emoji(post.excerpt(SiteSetting.post_onebox_maxlength)),
+ quote: PrettyText.unescape_emoji(post.excerpt(SiteSetting.post_onebox_maxlength, keep_svg: true)),
}
template = template("discourse_topic_onebox")
diff --git a/spec/lib/excerpt_parser_spec.rb b/spec/lib/excerpt_parser_spec.rb
index 5e4d57c2933..a4f5ecb1b93 100644
--- a/spec/lib/excerpt_parser_spec.rb
+++ b/spec/lib/excerpt_parser_spec.rb
@@ -34,6 +34,18 @@ RSpec.describe ExcerptParser do
expect(ExcerptParser.get_excerpt(html, 2, {})).to match_html('fo…
')
end
+ it "allows