');
+ var formattings = {};
+
+ if(this.data('orig-before') !== undefined) {
+ if(this.data('orig-before')) {
+ toret.prepend(document.createTextNode(this.data('orig-before')));
+ }
+ } else if(level && this.getWlxmlTag() !== 'span') {
+ toret.append('\n' + (new Array(level * 2 + 1)).join(' '));
+ }
+
+ toret.append(node);
+
+ if(this.data('orig-after')) {
+ toret.append(document.createTextNode(this.data('orig-after')));
+ }
+
+ /* Inside node */
+ if(this.data('orig-begin')) {
+ node.prepend(this.data('orig-begin'));
+ formattings.begin = true;
+ }
+
+ if(this.data('orig-end') !== undefined) {
+ if(this.data('orig-end')) {
+ node.append(this.data('orig-end'));
+ }
+ } else if(this.getWlxmlTag() !== 'span' && children.length){
+ node.append('\n' + (new Array(level * 2 + 1)).join(' '));
+ }
+
+ return {parts: toret.contents(), formattings: formattings};
+ }.bind(this);
+
+
+
+ var children = this.children(),
+ childParts;
+
+ var formatting = addFormatting(node);
+
+ for(var i = children.length - 1; i >= 0; i--) {
+ childParts = children[i].toXML(level + 1);
+ if(typeof childParts === 'string')
+ childParts = [document.createTextNode(childParts)];
+
+ if(formatting.formattings.begin) {
+ $(node.contents()[0]).after(childParts);
+ } else
+ node.prepend(childParts);
+ }
+ return formatting.parts;
+ },
append: function(params) {
- manipulate(this, params, 'append');
+ if(params.tag !== 'span')
+ this.data('orig-end', undefined);
+ return manipulate(this, params, 'append');
},
before: function(params) {
- manipulate(this, params, 'before');
+ return manipulate(this, params, 'before');
},
after: function(params) {
- manipulate(this, params, 'after');
+ return manipulate(this, params, 'after');
},
children: function() {
var toret = [];
@@ -82,10 +263,12 @@ $.extend(DocumentNodeElement.prototype, {
return toret;
- var elementContent = this.dom().contents();
+ var elementContent = this._container().contents();
var element = this;
elementContent.each(function(idx) {
- var childElement = documentElementFromHTMLElement(this, element.canvas);
+ var childElement = DocumentElement.fromHTMLElement(this, element.canvas);
+ if(childElement === undefined)
+ return true;
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) {
@@ -108,67 +291,106 @@ $.extend(DocumentNodeElement.prototype, {
return toret;
},
getWlxmlTag: function() {
- return this.dom().attr('wlxml-tag');
+ return this._container().attr('wlxml-tag');
},
setWlxmlTag: function(tag) {
- this.dom().attr('wlxml-tag', tag);
+ this._container().attr('wlxml-tag', tag);
},
getWlxmlClass: function() {
- var klass = this.dom().attr('wlxml-class');
+ var klass = this._container().attr('wlxml-class');
if(klass)
- return klass.replace('-', '.');
+ return klass.replace(/-/g, '.');
return undefined;
},
setWlxmlClass: function(klass) {
+ this.getWlxmlMetaAttrs().forEach(function(attr) {
+ if(!classAttributes.hasMetaAttr(klass, attr.name))
+ this.dom().removeAttr('wlxml-meta-' + attr.name);
+ }, this);
+
if(klass)
- this.dom().attr('wlxml-class', klass);
+ this._container().attr('wlxml-class', klass.replace(/\./g, '-'));
else
- this.dom().removeAttr('wlxml-class');
+ this._container().removeAttr('wlxml-class');
},
is: function(what) {
- if(what === 'list' && _.contains(['list-items', 'list-items-enum'], this.dom().attr('wlxml-class')))
+ if(what === 'list' && _.contains(['list.items', 'list.items.enum'], this.getWlxmlClass()))
return true;
return false;
- }
-});
+ },
+ getWlxmlMetaAttr: function(attr) {
+ return this.dom().attr('wlxml-meta-'+attr);
+ },
-DocumentElement.create = function(params, canvas) {
- var ElementType = params.text !== undefined ? DocumentTextElement : DocumentNodeElement;
- return ElementType.create(params);
-};
+ getWlxmlMetaAttrs: function() {
+ var toret = [];
+ var attrList = classAttributes.getMetaAttrsList(this.getWlxmlClass());
+ attrList.all.forEach(function(attr) {
+ toret.push({name: attr.name, value: this.getWlxmlMetaAttr(attr.name) || ''});
+ }, this);
+ return toret;
+ },
-DocumentElement.createDOM = function(params) {
- var ElementType = params.text !== undefined ? DocumentTextElement : DocumentNodeElement;
- return ElementType.createDOM(params);
-};
+ setWlxmlMetaAttr: function(attr, value) {
+ this.dom().attr('wlxml-meta-'+attr, value);
+ },
+
+ toggleLabel: function(toggle) {
+ var displayCss = toggle ? 'inline-block' : 'none';
+ var label = this.dom().children('.canvas-widgets').find('.canvas-widget-label');
+ label.css('display', displayCss);
+ this.dom().toggleClass('highlighted-element');
+ }
+});
-DocumentNodeElement.createDOM = function(params) {
- 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 represents a text node from WLXML document rendered inside Canvas
+var DocumentTextElement = function(htmlElement, canvas) {
+ DocumentElement.call(this, htmlElement, canvas);
};
-DocumentNodeElement.create = function(params, canvas) {
- return documentElementFromHTMLElement(DocumentNodeElement.createDOM(params)[0]);
-};
+$.extend(DocumentTextElement, {
+ createDOM: function(params) {
+ return $('
')
+ .attr('document-text-element', '')
+ .text(params.text || utils.unicode.ZWS);
+ },
-DocumentTextElement.create = function(params, canvas) {
- return documentElementFromHTMLElement(DocumentTextElement.createDOM(params)[0]);
-};
+ create: function(params, canvas) {
+ return this.fromHTMLElement(this.createDOM(params)[0]);
+ },
+ fromHTMLElement: function(htmlElement, canvas) {
+ return new this(htmlElement, canvas);
+ },
+ isContentContainer: function(htmlElement) {
+ return htmlElement.nodeType === Node.TEXT_NODE && $(htmlElement).parent().is('[document-text-element]');
+ }
+});
+
+DocumentTextElement.prototype = new DocumentElement();
$.extend(DocumentTextElement.prototype, {
+ toXML: function(parent) {
+ return this.getText();
+ },
+ _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();
+ return this.dom().text().replace(utils.unicode.ZWS, '');
+ },
+ isEmpty: function() {
+ // Having at least Zero Width Space is guaranteed be Content Observer
+ return this.dom().contents()[0].data === utils.unicode.ZWS;
},
after: function(params) {
if(params instanceof DocumentTextElement || params.text)
@@ -212,8 +434,10 @@ $.extend(DocumentTextElement.prototype, {
}
},
unwrap: function() {
- var parent = this.parent();
+ var parent = this.parent(),
+ toret;
if(parent.children().length === 1) {
+ toret = parent.parent();
var grandParent = parent.parent();
if(grandParent) {
var grandParentChildren = grandParent.children(),
@@ -233,6 +457,7 @@ $.extend(DocumentTextElement.prototype, {
parent.after(this);
}
parent.detach();
+ return toret;
}
},
split: function(params) {
@@ -265,22 +490,30 @@ $.extend(DocumentTextElement.prototype, {
succeedingChildren.forEach(function(child) {
newElement.append(child);
});
+
+ return {first: parentElement, second: newElement};
+ },
+ divide: function(params) {
+ var myText = this.getText();
+
+ if(params.offset === myText.length)
+ return this.after(params);
+ if(params.offset === 0)
+ return this.before(params);
+
+ var lhsText = myText.substr(0, params.offset),
+ rhsText = myText.substr(params.offset),
+ newElement = DocumentNodeElement.create({tag: params.tag, klass: params.klass}, this.canvas),
+ rhsTextElement = DocumentTextElement.create({text: rhsText});
+
+ this.setText(lhsText);
+ this.after(newElement);
+ newElement.after(rhsTextElement);
+ return newElement;
}
});
-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