FIX: strip spoilers in notification excerpts

FIX: strip spoilers in notification excerpts

diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb
index 40d1d41..085c6c1 100644
--- a/app/services/post_alerter.rb
+++ b/app/services/post_alerter.rb
@@ -429,7 +429,7 @@ class PostAlerter
        post_number: post.post_number,
        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: excerpt || post.excerpt(400, text_entities: true, strip_links: true, remap_emoji: true, strip_spoilers: true),
        username: username || post.username,
        post_url: post_url
       }
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index 9b47278..d4ec1b7 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -347,6 +347,7 @@ en:
   revert_version_same: "The current version is same as the version you are trying to revert to."
 
   excerpt_image: "image"
+  excerpt_spoiler: "spoiler"
 
   groups:
     success:
@@ -4267,7 +4268,7 @@ en:
                 label: "Private"
                 description: "Only logged in users can access this community"
           invite_only:
-              placeholder: "People must be explicitly invited. Public registration is disabled."
+            placeholder: "People must be explicitly invited. Public registration is disabled."
 
       contact:
         title: "Contact"
diff --git a/lib/excerpt_parser.rb b/lib/excerpt_parser.rb
index 96400ad..5d2c5fe 100644
--- a/lib/excerpt_parser.rb
+++ b/lib/excerpt_parser.rb
@@ -17,6 +17,7 @@ class ExcerptParser < Nokogiri::XML::SAX::Document
     @keep_emoji_images = options[:keep_emoji_images] == true
     @keep_onebox_source = options[:keep_onebox_source] == true
     @remap_emoji = options[:remap_emoji] == true
+    @strip_spoilers = options[:strip_spoilers] == true
     @start_excerpt = false
     @in_details_depth = 0
     @summary_contents = ""
@@ -110,7 +111,11 @@ class ExcerptParser < Nokogiri::XML::SAX::Document
       end
       # Preserve spoilers
       if attributes.include?(["class", "spoiler"])
-        include_tag("span", attributes)
+        if @strip_spoilers
+          characters("[#{I18n.t 'excerpt_spoiler'}]")
+        else
+          include_tag("span", attributes)
+        end
         @in_spoiler = true
       end
 
@@ -194,6 +199,8 @@ class ExcerptParser < Nokogiri::XML::SAX::Document
 
     @excerpt << before_string if before_string
 
+    string = "" if @in_spoiler && @strip_spoilers
+
     encode = encode ? lambda { |s| ERB::Util.html_escape(s) } : lambda { |s| s }
     if count_it && @current_length + string.length > @length
       length = [0, @length - @current_length - 1].max
diff --git a/spec/components/excerpt_parser_spec.rb b/spec/components/excerpt_parser_spec.rb
index 8410b9d..f3cba94 100644
--- a/spec/components/excerpt_parser_spec.rb
+++ b/spec/components/excerpt_parser_spec.rb
@@ -32,4 +32,14 @@ describe ExcerptParser do
     expect(ExcerptParser.get_excerpt(html, 3, {})).to match_html('<details class="disabled"><summary>foo</summary></details>')
     expect(ExcerptParser.get_excerpt(html, 2, {})).to match_html('<details class="disabled"><summary>fo&hellip;</summary></details>')
   end
+
+  it "preserves spoilers by default" do
+    html = 'Foo <span class="spoiler">bar</span>'
+    expect(ExcerptParser.get_excerpt(html, 100, {})).to match_html('Foo <span class="spoiler">bar</span>')
+  end
+
+  it "strips spoilers when specified" do
+    html = 'Foo <span class="spoiler">bar</span>'
+    expect(ExcerptParser.get_excerpt(html, 100, strip_spoilers: true)).to match_html("Foo [#{I18n.t 'excerpt_spoiler'}]")
+  end
 end

GitHub sha: 55942224

This commit has been mentioned on Discourse Meta. There might be relevant details there:

Sorry, I think we need a follow up here next week, the code needs to go in GitHub - discourse/discourse-spoiler-alert: A plugin for discourse to hide spoilers behind the spoiler-alert jQuery plugin

3 Likes

Revert "FIX: strip spoilers in notification excerpts"

Fix is now in

and