'use strict';
/* globals Node */
-var TEXT_NODE = Node.TEXT_NODE;
-
-
var DocumentNode = function(nativeNode, document) {
if(!document) {
clone: function() {
var clone = this._$.clone(true, true);
- // clone.find('*').addBack().each(function() {
- // var n = $(this);
- // if(n.data('canvasElement')) {
- // n.data('canvasElement', $.extend(true, {}, n.data('canvasElement')));
- // n.data('canvasElement').$element = n.data('canvasElement').$element.clone(true, true);
- // }
- // });
return this.document.createDocumentNode(clone[0]);
},
getPath: function(ancestor) {
+ if(!(this.document.containsNode(this))) {
+ return null;
+ }
+
var nodePath = [this].concat(this.parents()),
toret, idx;
ancestor = ancestor || this.document.root;
var registerTransformation = function(desc, name, target) {
var Transformation = transformations.createContextTransformation(desc, name);
- //+ to sie powinna nazywac registerTransformationFromDesc or sth
- //+ ew. spr czy nie override (tylko jesli powyzej sa prototypy to trudno do nich dojsc)
- target[name] = function(args) {
- var instance = this;
+ target[name] = function() {
+ var instance = this,
+ args = Array.prototype.slice.call(arguments, 0);
return instance.transform(Transformation, args);
- }
+ };
};
var registerMethod = function(methodName, method, target) {
this._nodeTransformations = {};
this._textNodeTransformations = {};
this._elementNodeTransformations = {};
+
+ this.registerExtension(coreTransformations);
};
$.extend(Document.prototype, Backbone.Events, {
var toret = new Factory(from, this);
_.extend(toret, this._nodeMethods);
_.extend(toret, typeMethods);
+
_.extend(toret, this._nodeTransformations);
_.extend(toret, typeTransformations);
+
+ toret.__super__ = _.extend({}, this._nodeMethods, this._nodeTransformations);
+ _.keys(toret.__super__).forEach(function(key) {
+ toret.__super__[key] = _.bind(toret.__super__[key], toret);
+ });
+
return toret;
},
loadXML: function(xml, options) {
options = options || {};
- defineDocumentProperties(this, $(parseXML(xml)));
+ this._defineDocumentProperties($(parseXML(xml)));
if(!options.silent) {
this.trigger('contentSet');
}
},
trigger: function() {
- //console.log('trigger: ' + arguments[0] + (arguments[1] ? ', ' + arguments[1].type : ''));
Backbone.Events.trigger.apply(this, arguments);
},
},
registerExtension: function(extension) {
- //debugger;
- var doc = this,
- existingPropertyNames = _.values(this);
+ var doc = this;
['document', 'documentNode', 'elementNode', 'textNode'].forEach(function(dstName) {
var dstExtension = extension[dstName];
},
transform: function(Transformation, args) {
- //console.log('transform');
var toret, transformation;
- // ref: odrebnie przygotowanie transformacji, odrebnie jej wykonanie (to pierwsze to analog transform z node)
-
if(typeof Transformation === 'function') {
transformation = new Transformation(this, this, args);
} else {
}
if(transformation) {
this._transformationLevel++;
- toret = transformation.run();
- if(this._transformationLevel === 1) {
+ toret = transformation.run({beUndoable:this._transformationLevel === 1});
+ if(this._transformationLevel === 1 && !this._undoInProgress) {
this.undoStack.push(transformation);
}
+ if(!this._undoInProgress && this._transformationLevel === 1) {
+ this.redoStack = [];
+ }
this._transformationLevel--;
- //console.log('clearing redo stack');
- this.redoStack = [];
return toret;
} else {
throw new Error('Transformation ' + transformation + ' doesn\'t exist!');
undo: function() {
var transformation = this.undoStack.pop();
if(transformation) {
+ this._undoInProgress = true;
transformation.undo();
+ this._undoInProgress = false;
this.redoStack.push(transformation);
}
},
redo: function() {
var transformation = this.redoStack.pop();
if(transformation) {
- transformation.run();
+ this._transformationLevel++;
+ transformation.run({beUndoable: true});
+ this._transformationLevel--;
this.undoStack.push(transformation);
+
}
},
toret = toret.contents()[idx];
});
return toret;
+ },
+
+ _defineDocumentProperties: function($document) {
+ var doc = this;
+ Object.defineProperty(doc, 'root', {get: function() {
+ return doc.createDocumentNode($document[0]);
+ }, configurable: true});
+ Object.defineProperty(doc, 'dom', {get: function() {
+ return $document[0];
+ }, configurable: true});
}
});
-var defineDocumentProperties = function(doc, $document) {
- Object.defineProperty(doc, 'root', {get: function() {
- return doc.createDocumentNode($document[0]);
- }, configurable: true});
- Object.defineProperty(doc, 'dom', {get: function() {
- return $document[0];
- }, configurable: true});
-};
-
return {
documentFromXML: function(xml) {
var doc = new Document(xml);
- doc.registerExtension(coreTransformations);
return doc;
},