From 4b8d9f5a41bec88d60484923ea1136409066249d Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Fri, 12 Sep 2014 20:10:14 +0200 Subject: [PATCH] Fixed quote insertion and inline error visuals --- .../js/3rdParty/redactor/plugins/wbbcode.js | 143 ++++++++++-------- wcfsetup/install/files/js/WCF.Message.js | 1 + wcfsetup/install/files/style/redactor.less | 2 +- 3 files changed, 86 insertions(+), 60 deletions(-) diff --git a/wcfsetup/install/files/js/3rdParty/redactor/plugins/wbbcode.js b/wcfsetup/install/files/js/3rdParty/redactor/plugins/wbbcode.js index 4680e221e4..44f037c4b1 100644 --- a/wcfsetup/install/files/js/3rdParty/redactor/plugins/wbbcode.js +++ b/wcfsetup/install/files/js/3rdParty/redactor/plugins/wbbcode.js @@ -8,6 +8,8 @@ if (!RedactorPlugins) var RedactorPlugins = {}; * @license GNU Lesser General Public License */ RedactorPlugins.wbbcode = { + wBlockTest: /^(BLOCKQUOTE|DIV)$/, + /** * Initializes the RedactorPlugins.wbbcode plugin. */ @@ -156,6 +158,7 @@ RedactorPlugins.wbbcode = { else { this._convertToHtml(); this.toggleVisual(); + this.fixQuoteContent(); this._observeQuotes(); this.buttonGet('html').children('i').removeClass('fa-square').addClass('fa-square-o'); @@ -658,74 +661,96 @@ RedactorPlugins.wbbcode = { // insert quotes if ($.getLength($cachedQuotes)) { // [quote] - var $unquoteString = function(quotedString) { - return quotedString.replace(/^['"]/, '').replace(/['"]$/, ''); - }; + for (var $key in $cachedQuotes) { + var $regex = new RegExp('@@' + $key + '@@', 'g'); + data = data.replace($regex, this.transformQuote($cachedQuotes[$key])); + } + } + + WCF.System.Event.fireEvent('com.woltlab.wcf.redactor', 'afterConvertToHtml', { data: data }); + + this.$source.val(data); + }, + + unquoteString: function(quotedString) { + return quotedString.replace(/^['"]/, '').replace(/['"]$/, ''); + }, + + transformQuote: function(quote) { + var self = this; + quote = quote.replace(/\[quote([^\]]+)?\]/gi, function(match, attributes, innerContent) { + var $author = ''; + var $link = ''; - var self = this; - var $transformQuote = function(quote) { - return quote.replace(/\[quote([^\]]+)?\]([\S\s]*)\[\/quote\]?/gi, $.proxy(function(match, attributes, innerContent) { - var $author = ''; - var $link = ''; + if (attributes) { + attributes = attributes.substr(1); + attributes = attributes.split(','); + + switch (attributes.length) { + case 1: + $author = attributes[0]; + break; - if (attributes) { - attributes = attributes.substr(1); - attributes = attributes.split(','); - - switch (attributes.length) { - case 1: - $author = attributes[0]; - break; - - case 2: - $author = attributes[0]; - $link = attributes[1]; - break; - } - - $author = WCF.String.escapeHTML($unquoteString($.trim($author))); - $link = WCF.String.escapeHTML($unquoteString($.trim($link))); + case 2: + $author = attributes[0]; + $link = attributes[1]; + break; + } + + $author = WCF.String.escapeHTML(self.unquoteString($.trim($author))); + $link = WCF.String.escapeHTML(self.unquoteString($.trim($link))); + } + + var $quote = '
' + + '
' + + '
' + + '

' + + self._buildQuoteHeader($author, $link) + + '

' + + '' + + '
' + + '
'; + + return $quote; + }); + + return quote.replace(/\[\/quote\]/gi, '
'); + }, + + /** + * Fixes quote content by converting newlines into own paragraphs. + */ + fixQuoteContent: function() { + var $count = this.$editor.find('.redactorQuoteContent').length; + var self = this; + while ($count > 0) { + var $content = this.$editor.find('.redactorQuoteContent:eq(0)').removeClass('redactorQuoteContent'); + $content.contents().each(function(index, node) { + if (node.nodeType === Element.ELEMENT_NODE) { + if (self.opts.rBlockTest.test(this.tagName) || self.wBlockTest.test(this.tagName)) { + $(node).wrap('
'); } + } + else if (node.nodeType === Element.TEXT_NODE) { + var $node = $(node); - var $quote = '
' - + '
' - + '
' - + '

' - + self._buildQuoteHeader($author, $link) - + '

' - + '' - + '
'; - - innerContent = $.trim(innerContent); - var $tmp = ''; - - if (innerContent.length) { - var $lines = innerContent.split('\n'); - - for (var $i = 0; $i < $lines.length; $i++) { - $tmp += '
' + $lines[$i] + '
'; + // split text nodes + var $parts = node.nodeValue.split(/\n/); + for (var $i = 0; $i < $parts.length; $i++) { + var $part = $.trim($parts[$i]); + if (!$part.length) { + $part = self.opts.invisibleSpace; } + + $('
' + $part + '
').insertAfter($node); } - else { - $tmp = '
' + self.opts.invisibleSpace + '
'; - } - - $quote += $tmp; - $quote += '
'; - return $quote; - }, this)); - }; + $node.remove(); + } + }); - for (var $key in $cachedQuotes) { - var $regex = new RegExp('@@' + $key + '@@', 'g'); - data = data.replace($regex, $transformQuote($cachedQuotes[$key])); - } + $count--; } - - WCF.System.Event.fireEvent('com.woltlab.wcf.redactor', 'afterConvertToHtml', { data: data }); - - this.$source.val(data); }, /** diff --git a/wcfsetup/install/files/js/WCF.Message.js b/wcfsetup/install/files/js/WCF.Message.js index 1a45ed3c58..fd6119cfd5 100644 --- a/wcfsetup/install/files/js/WCF.Message.js +++ b/wcfsetup/install/files/js/WCF.Message.js @@ -893,6 +893,7 @@ WCF.Message.QuickReply = Class.extend({ this._messageField.redactor('selectionEndOfEditor'); this._messageField.redactor('insertDynamic', $html, data.returnValues.template); + this._messageField.redactor('fixQuoteContent'); } else { this._messageField.val(data.returnValues.template); diff --git a/wcfsetup/install/files/style/redactor.less b/wcfsetup/install/files/style/redactor.less index 411cc1ff4c..804e203752 100644 --- a/wcfsetup/install/files/style/redactor.less +++ b/wcfsetup/install/files/style/redactor.less @@ -60,7 +60,7 @@ border-radius: 0; box-shadow: none; display: block; - margin-top: -1px; + margin: -1px; } } -- 2.20.1