X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/575435e1d6c772414286d891fbeb2956cd7f6753..ea72ab1c5af777c4ad75937bda6a5ec6adcd77a3:/src/smartxml/smartxml.js?ds=sidebyside diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index 41e8e19..3ff9df7 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -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');