Merge in change to the Actions api
[fnpeditor.git] / src / smartxml / smartxml.js
index cfae7c7..a5a1abc 100644 (file)
@@ -17,12 +17,21 @@ var DocumentNode = function(nativeNode, document) {
         throw new Error('undefined document for a node');
     }
     this.document = document;
         throw new Error('undefined document for a node');
     }
     this.document = document;
+    this.object = {};
     this._setNativeNode(nativeNode);
 
 };
 
 $.extend(DocumentNode.prototype, {
 
     this._setNativeNode(nativeNode);
 
 };
 
 $.extend(DocumentNode.prototype, {
 
+    getProperty: function(propName) {
+        var toret = this.object[propName];
+        if(toret && _.isFunction(toret)) {
+            toret = toret.call(this);
+        }
+        return toret;
+    },
+
     transform: function(Transformation, args) {
         var transformation = new Transformation(this.document, this, args);
         return this.document.transform(transformation);
     transform: function(Transformation, args) {
         var transformation = new Transformation(this.document, this, args);
         return this.document.transform(transformation);
@@ -153,10 +162,14 @@ $.extend(DocumentNode.prototype, {
     },
 
     getIndex: function() {
     },
 
     getIndex: function() {
+        var parent;
+
         if(this.isRoot()) {
             return 0;
         }
         if(this.isRoot()) {
             return 0;
         }
-        return this.parent().indexOf(this);
+
+        parent = this.parent();
+        return parent ? parent.indexOf(this) : undefined;
     },
 
     getNearestElementNode: function() {
     },
 
     getNearestElementNode: function() {
@@ -286,7 +299,7 @@ $.extend(TextNode.prototype, {
 
 var parseXML = function(xml) {
     var toret = $($.trim(xml));
 
 var parseXML = function(xml) {
     var toret = $($.trim(xml));
-    if(!toret.length) {
+    if(toret.length !== 1) {
         throw new Error('Unable to parse XML: ' + xml);
     }
     return toret[0];
         throw new Error('Unable to parse XML: ' + xml);
     }
     return toret[0];
@@ -565,7 +578,6 @@ $.extend(Document.prototype, Backbone.Events, fragments, {
 
             if(transformations.length > 1) {
                 // In case of real transactions we don't want to run undo on all of transformations if we don't have to.
 
             if(transformations.length > 1) {
                 // In case of real transactions we don't want to run undo on all of transformations if we don't have to.
-                stopAt = undefined;
                 transformations.some(function(t, idx) {
                     if(!t.undo && t.getChangeRoot().sameNode(doc.root)) {
                         stopAt = idx;
                 transformations.some(function(t, idx) {
                     if(!t.undo && t.getChangeRoot().sameNode(doc.root)) {
                         stopAt = idx;
@@ -653,8 +665,11 @@ $.extend(Document.prototype, Backbone.Events, fragments, {
 
     getNodeByPath: function(path) {
         var toret = this.root;
 
     getNodeByPath: function(path) {
         var toret = this.root;
-        path.forEach(function(idx) {
+        path.some(function(idx) {
             toret = toret.contents()[idx];
             toret = toret.contents()[idx];
+            if(!toret) {
+                return true;
+            }
         });
         return toret;
     },
         });
         return toret;
     },