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