this._transformationLevel = 0;
this._nodeMethods = {};
+ this._textNodeMethods = {};
+ this._elementNodeMethods = {};
this._nodeTransformations = {};
};
from = node[0];
}
}
- var Factory;
+ var Factory, typeMethods;
if(from.nodeType === Node.TEXT_NODE) {
Factory = this.TextNodeFactory;
+ typeMethods = this._textNodeMethods;
} else if(from.nodeType === Node.ELEMENT_NODE) {
Factory = this.ElementNodeFactory;
+ typeMethods = this._elementNodeMethods;
}
var toret = new Factory(from, this);
_.extend(toret, this._nodeMethods);
+ _.extend(toret, typeMethods);
_.extend(toret, this._nodeTransformations);
return toret;
},
return insertion.ofNode;
},
- registerMethod: function(methodName, method) {
- registerMethod(methodName, method, this);
- },
-
- registerNodeMethod: function(methodName, method) {
- registerMethod(methodName, method, this._nodeMethods);
+ registerMethod: function(methodName, method, dstName) {
+ var doc = this;
+ var destination = {
+ document: doc,
+ documentNode: doc._nodeMethods,
+ textNode: doc._textNodeMethods,
+ elementNode: doc._elementNodeMethods
+ }[dstName];
+ registerMethod(methodName, method, destination);
},
registerDocumentTransformation: function(desc, name) {
var doc = this,
existingPropertyNames = _.values(this);
- ['document', 'documentNode'].forEach(function(dstName) {
+ ['document', 'documentNode', 'elementNode', 'textNode'].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);
+ method = pair[1];
+
+ doc.registerMethod(methodName, method, dstName);
});
}
expect(function() {
doc.testTransformation();
}).to.throw(Error);
+
expect(doc.testMethod).to.be.undefined;
expect(elementNode.testMethod).to.be.undefined;
expect(textNode.testMethod).to.be.undefined;
+ expect(elementNode.elementTestMethod).to.be.undefined;
+ expect(textNode.textTestMethod).to.be.undefined;
});
it('allows adding method to a document', function() {
});
it('allows adding method to a DocumentNode instance', function() {
- extension = {documentNode: {methods: {
- testMethod: function() { return this; }
- }}};
+ extension = {
+ documentNode: {
+ methods: {
+ testMethod: function() { return this; }
+ }
+ },
+ textNode: {
+ methods: {
+ textTestMethod: function() { return this; }
+ }
+ },
+ elementNode: {
+ methods: {
+ elementTestMethod: function() { return this; }
+ }
+ }
+ };
doc.registerExtension(extension);
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');
+
+ expect(elementNode.elementTestMethod().sameNode(elementNode)).to.be.true;
+ expect(elementNode.textTestMethod).to.be.undefined;
+
+ expect(textNode.textTestMethod().sameNode(textNode)).to.be.true;
+ expect(textNode.elementTestMethod).to.be.undefined;
});
it('allows adding transformation to a DocumentNode', function() {