X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/97b2b3365d24475cbf61b3ad82c879911270f279..4ff93211ebf44be111ae2c00b7ee9c843ff6d7c9:/src/smartxml/core.js?ds=inline diff --git a/src/smartxml/core.js b/src/smartxml/core.js index 65b7852..ec2c643 100644 --- a/src/smartxml/core.js +++ b/src/smartxml/core.js @@ -13,7 +13,7 @@ var INSERTION = function(implementation) { nodeParent, returned; options = options || {}; - if(!(this.document.containsNode(this))) { + if(!(this.document.containsNode(this)) || !insertion.isNew) { nodeParent = insertion.ofNode.parent(); } returned = implementation.call(this, insertion.ofNode); @@ -431,6 +431,59 @@ var documentTransformations = { this._defineDocumentProperties(insertion.ofNode._$); insertion.ofNode.triggerChangeEvent('nodeAdded'); return insertion.ofNode; + }, + deleteText: function(params) { + var ptr, next, toDetach, middle, text; + + if(params.from.node.sameNode(params.to.node)) { + ptr = params.from.node; + text = ptr.getText(); + ptr.setText(text.substr(0, params.from.offset) + text.substr(params.to.offset)); + return; + } + + // Both edge text nodes need to be edited before anything else happen in case that + // they get merged when detaching content between them. + params.from.node.setText(params.from.node.getText().substr(0, params.from.offset)); + params.to.node.setText(params.to.node.getText().substr(params.to.offset)); + + ptr = params.from.node; + next = ptr.next(); + + while(next || ptr.parent()) { + if(next) { + if(next.sameNode(params.to.node)) { + return; + } + else if(next.nodeType === Node.ELEMENT_NODE && next.containsNode(params.to.node)) { + middle = next; + break; + } else { + toDetach = next; + next = next.next(); + toDetach.detach(); + } + } else { + ptr = ptr.parent(); + next = ptr.next(); + } + } + + if(!this.containsNode(params.to.node)) { + // The end node was merged during detaching nodes above - there is nothing more left to do. + return; + } + + ptr = middle.contents()[0]; + while(ptr && !ptr.sameNode(params.to.node)) { + if(ptr.nodeType === Node.ELEMENT_NODE && ptr.containsNode(params.to.node)) { + ptr = ptr.contents()[0]; + continue; + } else { + ptr = ptr.next(); + ptr.prev().detach(); + } + } } };