smartxml: refactor
[fnpeditor.git] / src / smartxml / smartxml.js
index 40f3aad..637fda6 100644 (file)
@@ -82,6 +82,12 @@ $.extend(DocumentNode.prototype, {
         return myIdx < parentContents.length - 1 ? parentContents[myIdx+1] : null;
     },
 
+    isSurroundedByTextElements: function() {
+        var prev = this.prev(),
+            next = this.next();
+        return prev && (prev.nodeType === Node.TEXT_NODE) && next && (next.nodeType === Node.TEXT_NODE);
+    },
+
     after: INSERTION(function(nativeNode) {
         return this._$.after(nativeNode);
     }),
@@ -91,13 +97,28 @@ $.extend(DocumentNode.prototype, {
     }),
 
     wrapWith: function(node) {
-        node = node instanceof ElementNode ? node : this.document.createElementNode(node);
-
+        var insertion = this.getNodeInsertion(node);
         if(this.parent()) {
-            this.before(node);
+            this.before(insertion.ofNode);
+        }
+        insertion.ofNode.append(this);
+        return insertion.ofNode;
+    },
+
+    /**
+    * Removes parent of a node if node has no siblings.
+    */
+    unwrap: function() {
+        if(this.isRoot()) {
+            return;
+        }
+        var parent = this.parent(),
+            grandParent;
+        if(parent.contents().length === 1) {
+            grandParent = parent.parent();
+            parent.unwrapContent();
+            return grandParent;
         }
-        node.append(this);
-        return node;
     },
 
     triggerChangeEvent: function(type, metaData) {
@@ -120,6 +141,9 @@ $.extend(DocumentNode.prototype, {
     },
 
     getIndex: function() {
+        if(this.isRoot()) {
+            return 0;
+        }
         return this.parent().indexOf(this);
     }
 });
@@ -133,13 +157,11 @@ $.extend(ElementNode.prototype, {
     nodeType: Node.ELEMENT_NODE,
 
     detach: function() {
-        var prev = this.prev(),
+        var next;
+        if(parent && this.isSurroundedByTextElements()) {
             next = this.next();
-        if(parent) {
-            if(prev && prev.nodeType === Node.TEXT_NODE && next && next.nodeType === Node.TEXT_NODE) {
-                prev.appendText(next.getText());
-                next.detach();
-            }
+            this.prev().appendText(next.getText());
+            next.detach();
         }
         return DocumentNode.prototype.detach.call(this);
     },
@@ -235,18 +257,20 @@ $.extend(ElementNode.prototype, {
             return;
         }
 
-        var parentContents = parent.contents(),
-            myContents = this.contents(),
+        var myContents = this.contents(),
             myIdx = parent.indexOf(this);
 
+
         if(myContents.length === 0) {
             return this.detach();
         }
 
-        var moveLeftRange, moveRightRange, leftMerged;
+        var prev = this.prev(),
+            next = this.next(),
+            moveLeftRange, moveRightRange, leftMerged;
 
-        if(myIdx > 0 && (parentContents[myIdx-1].nodeType === TEXT_NODE) && (myContents[0].nodeType === TEXT_NODE)) {
-            parentContents[myIdx-1].appendText(myContents[0].getText());
+        if(prev && (prev.nodeType === TEXT_NODE) && (myContents[0].nodeType === TEXT_NODE)) {
+            prev.appendText(myContents[0].getText());
             myContents[0].detach();
             moveLeftRange = true;
             leftMerged = true;
@@ -255,9 +279,10 @@ $.extend(ElementNode.prototype, {
         }
 
         if(!(leftMerged && myContents.length === 1)) {
-            if(myIdx < parentContents.length - 1 && (parentContents[myIdx+1].nodeType === TEXT_NODE) && (myContents[myContents.length-1].nodeType === TEXT_NODE)) {
-                parentContents[myIdx+1].prependText(myContents[myContents.length-1].getText());
-                myContents[myContents.length-1].detach();
+            var lastContents = _.last(myContents);
+            if(next && (next.nodeType === TEXT_NODE) && (lastContents.nodeType === TEXT_NODE)) {
+                next.prependText(lastContents.getText());
+                lastContents.detach();
                 moveRightRange = true;
             }
         }
@@ -275,22 +300,6 @@ $.extend(ElementNode.prototype, {
         };
     },
 
-    /**
-    * Removes parent of a node if node has no siblings.
-    */
-    unwrap: function() {
-        if(this.isRoot()) {
-            return;
-        }
-        var parent = this.parent(),
-            grandParent;
-        if(parent.contents().length === 1) {
-            grandParent = parent.parent();
-            parent.unwrapContent();
-            return grandParent;
-        }
-    },
-
     wrapText: function(params) {
         return this.document._wrapText(_.extend({inside: this}, params));
     },