X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/cef69fff5322bdc7766d7063809694f6ee0e9e47..246796cf3b707c4c340edc7a1d51946fff8a278e:/src/smartxml/core.js?ds=inline diff --git a/src/smartxml/core.js b/src/smartxml/core.js index b40e9c3..f8b128d 100644 --- a/src/smartxml/core.js +++ b/src/smartxml/core.js @@ -121,10 +121,13 @@ var documentNodeTransformations = { var elementNodeTransformations = { detach: function(params) { - var next; - params = _.extend({ - normalizeStrategy: 'merge' - }, params); + var next, prev; + + params = params || {}; + + if(!params.normalizeStrategy) { + params.normalizeStrategy = 'merge'; + } if(this.parent() && this.isSurroundedByTextNodes()) { if(params.normalizeStrategy === 'detach-left') { @@ -133,7 +136,12 @@ var elementNodeTransformations = { this.next().detach(); } else if(params.normalizeStrategy === 'merge') { next = this.next(); - this.prev().appendText(next.getText()); + prev = this.prev(); + params.ret = { + mergedTo: prev, + previousLen: prev.getText().length + }; + prev.appendText(next.getText()); next.detach(); } else { throw new Error('unknown normalize strategy for detach'); @@ -161,7 +169,11 @@ var elementNodeTransformations = { setAttr: function(name, value, silent) { var oldVal = this.getAttr(name); - this._$.attr(name, value); + if(_.isUndefined(value)) { + this._$.removeAttr(name); + } else { + this._$.attr(name, value); + } if(!silent) { this.triggerChangeEvent('nodeAttrChange', {attr: name, oldVal: oldVal, newVal: value}); } @@ -351,7 +363,7 @@ var textNodeTransformations = { newElement.prepend({text: suffix}); } - return {first: parentElement, second: newElement}; + return {first: parentElement, second: newElement, created: newElement}; }, divideWithElementNode: function(node, params) { @@ -474,7 +486,7 @@ var documentTransformations = { return insertion.ofNode; }, deleteText: function(params) { - var ptr, next, toDetach, middle, text; + var ptr, next, nextNext, toDetach, middle, text; if(params.from.node.sameNode(params.to.node)) { ptr = params.from.node; @@ -502,7 +514,14 @@ var documentTransformations = { } else { toDetach = next; next = next.next(); - toDetach.detach(); + nextNext = next ? next.next() : null; + toDetach.detach({normalizeStrategy: (next && next.sameNode(params.to.node)) ? 'merge' : 'detach-right'}); + if(next && !next.isInDocument()) { + if(next.sameNode(params.to.node)) { + return; + } + next = nextNext; + } } } else { ptr = ptr.parent();