summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Matatall <448516+oreoshake@users.noreply.github.com>2022-12-15 05:39:41 -1000
committerGitHub <noreply@github.com>2022-12-15 16:39:41 +0100
commit1f5740e65cc50ef3cc1feb7c0e5609df73d4173a (patch)
tree18f0786d828afc8860e684ffb5d9474c30756224
parent3d3429243fa0bacb20aac3db6c377441c0510f22 (diff)
Use Rails tag API to build RSS feed for spoilers and polls (#20163)
* Use Rails tag API to build RSS feed for spoilers and polls While the previous method did not contain a bug or a potential issue, the tag API can be very resilient against future problems and reduces the amount of manual management of the escape status of the content. I've added tests to ensure that the formatting is broken and still escapes control characters correctly. * this seems cleaner and passes * Incorporate feedback by moving the br to its own line and using the tag helper over the string constant for the br tag itself * whoops, tag helper doesn't use a self-closing tag
-rw-r--r--app/helpers/formatting_helper.rb25
-rw-r--r--spec/helpers/formatting_helper_spec.rb24
2 files changed, 41 insertions, 8 deletions
diff --git a/app/helpers/formatting_helper.rb b/app/helpers/formatting_helper.rb
index a9d2f965125..c7093148979 100644
--- a/app/helpers/formatting_helper.rb
+++ b/app/helpers/formatting_helper.rb
@@ -23,19 +23,28 @@ module FormattingHelper
before_html = begin
if status.spoiler_text?
- "<p><strong>#{I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)}</strong> #{h(status.spoiler_text)}</p><hr />"
- else
- ''
+ tag.p do
+ tag.strong do
+ I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)
+ end
+
+ status.spoiler_text
+ end + tag.hr
end
- end.html_safe # rubocop:disable Rails/OutputSafety
+ end
after_html = begin
if status.preloadable_poll
- "<p>#{status.preloadable_poll.options.map { |o| "<input type=#{status.preloadable_poll.multiple? ? 'checkbox' : 'radio'} disabled /> #{h(o)}" }.join('<br />')}</p>"
- else
- ''
+ tag.p do
+ safe_join(
+ status.preloadable_poll.options.map do |o|
+ tag.send(status.preloadable_poll.multiple? ? 'checkbox' : 'radio', o, disabled: true)
+ end,
+ tag.br
+ )
+ end
end
- end.html_safe # rubocop:disable Rails/OutputSafety
+ end
prerender_custom_emojis(
safe_join([before_html, html, after_html]),
diff --git a/spec/helpers/formatting_helper_spec.rb b/spec/helpers/formatting_helper_spec.rb
new file mode 100644
index 00000000000..af604a87b58
--- /dev/null
+++ b/spec/helpers/formatting_helper_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe FormattingHelper, type: :helper do
+ include Devise::Test::ControllerHelpers
+
+ describe '#rss_status_content_format' do
+ let(:status) { Fabricate(:status, text: 'Hello world<>', spoiler_text: 'This is a spoiler<>', poll: Fabricate(:poll, options: %w(Yes<> No))) }
+ let(:html) { helper.rss_status_content_format(status) }
+
+ it 'renders the spoiler text' do
+ expect(html).to include('<p>This is a spoiler&lt;&gt;</p><hr>')
+ end
+
+ it 'renders the status text' do
+ expect(html).to include('<p>Hello world&lt;&gt;</p>')
+ end
+
+ it 'renders the poll' do
+ expect(html).to include('<radio disabled="disabled">Yes&lt;&gt;</radio><br>')
+ end
+ end
+end