X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/5b4122c6f8f4fef93526a0029aa6a4ba5f329cfa..58425daa1aa7e717e92eaec170262de31ed47bc0:/src/smartxml/smartxml.js
diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js
index 80ee43c..2e507db 100644
--- a/src/smartxml/smartxml.js
+++ b/src/smartxml/smartxml.js
@@ -29,7 +29,7 @@ $.extend(DocumentNode.prototype, {
detach: function() { this._$.detach(); },
sameNode: function(otherNode) {
- return this.nativeNode === otherNode.nativeNode;
+ return otherNode && this.nativeNode === otherNode.nativeNode;
},
parent: function() {
@@ -41,10 +41,13 @@ $.extend(DocumentNode.prototype, {
},
wrapWith: function(node) {
+ node = node instanceof ElementNode ? node : this.document.createElementNode(node);
+
if(this.parent()) {
this.before(node);
}
node.append(this);
+ return node;
},
triggerChangeEvent: function(type, metaData) {
@@ -100,14 +103,20 @@ $.extend(ElementNode.prototype, DocumentNode.prototype, {
setTag: function(tagName) {
var node = this.document.createElementNode({tagName: tagName}),
- oldTagName = this.getTagName();
+ oldTagName = this.getTagName(),
+ myContents = this._$.contents();
this.getAttrs().forEach(function(attribute) {
node.setAttr(attribute.name, attribute.value, true);
});
node.setData(this.getData());
+ if(this.sameNode(this.document.root)) {
+ defineDocumentProperties(this.document, node._$);
+ }
+ this._$.replaceWith(node._$);
this._setNativeNode(node._$[0]);
+ this._$.append(myContents);
this.triggerChangeEvent('nodeTagChange', {oldTagName: oldTagName, newTagName: this.getTagName()});
},
@@ -183,8 +192,12 @@ $.extend(ElementNode.prototype, DocumentNode.prototype, {
toXML: function() {
var wrapper = $('
');
- wrapper.append(this._$);
+ wrapper.append(this._getXMLDOMToDump());
return wrapper.html();
+ },
+
+ _getXMLDOMToDump: function() {
+ return this._$;
}
});
@@ -199,12 +212,24 @@ $.extend(TextNode.prototype, DocumentNode.prototype, {
return this.nativeNode.data;
},
+ setText: function(text) {
+ this.nativeNode.data = text;
+ this.triggerTextChangeEvent();
+ },
+
appendText: function(text) {
this.nativeNode.data = this.nativeNode.data + text;
+ this.triggerTextChangeEvent();
},
prependText: function(text) {
this.nativeNode.data = text + this.nativeNode.data;
+ this.triggerTextChangeEvent();
+ },
+
+ triggerTextChangeEvent: function() {
+ var event = new events.ChangeEvent('nodeTextChange', {node: this});
+ this.document.trigger('change', event);
}
});
@@ -223,7 +248,7 @@ $.extend(Document.prototype, Backbone.Events, {
createElementNode: function(from) {
if(!(from instanceof HTMLElement)) {
- from = $('<' + from.tagName + '>');
+ from = $('<' + from.tagName + '>')[0];
}
return new this.ElementNodeFactory(from, this);
},
@@ -232,18 +257,12 @@ $.extend(Document.prototype, Backbone.Events, {
return new this.TextNodeFactory(nativeNode, this);
},
- loadXML: function(xml) {
- var $document = $(parseXML(xml));
-
- var doc = this;
- Object.defineProperty(this, 'root', {get: function() {
- return doc.createElementNode($document[0]);
- }, configurable: true});
- Object.defineProperty(this, 'dom', {get: function() {
- return $document[0];
- }, configurable: true});
-
- this.trigger('contentSet');
+ loadXML: function(xml, options) {
+ options = options || {};
+ defineDocumentProperties(this, $(parseXML(xml)));
+ if(!options.silent) {
+ this.trigger('contentSet');
+ }
},
toXML: function() {
@@ -251,6 +270,14 @@ $.extend(Document.prototype, Backbone.Events, {
}
});
+var defineDocumentProperties = function(doc, $document) {
+ Object.defineProperty(doc, 'root', {get: function() {
+ return doc.createElementNode($document[0]);
+ }, configurable: true});
+ Object.defineProperty(doc, 'dom', {get: function() {
+ return $document[0];
+ }, configurable: true});
+};
return {
documentFromXML: function(xml) {