UNPKG

icat-core

Version:
326 lines (296 loc) 7.63 kB
'use strict'; /*! * 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');