diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb index 8b8de6aa827..b792a6e701d 100644 --- a/app/services/post_alerter.rb +++ b/app/services/post_alerter.rb @@ -23,7 +23,14 @@ class PostAlerter topic_title: post.topic.title, topic_id: post.topic.id, excerpt: - excerpt || post.excerpt(400, text_entities: true, strip_links: true, remap_emoji: true), + excerpt || + post.excerpt( + 400, + text_entities: true, + strip_links: true, + remap_emoji: true, + plain_hashtags: true, + ), username: username || post.username, post_url: post_url, } diff --git a/lib/email/styles.rb b/lib/email/styles.rb index 6482b70eec6..d1976f3c517 100644 --- a/lib/email/styles.rb +++ b/lib/email/styles.rb @@ -216,7 +216,7 @@ module Email correct_first_body_margin correct_footer_style correct_footer_style_highlight_first - decorate_hashtags + strip_hashtag_link_icons reset_tables html_lang = SiteSetting.default_locale.sub("_", "-") @@ -396,7 +396,7 @@ module Email end end - def decorate_hashtags + def strip_hashtag_link_icons @fragment .search(".hashtag-cooked") .each do |hashtag| diff --git a/lib/excerpt_parser.rb b/lib/excerpt_parser.rb index f01499e9343..95d9f398d53 100644 --- a/lib/excerpt_parser.rb +++ b/lib/excerpt_parser.rb @@ -181,10 +181,10 @@ class ExcerptParser < Nokogiri::XML::SAX::Document when "div", "span" throw :done if @start_excerpt when "svg" - characters("", truncate: false, count_it: false, encode: false) + characters("", truncate: false, count_it: false, encode: false) if @keep_svg @in_svg = false when "use" - characters("", truncate: false, count_it: false, encode: false) + characters("", truncate: false, count_it: false, encode: false) if @keep_svg end end diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb index e041c4fb8f1..05df311c5bf 100644 --- a/lib/pretty_text.rb +++ b/lib/pretty_text.rb @@ -469,10 +469,21 @@ module PrettyText DiscourseEvent.trigger(:reduce_excerpt, doc, options) strip_image_wrapping(doc) strip_oneboxed_media(doc) + + if SiteSetting.enable_experimental_hashtag_autocomplete && options[:plain_hashtags] + convert_hashtag_links_to_plaintext(doc) + end + html = doc.to_html ExcerptParser.get_excerpt(html, max_length, options) end + def self.convert_hashtag_links_to_plaintext(doc) + doc + .css("a.hashtag-cooked") + .each { |hashtag| hashtag.replace("##{hashtag.attributes["data-slug"]}") } + end + def self.strip_links(string) return string if string.blank? diff --git a/spec/services/post_alerter_spec.rb b/spec/services/post_alerter_spec.rb index d35ea6a831a..793239bd8ab 100644 --- a/spec/services/post_alerter_spec.rb +++ b/spec/services/post_alerter_spec.rb @@ -1209,6 +1209,22 @@ RSpec.describe PostAlerter do expect(JSON.parse(body)).to eq(payload) end + it "does not have invalid HTML in the excerpt when enable_experimental_hashtag_autocomplete is enabled" do + SiteSetting.enable_experimental_hashtag_autocomplete = true + Fabricate(:category, slug: "random") + Jobs.run_immediately! + body = nil + + stub_request(:post, "https://site2.com/push").to_return do |request| + body = request.body + { status: 200, body: "OK" } + end + create_post_with_alerts(user: user, raw: "this, @eviltrout, is a test with #random") + expect(JSON.parse(body)["notifications"][0]["excerpt"]).to eq( + "this, @eviltrout, is a test with #random", + ) + end + context "with push subscriptions" do before do Fabricate(:push_subscription, user: evil_trout)