return this.$element;
},
parent: function() {
- return documentElementFromHTMLElement(this.$element.parent()[0], this.canvas);
+ var parents = this.$element.parents('[wlxml-tag]');
+ if(parents.length)
+ return DocumentElement.fromHTMLElement(parents[0], this.canvas);
+ return null;
},
sameNode: function(other) {
DocumentTextElement.prototype = new DocumentElement();
var manipulate = function(e, params, action) {
- var dom;
+ var element;
if(params instanceof DocumentElement) {
- dom = params.dom()
+ element = params;
} else {
- dom = DocumentNodeElement.createDOM(params);
+ element = DocumentElement.create(params);
}
- e.dom()[action](dom);
- return documentElementFromHTMLElement(dom);
+ e.dom()[action](element.dom());
+ return element;
};
$.extend(DocumentNodeElement.prototype, {
var elementContent = this.dom().contents();
var element = this;
elementContent.each(function(idx) {
- var childElement = documentElementFromHTMLElement(this, element.canvas);
+ var childElement = DocumentElement.fromHTMLElement(this, element.canvas);
if(idx === 0 && elementContent.length > 1 && elementContent[1].nodeType === Node.ELEMENT_NODE && (childElement instanceof DocumentTextElement) && $.trim($(this).text()) === '')
return true;
if(idx > 0 && childElement instanceof DocumentTextElement) {
}
});
+
+DocumentElement.create = function(params, canvas) {
+ var ElementType = params.text !== undefined ? DocumentTextElement : DocumentNodeElement;
+ return ElementType.create(params);
+};
+
+DocumentElement.createDOM = function(params) {
+ var ElementType = params.text !== undefined ? DocumentTextElement : DocumentNodeElement;
+ return ElementType.createDOM(params);
+};
+
+DocumentElement.fromHTMLElement = function(htmlElement, canvas) {
+ if(htmlElement.nodeType === Node.ELEMENT_NODE)
+ return DocumentNodeElement.fromHTMLElement(htmlElement, canvas);
+ if(htmlElement.nodeType === Node.TEXT_NODE)
+ return DocumentTextElement.fromHTMLElement(htmlElement, canvas);
+}
+
DocumentNodeElement.createDOM = function(params) {
- var dom;
- if(params.text) {
- dom = $(document.createTextNode(params.text));
- } else {
- dom = $('<div>').attr('wlxml-tag', params.tag);
- if(params.klass)
- dom.attr('wlxml-class', params.klass);
- }
+ var dom = $('<div>').attr('wlxml-tag', params.tag);
+ if(params.klass)
+ dom.attr('wlxml-class', params.klass);
return dom;
};
+DocumentTextElement.createDOM = function(params) {
+ return $(document.createTextNode(params.text));
+};
DocumentNodeElement.create = function(params, canvas) {
- return documentElementFromHTMLElement(DocumentNodeElement.createDOM(params)[0]);
+ return this.fromHTMLElement(this.createDOM(params)[0]);
+};
+
+DocumentTextElement.create = function(params, canvas) {
+ return this.fromHTMLElement(this.createDOM(params)[0]);
+};
+
+DocumentNodeElement.fromHTMLElement = function(htmlElement, canvas) {
+ return new this(htmlElement, canvas);
+};
+
+DocumentTextElement.fromHTMLElement = function(htmlElement, canvas) {
+ return new this(htmlElement, canvas);
};
after: function(params) {
if(params instanceof DocumentTextElement || params.text)
return false;
- var dom;
+ var element;
if(params instanceof DocumentNodeElement) {
- dom = params.dom();
+ element = params;
} else {
- dom = DocumentNodeElement.createDOM(params);
+ element = DocumentNodeElement.create(params);
}
this.dom().wrap('<div>');
- this.dom().parent().after(dom[0]);
+ this.dom().parent().after(element.dom());
this.dom().unwrap();
- return documentElementFromHTMLElement(dom[0]);
+ return element;
},
before: function(params) {
if(params instanceof DocumentTextElement || params.text)
return false;
- var dom;
+ var element;
if(params instanceof DocumentNodeElement) {
- dom = params.dom();
+ element = params;
} else {
- dom = DocumentNodeElement.createDOM(params);
+ element = DocumentNodeElement.create(params);
}
this.dom().wrap('<div>');
- this.dom().parent().before(dom[0]);
+ this.dom().parent().before(element.dom());
this.dom().unwrap();
- return documentElementFromHTMLElement(dom[0]);
+ return element;
},
wrapWithNodeElement: function(wlxmlNode) {
if(typeof wlxmlNode.start === 'number' && typeof wlxmlNode.end === 'number') {
}
},
unwrap: function() {
- if(this.parent().children().length === 1) {
- var parent = this.parent();
- parent.after(this);
+ var parent = this.parent();
+ if(parent.children().length === 1) {
+ var grandParent = parent.parent();
+ if(grandParent) {
+ var grandParentChildren = grandParent.children(),
+ idx = grandParent.childIndex(parent),
+ prev = idx - 1 > -1 ? grandParentChildren[idx-1] : null,
+ next = idx + 1 < grandParentChildren.length ? grandParentChildren[idx+1] : null;
+ if(prev && next) {
+ prev.setText(prev.getText() + this.getText() + next.getText());
+ next.detach();
+ } else if (prev || next) {
+ var target = prev ? prev : next;
+ target.setText(target.getText() + this.getText());
+ } else {
+ parent.after(this);
+ }
+ } else {
+ parent.after(this);
+ }
parent.detach();
}
},
}
});
-var documentElementFromHTMLElement = function(htmlElement, canvas) {
- // if(!canvas)
- // throw 'no canvas specified';
- if(htmlElement.nodeType === Node.ELEMENT_NODE)
- return new DocumentNodeElement(htmlElement, canvas);
- if(htmlElement.nodeType === Node.TEXT_NODE)
- return new DocumentTextElement(htmlElement, canvas);
-};
-
return {
- wrap: function(htmlElement, canvas) {
- return documentElementFromHTMLElement(htmlElement, canvas);
- },
DocumentElement: DocumentElement,
DocumentNodeElement: DocumentNodeElement,
DocumentTextElement: DocumentTextElement