refactor
[fnpeditor.git] / src / smartxml / smartxml.js
index 41e8e19..3ff9df7 100644 (file)
@@ -575,6 +575,12 @@ var parseXML = function(xml) {
     return $($.trim(xml))[0];
 };
 
+var registerTransformation = function(desc, name, target) {
+    var Transformation = transformations.createContextTransformation(desc, name);
+    target.register(Transformation);
+};
+
+
 var Document = function(xml) {
     this.loadXML(xml);
     this.undoStack = [];
@@ -764,21 +770,62 @@ $.extend(Document.prototype, Backbone.Events, {
     },
 
     registerMethod: function(methodName, method) {
+        if(this[methodName]) {
+            throw new Error('Cannot extend document with method name {methodName}. Name already exists.'
+                .replace('{methodName}', methodName)
+            );
+        }
         this[methodName] = method;
     },
 
-    registerTransformation: function(Transformation) {
-        return this.transformations.register(Transformation);
-    },
-
     registerNodeMethod: function(methodName, method) {
+        if(this._nodeMethods[methodName]) {
+            throw new Error('Cannot extend document with method name {methodName}. Name already exists.'
+                .replace('{methodName}', methodName)
+            );
+        }
         this._nodeMethods[methodName] = method;
     },
 
-    registerNodeTransformation: function(Transformation) {
-        this._nodeTransformations.register(Transformation);
+    registerDocumentTransformation: function(desc, name) {
+        registerTransformation(desc, name, this.transformations);
     },
 
+    registerNodeTransformation: function(desc, name) {
+        registerTransformation(desc, name, this._nodeTransformations);
+    },
+
+    registerExtension: function(extension) {
+        //debugger;
+        var doc = this,
+            existingPropertyNames = _.values(this);
+
+        ['document', 'documentNode'].forEach(function(dstName) {
+            var dstExtension = extension[dstName];
+            if(dstExtension) {
+                if(dstExtension.methods) {
+                    _.pairs(dstExtension.methods).forEach(function(pair) {
+                        var methodName = pair[0],
+                            method = pair[1],
+                            operation;
+                        operation = {document: 'registerMethod', documentNode: 'registerNodeMethod'}[dstName];
+                        doc[operation](methodName, method);
+
+                    });
+                }
+
+                if(dstExtension.transformations) {
+                    _.pairs(dstExtension.transformations).forEach(function(pair) {
+                        var name = pair[0],
+                            desc = pair[1],
+                            operation;
+                        operation = {document: 'registerDocumentTransformation', documentNode: 'registerNodeTransformation'}[dstName];
+                        doc[operation](desc, name);
+                    });
+                }
+            }
+        });
+    },
 
     transform: function(transformation, args) {
         //console.log('transform');