186 lines
5.7 KiB
JavaScript
186 lines
5.7 KiB
JavaScript
const reGrouping = /(\d+)(\d{3})/;
|
|
|
|
function clone(o) {
|
|
if (o == null) {
|
|
return o;
|
|
}
|
|
|
|
if (Array.isArray(o)) {
|
|
return o.map(clone);
|
|
}
|
|
|
|
if (o instanceof Date) {
|
|
// we do not clone date objects but convert them to an iso string
|
|
return o.toISOString();
|
|
}
|
|
|
|
if (typeof o == 'object') {
|
|
let oo = {};
|
|
for (let key in o) {
|
|
oo[key] = clone(o[key]);
|
|
}
|
|
return oo;
|
|
}
|
|
|
|
return o;
|
|
}
|
|
|
|
function mergeDeep(target, source) {
|
|
if (isObject(target) && isObject(source)) {
|
|
for (const key in source) {
|
|
if (isObject(source[key])) {
|
|
if (!target[key]) {
|
|
Object.assign(target, { [key]: {} });
|
|
}
|
|
|
|
mergeDeep(target[key], source[key]);
|
|
} else {
|
|
Object.assign(target, { [key]: source[key] });
|
|
}
|
|
}
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
function isObject(item) {
|
|
return (item && typeof item === 'object' && !Array.isArray(item) && item !== null);
|
|
}
|
|
|
|
module.exports = {
|
|
|
|
clone,
|
|
|
|
mergeDeep,
|
|
|
|
escapeRegExp: function(val) {
|
|
// https://github.com/benjamingr/RegExp.escape
|
|
return val.replace(/[\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
},
|
|
|
|
keysToLowerCase: function(o) {
|
|
return Object.keys(o).reduce((c, k) => (c[k.toLowerCase()] = o[k], c), {});
|
|
},
|
|
|
|
padNumber: function(num, digids, trim) {
|
|
let sign = '';
|
|
|
|
if (num < 0) {
|
|
sign = '-';
|
|
num = -num;
|
|
}
|
|
|
|
num = String(num);
|
|
|
|
while (num.length < digids) {
|
|
num = '0' + num;
|
|
}
|
|
|
|
if (trim) {
|
|
num = num.substr(num.length - digids);
|
|
}
|
|
|
|
return sign + num;
|
|
},
|
|
|
|
formatNumber: function(num, decimals, decimalSeparator, groupingSeparator) {
|
|
num = Number(num);
|
|
|
|
if (isNaN(num) || !isFinite(num)) return '';
|
|
|
|
decimalSeparator = typeof decimalSeparator == 'string' ? decimalSeparator : '.';
|
|
groupingSeparator = typeof groupingSeparator == 'string' ? groupingSeparator : '';
|
|
precision = typeof precision == 'number' ? Math.abs(precision) : null;
|
|
|
|
let minus = num < 0;
|
|
let parts = (decimals == null ? String(Math.abs(num)) : Math.abs(num).toFixed(decimals)).split('.');
|
|
let wholePart = parts[0];
|
|
let decimalPart = parts.length > 1 ? decimalSeparator + parts[1] : '';
|
|
|
|
if (groupingSeparator) {
|
|
while (reGrouping.test(wholePart)) {
|
|
wholePart = wholePart.replace(reGrouping, '$1' + groupingSeparator + '$2');
|
|
}
|
|
}
|
|
|
|
return (minus ? '-' : '') + wholePart + decimalPart;
|
|
},
|
|
|
|
parseDate: function(obj) {
|
|
if (Object.prototype.toString.call(obj) == '[object Date]') return new Date(obj);
|
|
|
|
let date = new Date(obj);
|
|
|
|
if (typeof obj == 'number') {
|
|
date = new Date(obj * 1000);
|
|
}
|
|
|
|
if (typeof obj == 'string') {
|
|
if (obj == 'now') {
|
|
date = new Date();
|
|
} else if (/^\d{4}-\d{2}-\d{2}$/.test(obj)) {
|
|
let parts = obj.split('-');
|
|
date = new Date(parts[0], parts[1] - 1, parts[2]);
|
|
} else if (/^\d{2}:\d{2}:\d{2}$/.test(obj)) {
|
|
let parts = obj.split(':');
|
|
date = new Date();
|
|
date.setHours(parts[0]);
|
|
date.setMinutes(parts[1]);
|
|
date.setSeconds(parts[2]);
|
|
date.setMilliseconds(0);
|
|
}
|
|
}
|
|
|
|
if (date.toString() == 'Invalid Date') {
|
|
return undefined;
|
|
}
|
|
|
|
return date;
|
|
},
|
|
|
|
formatDate: function(date, format, utc, locale) {
|
|
date = module.exports.parseDate(date);
|
|
if (date == null) return date;
|
|
locale = typeof locale == 'string' ? locale : 'en-US';
|
|
const lang = require('../locale/' + locale);
|
|
const pad = (v, n) => `0000${v}`.substr(-n);
|
|
|
|
let y = utc ? date.getUTCFullYear() : date.getFullYear(),
|
|
n = utc ? date.getUTCMonth() : date.getMonth(),
|
|
d = utc ? date.getUTCDate() : date.getDate(),
|
|
w = utc ? date.getUTCDay() : date.getDay(),
|
|
h = utc ? date.getUTCHours() : date.getHours(),
|
|
m = utc ? date.getUTCMinutes() : date.getMinutes(),
|
|
s = utc ? date.getUTCSeconds() : date.getSeconds(),
|
|
v = utc ? date.getUTCMilliseconds() : date.getMilliseconds();
|
|
|
|
return format.replace(/([yMdHhmsaAvw])(\1+)?/g, part => {
|
|
switch (part) {
|
|
case 'yyyy': return pad(y, 4);
|
|
case 'yy': return pad(y, 2);
|
|
case 'y': return y;
|
|
case 'MMMM': return lang.months[n];
|
|
case 'MMM': return lang.monthsShort[n];
|
|
case 'MM': return pad(n + 1, 2);
|
|
case 'M': return n + 1;
|
|
case 'dddd': return lang.days[w];
|
|
case 'ddd': return lang.daysShort[w];
|
|
case 'dd': return pad(d, 2);
|
|
case 'd': return d;
|
|
case 'HH': return pad(h, 2);
|
|
case 'H': return h;
|
|
case 'hh': return pad((h % 12) || 12, 2);
|
|
case 'h': return (h % 12) || 12;
|
|
case 'mm': return pad(m, 2);
|
|
case 'm': return m;
|
|
case 'ss': return pad(s, 2);
|
|
case 's': return s;
|
|
case 'a': return h < 12 ? 'am' : 'pm';
|
|
case 'A': return h < 12 ? 'AM' : 'PM';
|
|
case 'v': return pad(v, 3);
|
|
case 'w': return w;
|
|
}
|
|
});
|
|
}
|
|
|
|
}; |