diff --git a/app/models/post.rb b/app/models/post.rb
index efb75dd8827..09691d10b86 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -453,11 +453,11 @@ class Post < ActiveRecord::Base
# Strip out most of the markup
def excerpt(maxlength = nil, options = {})
- Post.excerpt(cooked, maxlength, options)
+ Post.excerpt(cooked, maxlength, options.merge(post: self))
end
def excerpt_for_topic
- Post.excerpt(cooked, 220, strip_links: true, strip_images: true)
+ Post.excerpt(cooked, 220, strip_links: true, strip_images: true, post: self)
end
def is_first_post?
diff --git a/app/models/user_profile.rb b/app/models/user_profile.rb
index a6453dec4ed..3e51fd91733 100644
--- a/app/models/user_profile.rb
+++ b/app/models/user_profile.rb
@@ -24,6 +24,7 @@ class UserProfile < ActiveRecord::Base
BAKED_VERSION = 1
def bio_excerpt(length = 350, opts = {})
+ return nil if bio_cooked.blank?
excerpt = PrettyText.excerpt(bio_cooked, length, opts).sub(/
$/, '')
return excerpt if excerpt.blank? || (user.has_trust_level?(TrustLevel[1]) && !user.suspended?)
PrettyText.strip_links(excerpt)
@@ -35,7 +36,6 @@ class UserProfile < ActiveRecord::Base
end
def bio_summary
- return nil unless bio_cooked.present?
bio_excerpt(500, strip_links: true, text_entities: true)
end
diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb
index 79b6e66a4d7..123bb916474 100644
--- a/lib/pretty_text.rb
+++ b/lib/pretty_text.rb
@@ -347,6 +347,7 @@ module PrettyText
def self.excerpt(html, max_length, options = {})
# TODO: properly fix this HACK in ExcerptParser without introducing XSS
doc = Nokogiri::HTML.fragment(html)
+ DiscourseEvent.trigger(:reduce_excerpt, doc, options)
strip_image_wrapping(doc)
html = doc.to_html
diff --git a/plugins/poll/config/locales/server.en.yml b/plugins/poll/config/locales/server.en.yml
index 1fdcbf47ca2..c667a9dd95c 100644
--- a/plugins/poll/config/locales/server.en.yml
+++ b/plugins/poll/config/locales/server.en.yml
@@ -22,6 +22,7 @@ en:
poll_minimum_trust_level_to_create: "Define the minimum trust level needed to create polls."
poll:
+ poll: "poll"
invalid_argument: "Invalid value '%{value}' for argument '%{argument}'."
multiple_polls_without_name: "There are multiple polls without a name. Use the 'name
' attribute to uniquely identify your polls."
diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb
index 7b64ddf5790..4a494cf4c5b 100644
--- a/plugins/poll/plugin.rb
+++ b/plugins/poll/plugin.rb
@@ -435,6 +435,13 @@ after_initialize do
end
end
+ on(:reduce_excerpt) do |doc, options|
+ post = options[:post]
+ doc.css("div.poll").each do |poll|
+ poll.replace "#{I18n.t("poll.poll")}"
+ end
+ end
+
on(:post_created) do |post|
DiscoursePoll::Poll.schedule_jobs(post)
diff --git a/plugins/poll/spec/lib/pretty_text_spec.rb b/plugins/poll/spec/lib/pretty_text_spec.rb
index a7e1f3d36c7..a1b834ac7ca 100644
--- a/plugins/poll/spec/lib/pretty_text_spec.rb
+++ b/plugins/poll/spec/lib/pretty_text_spec.rb
@@ -119,4 +119,21 @@ describe PrettyText do
expect(n cooked).to eq(n expected)
end
+
+ it 'can onebox posts' do
+ post = Fabricate(:post, raw: <<~EOF)
+ A post with a poll
+
+ [poll type=regular]
+ * Hello
+ * World
+ [/poll]
+ EOF
+
+ onebox = Oneboxer.onebox_raw(post.full_url, user_id: Fabricate(:user).id)
+ doc = Nokogiri::HTML(onebox[:preview])
+
+ expect(onebox[:preview]).to include("A post with a poll")
+ expect(onebox[:preview]).to include("poll")
+ end
end