0ed44f90de545bc6c110913bc3b88f75c51d638d6c604390d4379c37e161c2837aead1fb122b302ae1ce27a7143899837a71bba0313fcaa92bdc8a986be110 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import zeroFill from '../utils/zero-fill';
  2. export var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
  3. var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
  4. var formatFunctions = {};
  5. export var formatTokenFunctions = {};
  6. // token: 'M'
  7. // padded: ['MM', 2]
  8. // ordinal: 'Mo'
  9. // callback: function () { this.month() + 1 }
  10. export function addFormatToken (token, padded, ordinal, callback) {
  11. var func = callback;
  12. if (typeof callback === 'string') {
  13. func = function () {
  14. return this[callback]();
  15. };
  16. }
  17. if (token) {
  18. formatTokenFunctions[token] = func;
  19. }
  20. if (padded) {
  21. formatTokenFunctions[padded[0]] = function () {
  22. return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
  23. };
  24. }
  25. if (ordinal) {
  26. formatTokenFunctions[ordinal] = function () {
  27. return this.localeData().ordinal(func.apply(this, arguments), token);
  28. };
  29. }
  30. }
  31. function removeFormattingTokens(input) {
  32. if (input.match(/\[[\s\S]/)) {
  33. return input.replace(/^\[|\]$/g, '');
  34. }
  35. return input.replace(/\\/g, '');
  36. }
  37. function makeFormatFunction(format) {
  38. var array = format.match(formattingTokens), i, length;
  39. for (i = 0, length = array.length; i < length; i++) {
  40. if (formatTokenFunctions[array[i]]) {
  41. array[i] = formatTokenFunctions[array[i]];
  42. } else {
  43. array[i] = removeFormattingTokens(array[i]);
  44. }
  45. }
  46. return function (mom) {
  47. var output = '', i;
  48. for (i = 0; i < length; i++) {
  49. output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
  50. }
  51. return output;
  52. };
  53. }
  54. // format date using native date object
  55. export function formatMoment(m, format) {
  56. if (!m.isValid()) {
  57. return m.localeData().invalidDate();
  58. }
  59. format = expandFormat(format, m.localeData());
  60. formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
  61. return formatFunctions[format](m);
  62. }
  63. export function expandFormat(format, locale) {
  64. var i = 5;
  65. function replaceLongDateFormatTokens(input) {
  66. return locale.longDateFormat(input) || input;
  67. }
  68. localFormattingTokens.lastIndex = 0;
  69. while (i >= 0 && localFormattingTokens.test(format)) {
  70. format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
  71. localFormattingTokens.lastIndex = 0;
  72. i -= 1;
  73. }
  74. return format;
  75. }