From: Aleksander Ɓukasz Date: Mon, 25 Nov 2013 15:54:31 +0000 (+0100) Subject: smartxml: DocumentNode.replaceWith X-Git-Url: https://git.mdrn.pl/fnpeditor.git/commitdiff_plain/e7d1ef97b3d612aaa64a4bc0742b7ede49e807d4 smartxml: DocumentNode.replaceWith --- diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index 0e05293..01a0a2a 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -71,6 +71,16 @@ $.extend(DocumentNode.prototype, { return this; }, + replaceWith: function(node) { + var toret; + if(this.isRoot()) { + return this.document.replaceRoot(node); + } + toret = this.after(node); + this.detach(); + return toret; + }, + sameNode: function(otherNode) { return otherNode && this.nativeNode === otherNode.nativeNode; }, @@ -153,15 +163,7 @@ $.extend(DocumentNode.prototype, { }, getNodeInsertion: function(node) { - var insertion = {}; - if(node instanceof DocumentNode) { - insertion.ofNode = node; - insertion.insertsNew = !this.document.containsNode(node); - } else { - insertion.ofNode = this.document.createDocumentNode(node); - insertion.insertsNew = true; - } - return insertion; + return this.document.getNodeInsertion(node); }, getIndex: function() { @@ -579,6 +581,26 @@ $.extend(Document.prototype, Backbone.Events, { trigger: function() { //console.log('trigger: ' + arguments[0] + (arguments[1] ? ', ' + arguments[1].type : '')); Backbone.Events.trigger.apply(this, arguments); + }, + + getNodeInsertion: function(node) { + var insertion = {}; + if(node instanceof DocumentNode) { + insertion.ofNode = node; + insertion.insertsNew = !this.containsNode(node); + } else { + insertion.ofNode = this.createDocumentNode(node); + insertion.insertsNew = true; + } + return insertion; + }, + + replaceRoot: function(node) { + var insertion = this.getNodeInsertion(node); + this.root.detach(); + defineDocumentProperties(this, insertion.ofNode._$); + insertion.ofNode.triggerChangeEvent('nodeAdded'); + return insertion.ofNode; } }); diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index 180fa87..cf7ef2a 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -304,6 +304,27 @@ describe('smartxml', function() { describe('Manipulations', function() { + describe('replacing node with another one', function() { + it('replaces node with another one', function() { + var doc = getDocumentFromXML('
'), + a = doc.root.contents()[0]; + + var c = a.replaceWith({tagName: 'b', attrs: {b:'1'}}); + + expect(doc.root.contents()[0].sameNode(c)); + expect(c.getTagName()).to.equal('b'); + expect(c.getAttr('b')).to.equal('1'); + }); + it('can replace document root', function() { + var doc = getDocumentFromXML('
'); + + var header = doc.root.replaceWith({tagName: 'header'}); + + expect(doc.root.sameNode(header)).to.be.true; + expect(doc.containsNode(header)).to.be.true; + }); + }); + it('merges adjacent text nodes resulting from detaching an element node in between', function() { var doc = getDocumentFromXML('
Alice hasa cat
'), span = doc.root.contents()[1]; @@ -653,6 +674,26 @@ describe('smartxml', function() { expect(event.type).to.equal('nodeMoved'); expect(event.meta.node.sameNode(inserted)).to.be.true; }); + + it('emits nodeDetached and nodeAdded when replacing root node with another', function() { + var doc = getDocumentFromXML(''), + oldRoot = doc.root, + spy = sinon.spy(); + + doc.on('change', spy); + + doc.root.replaceWith({tagName: 'b'}); + + expect(spy.callCount).to.equal(2); + + var event1 = spy.args[0][0], + event2 = spy.args[1][0]; + + expect(event1.type).to.equal('nodeDetached'); + expect(event1.meta.node.sameNode(oldRoot)).to.equal(true, 'root node in nodeDetached event metadata'); + expect(event2.type).to.equal('nodeAdded'); + expect(event2.meta.node.sameNode(doc.root)).to.equal(true, 'new root node in nodelAdded event meta'); + }); }); describe('Traversing', function() {