X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/72dfc92f908add69b4d862e9b6c3107e2a8acd21..064901239c2478c0fa4763812771cb370c76742d:/modules/documentCanvas/canvas/documentElement.js?ds=inline
diff --git a/modules/documentCanvas/canvas/documentElement.js b/modules/documentCanvas/canvas/documentElement.js
index 82a85c7..f6137ef 100644
--- a/modules/documentCanvas/canvas/documentElement.js
+++ b/modules/documentCanvas/canvas/documentElement.js
@@ -6,22 +6,49 @@ define([
'use strict';
-// DocumentElement represents a node from WLXML document rendered inside Canvas
+// DocumentElement represents a text or an element node from WLXML document rendered inside Canvas
var DocumentElement = function(htmlElement, canvas) {
if(arguments.length === 0)
return;
this.canvas = canvas;
- this.$element = $(htmlElement);
+ this._setupDOMHandler(htmlElement);
}
+var elementTypeFromParams = function(params) {
+ return params.text !== undefined ? DocumentTextElement : DocumentNodeElement;
+
+};
+
+$.extend(DocumentElement, {
+ create: function(params, canvas) {
+ return elementTypeFromParams(params).create(params);
+ },
+
+ createDOM: function(params) {
+ return elementTypeFromParams(params).createDOM(params);
+ },
+
+ fromHTMLElement: function(htmlElement, canvas) {
+ var $element = $(htmlElement);
+ if(htmlElement.nodeType === Node.ELEMENT_NODE && $element.attr('wlxml-tag'))
+ return DocumentNodeElement.fromHTMLElement(htmlElement, canvas);
+ if($element.attr('wlxml-text') !== undefined || (htmlElement.nodeType === Node.TEXT_NODE && $element.parent().attr('wlxml-text') !== undefined))
+ return DocumentTextElement.fromHTMLElement(htmlElement, canvas);
+ return undefined;
+ }
+});
+
$.extend(DocumentElement.prototype, {
+ _setupDOMHandler: function(htmlElement) {
+ this.$element = $(htmlElement);
+ },
dom: function() {
return this.$element;
},
parent: function() {
var parents = this.$element.parents('[wlxml-tag]');
if(parents.length)
- return documentElementFromHTMLElement(parents[0], this.canvas);
+ return DocumentElement.fromHTMLElement(parents[0], this.canvas);
return null;
},
@@ -43,28 +70,42 @@ $.extend(DocumentElement.prototype, {
});
+// DocumentNodeElement represents an element node from WLXML document rendered inside Canvas
var DocumentNodeElement = function(htmlElement, canvas) {
DocumentElement.call(this, htmlElement, canvas);
};
-var DocumentTextElement = function(htmlElement, canvas) {
- DocumentElement.call(this, htmlElement, canvas);
-};
+$.extend(DocumentNodeElement, {
+ createDOM: function(params) {
+ var dom = $('
')
+ .attr('wlxml-tag', params.tag);
+ if(params.klass)
+ dom.attr('wlxml-class', params.klass.replace(/\./g, '-'));
+ return dom;
+ },
-DocumentNodeElement.prototype = new DocumentElement();
-DocumentTextElement.prototype = new DocumentElement();
+ create: function(params, canvas) {
+ return this.fromHTMLElement(this.createDOM(params)[0]);
+ },
+
+ fromHTMLElement: function(htmlElement, canvas) {
+ return new this(htmlElement, canvas);
+ }
+});
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;
};
+DocumentNodeElement.prototype = new DocumentElement();
+
$.extend(DocumentNodeElement.prototype, {
append: function(params) {
manipulate(this, params, 'append');
@@ -85,7 +126,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) {
@@ -132,27 +173,40 @@ $.extend(DocumentNodeElement.prototype, {
}
});
-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);
- }
- return dom;
+
+// DocumentNodeElement represents a text node from WLXML document rendered inside Canvas
+var DocumentTextElement = function(htmlElement, canvas) {
+ DocumentElement.call(this, htmlElement, canvas);
};
+$.extend(DocumentTextElement, {
+ createDOM: function(params) {
+ return $('
')
+ .attr('wlxml-text', '')
+ .text(params.text);
+ },
-DocumentNodeElement.create = function(params, canvas) {
- return documentElementFromHTMLElement(DocumentNodeElement.createDOM(params)[0]);
-};
+ create: function(params, canvas) {
+ return this.fromHTMLElement(this.createDOM(params)[0]);
+ },
+ fromHTMLElement: function(htmlElement, canvas) {
+ return new this(htmlElement, canvas);
+ }
+});
+
+DocumentTextElement.prototype = new DocumentElement();
$.extend(DocumentTextElement.prototype, {
+ _setupDOMHandler: function(htmlElement) {
+ var $element = $(htmlElement);
+ if(htmlElement.nodeType === Node.TEXT_NODE)
+ this.$element = $element.parent();
+ else
+ this.$element = $element;
+ },
setText: function(text) {
- this.dom()[0].data = text;
+ this.dom().contents()[0].data = text;
},
getText: function() {
return this.dom().text();
@@ -160,30 +214,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') {
@@ -255,19 +309,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