2 'libs/jquery-1.9.1.min',
9 // DocumentElement represents a node from WLXML document rendered inside Canvas
10 var DocumentElement = function(htmlElement, canvas) {
11 if(arguments.length === 0)
14 this.$element = $(htmlElement);
16 this.wlxmlTag = this.$element.attr('wlxml-tag');
19 $.extend(DocumentElement.prototype, {
23 children: function() {
25 if(this instanceof DocumentTextElement)
29 var elementContent = this.$element.contents();
31 elementContent.each(function(idx) {
32 var childElement = documentElementFromHTMLElement(this, element.canvas);
33 if(idx === 0 && elementContent.length > 1 && elementContent[1].nodeType === Node.ELEMENT_NODE && (childElement instanceof DocumentTextElement) && $.trim($(this).text()) === '')
35 if(idx > 0 && childElement instanceof DocumentTextElement) {
36 if(toret[toret.length-1] instanceof DocumentNodeElement && $.trim($(this).text()) === '')
39 toret.push(childElement);
44 return documentElementFromHTMLElement(this.$element.parent()[0], this.canvas);
47 sameNode: function(other) {
48 return other && (typeof other === typeof this) && other.$element[0] === this.$element[0];
51 wrapWithNodeElement: function(wlxmlNode) {
52 this.$element.wrap($('<' + wlxmlNode.tag + ' class="' + wlxmlNode.klass.replace('.', '-') + '">')[0]);
53 return documentElementFromHTMLElement(this.$element.parent().get(0), this.canvas);
56 childIndex: function(child) {
57 var children = this.children(),
59 children.forEach(function(c, idx) {
60 if(c.sameNode(child)) {
69 this.$element.detach();
75 var DocumentNodeElement = function(htmlElement, canvas) {
76 DocumentElement.call(this, htmlElement, canvas);
79 var DocumentTextElement = function(htmlElement, canvas) {
80 DocumentElement.call(this, htmlElement, canvas);
83 DocumentNodeElement.prototype = new DocumentElement();
84 DocumentTextElement.prototype = new DocumentElement();
86 var manipulate = function(e, params, action) {
88 if(params instanceof DocumentElement) {
91 dom = DocumentNodeElement.createDOM(params);
93 e.$element[action](dom);
94 return documentElementFromHTMLElement(dom);
97 $.extend(DocumentNodeElement.prototype, {
98 append: function(params) {
99 manipulate(this, params, 'append');
101 before: function(params) {
102 manipulate(this, params, 'before');
105 after: function(params) {
106 manipulate(this, params, 'after');
108 getWlxmlTag: function() {
109 return this.$element.attr('wlxml-tag');
111 setWlxmlTag: function(tag) {
112 this.$element.attr('wlxml-tag', tag);
114 getWlxmlClass: function() {
115 var klass = this.$element.attr('wlxml-class');
117 return klass.replace('-', '.');
120 setWlxmlClass: function(klass) {
122 this.$element.attr('wlxml-class', klass);
124 this.$element.removeAttr('wlxml-class');
127 if(what === 'list' && _.contains(['list-items', 'list-items-enum'], this.$element.attr('wlxml-class')))
133 DocumentNodeElement.createDOM = function(params) {
136 dom = $(document.createTextNode(params.text));
138 dom = $('<div>').attr('wlxml-tag', params.tag);
140 dom.attr('wlxml-class', params.klass);
146 DocumentNodeElement.create = function(params, canvas) {
147 return documentElementFromHTMLElement(DocumentNodeElement.createDOM(params)[0]);
151 $.extend(DocumentTextElement.prototype, {
152 setText: function(text) {
153 this.$element[0].data = text;
155 getText: function() {
156 return this.$element.text();
158 after: function(params) {
159 if(params instanceof DocumentTextElement || params.text)
162 if(params instanceof DocumentNodeElement) {
165 dom = DocumentNodeElement.createDOM(params);
167 this.$element.wrap('<div>');
168 this.$element.parent().after(dom[0]);
169 this.$element.unwrap();
170 return documentElementFromHTMLElement(dom[0]);
172 before: function(params) {
173 if(params instanceof DocumentTextElement || params.text)
176 if(params instanceof DocumentNodeElement) {
179 dom = DocumentNodeElement.createDOM(params);
181 this.$element.wrap('<div>');
182 this.$element.parent().before(dom[0]);
183 this.$element.unwrap();
184 return documentElementFromHTMLElement(dom[0]);
186 wrapWithNodeElement: function(wlxmlNode) {
187 if(wlxmlNode.start && wlxmlNode.end) {
188 return this.canvas.wrapText({
189 inside: this.parent(),
190 textNodeIdx: this.parent().childIndex(this),
191 offsetStart: wlxmlNode.start,
192 offsetEnd: wlxmlNode.end,
193 _with: {tag: wlxmlNode.tag, klass: wlxmlNode.klass}
196 return DocumentElement.prototype.wrapWithNodeElement.call(this, wlxmlNode);
199 split: function(params) {
200 var parentElement = this.parent(),
201 myIdx = parentElement.childIndex(this),
202 myCanvas = this.canvas,
204 succeedingChildren = [],
206 prefix = this.getText().substr(0, params.offset),
207 suffix = this.getText().substr(params.offset);
209 parentElement.children().forEach(function(child) {
211 succeedingChildren.push(child);
212 if(child.sameNode(thisElement))
216 if(prefix.length > 0)
217 this.setText(prefix);
221 var newElement = DocumentNodeElement.create({tag: parentElement.wlxmlTag, klass: parentElement.wlxmlClass}, myCanvas);
222 parentElement.after(newElement);
224 if(suffix.length > 0)
225 newElement.append({text: suffix});
226 succeedingChildren.forEach(function(child) {
227 newElement.append(child);
232 var documentElementFromHTMLElement = function(htmlElement, canvas) {
234 // throw 'no canvas specified';
235 if(htmlElement.nodeType === Node.ELEMENT_NODE)
236 return new DocumentNodeElement(htmlElement, canvas);
237 if(htmlElement.nodeType === Node.TEXT_NODE)
238 return new DocumentTextElement(htmlElement, canvas);
242 wrap: function(htmlElement, canvas) {
243 return documentElementFromHTMLElement(htmlElement, canvas);
245 DocumentElement: DocumentElement,
246 DocumentNodeElement: DocumentNodeElement,
247 DocumentTextElement: DocumentTextElement