X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/575435e1d6c772414286d891fbeb2956cd7f6753..0f5cbf957bc0bbdcff93bdb33c227f78041e332b:/src/smartxml/smartxml.js?ds=sidebyside diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index 41e8e19..9215287 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -779,6 +779,69 @@ $.extend(Document.prototype, Backbone.Events, { this._nodeTransformations.register(Transformation); }, + registerExtension: function(extension) { + //debugger; + var doc = this, + existingPropertyNames = _.values(this); + + var getTrans = function(desc, methodName) { + if(typeof desc === 'function') { + desc = {impl: desc}; + } + if(!desc.impl) { + throw new Error('Got transformation description without implementation.') + } + desc.name = desc.name || methodName; + return desc; + }; + + [ + {source: extension.document, target: doc}, + {source: extension.documentNode, target: [doc.ElementNodeFactory.prototype, doc.TextNodeFactory.prototype]}, + + ].forEach(function(mapping) { + if(mapping.source) { + if(mapping.source.methods) { + existingPropertyNames = _.values(mapping.target) + _.pairs(mapping.source.methods).forEach(function(pair) { + var methodName = pair[0], + method = pair[1], + targets = _.isArray(mapping.target) ? mapping.target : [mapping.target]; + if(_.contains(existingPropertyNames, methodName)) { + throw new Error('Cannot extend {target} with method name {methodName}. Name already exists.' + .replace('{target}', mapping.target) + .replace('{methodName}', methodName) + ); + } + targets.forEach(function(target) { + if(target === doc) { + target.registerMethod(methodName, method); + } else { + doc.registerNodeMethod(methodName, method); + } + + }); + }); + } + + if(mapping.source.transformations) { + _.pairs(mapping.source.transformations).forEach(function(pair) { + var transformation = getTrans(pair[1], pair[0]), + targets = _.isArray(mapping.target) ? mapping.target : [mapping.target]; + targets.forEach(function(target) { + if(target === doc) { + target.registerTransformation(transformations.createContextTransformation(transformation)); + } else { + doc.registerNodeTransformation(transformations.createContextTransformation(transformation)); + } + + + }); + }); + } + } + }); + }, transform: function(transformation, args) { //console.log('transform');