Fixing order of items extracted from a list
[fnpeditor.git] / modules / documentCanvas / canvasNode.js
1 define([
2 'libs/jquery-1.9.1.min',
3 'libs/underscore-min',
4 'modules/documentCanvas/classAttributes'
5 ], function($, _, classAttributes) {
6
7 'use strict';
8
9
10
11
12 var tagSelector = '[wlxml-tag]';
13
14 var CanvasNode = function(desc) {
15     if(desc instanceof $) {
16         this.dom = desc;
17         if(!this.dom.attr('id')) {
18             this.dom.attr('id', 'xxxxxxxx-xxxx-xxxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {var r = Math.random()*16|0,v=c=='x'?r:r&0x3|0x8;return v.toString(16);}));
19         }
20     } else {
21         var toBlock = ['div', 'document', 'section', 'header'];
22         var htmlTag = _.contains(toBlock, desc.tag) ? 'div' : 'span';
23         this.dom = $('<' + htmlTag + '>');
24         this.dom.attr('wlxml-tag', desc.tag);
25         if(desc.klass)
26             this.dom.attr('wlxml-class', desc.klass);
27         if(desc.content)
28             this.dom.text(desc.content);
29         if(desc.meta) {
30             var c = this;
31             _.keys(desc.meta)
32             .filter(function(key) {return classAttributes.hasMetaAttr(c.getClass(), key);})
33             .forEach(function(key) {
34                 c.dom.attr('wlxml-meta-'+key, desc.meta[key]);
35             });
36         }
37         this.dom.attr('id', 'xxxxxxxx-xxxx-xxxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {var r = Math.random()*16|0,v=c=='x'?r:r&0x3|0x8;return v.toString(16);}));
38     }
39 };
40
41 CanvasNode.prototype.getTag = function() {
42     return this.dom.attr('wlxml-tag');
43 };
44
45 CanvasNode.prototype.getClass = function() {
46     return this.dom.attr('wlxml-class');
47 };
48
49 CanvasNode.prototype.setClass = function(klass) {
50     if(klass != this.getClass()) {
51         var c = this;
52         this.getMetaAttrs().forEach(function(attr) {
53             if(!classAttributes.hasMetaAttr(klass, attr.name))
54                 c.dom.removeAttr('wlxml-meta-' + attr.name);
55         });
56         this.dom.attr('wlxml-class', klass);
57     }
58 };
59
60 CanvasNode.prototype.getId = function() {
61     return this.dom.attr('id');
62 };
63
64 CanvasNode.prototype.getContent = function() {
65     return this.dom.text();
66 };
67
68 CanvasNode.prototype.setContent = function(content) {
69     this.dom.text(content);
70 };
71
72 CanvasNode.prototype.isSame = function(other) {
73     return (other instanceof CanvasNode) && this.dom.get(0) === other.dom.get(0);
74 };
75
76 CanvasNode.prototype.children = function() {
77     var list = [];
78     this.dom.children(tagSelector).each(function() {
79         list.push(new CanvasNode($(this)));
80     });
81     return $(list);
82 };
83
84
85 CanvasNode.prototype.parent = function() {
86     var node = this.dom.parent(tagSelector);
87     if(node.length)
88         return new CanvasNode(node);
89     return null;
90 };
91
92 CanvasNode.prototype.parents = function() {
93     var list = [];
94     this.dom.parents(tagSelector).each(function() {
95         list.push(new CanvasNode($(this)));
96     });
97     return $(list);
98 };
99
100
101 CanvasNode.prototype.isOfClass = function(klass) {
102     return this.getClass() && this.getClass().substr(0, klass.length) === klass;
103 };
104
105 CanvasNode.prototype.getMetaAttr = function(attr) {
106     return this.dom.attr('wlxml-meta-'+attr);
107 };
108
109 CanvasNode.prototype.getMetaAttrs = function() {
110     var toret = [];
111     var metaAttrPrefix = 'wlxml-meta-';
112
113     var attrList = classAttributes.getMetaAttrsList(this.getClass());
114     var c = this;
115     attrList.all.forEach(function(attr) {
116         toret.push({name: attr.name, value: c.getMetaAttr(attr.name) || ''});  
117     });
118
119
120     return toret;
121 };
122
123 CanvasNode.prototype.setMetaAttr = function(attr, value) {
124     this.dom.attr('wlxml-meta-'+attr, value);
125 };
126
127 return {
128     create: function(desc) {
129         return new CanvasNode(desc);
130     }
131
132 };
133     
134
135 });