a49a5e5cb37be4b0ad928a54436d71dd6d0864cb1aa07662a17b0915fc2d8778af4c2658667fe75d7290bb262156cd88567f9ef16d1163707ff86cacfce793 2.8 KB

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