5f7efb9f381ff6fa2888a9dd251eb06621c848d2
[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             c.dom.removeAttr('wlxml-meta-' + attr.name);
54         });
55         this.dom.attr('wlxml-class', klass);
56     }
57 };
58
59 CanvasNode.prototype.getId = function() {
60     return this.dom.attr('id');
61 };
62
63 CanvasNode.prototype.getContent = function() {
64     return this.dom.text();
65 };
66
67 CanvasNode.prototype.setContent = function(content) {
68     this.dom.text(content);
69 };
70
71 CanvasNode.prototype.isSame = function(other) {
72     return (other instanceof CanvasNode) && this.dom.get(0) === other.dom.get(0);
73 };
74
75 CanvasNode.prototype.children = function() {
76     var list = [];
77     this.dom.children(tagSelector).each(function() {
78         list.push(new CanvasNode($(this)));
79     });
80     return $(list);
81 };
82
83
84 CanvasNode.prototype.parent = function() {
85     var node = this.dom.parent(tagSelector);
86     if(node.length)
87         return new CanvasNode(node);
88     return null;
89 };
90
91 CanvasNode.prototype.parents = function() {
92     var list = [];
93     this.dom.parents(tagSelector).each(function() {
94         list.push(new CanvasNode($(this)));
95     });
96     return $(list);
97 };
98
99
100 CanvasNode.prototype.isOfClass = function(klass) {
101     return this.getClass() && this.getClass().substr(0, klass.length) === klass;
102 };
103
104 CanvasNode.prototype.getMetaAttr = function(attr) {
105     return this.dom.attr('wlxml-meta-'+attr);
106 };
107
108 CanvasNode.prototype.getMetaAttrs = function() {
109     var toret = [];
110     var metaAttrPrefix = 'wlxml-meta-';
111
112     var attrList = classAttributes.getMetaAttrsList(this.getClass());
113     var c = this;
114     attrList.all.forEach(function(attr) {
115         toret.push({name: attr.name, value: c.getMetaAttr(attr.name) || ''});  
116     });
117
118
119     return toret;
120 };
121
122 CanvasNode.prototype.setMetaAttr = function(attr, value) {
123     this.dom.attr('wlxml-meta-'+attr, value);
124 };
125
126 return {
127     create: function(desc) {
128         return new CanvasNode(desc);
129     }
130
131 };
132     
133
134 });