icat-core
Version:
icat core
318 lines (289 loc) • 7.38 kB
JavaScript
/*!
* 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'
);