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
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
oneboxed_images.each { |img| limit_size!(img) }

View File

@ -33,13 +33,14 @@ module Onebox
def to_html
uri = URI::parse(@url)
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
case route[:controller]
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
# Post Link
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]")
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
else
@ -77,7 +80,7 @@ module Onebox
end
quote = post.excerpt(SiteSetting.post_onebox_maxlength)
args = { original_url: @url,
args = { original_url: url,
title: topic.title,
avatar: PrettyText.avatar_img(topic.user.avatar_template, 'tiny'),
posts_count: topic.posts_count,

View File

@ -35,9 +35,14 @@ describe Onebox::Engine::DiscourseLocalOnebox do
end
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)
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.excerpt)
end