diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb
index 40d1d41d18b..085c6c19adb 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 9b472787f81..d4ec1b78a52 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 96400ade31c..5d2c5fe27a8 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 8410b9d5e45..f3cba94e448 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('foo
')
expect(ExcerptParser.get_excerpt(html, 2, {})).to match_html('fo…
')
end
+
+ it "preserves spoilers by default" do
+ html = 'Foo bar'
+ expect(ExcerptParser.get_excerpt(html, 100, {})).to match_html('Foo bar')
+ end
+
+ it "strips spoilers when specified" do
+ html = 'Foo bar'
+ expect(ExcerptParser.get_excerpt(html, 100, strip_spoilers: true)).to match_html("Foo [#{I18n.t 'excerpt_spoiler'}]")
+ end
end