From 518910a54d3a8189e6d3b8b327544f2779f856b4 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 13 Mar 2013 15:50:44 -0400 Subject: [PATCH] FIX: Don't include link counts when selecting text to quote a post. --- .../discourse/components/utilities.js | 32 ++++++++++----- .../controllers/quote_button_controller.js | 39 +++++++++++-------- .../discourse/views/quote_buton_view.js | 11 +++--- config/locales/client.en.yml | 1 + 4 files changed, 52 insertions(+), 31 deletions(-) diff --git a/app/assets/javascripts/discourse/components/utilities.js b/app/assets/javascripts/discourse/components/utilities.js index ce308a7db2e..fcfd4a55a5d 100644 --- a/app/assets/javascripts/discourse/components/utilities.js +++ b/app/assets/javascripts/discourse/components/utilities.js @@ -103,16 +103,30 @@ Discourse.Utilities = { }, selectedText: function() { - var t; - t = ''; - if (window.getSelection) { - t = window.getSelection().toString(); - } else if (document.getSelection) { - t = document.getSelection().toString(); - } else if (document.selection) { - t = document.selection.createRange().text; + var html = ''; + + if (typeof window.getSelection != "undefined") { + var sel = window.getSelection(); + if (sel.rangeCount) { + var container = document.createElement("div"); + for (var i = 0, len = sel.rangeCount; i < len; ++i) { + container.appendChild(sel.getRangeAt(i).cloneContents()); + } + html = container.innerHTML; + } + } else if (typeof document.selection != "undefined") { + if (document.selection.type == "Text") { + html = document.selection.createRange().htmlText; + } } - return String(t).trim(); + + // Strip out any .click elements from the HTML before converting it to text + var div = document.createElement('div'); + div.innerHTML = html; + $('.clicks', $(div)).remove(); + var text = div.textContent || div.innerText || ""; + + return String(text).trim(); }, // Determine the position of the caret in an element diff --git a/app/assets/javascripts/discourse/controllers/quote_button_controller.js b/app/assets/javascripts/discourse/controllers/quote_button_controller.js index 3c4e9d5e1b7..708c91d56b6 100644 --- a/app/assets/javascripts/discourse/controllers/quote_button_controller.js +++ b/app/assets/javascripts/discourse/controllers/quote_button_controller.js @@ -10,6 +10,11 @@ Discourse.QuoteButtonController = Discourse.Controller.extend({ needs: ['topic', 'composer'], started: null, + init: function() { + this._super(); + $LAB.script(assetPath('defer/html-sanitizer-bundle')); + }, + // If the buffer is cleared, clear out other state (post) bufferChanged: (function() { if (this.blank('buffer')) { @@ -35,6 +40,7 @@ Discourse.QuoteButtonController = Discourse.Controller.extend({ selectedText = Discourse.Utilities.selectedText(); if (this.get('buffer') === selectedText) return; if (this.get('lastSelected') === selectedText) return; + this.set('post', e.context); this.set('buffer', selectedText); top = e.pageY + 5; @@ -44,35 +50,33 @@ Discourse.QuoteButtonController = Discourse.Controller.extend({ top = this.started[1] - 50; left = ((left - this.started[0]) / 2) + this.started[0] - ($quoteButton.width() / 2); } - $quoteButton.css({ - top: top, - left: left - }); + $quoteButton.css({ top: top, left: left }); this.started = null; return false; }, - quoteText: function(e) { - var buffer, composerController, composerOpts, composerPost, post, quotedText, - _this = this; - e.stopPropagation(); - post = this.get('post'); - composerController = this.get('controllers.composer'); - composerOpts = { + /** + Quote the currently selected text + + @method quoteText + **/ + quoteText: function() { + var post = this.get('post'); + var composerController = this.get('controllers.composer'); + var composerOpts = { post: post, action: Discourse.Composer.REPLY, draftKey: this.get('post.topic.draft_key') }; // If the composer is associated with a different post, we don't change it. - if (composerPost = composerController.get('content.post')) { - if (composerPost.get('id') !== this.get('post.id')) { - composerOpts.post = composerPost; - } + var composerPost = composerController.get('content.post'); + if (composerPost && (composerPost.get('id') !== this.get('post.id'))) { + composerOpts.post = composerPost; } - buffer = this.get('buffer'); - quotedText = Discourse.BBCode.buildQuoteBBCode(post, buffer); + var buffer = this.get('buffer'); + var quotedText = Discourse.BBCode.buildQuoteBBCode(post, buffer); if (composerController.wouldLoseChanges()) { composerController.appendText(quotedText); } else { @@ -83,4 +87,5 @@ Discourse.QuoteButtonController = Discourse.Controller.extend({ this.set('buffer', ''); return false; } + }); diff --git a/app/assets/javascripts/discourse/views/quote_buton_view.js b/app/assets/javascripts/discourse/views/quote_buton_view.js index bc83b632e15..775bc5aeb51 100644 --- a/app/assets/javascripts/discourse/views/quote_buton_view.js +++ b/app/assets/javascripts/discourse/views/quote_buton_view.js @@ -11,7 +11,7 @@ Discourse.QuoteButtonView = Discourse.View.extend({ classNameBindings: ['hasBuffer'], render: function(buffer) { - buffer.push("quote reply"); + buffer.push(Em.String.i18n("post.quote_reply")); }, hasBuffer: (function() { @@ -25,17 +25,18 @@ Discourse.QuoteButtonView = Discourse.View.extend({ didInsertElement: function() { // Clear quote button if they click elsewhere - var _this = this; + var quoteButtonView = this; return $(document).bind("mousedown.quote-button", function(e) { if ($(e.target).hasClass('quote-button')) return; if ($(e.target).hasClass('create')) return; - _this.controller.mouseDown(e); - _this.set('controller.lastSelected', _this.get('controller.buffer')); - return _this.set('controller.buffer', ''); + quoteButtonView.controller.mouseDown(e); + quoteButtonView.set('controller.lastSelected', quoteButtonView.get('controller.buffer')); + return quoteButtonView.set('controller.buffer', ''); }); }, click: function(e) { + e.stopPropagation(); return this.get('controller').quoteText(e); } diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 53f52cc3785..92181ca3eab 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -517,6 +517,7 @@ en: post: reply: "Replying to {{link}} by {{replyAvatar}} {{username}}" reply_topic: "Reply to {{link}}" + quote_reply: "quote reply" edit: "Editing {{link}} by {{replyAvatar}} {{username}}" post_number: "post {{number}}" in_reply_to: "in reply to"