X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/72da90cac0feafb35cac9292105e24f2b5094b45..46359b91eb01a6d5c43cedf477751e1ca6fea3e4:/src/smartxml/smartxml.js diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index 0e05293..e3c831d 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -6,7 +6,7 @@ define([ ], function($, _, Backbone, events) { 'use strict'; - +/* globals Node */ var TEXT_NODE = Node.TEXT_NODE; @@ -71,8 +71,18 @@ $.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; + return !!(otherNode) && this.nativeNode === otherNode.nativeNode; }, parent: function() { @@ -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() { @@ -182,7 +184,7 @@ $.extend(ElementNode.prototype, { detach: function() { var next; - if(parent && this.isSurroundedByTextElements()) { + if(this.parent() && this.isSurroundedByTextElements()) { next = this.next(); this.prev().appendText(next.getText()); next.detach(); @@ -270,6 +272,15 @@ $.extend(ElementNode.prototype, { this._$.prepend(nativeNode); }), + insertAtIndex: function(nativeNode, index) { + var contents = this.contents(); + if(index < contents.length) { + return contents[index].before(nativeNode); + } else if(index === contents.length) { + return this.append(nativeNode); + } + }, + unwrapContent: function() { var parent = this.parent(); if(!parent) { @@ -435,6 +446,7 @@ $.extend(Document.prototype, Backbone.Events, { createDocumentNode: function(from) { if(!(from instanceof Node)) { if(from.text !== undefined) { + /* globals document */ from = document.createTextNode(from.text); } else { var node = $('<' + from.tagName + '>'); @@ -472,17 +484,17 @@ $.extend(Document.prototype, Backbone.Events, { }, wrapNodes: function(params) { - if(!(params.element1.parent().sameNode(params.element2.parent()))) { + if(!(params.node1.parent().sameNode(params.node2.parent()))) { throw new Error('Wrapping non-sibling nodes not supported.'); } - var parent = params.element1.parent(), + var parent = params.node1.parent(), parentContents = parent.contents(), wrapper = this.createDocumentNode({ tagName: params._with.tagName, attrs: params._with.attrs}), - idx1 = parent.indexOf(params.element1), - idx2 = parent.indexOf(params.element2); + idx1 = parent.indexOf(params.node1), + idx2 = parent.indexOf(params.node2); if(idx1 > idx2) { var tmp = idx1; @@ -579,6 +591,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; } });