1 | var _stock = {}
|
2 | var _stockData = {}
|
3 | var uuid = -1;
|
4 |
|
5 | function getObjType(object){
|
6 | return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
|
7 | }
|
8 |
|
9 | function uniqueId(prefix){
|
10 | if (!prefix) prefix = 'random_'
|
11 | uuid++
|
12 | return prefix+uuid
|
13 | }
|
14 |
|
15 | function extend() {
|
16 | var options, name, src, copy, copyIsArray, clone
|
17 | , target = arguments[0] || {}
|
18 | , i = 1
|
19 | , length = arguments.length
|
20 | , deep = false;
|
21 |
|
22 | if (typeof target === "boolean") {
|
23 | deep = target;
|
24 | target = arguments[1] || {};
|
25 |
|
26 | i = 2;
|
27 | }
|
28 |
|
29 |
|
30 | if (typeof target !== "object" && typeof target != 'function') {
|
31 | target = {};
|
32 | }
|
33 |
|
34 | if (length === i) {
|
35 |
|
36 | if (Array.isArray(target)) target = []
|
37 | if (getObjType(target) == 'Object') target = {}
|
38 | --i;
|
39 | }
|
40 | for (; i < length; i++) {
|
41 |
|
42 | if ((options = arguments[i]) != null) {
|
43 |
|
44 | for (name in options) {
|
45 | src = target[name];
|
46 | copy = options[name];
|
47 |
|
48 | if (target === copy) {
|
49 | continue;
|
50 | }
|
51 |
|
52 | if (deep && copy && (getObjType(copy) === 'Object' || (copyIsArray = Array.isArray(copy)))) {
|
53 | if (copyIsArray) {
|
54 | copyIsArray = false;
|
55 | clone = src && Array.isArray(src) ? src : [];
|
56 | } else {
|
57 | clone = src && getObjType(copy) === 'Object' ? src : {};
|
58 | }
|
59 |
|
60 | target[name] = extend(deep, clone, copy);
|
61 |
|
62 | } else if (copy !== undefined) {
|
63 | target[name] = copy;
|
64 | }
|
65 | }
|
66 | }
|
67 | }
|
68 |
|
69 | return target;
|
70 | };
|
71 |
|
72 |
|
73 | var _count = {}
|
74 | var count = function(name) {
|
75 | if (_count[name]) {
|
76 | _count[name]++;
|
77 | return true;
|
78 | } else {
|
79 |
|
80 | _count[name] = 1;
|
81 | return false;
|
82 | }
|
83 | }
|
84 |
|
85 | var store = function( name, data, act ){
|
86 | this.name = name || '';
|
87 | this.sdata = data || {};
|
88 | this.sact = act||{};
|
89 | this.ctx = {"null":null};
|
90 | var me = this;
|
91 |
|
92 | this.dataer = function(data, key) {
|
93 | var keyData;
|
94 | if (key) keyData = _stockData[this.name+'.'+key]
|
95 | if (!data) data = this.sdata
|
96 | if (data || keyData) {
|
97 |
|
98 | var _resault = [];
|
99 | if (getObjType(this.sact) === 'Array') {
|
100 | var acts = this.sact;
|
101 | acts.map(function(fun) {
|
102 | if (getObjType(fun.args) === 'Array') {
|
103 | if (count(me.name)) {
|
104 | fun.args.pop()
|
105 | }
|
106 | fun.args.push(data||{})
|
107 | if (typeof fun === 'function') {
|
108 | var _tmp = fun.apply(fun.args[0], [fun.args[0], data])
|
109 | _resault.push(_tmp);
|
110 | }
|
111 | } else {
|
112 | if (typeof fun === 'function') {
|
113 | var _tmp = fun.call(me.ctx[me.name||'null'], data);
|
114 | _resault.push(_tmp);
|
115 | }
|
116 | if (getObjType(fun)=='Object') {
|
117 | Object.keys(fun).map(function(item){
|
118 | if (typeof fun[item] == 'function'){
|
119 | var _tmp = fun[item].call(me.ctx[me.name||'null'], data)
|
120 | _resault.push(_tmp)
|
121 | }
|
122 | })
|
123 | }
|
124 | }
|
125 | })
|
126 | return _resault;
|
127 | }
|
128 | if (getObjType(this.sact) === 'Object') {
|
129 | var sacts = this.sact
|
130 | if (key) {
|
131 | if (sacts[key]) {
|
132 | var fun = sacts[key]
|
133 | if (getObjType(fun.args) === 'Array') {
|
134 | if (count(me.name)) {
|
135 | fun.args.pop()
|
136 | }
|
137 | fun.args.push((keyData||data||{}))
|
138 | if (typeof fun === 'function')
|
139 | return fun.apply(fun.args[0], [fun.args[0], (keyData||data)])
|
140 | } else {
|
141 | if (typeof fun === 'function')
|
142 | return fun.call(me.ctx[me.name||'null'], (keyData||data));
|
143 | }
|
144 | }
|
145 | } else {
|
146 | for (var item in sacts) {
|
147 | var _keydata = _stockData[me.name+'.'+item]
|
148 | if (typeof sacts[item] === 'function') {
|
149 | var fun = sacts[item]
|
150 | if (getObjType(fun.args) === 'Array') {
|
151 | if (count(me.name)) {
|
152 | fun.args.pop()
|
153 | }
|
154 | fun.args.push((data||_keydata||{}))
|
155 | if (typeof fun === 'function'){
|
156 | var _tmp = fun.apply(fun.args[0], [fun.args[0], (data||_keydata)])
|
157 | _resault.push(_tmp)
|
158 | }
|
159 | } else {
|
160 | if (typeof fun === 'function'){
|
161 | var _tmp = fun.call(me.ctx[me.name||'null'], (data||_keydata));
|
162 | _resault.push(_tmp)
|
163 | }
|
164 | }
|
165 | }
|
166 | }
|
167 | return _resault
|
168 | }
|
169 | }
|
170 | if (getObjType(this.sact) === 'Function') {
|
171 | var fun = this.sact
|
172 | if (Array.isArray(fun.args)) {
|
173 | if (count(me.name)) { fun.args.pop() }
|
174 | fun.args.push((data||_keydata||{}))
|
175 | return typeof fun == 'function' ? fun.apply(fun.args[0], [fun.args[0], data]) : ''
|
176 | } else {
|
177 | return typeof fun == 'function' ? fun.call(me.ctx[me.name||'null'], (data||_keydata)) : ''
|
178 | }
|
179 | }
|
180 | } else {
|
181 | var _resault = [];
|
182 | if (getObjType(this.sact) === 'Array') {
|
183 | var acts = this.sact;
|
184 | var _resault = [];
|
185 | acts.map(function(fun) {
|
186 | if (getObjType(fun.args) === 'Array') {
|
187 | if (typeof fun === 'function') {
|
188 | var _tmp = fun.apply(fun.args[0], fun.args);
|
189 | _resault.push(_tmp);
|
190 | }
|
191 | } else {
|
192 | if (typeof fun === 'function') {
|
193 | var _tmp = fun.call(me.ctx[me.name||'null']);
|
194 | _resault.push(_tmp);
|
195 | }
|
196 | if (getObjType(fun)=='Object') {
|
197 | Object.keys(fun).map(function(item){
|
198 | if (typeof fun[item] == 'function'){
|
199 | var _tmp = fun[item].call(me.ctx[me.name||'null'])
|
200 | _resault.push(_tmp)
|
201 | }
|
202 | })
|
203 | }
|
204 | }
|
205 | })
|
206 | return _resault;
|
207 | }
|
208 | if (getObjType(this.sact) === 'Object') {
|
209 | var sacts = this.sact
|
210 | if (key) {
|
211 | if (sacts[key]) {
|
212 | var fun = sacts[key]
|
213 | if (getObjType(fun.args) === 'Array') {
|
214 | if (typeof fun === 'function'){
|
215 | return fun.apply(fun.args[0], fun.args)
|
216 | }
|
217 | } else {
|
218 | if (typeof fun === 'function')
|
219 | return fun.call(me.ctx[me.name||'null']);
|
220 | }
|
221 | }
|
222 | } else {
|
223 | for (var item in sacts) {
|
224 | var _keydata = _stockData[me.name+'.'+item]
|
225 | if (typeof sacts[item] === 'function') {
|
226 | var fun = sacts[item]
|
227 | if (getObjType(fun.args) === 'Array') {
|
228 | if (typeof fun === 'function'){
|
229 | var _tmp = fun.apply(fun.args[0], [fun.args[0], _keydata])
|
230 | _resault.push(_tmp);
|
231 | }
|
232 | } else {
|
233 | if (typeof fun === 'function'){
|
234 | var _tmp = fun.call(me.ctx[me.name||'null'], _keydata);
|
235 | _resault.push(_tmp);
|
236 | }
|
237 | }
|
238 | }
|
239 | }
|
240 | return _resault
|
241 | }
|
242 | }
|
243 | if (getObjType(this.sact) === 'Function') {
|
244 | var fun = this.sact
|
245 | if (Array.isArray(fun.args)) {
|
246 | return typeof fun == 'function' ? fun.apply(fun.args[0], fun.args) : ''
|
247 | } else {
|
248 | return typeof fun == 'function' ? fun.call(me.ctx[me.name||'null']) : ''
|
249 | }
|
250 | }
|
251 | }
|
252 | }
|
253 |
|
254 | this.acter = function( act ){
|
255 | var s_type = getObjType(this.sact)
|
256 | var a_type = getObjType(act)
|
257 |
|
258 | switch (s_type) {
|
259 | case 'Object':
|
260 | if (typeof act == 'object') this.sact = extend({}, this.sact, act)
|
261 | else {
|
262 | var _uuid = uniqueId()
|
263 | if (typeof act == 'function') this.sact[_uuid] = act
|
264 | }
|
265 | break;
|
266 | case 'Array':
|
267 | switch (a_type) {
|
268 | case 'Array':
|
269 | this.sact = this.sact.concat(act)
|
270 | break;
|
271 | case 'Object':
|
272 | this.sact = extend({}, this.sact, act)
|
273 | break;
|
274 | case 'Function':
|
275 | this.sact = this.sact.push(act)
|
276 | break;
|
277 | }
|
278 | break;
|
279 | case 'Function':
|
280 | switch (a_type) {
|
281 | case 'Array':
|
282 | this.sact = act.unshift(this.sact)
|
283 | break;
|
284 | case 'Object':
|
285 | var _uuid = uniqueId()
|
286 | this.sact = act[_uuid] = this.sact
|
287 | break;
|
288 | case 'Function':
|
289 | this.sact = [this.sact, act]
|
290 | break;
|
291 | }
|
292 | break;
|
293 | default:
|
294 | if (typeof act == 'function') this.sact = act
|
295 | }
|
296 | }
|
297 |
|
298 | this.setter = function( data, act ){
|
299 | if( data ) this.sdata = data;
|
300 | if( act ) this.sact = act;
|
301 | };
|
302 |
|
303 | this.getter = function( type ){
|
304 | if( type === 'action' ) return this.sact;
|
305 | if( type === 'data') return this.sdata;
|
306 | };
|
307 |
|
308 | this.binder = function(ctx) {
|
309 | this.ctx[this.name] = ctx
|
310 | }
|
311 | }
|
312 |
|
313 |
|
314 | var storeAct = {
|
315 | append: function(name, dataOrAct, fun){
|
316 | if (!name || name == '') return false;
|
317 |
|
318 | var save = _stock;
|
319 |
|
320 | if (!save[name]) {
|
321 | this.set(name, dataOrAct, fun)
|
322 | return
|
323 | }
|
324 |
|
325 | var target;
|
326 | var s_type = getObjType(save[name].sdata)
|
327 | var d_type = getObjType(dataOrAct)
|
328 |
|
329 | switch (s_type) {
|
330 | case 'Array':
|
331 | if (d_type == 'Array') {
|
332 | save[name].sdata = save[name].sdata.concat(dataOrAct)
|
333 | } else {
|
334 | save[name].sdata.push(dataOrAct)
|
335 | }
|
336 | break;
|
337 | case 'Object':
|
338 | switch (d_type) {
|
339 | case 'Object':
|
340 |
|
341 | save[name].sdata = extend({}, save[name].sdata, dataOrAct)
|
342 | break;
|
343 | default:
|
344 | var _uuid = uniqueId(name+'_')
|
345 | save[name].sdata[_uuid] = dataOrAct
|
346 | }
|
347 | break;
|
348 | default:
|
349 | if (dataOrAct) save[name].sdata = [save[name].sdata, dataOrAct]
|
350 | }
|
351 | },
|
352 |
|
353 | pop: function(name){
|
354 | if (!name || name == '') return false;
|
355 | var save = _stock;
|
356 | if (save[name]) {
|
357 | var tmp = save[name].getter('data')
|
358 | if (getObjType(tmp) === 'Array') {
|
359 | var popdata = tmp.pop();
|
360 | save[name].setter(tmp)
|
361 | return [tmp, popdata]
|
362 | }
|
363 | }
|
364 | },
|
365 |
|
366 | update: function(name, target){
|
367 | if (!name || name == '') return false;
|
368 | if (typeof target != 'object') return false;
|
369 | var save = _stock;
|
370 | if (!save[name]) return false
|
371 | var odata = save[name].getter('data')
|
372 | Object.keys(target).map(function(item, ii){
|
373 | odata[item] = target[item]
|
374 | })
|
375 | },
|
376 |
|
377 | set: function(name, dataOrAct, fun){
|
378 | if (!name || name == '') return false;
|
379 | if (!dataOrAct) dataOrAct = {}
|
380 | var save = _stock;
|
381 | if (!save[name]) {
|
382 | var thisStore = new store(name);
|
383 | save[name] = thisStore;
|
384 | }
|
385 | if (dataOrAct && dataOrAct !== "") {
|
386 | if (getObjType(dataOrAct) === 'Function') {
|
387 | if (getObjType(fun) === 'Array') {
|
388 | dataOrAct.args = fun;
|
389 | } else {
|
390 | if (fun) dataOrAct.args = [fun]
|
391 | }
|
392 | save[name].acter(dataOrAct);
|
393 | } else {
|
394 | if (getObjType(dataOrAct) === 'Object' ||
|
395 | getObjType(dataOrAct) === 'String' ||
|
396 | getObjType(dataOrAct) === 'Boolean') {
|
397 | save[name].setter(dataOrAct);
|
398 | }
|
399 | else if (getObjType(dataOrAct) === 'Array') {
|
400 | var isFuns = true;
|
401 | if (!dataOrAct.length) {
|
402 | save[name].setter([]);
|
403 | } else {
|
404 | dataOrAct.map(function(item, i) {
|
405 | if (getObjType(item) !== 'Function') isFuns = false;
|
406 | })
|
407 | if (isFuns) {
|
408 | if (getObjType(fun) === 'Array') {
|
409 | dataOrAct.map(function(item, i) {
|
410 | if (getObjType(fun[i]) === 'Array'){
|
411 | item.args = fun[i];
|
412 | } else {
|
413 | if (fun[i]) item.args = [fun[i]]
|
414 | }
|
415 | })
|
416 | }
|
417 | save[name].acter(dataOrAct);
|
418 |
|
419 | } else {
|
420 | save[name].setter(dataOrAct);
|
421 | }
|
422 | }
|
423 | }
|
424 | }
|
425 | }
|
426 |
|
427 | if (fun) {
|
428 | if (getObjType(fun) === 'Function') save[name].acter(fun);
|
429 |
|
430 | if (getObjType(fun) === 'Array') {
|
431 | var isFuns = true;
|
432 | fun.map(function(item, i) {
|
433 | if (getObjType(item) !== 'Function') isFuns = false;
|
434 | })
|
435 | if (isFuns) {
|
436 | save[name].acter(fun);
|
437 | }
|
438 | }
|
439 |
|
440 | if (getObjType(fun) === 'Object') {
|
441 | save[name].acter(fun)
|
442 | }
|
443 | }
|
444 |
|
445 | return SAX(name)
|
446 | },
|
447 |
|
448 | get: function(name){
|
449 | if(!name||name=='') return;
|
450 | var save = _stock;
|
451 | if(save[name]){
|
452 | return save[name].getter( 'data' )
|
453 | } else {
|
454 | return false;
|
455 | }
|
456 | },
|
457 |
|
458 | setter: function(name, dataOrAct, fun) {
|
459 | if (dataOrAct) this.append(name, dataOrAct, fun)
|
460 | return _stock[name].dataer(_stock[name].sdata)
|
461 | },
|
462 |
|
463 | getter: function(name){
|
464 | if(!name||name=='') return;
|
465 | var save = _stock;
|
466 | if(save[name]){
|
467 | var that = save[name]
|
468 | function runner(data, key){
|
469 | return that.dataer(data, key)
|
470 | }
|
471 | return {
|
472 | run: runner,
|
473 | data: save[name].getter( 'data' ),
|
474 | action: save[name].getter( 'action' )
|
475 | }
|
476 | }
|
477 | },
|
478 |
|
479 | deleter: function( name ){
|
480 | if(!name||name=='') return;
|
481 | var save = _stock;
|
482 | if(save[name]){
|
483 | delete save[name];
|
484 | }
|
485 | },
|
486 |
|
487 | runner: function( name, ddd, key, cb ){
|
488 | if (!name || name == '') return false
|
489 | var save = _stock
|
490 | if (save[name]) {
|
491 | var that = save[name]
|
492 |
|
493 | function _runner(data, key) {
|
494 | return that.dataer(data, key)
|
495 | }
|
496 |
|
497 | var _data = that.getter('data')
|
498 |
|
499 | if (key && ddd) {
|
500 | var keyofdata = name + '.' + key
|
501 | _stockData[keyofdata] = typeof ddd == 'object' ? extend({}, ddd) : ddd
|
502 | }
|
503 | if (that.sact) return _runner((ddd||_data), key)
|
504 | }
|
505 | },
|
506 |
|
507 | has: function(id, cb){
|
508 | var keys = Object.keys(_stock)
|
509 | if (keys.indexOf(id)>-1) {
|
510 | var that = _stock[id]
|
511 | if (typeof cb=='function') {
|
512 | var _data = that.getter('data')
|
513 | return cb(_data)
|
514 | }
|
515 | return true
|
516 | }
|
517 | },
|
518 |
|
519 | lister: function(){
|
520 | return Object.keys( _stock );
|
521 | },
|
522 |
|
523 | bind: function(name, ctx) {
|
524 | if (!name || name == '') return;
|
525 | var save = _stock;
|
526 | if (!save[name]) save[name] = new store(name)
|
527 | save[name].binder(ctx||null)
|
528 | }
|
529 | }
|
530 | storeAct.trigger = storeAct.setter
|
531 | storeAct.roll = function(name, key, ddd){
|
532 | if (typeof key == 'object') {
|
533 | ddd = key
|
534 | return storeAct.runner(name, ddd)
|
535 | } else {
|
536 | return storeAct.runner(name, ddd, key)
|
537 | }
|
538 | }
|
539 |
|
540 | function sax(name, data, funs){
|
541 | this.ctx
|
542 | this.name = name
|
543 | this.data = data
|
544 | this.funs = funs
|
545 | this.store = _stock[name]
|
546 | }
|
547 | sax.prototype = {
|
548 | roll: function(key, data){
|
549 | return storeAct.roll(this.name, key, data)
|
550 | },
|
551 | setActions: function(opts){
|
552 | this.store.acter(opts)
|
553 | },
|
554 | set: function(data, fun){
|
555 | storeAct.set(this.name, data, fun)
|
556 | },
|
557 | get: function(){
|
558 | return this.store.sdata
|
559 | },
|
560 | append: function(data, fun){
|
561 | storeAct.append(this.name, data, fun)
|
562 | this.data = this.store.sdata
|
563 | return this.data
|
564 | },
|
565 | update: function(data){
|
566 | return storeAct.update(this.name, data)
|
567 | },
|
568 | bind: function(ctx){
|
569 | storeAct.bind(this.name, ctx)
|
570 | this.ctx = ctx
|
571 | return this
|
572 | },
|
573 | has: function(id, cb){
|
574 | return storeAct.has(id, cb)
|
575 | },
|
576 | pop: function(){
|
577 | return storeAct.pop(this.name)
|
578 | },
|
579 | trigger: function(data){
|
580 | return storeAct.trigger(this.name, data)
|
581 | }
|
582 | }
|
583 |
|
584 | var saxInstance = {}
|
585 | function SAX(name, data, funs){
|
586 | if (name) {
|
587 | var save = _stock;
|
588 | if (save[name]) {
|
589 | return saxInstance[name]
|
590 | } else {
|
591 | storeAct.set(name, data, funs)
|
592 | var instance = new sax(name, data, funs)
|
593 | saxInstance[name] = instance
|
594 | return instance
|
595 | }
|
596 | }
|
597 | }
|
598 |
|
599 | SAX.fn = {
|
600 | extend: function(opts){
|
601 | var _fn = sax.prototype
|
602 | if (getObjType(opts) == 'Object') {
|
603 | sax.prototype = extend(_fn, opts)
|
604 | }
|
605 | }
|
606 | }
|
607 |
|
608 | var _keys = Object.keys(storeAct)
|
609 | _keys.map(function(item, ii){
|
610 | SAX[item] = storeAct[item]
|
611 | })
|
612 |
|
613 | module.exports = SAX
|