X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/1fdf24331346d3b0765cdf9061199aa8bd905bc5..d0db6d70e04af12eeac7275d6140b53df001aa1e:/modules/documentCanvas/canvas/documentElement.js?ds=sidebyside
diff --git a/modules/documentCanvas/canvas/documentElement.js b/modules/documentCanvas/canvas/documentElement.js
index 8a50d23..49fcd22 100644
--- a/modules/documentCanvas/canvas/documentElement.js
+++ b/modules/documentCanvas/canvas/documentElement.js
@@ -19,7 +19,10 @@ $.extend(DocumentElement.prototype, {
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) {
@@ -52,14 +55,14 @@ DocumentNodeElement.prototype = new DocumentElement();
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, {
@@ -82,7 +85,7 @@ $.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) {
@@ -129,21 +132,49 @@ $.extend(DocumentNodeElement.prototype, {
}
});
+
+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 = $('
').attr('wlxml-tag', params.tag);
- if(params.klass)
- dom.attr('wlxml-class', params.klass);
- }
+ var dom = $('
').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);
};
@@ -157,30 +188,30 @@ $.extend(DocumentTextElement.prototype, {
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('
');
- 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('
');
- 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') {
@@ -196,9 +227,26 @@ $.extend(DocumentTextElement.prototype, {
}
},
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();
}
},
@@ -235,19 +283,7 @@ $.extend(DocumentTextElement.prototype, {
}
});
-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