FEATURE: add context for cross topic links

This commit is contained in:
Sam 2015-09-25 14:52:43 +10:00
parent 150ad01111
commit fc2d61136d
3 changed files with 28 additions and 6 deletions

View File

@ -245,7 +245,21 @@ class CookedPostProcessor
} }
# apply oneboxes # apply oneboxes
Oneboxer.apply(@doc) { |url| Oneboxer.onebox(url, args) } Oneboxer.apply(@doc) { |url|
# hack urls to create proper expansions
if url =~ Regexp.new("^#{Discourse.base_url.gsub(".","\\.")}.*$", true)
uri = URI.parse(url) rescue nil
if uri && uri.path
route = Rails.application.routes.recognize_path(uri.path) rescue nil
if route && route[:controller] == 'topics'
url += (url =~ /\?/ ? "&" : "?") + "&source_topic_id=#{@post.topic_id}"
end
end
end
Oneboxer.onebox(url, args)
}
# make sure we grab dimensions for oneboxed images # make sure we grab dimensions for oneboxed images
oneboxed_images.each { |img| limit_size!(img) } oneboxed_images.each { |img| limit_size!(img) }

View File

@ -33,13 +33,14 @@ module Onebox
def to_html def to_html
uri = URI::parse(@url) uri = URI::parse(@url)
route = Rails.application.routes.recognize_path(uri.path) route = Rails.application.routes.recognize_path(uri.path)
url = @url.sub(/[&?]source_topic_id=(\d+)/, "")
source_topic_id = $1.to_i
# Figure out what kind of onebox to show based on the URL # Figure out what kind of onebox to show based on the URL
case route[:controller] case route[:controller]
when 'topics' when 'topics'
linked = "<a href='#{@url}'>#{@url}</a>" linked = "<a href='#{url}'>#{url}</a>"
if route[:post_number].present? && route[:post_number].to_i > 1 if route[:post_number].present? && route[:post_number].to_i > 1
# Post Link # Post Link
post = Post.find_by(topic_id: route[:topic_id], post_number: route[:post_number].to_i) post = Post.find_by(topic_id: route[:topic_id], post_number: route[:post_number].to_i)
@ -56,7 +57,9 @@ module Onebox
excerpt.gsub!("[/quote]", "[quote]") excerpt.gsub!("[/quote]", "[quote]")
quote = "[quote=\"#{post.user.username}, topic:#{topic.id}, slug:#{slug}, post:#{post.post_number}\"]#{excerpt}[/quote]" quote = "[quote=\"#{post.user.username}, topic:#{topic.id}, slug:#{slug}, post:#{post.post_number}\"]#{excerpt}[/quote]"
cooked = PrettyText.cook(quote) args = {}
args[:topic_id] = source_topic_id if source_topic_id > 0
cooked = PrettyText.cook(quote, args)
return cooked return cooked
else else
@ -77,7 +80,7 @@ module Onebox
end end
quote = post.excerpt(SiteSetting.post_onebox_maxlength) quote = post.excerpt(SiteSetting.post_onebox_maxlength)
args = { original_url: @url, args = { original_url: url,
title: topic.title, title: topic.title,
avatar: PrettyText.avatar_img(topic.user.avatar_template, 'tiny'), avatar: PrettyText.avatar_img(topic.user.avatar_template, 'tiny'),
posts_count: topic.posts_count, posts_count: topic.posts_count,

View File

@ -35,9 +35,14 @@ describe Onebox::Engine::DiscourseLocalOnebox do
end end
it "returns some onebox goodness if post exists and can be seen" do it "returns some onebox goodness if post exists and can be seen" do
url = "#{Discourse.base_url}#{post2.url}" url = "#{Discourse.base_url}#{post2.url}?source_topic_id=#{post2.topic_id+1}"
Guardian.any_instance.stubs(:can_see?).returns(true) Guardian.any_instance.stubs(:can_see?).returns(true)
html = Onebox.preview(url).to_s html = Onebox.preview(url).to_s
expect(html).to include(post2.excerpt)
expect(html).to include(post2.topic.title)
url = "#{Discourse.base_url}#{post2.url}"
html = Onebox.preview(url).to_s
expect(html).to include(post2.user.username) expect(html).to include(post2.user.username)
expect(html).to include(post2.excerpt) expect(html).to include(post2.excerpt)
end end