From 575435e1d6c772414286d891fbeb2956cd7f6753 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Wed, 4 Dec 2013 17:11:55 +0100 Subject: [PATCH] wip: refactoring method/transformation registration out of wlxml.js to smartxml - ver2 --- src/smartxml/smartxml.js | 241 ++++++++++++++++++---------------- src/smartxml/smartxml.test.js | 82 ++++++------ src/wlxml/wlxml.js | 71 ++++------ src/wlxml/wlxml.test.js | 5 + 4 files changed, 198 insertions(+), 201 deletions(-) diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index 8110a97..41e8e19 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -38,8 +38,6 @@ var DocumentNode = function(nativeNode, document) { $.extend(DocumentNode.prototype, { - transformations: new transformations.TransformationStorage(), - transform: function(name, args) { var Transformation = this.transformations.get(name), transformation; @@ -386,56 +384,56 @@ $.extend(ElementNode.prototype, { // 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(); - } -})); +// 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(); +// } +// })); /// @@ -526,51 +524,51 @@ $.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; - } -})); +// 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) { @@ -583,13 +581,14 @@ var Document = function(xml) { this.redoStack = []; this._transformationLevel = 0; this.transformations = new transformations.TransformationStorage(); - + + this._nodeMethods = {}; + this._nodeTransformations = new transformations.TransformationStorage(); }; $.extend(Document.prototype, Backbone.Events, { ElementNodeFactory: ElementNode, TextNodeFactory: TextNode, - transformations: new transformations.TransformationStorage(), createDocumentNode: function(from) { if(!(from instanceof Node)) { @@ -612,7 +611,10 @@ $.extend(Document.prototype, Backbone.Events, { } else if(from.nodeType === Node.ELEMENT_NODE) { Factory = this.ElementNodeFactory; } - return new Factory(from, this); + var toret = new Factory(from, this); + _.extend(toret, this._nodeMethods); + toret.transformations = this._nodeTransformations; + return toret; }, loadXML: function(xml, options) { @@ -761,6 +763,23 @@ $.extend(Document.prototype, Backbone.Events, { return insertion.ofNode; }, + registerMethod: function(methodName, method) { + this[methodName] = method; + }, + + registerTransformation: function(Transformation) { + return this.transformations.register(Transformation); + }, + + registerNodeMethod: function(methodName, method) { + this._nodeMethods[methodName] = method; + }, + + registerNodeTransformation: function(Transformation) { + this._nodeTransformations.register(Transformation); + }, + + transform: function(transformation, args) { //console.log('transform'); var Transformation, toret; @@ -817,19 +836,19 @@ var defineDocumentProperties = function(doc, $document) { }, configurable: true}); }; -Document.prototype.transformations.register(transformations.createContextTransformation({ - name: 'smartxml.wrapNodes', - // init: function() { +// Document.prototype.transformations.register(transformations.createContextTransformation({ +// name: 'smartxml.wrapNodes', +// // init: function() { - // }, - // getChangeRoot: function() { - // return this.context; - // }, - impl: function(args) { - this.wrapNodes(args); - }, +// // }, +// // getChangeRoot: function() { +// // return this.context; +// // }, +// impl: function(args) { +// this.wrapNodes(args); +// }, -})); +// })); return { diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index c7cb6ad..ca72e75 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -827,63 +827,63 @@ describe('smartxml', function() { }); }); - describe('Undo/redo', function() { + // describe('Undo/redo', function() { - it('does work', function() { - var doc = getDocumentFromXML('
Alice
'), - span = doc.root.contents()[0]; + // it('does work', function() { + // var doc = getDocumentFromXML('
Alice
'), + // span = doc.root.contents()[0]; - span.transform('smartxml.detach'); + // span.transform('smartxml.detach'); - doc.undo(); + // doc.undo(); - expect(doc.root.contents()).to.have.length(1); - expect(doc.root.contents()[0].getTagName()).to.equal('span'); - expect(doc.root.contents()[0].contents()[0].getText()).to.equal('Alice'); + // expect(doc.root.contents()).to.have.length(1); + // expect(doc.root.contents()[0].getTagName()).to.equal('span'); + // expect(doc.root.contents()[0].contents()[0].getText()).to.equal('Alice'); - doc.redo(); - expect(doc.root.contents()).to.have.length(0); + // doc.redo(); + // expect(doc.root.contents()).to.have.length(0); - doc.undo(); - expect(doc.root.contents()).to.have.length(1); - expect(doc.root.contents()[0].getTagName()).to.equal('span'); - expect(doc.root.contents()[0].contents()[0].getText()).to.equal('Alice'); + // doc.undo(); + // expect(doc.root.contents()).to.have.length(1); + // expect(doc.root.contents()[0].getTagName()).to.equal('span'); + // expect(doc.root.contents()[0].contents()[0].getText()).to.equal('Alice'); - }); - it('does work - merged text nodes case', function() { - var doc = getDocumentFromXML('
Alice has a cat.
'), - span = doc.root.contents()[1]; + // }); + // it('does work - merged text nodes case', function() { + // var doc = getDocumentFromXML('
Alice has a cat.
'), + // span = doc.root.contents()[1]; - span.transform('smartxml.detach'); + // span.transform('smartxml.detach'); - doc.undo(); + // doc.undo(); - expect(doc.root.contents().length).to.equal(3); - //console.log(doc.toXML()); - expect(doc.root.contents()[1].contents()[0].getText()).to.equal('has'); + // expect(doc.root.contents().length).to.equal(3); + // //console.log(doc.toXML()); + // expect(doc.root.contents()[1].contents()[0].getText()).to.equal('has'); - }); - it('dbg - don not store nodes in tranformation state!', function() { - var doc = getDocumentFromXML('
'), - a = doc.root.contents()[0], - b = doc.root.contents()[1]; + // }); + // it('dbg - don not store nodes in tranformation state!', function() { + // var doc = getDocumentFromXML('
'), + // a = doc.root.contents()[0], + // b = doc.root.contents()[1]; - a.transform('smartxml.detach'); - b.transform('smartxml.detach'); - doc.undo(); - doc.undo(); - expect(doc.root.contents().length).to.equal(2); - expect(doc.root.contents()[0].getTagName()).to.equal('a'); - expect(doc.root.contents()[1].getTagName()).to.equal('b'); + // a.transform('smartxml.detach'); + // b.transform('smartxml.detach'); + // doc.undo(); + // doc.undo(); + // expect(doc.root.contents().length).to.equal(2); + // expect(doc.root.contents()[0].getTagName()).to.equal('a'); + // expect(doc.root.contents()[1].getTagName()).to.equal('b'); - doc.redo(); - doc.redo(); - expect(doc.root.contents().length).to.equal(0); + // doc.redo(); + // doc.redo(); + // expect(doc.root.contents().length).to.equal(0); - }); - }); + // }); + // }); }); diff --git a/src/wlxml/wlxml.js b/src/wlxml/wlxml.js index 8d99cde..7c5207a 100644 --- a/src/wlxml/wlxml.js +++ b/src/wlxml/wlxml.js @@ -137,15 +137,15 @@ $.extend(WLXMLElementNode.prototype, smartxml.ElementNode.prototype, { } }); -WLXMLElementNode.prototype.transformations.register(transformations.createContextTransformation({ - name: 'wlxml.setMetaAttribute', - impl: function(args) { - this.setMetaAttribute(args.name, args.value); - }, - getChangeRoot: function() { - return this.context; - } -})); +// WLXMLElementNode.prototype.transformations.register(transformations.createContextTransformation({ +// name: 'wlxml.setMetaAttribute', +// impl: function(args) { +// this.setMetaAttribute(args.name, args.value); +// }, +// getChangeRoot: function() { +// return this.context; +// } +// })); @@ -158,36 +158,6 @@ var WLXMLDocument = function(xml, options) { smartxml.Document.call(this, xml); this.options = options; - // this.DocumentNodeFactory = function() { - // WLXMLDocumentNode.apply(this, arguments); - // }; - - // this.DocumentNodeFactory.prototype = Object.create(WLXMLDocumentNode.prototype); - - this.ElementNodeFactory = function() { - WLXMLElementNode.apply(this, arguments); - } - this.ElementNodeFactory.prototype = Object.create(WLXMLElementNode.prototype); - this.ElementNodeFactory.prototype.transformations = new transformations.TransformationStorage(); - this.ElementNodeFactory.prototype.registerTransformation = function(Transformation) { - return this.transformations.register(Transformation); - }; - this.ElementNodeFactory.prototype.registerMethod = function(methodName, method) { - this[methodName] = method; - }; - - this.TextNodeFactory = function() { - smartxml.TextNode.apply(this, arguments); - } - this.TextNodeFactory.prototype = Object.create(smartxml.TextNode.prototype); - this.TextNodeFactory.prototype.transformations = new transformations.TransformationStorage(); - this.TextNodeFactory.prototype.registerTransformation = function(Transformation) { - return this.transformations.register(Transformation); - }; - this.TextNodeFactory.prototype.registerMethod = function(methodName, method) { - this[methodName] = method; - }; - this.classMethods = {}; this.classTransformations = {}; }; @@ -285,14 +255,6 @@ $.extend(WLXMLDocument.prototype, { this.trigger('contentSet'); }, - registerMethod: function(methodName, method) { - this[methodName] = method; - }, - - registerTransformation: function(Transformation) { - return this.transformations.register(Transformation); - }, - registerClassTransformation: function(Transformation, className) { var thisClassTransformations = (this.classTransformations[className] = this.classTransformations[className] || new transformations.TransformationStorage()); return thisClassTransformations.register(Transformation); @@ -338,7 +300,12 @@ $.extend(WLXMLDocument.prototype, { ); } targets.forEach(function(target) { - target.registerMethod(methodName, method) + if(target === doc) { + target.registerMethod(methodName, method); + } else { + doc.registerNodeMethod(methodName, method); + } + }); }); } @@ -348,7 +315,13 @@ $.extend(WLXMLDocument.prototype, { var transformation = getTrans(pair[1], pair[0]), targets = _.isArray(mapping.target) ? mapping.target : [mapping.target]; targets.forEach(function(target) { - target.registerTransformation(transformations.createContextTransformation(transformation)); + if(target === doc) { + target.registerTransformation(transformations.createContextTransformation(transformation)); + } else { + doc.registerNodeTransformation(transformations.createContextTransformation(transformation)); + } + + }); }); } diff --git a/src/wlxml/wlxml.test.js b/src/wlxml/wlxml.test.js index e2c11fa..480ca1c 100644 --- a/src/wlxml/wlxml.test.js +++ b/src/wlxml/wlxml.test.js @@ -303,6 +303,11 @@ describe('WLXMLDocument', function() { }}}; doc.registerExtension(extension); + + /* refresh */ + elementNode = doc.root; + textNode = doc.root.contents()[0]; + expect(elementNode.testMethod().sameNode(elementNode)).to.equal(true, 'context is set to a node instance'); expect(textNode.testMethod().sameNode(textNode)).to.equal(true, 'context is set to a node instance'); }); -- 2.20.1