mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 18:30:26 -06:00
FIX: handle quote rendering for external Discourse instance (#16722)
Gracefully handle quotes from an external discourse instance by stripping quote-controls and including username in the title
This commit is contained in:
parent
991b62b6f1
commit
20740f196c
@ -282,6 +282,11 @@ export default class PostCooked {
|
|||||||
this._updateQuoteElements($aside, "chevron-down");
|
this._updateQuoteElements($aside, "chevron-down");
|
||||||
const $title = $(".title", $aside);
|
const $title = $(".title", $aside);
|
||||||
|
|
||||||
|
// If post/topic is not found then display username, skip controls
|
||||||
|
if (e.classList.contains("quote-post-not-found")) {
|
||||||
|
return (e.querySelector(".title").innerHTML = e.dataset.username);
|
||||||
|
}
|
||||||
|
|
||||||
// Unless it's a full quote, allow click to expand
|
// Unless it's a full quote, allow click to expand
|
||||||
if (!($aside.data("full") || $title.data("has-quote-controls"))) {
|
if (!($aside.data("full") || $title.data("has-quote-controls"))) {
|
||||||
$title.on("click", (e2) => {
|
$title.on("click", (e2) => {
|
||||||
|
@ -78,9 +78,8 @@ class CookedPostProcessor
|
|||||||
q.css('blockquote').text
|
q.css('blockquote').text
|
||||||
)
|
)
|
||||||
|
|
||||||
if comparer.modified?
|
q['class'] = ((q['class'] || '') + " quote-post-not-found").strip if comparer.missing?
|
||||||
q['class'] = ((q['class'] || '') + " quote-modified").strip
|
q['class'] = ((q['class'] || '') + " quote-modified").strip if comparer.modified?
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -15,12 +15,18 @@ class QuoteComparer
|
|||||||
# This algorithm is far from perfect, but it follows the Discourse
|
# This algorithm is far from perfect, but it follows the Discourse
|
||||||
# philosophy of "catch the obvious cases, leave moderation for the
|
# philosophy of "catch the obvious cases, leave moderation for the
|
||||||
# complicated ones"
|
# complicated ones"
|
||||||
|
def missing?
|
||||||
|
return true if @parent_post.blank?
|
||||||
|
end
|
||||||
|
|
||||||
def modified?
|
def modified?
|
||||||
return true if @text.blank? || @parent_post.blank?
|
return true if @text.blank?
|
||||||
|
|
||||||
parent_text = Nokogiri::HTML5::fragment(@parent_post.cooked).text.delete(QuoteComparer.whitespace)
|
if @parent_post
|
||||||
text = @text.delete(QuoteComparer.whitespace)
|
parent_text = Nokogiri::HTML5::fragment(@parent_post.cooked).text.delete(QuoteComparer.whitespace)
|
||||||
|
text = @text.delete(QuoteComparer.whitespace)
|
||||||
|
|
||||||
!parent_text.include?(text)
|
!parent_text.include?(text)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1753,6 +1753,22 @@ describe CookedPostProcessor do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "external discourse instance quote" do
|
||||||
|
let(:external_raw) do
|
||||||
|
<<~RAW.strip
|
||||||
|
[quote="random_guy_not_from_our_discourse, post:2004, topic:401"]
|
||||||
|
this quote is not from our discourse
|
||||||
|
[/quote]
|
||||||
|
and this is a reply
|
||||||
|
RAW
|
||||||
|
end
|
||||||
|
let(:cp) { Fabricate(:post, raw: external_raw) }
|
||||||
|
|
||||||
|
it "it should be marked as missing" do
|
||||||
|
cpp.post_process_quotes
|
||||||
|
expect(cpp.doc.css('aside.quote.quote-post-not-found')).to be_present
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "full quote on direct reply" do
|
context "full quote on direct reply" do
|
||||||
|
@ -4,6 +4,30 @@ require 'quote_comparer'
|
|||||||
|
|
||||||
describe QuoteComparer do
|
describe QuoteComparer do
|
||||||
|
|
||||||
|
describe "#missing?" do
|
||||||
|
fab!(:post) { Fabricate(:post, raw: "This has **text** we _are_ matching") }
|
||||||
|
|
||||||
|
it "returns true for missing topic and post" do
|
||||||
|
expect(QuoteComparer.new(nil, nil, "test")).to be_missing
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns true for missing topic" do
|
||||||
|
expect(QuoteComparer.new(nil, post.post_number, "test")).to be_missing
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns true for missing post" do
|
||||||
|
expect(QuoteComparer.new(post.topic_id, nil, "test")).to be_missing
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns false for only missing text" do
|
||||||
|
expect(QuoteComparer.new(post.topic_id, post.post_number, nil)).to_not be_missing
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns false for no missing topic and post" do
|
||||||
|
expect(QuoteComparer.new(post.topic_id, post.post_number, "test")).to_not be_missing
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "#modified?" do
|
describe "#modified?" do
|
||||||
fab!(:post) { Fabricate(:post, raw: "This has **text** we _are_ matching") }
|
fab!(:post) { Fabricate(:post, raw: "This has **text** we _are_ matching") }
|
||||||
|
|
||||||
@ -11,10 +35,6 @@ describe QuoteComparer do
|
|||||||
QuoteComparer.new(post.topic_id, post.post_number, text)
|
QuoteComparer.new(post.topic_id, post.post_number, text)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns true for no post" do
|
|
||||||
expect(QuoteComparer.new(nil, nil, "test")).to be_modified
|
|
||||||
end
|
|
||||||
|
|
||||||
it "returns true for nil text" do
|
it "returns true for nil text" do
|
||||||
expect(qc(nil)).to be_modified
|
expect(qc(nil)).to be_modified
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user