Fixed inserting smileys breaking out of current formatting
authorAlexander Ebert <ebert@woltlab.com>
Fri, 20 Feb 2015 22:44:50 +0000 (23:44 +0100)
committerAlexander Ebert <ebert@woltlab.com>
Fri, 20 Feb 2015 22:44:50 +0000 (23:44 +0100)
wcfsetup/install/files/js/3rdParty/redactor/plugins/wbbcode.js

index f91083bca7a8e464735bc955ff6150d94045463a..1335db8c4a56ab8c104674574fd9794fce4490a4 100644 (file)
@@ -199,7 +199,45 @@ RedactorPlugins.wbbcode = function() {
                        }
                        
                        if (this.opts.visual) {
-                               this.insert.html('&nbsp;<img src="' + smileyPath + '" class="smiley" alt="' + smileyCode + '" />&nbsp;', false);
+                               var $parentBefore = null;
+                               if (window.getSelection().rangeCount && window.getSelection().getRangeAt(0).collapsed) {
+                                       $parentBefore = window.getSelection().getRangeAt(0).startContainer;
+                                       if ($parentBefore.nodeType === Node.TEXT_NODE) {
+                                               $parentBefore = $parentBefore.parentElement;
+                                       }
+                                       
+                                       if (!this.utils.isRedactorParent($parentBefore)) {
+                                               $parentBefore = null;
+                                       }
+                               }
+                               
+                               this.insert.html('<img src="' + smileyPath + '" class="smiley" alt="' + smileyCode + '" id="redactorSmiley">', false);
+                               
+                               var $smiley = document.getElementById('redactorSmiley');
+                               if ($parentBefore !== null) {
+                                       var $currentParent = window.getSelection().getRangeAt(0).startContainer;
+                                       if ($currentParent.nodeType === Node.TEXT_NODE) {
+                                               $currentParent = $currentParent.parentElement;
+                                       }
+                                       
+                                       // smiley has been inserted outside the original caret parent, move
+                                       if ($parentBefore !== $currentParent) {
+                                               $parentBefore.appendChild($smiley);
+                                       }
+                               }
+                               
+                               // add spaces as paddings
+                               var $parent = $smiley.parentElement;
+                               var $node = document.createTextNode('\u00A0');
+                               $parent.insertBefore($node, $smiley);
+                               
+                               var $node = document.createTextNode('\u00A0');
+                               if ($parent.lastChild === $smiley) {
+                                       $parent.appendChild($node);
+                               }
+                               else {
+                                       $parent.insertBefore($node, $smiley.nextSibling);
+                               }
                        }
                        else {
                                this.wutil.insertAtCaret(' ' + smileyCode + ' ');