You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

185 regels
5.7 KiB

  1. const reGrouping = /(\d+)(\d{3})/;
  2. function clone(o) {
  3. if (o == null) {
  4. return o;
  5. }
  6. if (Array.isArray(o)) {
  7. return o.map(clone);
  8. }
  9. if (o instanceof Date) {
  10. // we do not clone date objects but convert them to an iso string
  11. return o.toISOString();
  12. }
  13. if (typeof o == 'object') {
  14. let oo = {};
  15. for (let key in o) {
  16. oo[key] = clone(o[key]);
  17. }
  18. return oo;
  19. }
  20. return o;
  21. }
  22. function mergeDeep(target, source) {
  23. if (isObject(target) && isObject(source)) {
  24. for (const key in source) {
  25. if (isObject(source[key])) {
  26. if (!target[key]) {
  27. Object.assign(target, { [key]: {} });
  28. }
  29. mergeDeep(target[key], source[key]);
  30. } else {
  31. Object.assign(target, { [key]: source[key] });
  32. }
  33. }
  34. }
  35. return target;
  36. }
  37. function isObject(item) {
  38. return (item && typeof item === 'object' && !Array.isArray(item) && item !== null);
  39. }
  40. module.exports = {
  41. clone,
  42. mergeDeep,
  43. escapeRegExp: function(val) {
  44. // https://github.com/benjamingr/RegExp.escape
  45. return val.replace(/[\\^$*+?.()|[\]{}]/g, '\\$&');
  46. },
  47. keysToLowerCase: function(o) {
  48. return Object.keys(o).reduce((c, k) => (c[k.toLowerCase()] = o[k], c), {});
  49. },
  50. padNumber: function(num, digids, trim) {
  51. let sign = '';
  52. if (num < 0) {
  53. sign = '-';
  54. num = -num;
  55. }
  56. num = String(num);
  57. while (num.length < digids) {
  58. num = '0' + num;
  59. }
  60. if (trim) {
  61. num = num.substr(num.length - digids);
  62. }
  63. return sign + num;
  64. },
  65. formatNumber: function(num, decimals, decimalSeparator, groupingSeparator) {
  66. num = Number(num);
  67. if (isNaN(num) || !isFinite(num)) return '';
  68. decimalSeparator = typeof decimalSeparator == 'string' ? decimalSeparator : '.';
  69. groupingSeparator = typeof groupingSeparator == 'string' ? groupingSeparator : '';
  70. precision = typeof precision == 'number' ? Math.abs(precision) : null;
  71. let minus = num < 0;
  72. let parts = (decimals == null ? String(Math.abs(num)) : Math.abs(num).toFixed(decimals)).split('.');
  73. let wholePart = parts[0];
  74. let decimalPart = parts.length > 1 ? decimalSeparator + parts[1] : '';
  75. if (groupingSeparator) {
  76. while (reGrouping.test(wholePart)) {
  77. wholePart = wholePart.replace(reGrouping, '$1' + groupingSeparator + '$2');
  78. }
  79. }
  80. return (minus ? '-' : '') + wholePart + decimalPart;
  81. },
  82. parseDate: function(obj) {
  83. if (Object.prototype.toString.call(obj) == '[object Date]') return new Date(obj);
  84. let date = new Date(obj);
  85. if (typeof obj == 'number') {
  86. date = new Date(obj * 1000);
  87. }
  88. if (typeof obj == 'string') {
  89. if (obj == 'now') {
  90. date = new Date();
  91. } else if (/^\d{4}-\d{2}-\d{2}$/.test(obj)) {
  92. let parts = obj.split('-');
  93. date = new Date(parts[0], parts[1] - 1, parts[2]);
  94. } else if (/^\d{2}:\d{2}:\d{2}$/.test(obj)) {
  95. let parts = obj.split(':');
  96. date = new Date();
  97. date.setHours(parts[0]);
  98. date.setMinutes(parts[1]);
  99. date.setSeconds(parts[2]);
  100. date.setMilliseconds(0);
  101. }
  102. }
  103. if (date.toString() == 'Invalid Date') {
  104. return undefined;
  105. }
  106. return date;
  107. },
  108. formatDate: function(date, format, utc, locale) {
  109. date = module.exports.parseDate(date);
  110. if (date == null) return date;
  111. locale = typeof locale == 'string' ? locale : 'en-US';
  112. const lang = require('../locale/' + locale);
  113. const pad = (v, n) => `0000${v}`.substr(-n);
  114. let y = utc ? date.getUTCFullYear() : date.getFullYear(),
  115. n = utc ? date.getUTCMonth() : date.getMonth(),
  116. d = utc ? date.getUTCDate() : date.getDate(),
  117. w = utc ? date.getUTCDay() : date.getDay(),
  118. h = utc ? date.getUTCHours() : date.getHours(),
  119. m = utc ? date.getUTCMinutes() : date.getMinutes(),
  120. s = utc ? date.getUTCSeconds() : date.getSeconds(),
  121. v = utc ? date.getUTCMilliseconds() : date.getMilliseconds();
  122. return format.replace(/([yMdHhmsaAv])(\1+)?/g, part => {
  123. switch (part) {
  124. case 'yyyy': return pad(y, 4);
  125. case 'yy': return pad(y, 2);
  126. case 'y': return y;
  127. case 'MMMM': return lang.months[n];
  128. case 'MMM': return lang.monthsShort[n];
  129. case 'MM': return pad(n + 1, 2);
  130. case 'M': return n + 1;
  131. case 'dddd': return lang.days[w];
  132. case 'ddd': return lang.daysShort[w];
  133. case 'dd': return pad(d, 2);
  134. case 'd': return d;
  135. case 'HH': return pad(h, 2);
  136. case 'H': return h;
  137. case 'hh': return pad((h % 12) || 12, 2);
  138. case 'h': return (h % 12) || 12;
  139. case 'mm': return pad(m, 2);
  140. case 'm': return m;
  141. case 'ss': return pad(s, 2);
  142. case 's': return s;
  143. case 'a': return h < 12 ? 'am' : 'pm';
  144. case 'A': return h < 12 ? 'AM' : 'PM';
  145. case 'v': return pad(v, 3);
  146. }
  147. });
  148. }
  149. };