X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/0f5cbf957bc0bbdcff93bdb33c227f78041e332b..75d2183aafd4b2d3e94c17f6c3c8ee0d8a4738e4:/src/smartxml/smartxml.js?ds=sidebyside diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index 9215287..bb6258e 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -575,6 +575,22 @@ var parseXML = function(xml) { return $($.trim(xml))[0]; }; +var registerTransformation = function(desc, name, target) { + var Transformation = transformations.createContextTransformation(desc, name); + target.register(Transformation); +}; + +var registerMethod = function(methodName, method, target) { + if(target[methodName]) { + throw new Error('Cannot extend {target} with method name {methodName}. Name already exists.' + .replace('{target}', target) + .replace('{methodName}', methodName) + ); + } + target[methodName] = method; +}; + + var Document = function(xml) { this.loadXML(xml); this.undoStack = []; @@ -764,19 +780,19 @@ $.extend(Document.prototype, Backbone.Events, { }, registerMethod: function(methodName, method) { - this[methodName] = method; + registerMethod(methodName, method, this); }, - registerTransformation: function(Transformation) { - return this.transformations.register(Transformation); + registerNodeMethod: function(methodName, method) { + registerMethod(methodName, method, this._nodeMethods); }, - registerNodeMethod: function(methodName, method) { - this._nodeMethods[methodName] = method; + registerDocumentTransformation: function(desc, name) { + registerTransformation(desc, name, this.transformations); }, - registerNodeTransformation: function(Transformation) { - this._nodeTransformations.register(Transformation); + registerNodeTransformation: function(desc, name) { + registerTransformation(desc, name, this._nodeTransformations); }, registerExtension: function(extension) { @@ -784,59 +800,27 @@ $.extend(Document.prototype, Backbone.Events, { 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) { + ['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], - 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); - } - - }); + operation; + operation = {document: 'registerMethod', documentNode: 'registerNodeMethod'}[dstName]; + doc[operation](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)); - } - - - }); + 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); }); } }