smartxml: node.unwrap
authorAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Tue, 19 Nov 2013 10:25:22 +0000 (11:25 +0100)
committerAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Tue, 19 Nov 2013 10:25:22 +0000 (11:25 +0100)
src/smartxml/smartxml.js
src/smartxml/smartxml.test.js

index 0dd7082..c176f08 100644 (file)
@@ -36,6 +36,10 @@ $.extend(DocumentNode.prototype, {
         this._$ = $(nativeNode);
     },
 
         this._$ = $(nativeNode);
     },
 
+    isRoot: function() {
+        return this.document.root.sameNode(this);
+    },
+
     detach: function() {
         var parent = this.parent();
         this._$.detach();
     detach: function() {
         var parent = this.parent();
         this._$.detach();
@@ -245,6 +249,22 @@ $.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));
     },
     wrapText: function(params) {
         return this.document._wrapText(_.extend({inside: this}, params));
     },
index 2666ae2..09fdfeb 100644 (file)
@@ -302,6 +302,19 @@ describe('smartxml', function() {
             expect(node.contents()[2].getText()).to.equal(' a cat!');
         });
 
             expect(node.contents()[2].getText()).to.equal(' a cat!');
         });
 
+        it('unwrap single node from its parent', function() {
+            var doc = getDocumentFromXML('<div><a><b></b></a></div>'),
+                div = doc.root,
+                a = div.contents()[0],
+                b = a.contents()[0];
+
+            var parent = b.unwrap();
+
+            expect(parent.sameNode(div)).to.equal(true, 'returns new parent');
+            expect(div.contents()).to.have.length(1, 'root contains only one node');
+            expect(div.contents()[0].sameNode(b)).to.equal(true, 'node got unwrapped');
+        });
+
         describe('Wrapping text', function() {
             it('wraps text spanning multiple sibling TextNodes', function() {
                 var section = elementNodeFromXML('<section>Alice has a <span>small</span> cat</section>'),
         describe('Wrapping text', function() {
             it('wraps text spanning multiple sibling TextNodes', function() {
                 var section = elementNodeFromXML('<section>Alice has a <span>small</span> cat</section>'),