X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/2c3bcb5d2d550bb6546c0f8aa3721f623ca9d6b6..f93de3e03a720d2b0373ed31977aeb4c47c7fb69:/src/smartxml/smartxml.js diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index c23e06d..8924e7f 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -4,8 +4,9 @@ define([ 'libs/backbone', 'smartxml/events', 'smartxml/transformations', - 'smartxml/core' -], function($, _, Backbone, events, transformations, coreTransformations) { + 'smartxml/core', + 'smartxml/fragments' +], function($, _, Backbone, events, transformations, coreTransformations, fragments) { 'use strict'; /* globals Node */ @@ -78,6 +79,14 @@ $.extend(DocumentNode.prototype, { return this.document.root.sameNode(this); }, + isInDocument: function() { + return this.document.containsNode(this); + }, + + isSiblingOf: function(node) { + return node && this.parent().sameNode(node.parent()); + }, + sameNode: function(otherNode) { return !!(otherNode) && this.nativeNode === otherNode.nativeNode; }, @@ -143,6 +152,10 @@ $.extend(DocumentNode.prototype, { return 0; } return this.parent().indexOf(this); + }, + + getNearestElementNode: function() { + return this.nodeType === Node.ELEMENT_NODE ? this : this.parent(); } }); @@ -291,7 +304,7 @@ var Document = function(xml, extensions) { this.loadXML(xml); }; -$.extend(Document.prototype, Backbone.Events, { +$.extend(Document.prototype, Backbone.Events, fragments, { ElementNodeFactory: ElementNode, TextNodeFactory: TextNode, @@ -479,7 +492,7 @@ $.extend(Document.prototype, Backbone.Events, { if(!this._currentTransaction) { return this.transaction(function() { return this.transform(Transformation, args); - }, this); + }, {context: this}); } if(typeof Transformation === 'function') { @@ -542,6 +555,7 @@ $.extend(Document.prototype, Backbone.Events, { this._undoInProgress = false; this.redoStack.push(transaction); + this.trigger('operationEnd'); } }, redo: function() { @@ -553,6 +567,8 @@ $.extend(Document.prototype, Backbone.Events, { }); this._transformationLevel--; this.undoStack.push(transaction); + this.trigger('operationEnd'); + } }, @@ -570,6 +586,7 @@ $.extend(Document.prototype, Backbone.Events, { } if(this._currentTransaction.hasTransformations()) { this.undoStack.push(this._currentTransaction); + this.trigger('operationEnd'); } this._currentTransaction = null; }, @@ -581,6 +598,7 @@ $.extend(Document.prototype, Backbone.Events, { this.replaceRoot(this._rollbackBackup); this._rollbackBackup = null; this._currentTransaction = null; + this._transformationLevel = 0; }, transaction: function(callback, params) { @@ -625,6 +643,13 @@ $.extend(Document.prototype, Backbone.Events, { } return $document[0]; }, configurable: true}); + }, + + createFragment: function(Type, params) { + if(!Type.prototype instanceof fragments.Fragment) { + throw new Error('Can\'t create a fragment: `Type` is not a valid Fragment'); + } + return new Type(this, params); } });