smartxml: Getting rid of nodeMoved event in favor of `move` flag on nodeDetached...
[fnpeditor.git] / src / smartxml / smartxml.js
index e2cdc9b..cfae7c7 100644 (file)
@@ -122,22 +122,27 @@ $.extend(DocumentNode.prototype, {
         return myIdx < parentContents.length - 1 ? parentContents[myIdx+1] : null;
     },
 
-    isSurroundedByTextElements: function() {
-        var prev = this.prev(),
-            next = this.next();
-        return prev && (prev.nodeType === Node.TEXT_NODE) && next && (next.nodeType === Node.TEXT_NODE);
+    isSurroundedByTextNodes: function() {
+        return this.isPrecededByTextNode() && this.isFollowedByTextNode();
+    },
+
+    isPrecededByTextNode: function() {
+        var prev = this.prev();
+        return prev && prev.nodeType === Node.TEXT_NODE;
+    },
+
+    isFollowedByTextNode: function() {
+        var next = this.next();
+        return next && next.nodeType === Node.TEXT_NODE;
     },
 
     triggerChangeEvent: function(type, metaData, origParent, nodeWasContained) {
         var node = (metaData && metaData.node) ? metaData.node : this,
             event = new events.ChangeEvent(type, $.extend({node: node}, metaData || {}));
         if(type === 'nodeDetached' || this.document.containsNode(event.meta.node)) {
-            if(type === 'nodeMoved') {
-                event.meta.parent = origParent;
-            }
             this.document.trigger('change', event);
         }
-        if((type === 'nodeAdded' || type === 'nodeMoved') && !this.document.containsNode(this) && nodeWasContained) {
+        if(type === 'nodeAdded' && !this.document.containsNode(this) && nodeWasContained) {
              event = new events.ChangeEvent('nodeDetached', {node: node, parent: origParent});
              this.document.trigger('change', event);
         }
@@ -168,12 +173,16 @@ ElementNode.prototype = Object.create(DocumentNode.prototype);
 $.extend(ElementNode.prototype, {
     nodeType: Node.ELEMENT_NODE,
 
-    setData: function(key, value) {
-        if(value !== undefined) {
-            this._$.data(key, value);
+    setData: function(arg1, arg2) {
+        if(arguments.length === 2) {
+            if(_.isUndefined(arg2)) {
+                this._$.removeData(arg1);
+            } else {
+                this._$.data(arg1, arg2);
+            }
         } else {
             this._$.removeData(_.keys(this._$.data()));
-            this._$.data(key);
+            this._$.data(arg1);
         }
     },
 
@@ -223,6 +232,22 @@ $.extend(ElementNode.prototype, {
         return node && (node.nativeNode === this.nativeNode || node._$.parents().index(this._$) !== -1);
     },
 
+    getLastTextNode: function() {
+        var contents = this.contents(),
+            toret;
+
+        contents.reverse().some(function(node) {
+            if(node.nodeType === Node.TEXT_NODE) {
+                toret = node;
+                return true;
+            }
+            toret = node.getLastTextNode();
+            return !!toret;
+        });
+
+        return toret;
+    },
+
     toXML: function() {
         var wrapper = $('<div>');
         wrapper.append(this._getXMLDOMToDump());