X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/83edceffb18f5802bb6a9b20746437a3a46f2450..9abc2f052e1503f396f118e9508b14cb8b276e39:/src/smartxml/smartxml.js diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index a5a1abc..c158bac 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -12,6 +12,8 @@ define([ /* globals Node */ +var privateKey = '_smartxml'; + var DocumentNode = function(nativeNode, document) { if(!document) { throw new Error('undefined document for a node'); @@ -48,7 +50,7 @@ $.extend(DocumentNode.prototype, { clone.find('*').addBack().each(function() { var el = this, clonedData = $(this).data(); - + $(el).removeData(privateKey); _.pairs(clonedData).forEach(function(pair) { var key = pair[0], value = pair[1]; @@ -180,6 +182,7 @@ $.extend(DocumentNode.prototype, { var ElementNode = function(nativeNode, document) { DocumentNode.call(this, nativeNode, document); + $(nativeNode).data(privateKey, {node: this}); }; ElementNode.prototype = Object.create(DocumentNode.prototype); @@ -203,7 +206,9 @@ $.extend(ElementNode.prototype, { if(key) { return this._$.data(key); } - return this._$.data(); + var toret = _.clone(this._$.data()); + delete toret[privateKey]; + return toret; }, getTagName: function() { @@ -245,11 +250,21 @@ $.extend(ElementNode.prototype, { return node && (node.nativeNode === this.nativeNode || node._$.parents().index(this._$) !== -1); }, + getFirstTextNode: function() { + return this._getTextNode('first'); + }, + getLastTextNode: function() { + return this._getTextNode('last'); + }, + + _getTextNode: function(which) { var contents = this.contents(), toret; - - contents.reverse().some(function(node) { + if(which === 'last') { + contents = contents.reverse(); + } + contents.some(function(node) { if(node.nodeType === Node.TEXT_NODE) { toret = node; return true; @@ -275,12 +290,33 @@ $.extend(ElementNode.prototype, { var TextNode = function(nativeNode, document) { DocumentNode.call(this, nativeNode, document); + this._data = Object.create({}); + nativeNode.__smartxmlTextNodeInstance = this; }; TextNode.prototype = Object.create(DocumentNode.prototype); $.extend(TextNode.prototype, { nodeType: Node.TEXT_NODE, + setData: function(arg1, arg2) { + if(arguments.length === 2) { + if(_.isUndefined(arg2)) { + delete this._data[arg1]; + } else { + this._data[arg1] = arg2; + } + } else { + this._data = _.extend({}, arg1); + } + }, + + getData: function(key) { + if(key) { + return this._data[key]; + } + return this._data; + }, + getText: function() { return this.nativeNode.data; }, @@ -352,7 +388,15 @@ $.extend(Document.prototype, Backbone.Events, fragments, { TextNodeFactory: TextNode, createDocumentNode: function(from) { - if(!(from instanceof Node)) { + var cached; + + if(from instanceof Node) { + /* globals Text */ + cached = from instanceof Text ? from.__smartxmlTextNodeInstance : ($(from).data(privateKey) || {}).node; + if(cached instanceof DocumentNode) { + return cached; + } + } else { if(typeof from === 'string') { from = parseXML(from); this.normalizeXML(from);