1 |
|
2 | var Type = require('./type');
|
3 | var Val = require('./val');
|
4 | var Node = {_: '_'};
|
5 | Node.soul = function(n, o){ return (n && n._ && n._[o || soul_]) }
|
6 | Node.soul.ify = function(n, o){
|
7 | o = (typeof o === 'string')? {soul: o} : o || {};
|
8 | n = n || {};
|
9 | n._ = n._ || {};
|
10 | n._[soul_] = o.soul || n._[soul_] || text_random();
|
11 | return n;
|
12 | }
|
13 | ;(function(){
|
14 | Node.is = function(n, cb, as){ var s;
|
15 | if(!obj_is(n)){ return false }
|
16 | if(s = Node.soul(n)){
|
17 | return !obj_map(n, map, {as:as,cb:cb,s:s,n:n});
|
18 | }
|
19 | return false;
|
20 | }
|
21 | function map(v, f){
|
22 | if(f === Node._){ return }
|
23 | if(!Val.is(v)){ return true }
|
24 | if(this.cb){ this.cb.call(this.as, v, f, this.n, this.s) }
|
25 | }
|
26 | }());
|
27 | ;(function(){
|
28 | Node.ify = function(obj, o, as){
|
29 | if(!o){ o = {} }
|
30 | else if(typeof o === 'string'){ o = {soul: o} }
|
31 | else if(o instanceof Function){ o = {map: o} }
|
32 | if(o.map){ o.node = o.map.call(as, obj, u, o.node || {}) }
|
33 | if(o.node = Node.soul.ify(o.node || {}, o)){
|
34 | obj_map(obj, map, {o:o,as:as});
|
35 | }
|
36 | return o.node;
|
37 | }
|
38 | function map(v, f){ var o = this.o, tmp, u;
|
39 | if(o.map){
|
40 | tmp = o.map.call(this.as, v, ''+f, o.node);
|
41 | if(u === tmp){
|
42 | obj_del(o.node, f);
|
43 | } else
|
44 | if(o.node){ o.node[f] = tmp }
|
45 | return;
|
46 | }
|
47 | if(Val.is(v)){
|
48 | o.node[f] = v;
|
49 | }
|
50 | }
|
51 | }());
|
52 | var obj = Type.obj, obj_is = obj.is, obj_del = obj.del, obj_map = obj.map;
|
53 | var text = Type.text, text_random = text.random;
|
54 | var soul_ = Val.rel._;
|
55 | var u;
|
56 | module.exports = Node;
|
57 | |
\ | No newline at end of file |