From e91379916b739ea80178ac1e00b9b2f4b0dff84c Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 13 Apr 2016 13:24:39 -0400 Subject: [PATCH] FIX: Provide the ability to `reduce` cooked content This allows us to strip polls from the group posts page. --- app/helpers/user_notifications_helper.rb | 7 ++++--- app/serializers/group_post_serializer.rb | 6 ++++++ app/views/email/_post.html.erb | 2 +- lib/pretty_text.rb | 3 ++- plugins/poll/plugin.rb | 26 +++++++++++------------- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/app/helpers/user_notifications_helper.rb b/app/helpers/user_notifications_helper.rb index 4f4ca687aeb..4c088836d11 100644 --- a/app/helpers/user_notifications_helper.rb +++ b/app/helpers/user_notifications_helper.rb @@ -51,7 +51,7 @@ module UserNotificationsHelper def email_excerpt(html, posts_count) # only include 1st paragraph when more than 1 posts html = first_paragraph_from(html).to_s if posts_count > 1 - raw format_for_email(html) + PrettyText.format_for_email(html).html_safe end def normalize_name(name) @@ -65,8 +65,9 @@ module UserNotificationsHelper normalize_name(post.user.name) != normalize_name(post.user.username) end - def format_for_email(html) - PrettyText.format_for_email(html).html_safe + def format_for_email(post, use_excerpt) + html = use_excerpt ? post.excerpt : post.cooked + PrettyText.format_for_email(html, post).html_safe end end diff --git a/app/serializers/group_post_serializer.rb b/app/serializers/group_post_serializer.rb index ad4806d8707..77f1eb95b38 100644 --- a/app/serializers/group_post_serializer.rb +++ b/app/serializers/group_post_serializer.rb @@ -31,6 +31,12 @@ class GroupPostSerializer < ApplicationSerializer object.topic end + def cooked + fragment = Nokogiri::HTML.fragment(object.cooked) + DiscourseEvent.trigger(:reduce_cooked, fragment, object) + fragment.to_html + end + def category object.topic.category end diff --git a/app/views/email/_post.html.erb b/app/views/email/_post.html.erb index 250d1e6d70d..42bb7afb836 100644 --- a/app/views/email/_post.html.erb +++ b/app/views/email/_post.html.erb @@ -23,7 +23,7 @@ - <%= format_for_email(use_excerpt ? post.excerpt : post.cooked) %> + <%= format_for_email(post, use_excerpt) %> diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb index cfd9b53c276..a627ac13f45 100644 --- a/lib/pretty_text.rb +++ b/lib/pretty_text.rb @@ -390,8 +390,9 @@ module PrettyText doc.css(".lightbox-wrapper .meta").remove end - def self.format_for_email(html) + def self.format_for_email(html, post = nil) doc = Nokogiri::HTML.fragment(html) + DiscourseEvent.trigger(:reduce_cooked, doc, post) make_all_links_absolute(doc) strip_image_wrapping(doc) doc.to_html diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb index ce251f91a25..82d271b7a81 100644 --- a/plugins/poll/plugin.rb +++ b/plugins/poll/plugin.rb @@ -22,19 +22,6 @@ DEFAULT_POLL_NAME ||= "poll".freeze after_initialize do - # turn polls into a link in emails - Email::Styles.register_plugin_style do |fragment, opts| - post = Post.find_by(id: opts[:post_id]) rescue nil - if post.nil? || post.trashed? - fragment.css(".poll").each(&:remove) - else - post_url = "#{Discourse.base_url}#{post.url}" - fragment.css(".poll").each do |poll| - poll.replace "

#{I18n.t("poll.email.link_to_poll")}

" - end - end - end - module ::DiscoursePoll class Engine < ::Rails::Engine engine_name PLUGIN_NAME @@ -281,7 +268,7 @@ after_initialize do self.errors.add(:base, I18n.t("poll.default_poll_with_multiple_choices_has_invalid_parameters")) : self.errors.add(:base, I18n.t("poll.named_poll_with_multiple_choices_has_invalid_parameters", name: poll["name"])) return - end + end end # store the valid poll @@ -367,6 +354,17 @@ after_initialize do user ? [POLLS_CUSTOM_FIELD, VOTES_CUSTOM_FIELD] : [POLLS_CUSTOM_FIELD] end + on(:reduce_cooked) do |fragment, post| + if post.nil? || post.trashed? + fragment.css(".poll, [data-poll-name]").each(&:remove) + else + post_url = "#{Discourse.base_url}#{post.url}" + fragment.css(".poll, [data-poll-name]").each do |poll| + poll.replace "

#{I18n.t("poll.email.link_to_poll")}

" + end + end + end + # tells the front-end we have a poll for that post on(:post_created) do |post| next if post.is_first_post? || post.custom_fields[POLLS_CUSTOM_FIELD].blank?