smartxml: allow for removing node data for a specified key
[fnpeditor.git] / src / smartxml / smartxml.js
index 08897cc..de70e9b 100644 (file)
@@ -79,6 +79,10 @@ $.extend(DocumentNode.prototype, {
         return this.document.root.sameNode(this);
     },
 
+    isInDocument: function() {
+        return this.document.containsNode(this);
+    },
+
     isSiblingOf: function(node) {
         return node && this.parent().sameNode(node.parent());
     },
@@ -118,10 +122,18 @@ $.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) {
@@ -165,8 +177,12 @@ $.extend(ElementNode.prototype, {
     nodeType: Node.ELEMENT_NODE,
 
     setData: function(key, value) {
-        if(value !== undefined) {
-            this._$.data(key, value);
+        if(arguments.length === 2) {
+            if(_.isUndefined(value)) {
+                this._$.removeData(key);
+            } else {
+                this._$.data(key, value);
+            }
         } else {
             this._$.removeData(_.keys(this._$.data()));
             this._$.data(key);
@@ -219,6 +235,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());
@@ -243,6 +275,11 @@ $.extend(TextNode.prototype, {
         return this.nativeNode.data;
     },
 
+
+    containsNode: function() {
+        return false;
+    },
+
     triggerTextChangeEvent: function() {
         var event = new events.ChangeEvent('nodeTextChange', {node: this});
         this.document.trigger('change', event);