X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/de1034273c0aa6897014dbfb6c6c92d809fd0556..06ff71dcb6c913a66280ebf812481224ee461f8c:/src/smartxml/smartxml.js diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index c176f08..05583c5 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -68,6 +68,20 @@ $.extend(DocumentNode.prototype, { return parents; }, + prev: function() { + var myIdx = this.getIndex(); + return myIdx > 0 ? this.parent().contents()[myIdx-1] : null; + }, + + next: function() { + if(this.isRoot()) { + return null; + } + var myIdx = this.getIndex(), + parentContents = this.parent().contents(); + return myIdx < parentContents.length - 1 ? parentContents[myIdx+1] : null; + }, + after: INSERTION(function(nativeNode) { return this._$.after(nativeNode); }), @@ -77,13 +91,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) { @@ -106,6 +135,9 @@ $.extend(DocumentNode.prototype, { }, getIndex: function() { + if(this.isRoot()) { + return 0; + } return this.parent().indexOf(this); } }); @@ -118,6 +150,18 @@ ElementNode.prototype = Object.create(DocumentNode.prototype); $.extend(ElementNode.prototype, { nodeType: Node.ELEMENT_NODE, + detach: function() { + var prev = this.prev(), + next = this.next(); + if(parent) { + if(prev && prev.nodeType === Node.TEXT_NODE && next && next.nodeType === Node.TEXT_NODE) { + prev.appendText(next.getText()); + next.detach(); + } + } + return DocumentNode.prototype.detach.call(this); + }, + setData: function(key, value) { if(value !== undefined) { this._$.data(key, value); @@ -213,6 +257,7 @@ $.extend(ElementNode.prototype, { myContents = this.contents(), myIdx = parent.indexOf(this); + if(myContents.length === 0) { return this.detach(); } @@ -249,22 +294,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)); },