X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/0f5cbf957bc0bbdcff93bdb33c227f78041e332b..cee08f0b14be951a31544ae708b2a92f6255e61a:/src/smartxml/smartxml.js diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index 9215287..831a96a 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -38,12 +38,8 @@ var DocumentNode = function(nativeNode, document) { $.extend(DocumentNode.prototype, { - transform: function(name, args) { - var Transformation = this.transformations.get(name), - transformation; - if(Transformation) { - transformation = new Transformation(this.document, this, args); - } + transform: function(Transformation, args) { + var transformation = new Transformation(this.document, this, args); return this.document.transform(transformation); }, @@ -380,63 +376,6 @@ $.extend(ElementNode.prototype, { } }); -// trans - -// todo - split+append - -// ElementNode.prototype.transformations.register(transformations.createContextTransformation({ -// name: 'smartxml.setAttr', -// impl: function(args) { -// this.setAttr(args.name, args.value); -// }, -// getChangeRoot: function() { -// return this.context; -// } -// })); - -// ElementNode.prototype.transformations.register(transformations.createContextTransformation({ -// name: 'smartxml.setAttr2', -// impl: function(args) { -// this.prevAttr = this.getAttr(args.name); -// this.setAttr(args.name, args.value); -// }, -// undo: function(args) { -// this.setAttr(args.name, this.prevAttr); -// } -// })); - -// DocumentNode.prototype.transformations.register(transformations.createContextTransformation({ -// name: 'smartxml.wrapWith', -// getChangeRoot: function() { -// return this.context.parent(); -// }, -// impl: function(args) { -// return this.wrapWith(args); -// } -// })); - -// DocumentNode.prototype.transformations.register(transformations.createContextTransformation({ -// name: 'smartxml.wrapText', -// getChangeRoot: function() { -// return this.context; -// }, -// impl: function(args) { -// return this.wrapText(args); -// } -// })); - -// DocumentNode.prototype.transformations.register(transformations.createContextTransformation({ -// name: 'smartxml.detach', -// getChangeRoot: function() { -// return this.context.parent(); -// }, -// impl: function(args) { -// return this.detach(); -// } -// })); - -/// - var TextNode = function(nativeNode, document) { DocumentNode.call(this, nativeNode, document); }; @@ -524,66 +463,37 @@ $.extend(TextNode.prototype, { }); -// TextNode.prototype.transformations.register(transformations.createContextTransformation({ -// name: 'rng.breakContent', -// // impl: function(args) { -// // var node = this.context, -// // newNodes, emptyNode, emptyText; -// // newNodes = node.transform('smartxml.split', {offset: args.offset}); -// // [newNodes.first, newNodes.second].some(function(newNode) { -// // if(!(newNode.contents().length)) { -// // newNode.transform('smartxml.append', {text: ''}); -// // return true; // break -// // } -// // }); -// // return _.extend(newNodes, {emptyText: emptyText}); -// // }, -// impl: function(args) { -// var node = this, -// newNodes, emptyNode, emptyText; -// newNodes = node.split({offset: args.offset}); -// [newNodes.first, newNodes.second].some(function(newNode) { -// if(!(newNode.contents().length)) { -// newNode.append({text: ''}); -// return true; // break -// } -// }); -// return _.extend(newNodes, {emptyText: emptyText}); -// }, -// getChangeRoot: function() { -// return this.context.parent().parent(); -// }, -// isAllowed: function(args) { -// var parent = this.parent(); -// return !!(parent && parent.parent()); -// } -// })); - - -// ElementNode.prototype.transformations.register(transformations.createContextTransformation({ -// name: 'smartxml.setText', -// impl: function(args) { -// this.setText(args.text); -// }, -// getChangeRoot: function() { -// return this.context; -// } -// })); - - var parseXML = function(xml) { return $($.trim(xml))[0]; }; +var registerTransformation = function(desc, name, target) { + var Transformation = transformations.createContextTransformation(desc, name); + target[name] = function(args) { + var instance = this; + return instance.transform(Transformation, args); + } +}; + +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 = []; this.redoStack = []; this._transformationLevel = 0; - this.transformations = new transformations.TransformationStorage(); this._nodeMethods = {}; - this._nodeTransformations = new transformations.TransformationStorage(); + this._nodeTransformations = {}; }; $.extend(Document.prototype, Backbone.Events, { @@ -613,7 +523,7 @@ $.extend(Document.prototype, Backbone.Events, { } var toret = new Factory(from, this); _.extend(toret, this._nodeMethods); - toret.transformations = this._nodeTransformations; + _.extend(toret, this._nodeTransformations); return toret; }, @@ -764,19 +674,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); }, - registerNodeTransformation: function(Transformation) { - this._nodeTransformations.register(Transformation); + registerNodeTransformation: function(desc, name) { + registerTransformation(desc, name, this._nodeTransformations); }, registerExtension: function(extension) { @@ -784,74 +694,42 @@ $.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); }); } } }); }, - transform: function(transformation, args) { + transform: function(Transformation, args) { //console.log('transform'); - var Transformation, toret; - if(typeof transformation === 'string') { - Transformation = this.transformations.get(transformation); - if(Transformation) { - transformation = new Transformation(this, this, args); - } - } + var toret, transformation; + + if(typeof Transformation === 'function') { + transformation = new Transformation(this, this, args); + } else { + transformation = Transformation; + } if(transformation) { this._transformationLevel++; toret = transformation.run(); @@ -899,20 +777,6 @@ var defineDocumentProperties = function(doc, $document) { }, configurable: true}); }; -// Document.prototype.transformations.register(transformations.createContextTransformation({ -// name: 'smartxml.wrapNodes', -// // init: function() { - -// // }, -// // getChangeRoot: function() { -// // return this.context; -// // }, -// impl: function(args) { -// this.wrapNodes(args); -// }, - -// })); - return { documentFromXML: function(xml) {