X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/c986f6ebfd3d20bdc75ce00ee09bd2c716e0cb16..9c680e17e94d8299a55ac811bca76e73339d02f0:/modules/documentCanvas/canvasNode.js?ds=inline diff --git a/modules/documentCanvas/canvasNode.js b/modules/documentCanvas/canvasNode.js index 0bfd358..72343a4 100644 --- a/modules/documentCanvas/canvasNode.js +++ b/modules/documentCanvas/canvasNode.js @@ -1,56 +1,135 @@ -define(['libs/jquery-1.9.1.min'], function($) { - -'use strict'; - -var CanvasNode = function(desc) { - if(desc instanceof $) { - this.dom = desc; - if(!this.dom.attr('id')) { - 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);})); - } - } else { - var toBlock = ['div', 'document', 'section', 'header']; - var htmlTag = _.contains(toBlock, desc.tag) ? 'div' : 'span'; - this.dom = $('<' + htmlTag + '>'); - this.dom.attr('wlxml-tag', desc.tag); - if(desc.klass) - this.dom.attr('wlxml-class', desc.klass); - if(desc.content) - this.dom.text(desc.content); - 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);})); - } -}; - -CanvasNode.prototype.getTag = function() { - return this.dom.attr('wlxml-tag'); -} - -CanvasNode.prototype.getClass = function() { - return this.dom.attr('wlxml-class'); -} - -CanvasNode.prototype.getId = function() { - return this.dom.attr('id'); -} - -CanvasNode.prototype.getContent = function() { - return this.dom.text(); -} - -CanvasNode.prototype.setContent = function(content) { - this.dom.text(content); -} - -CanvasNode.prototype.isSame = function(other) { - return this.dom.get(0).isSameNode(other.dom.get(0)); -} - -return { - create: function(desc) { - return new CanvasNode(desc); - } - -} - - +define([ +'libs/jquery-1.9.1.min', +'libs/underscore-min', +'modules/documentCanvas/classAttributes' +], function($, _, classAttributes) { + +'use strict'; + + + + +var tagSelector = '[wlxml-tag]'; + +var CanvasNode = function(desc) { + if(desc instanceof $) { + this.dom = desc; + if(!this.dom.attr('id')) { + 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);})); + } + } else { + var toBlock = ['div', 'document', 'section', 'header']; + var htmlTag = _.contains(toBlock, desc.tag) ? 'div' : 'span'; + this.dom = $('<' + htmlTag + '>'); + this.dom.attr('wlxml-tag', desc.tag); + if(desc.klass) + this.dom.attr('wlxml-class', desc.klass); + if(desc.content) + this.dom.text(desc.content); + if(desc.meta) { + var c = this; + _.keys(desc.meta) + .filter(function(key) {return classAttributes.hasMetaAttr(c.getClass(), key);}) + .forEach(function(key) { + c.dom.attr('wlxml-meta-'+key, desc.meta[key]); + }); + } + 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);})); + } +}; + +CanvasNode.prototype.getTag = function() { + return this.dom.attr('wlxml-tag'); +}; + +CanvasNode.prototype.getClass = function() { + return this.dom.attr('wlxml-class'); +}; + +CanvasNode.prototype.setClass = function(klass) { + if(klass != this.getClass()) { + var c = this; + this.getMetaAttrs().forEach(function(attr) { + if(!classAttributes.hasMetaAttr(klass, attr.name)) + c.dom.removeAttr('wlxml-meta-' + attr.name); + }); + this.dom.attr('wlxml-class', klass); + } +}; + +CanvasNode.prototype.getId = function() { + return this.dom.attr('id'); +}; + +CanvasNode.prototype.getContent = function() { + return this.dom.text(); +}; + +CanvasNode.prototype.setContent = function(content) { + this.dom.text(content); +}; + +CanvasNode.prototype.isSame = function(other) { + return (other instanceof CanvasNode) && this.dom.get(0) === other.dom.get(0); +}; + +CanvasNode.prototype.children = function() { + var list = []; + this.dom.children(tagSelector).each(function() { + list.push(new CanvasNode($(this))); + }); + return $(list); +}; + + +CanvasNode.prototype.parent = function() { + var node = this.dom.parent(tagSelector); + if(node.length) + return new CanvasNode(node); + return null; +}; + +CanvasNode.prototype.parents = function() { + var list = []; + this.dom.parents(tagSelector).each(function() { + list.push(new CanvasNode($(this))); + }); + return $(list); +}; + + +CanvasNode.prototype.isOfClass = function(klass) { + return this.getClass() && this.getClass().substr(0, klass.length) === klass; +}; + +CanvasNode.prototype.getMetaAttr = function(attr) { + return this.dom.attr('wlxml-meta-'+attr); +}; + +CanvasNode.prototype.getMetaAttrs = function() { + var toret = []; + var metaAttrPrefix = 'wlxml-meta-'; + + var attrList = classAttributes.getMetaAttrsList(this.getClass()); + var c = this; + attrList.all.forEach(function(attr) { + toret.push({name: attr.name, value: c.getMetaAttr(attr.name) || ''}); + }); + + + return toret; +}; + +CanvasNode.prototype.setMetaAttr = function(attr, value) { + this.dom.attr('wlxml-meta-'+attr, value); +}; + +return { + create: function(desc) { + return new CanvasNode(desc); + } + +}; + + }); \ No newline at end of file