icat-core
Version:
icat core
326 lines (296 loc) • 7.63 kB
JavaScript
;
/*!
* Copyright 2011~2016, ICAT JavaScript Library 0.0.2
* https://github.com/valleykid/icat#readme
*
* Copyright (c) 2016 valleykid
* Licensed under the MIT license.
*
* @Author valleykiddy@gmail.com
* @Time 2016-01-27 00:19:32
*/
module.exports = function (root, nodeEnv) {
var iCat = root['ICAT'] || { version: '0.0.2' },
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 removeItem(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 isEmptyObject(obj) {
for (var name in obj) {
return false;
}
return true;
},
/**
* ICAT's utils/tools
* @param {String/Function} name 方法名/执行函数
* @param {Function} fn 方法体
*/
util: function util(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 widget(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 wait(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 encrypt(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 decode(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 trim(s, isAll) {
return isAll ? s.replace(/\s/g, '') : s.replace(/^\s+|\s+$/g, '');
},
removeExcess: function removeExcess(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');