UNPKG

icat-core

Version:
318 lines (289 loc) 7.38 kB
/*! * Copyright 2011~<%=today("yyyy")%>, <%=pkg.name.toLocaleUpperCase()%> JavaScript Library <%=pkg.version%> * <%=pkg.homepage%> * * Copyright (c) <%=today("yyyy")%> <%=pkg.author.name%> * Licensed under the <%=pkg.licenses[0].type%> license. * * @Author <%=pkg.author.email%> * @Time <%=today("yyyy-mm-dd HH:MM:ss")%> */ module.exports = function(root, nodeEnv){ var iCat = root['ICAT'] || {version:'<%=pkg.version%>'}, extfunc; // Kinds of judgments foreach( ['String', 'Boolean', 'Function', 'Array', 'Object', 'Number', 'RegExp'], function(v){ iCat['is'+v] = function(obj){ if(obj===undefined || obj===null) return false; return Object.prototype.toString.call(obj).slice(8, -1) === v; }; } ); iCat.extend = function(){ var o = this, evts, argus = Array.prototype.slice.call(arguments); if(!nodeEnv){ //for events foreach(argus, function(item, k){ if(item.events){ evts = evts || {}; extend(evts, item.events); delete item.events; } }); evts && iCat.util.bindEvent(evts, null, o); } argus.unshift(o); extend.apply(o, argus); return o; }; iCat.extend({ foreach: foreach, mixin: extend, mix: mix, deepClone: deepClone, hasItem: hasItem, unique: unique, // 数组去除指定项 removeItem: function(arr, item){ if(!iCat.hasItem(arr, item) && iCat.isNumber(item)){ arr.splice(item, 1); } else { var index = getIndex(arr, item); if(index!==-1) arr.splice(index, 1); } return arr; }, isEmptyObject: function(obj){ for(var name in obj){ return false; } return true; }, /** * ICAT's utils/tools * @param {String/Function} name 方法名/执行函数 * @param {Function} fn 方法体 */ util: function(name, fn){ if(iCat.isString(name)) iCat.util[name] = fn || function(){}; else if(iCat.isFunction(name)) mix(iCat.util, name()); else if(iCat.isObject(name)) mix(iCat.util, name); else if(iCat.isArray(name)){ foreach(name, function(o){ if(o.utilName && o.callback){ iCat.util[o.utilName] = o.callback; } }); } }, widget: function(name, fn){ if(iCat.isString(name)) iCat.widget[name] = iCat.isFunction(fn)? fn() : fn; else if(iCat.isObject(name)){ foreach(name, function(o, k){ if(o) iCat.widget[k] = iCat.isFunction(o)? o() : o; }); } else if(iCat.isArray(name)){ foreach(name, function(o){ var fn = o.create; if(o.widgetName && fn){ iCat.util[o.widgetName] = iCat.isFunction(fn)? fn() : fn; } }); } }, /** * 等待某对象生效后执行操作 * @param {Function} cb [description] * @param {[type]} delay 超时临界值 * @param {[type]} step 每隔多少ms执行一次 */ wait: function(cb, delay, step){ delay = delay || 100; step = step || 10; var Cache = iCat.wait; var steps = 0, fn, key = 'icat_timer' + Math.floor(Math.random()*1000000+1); if(cb(false)!==false) return; //do first Cache[key] = setInterval(function(){ if(cb(steps>=delay)===false && steps<delay){ steps += step; } else { clearInterval(Cache[key]); delete Cache[key]; } }, step); }, //加密 encrypt: function(source, key){ var arr = []; var len = source.length, keyLen = key.length; for(var i=0; i<len; i++){ var k = source.charCodeAt(i)^key.charCodeAt(i%keyLen); arr.push(k); } return arr.join('^'); }, //解密 decode: function(s, key){ if(!iCat.isString(s)|| !/^\d+(\^\d+)+$/.test(s) ) return ''; var arr = s.split('^'), len = arr.length; var keyLen = key.length, ret = []; for(var i=0; i<len; i++){ var k = (+arr[i])^key.charCodeAt(i%keyLen); ret.push(String.fromCharCode(k)); } return ret.join(''); }, trim: function(s, isAll){ return isAll? s.replace(/\s/g, '') : s.replace(/^\s+|\s+$/g, ''); }, removeExcess: function(s){ s = s.replace('??', '@'); return s.replace(/(\?|#).*$/, '').replace('@', '??'); } }); extfunc = nodeEnv? require('./node') : require('./browser'); extfunc(iCat, root); module.exports = root['ICAT'] = iCat; /** * Handles objects with the built-in 'foreach', arrays, and raw objects. * @param {Array/Object} o 被遍历的对象/数组 * @param {Function} cb 回调方法,返回false则跳出遍历 * @param {Array} args 传递给回调方法的参数 * @param {Boolean} setObj 设定o是或不是对象 */ function foreach(o, cb, args, setObj){ var name, i = 0, length = o.length, isObj = setObj || length===undefined; if(args){ if(isObj){ for(name in o){ if(cb.apply(o[name], args)===false){ break; } } } else { for(;i<length;){ if(cb.apply(o[i++], args)===false){ break; } } } } else { if(isObj){ for(name in o){ if(cb.call(o[name], o[name], name)===false){ break; } } } else { for(;i<length;i++){ if(cb.call(o[i], o[i], i)===false){ break; } } } } } /** * Copies all the properties of s to r. * @param {Object} r 接收方 * @param {Object} s 发出方 * @param {Array/String} l Array时表示白名单,String时表示黑名单 * @return {Object} */ function mix(r, s, l){ if(!s || !r) return r; var i, p, len, white = true; if(l && iCat.isString(l)){ l = l.replace(/\s+/g, '').split(','); white = false; } if(l && (len=l.length)){ var o = {}; if(white){ foreach(l, function(p){ if(s[p]) o[p] = s[p]; }); } else { foreach(s, function(v, p){ if(!hasItem(l, p)) o[p] = v; }); } extend(r, o); } else { extend(r, s); } return r; } // same as underscore, but supports deep-meger function extend(obj){ var argus = Array.prototype.slice.call(arguments, 1); foreach(argus, function(source){ if(source){ for(var p in source){ if(iCat.isObject(obj[p]) && iCat.isObject(source[p])){ obj[p] = extend(obj[p], source[p]); } else if(iCat.isArray(obj[p])){ obj[p] = unique( obj[p].concat(source[p]) ); } else { obj[p] = source[p]; } } } }); return obj; } // 数组去重 function unique(arr){ var hash = {}, r = []; foreach(arr, function(v){ var k = root['JSON'] && iCat.isObject(v)? root['JSON'].stringify(v) : v; if(!hash[k]){ r.push(v); hash[k] = true; } }); return r; } // 数组(对象/字符串)是否包含某值 function hasItem(o, p){ if(iCat.isArray(o)) return getIndex(o, p)>-1; if(iCat.isObject(o)) return p in o; if(iCat.isString(o)) return o.indexOf(p)>-1; return false; } // 数组索引 function getIndex(arr, item){ if('indexOf' in arr) return arr.indexOf(item); var ret = -1; foreach(arr, function(v, i){ if(v===item){ret = i; return false;} }); return ret; } function deepClone(obj){ if(!obj) return; var o; if(obj.constructor==Object){ o = new obj.constructor(); } else { o = new obj.constructor(obj.valueOf()); } for(var k in obj){ if(o[k]!=obj[k]){ if(iCat.isObject(obj[k])){ o[k] = deepClone(obj[k]); } else if(iCat.isArray(obj[k])){ o[k] = obj[k].concat(); } else { o[k] = obj[k]; } } } return o; } return root['ICAT'] = iCat; }( global || {}, typeof window==='undefined' );