date.format.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /**
  2. * DevExtreme (localization/ldml/date.format.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var ARABIC_COMMA = "\u060c";
  11. var FORMAT_SEPARATORS = " .,:;/\\<>()-[]" + ARABIC_COMMA;
  12. var ARABIC_ZERO_CODE = 1632;
  13. var checkDigit = function(char) {
  14. var code = char && char.charCodeAt(0);
  15. return char >= "0" && char <= "9" || code >= ARABIC_ZERO_CODE && code < ARABIC_ZERO_CODE + 10
  16. };
  17. var checkPatternContinue = function(text, index, isDigit) {
  18. var char = text[index];
  19. var prevChar = text[index - 1];
  20. var nextChar = text[index + 1];
  21. if (!isDigit) {
  22. if ("." === char || " " === char && "." === prevChar) {
  23. return true
  24. }
  25. if ("-" === char && !checkDigit(nextChar)) {
  26. return true
  27. }
  28. }
  29. return FORMAT_SEPARATORS.indexOf(char) < 0 && isDigit === checkDigit(char)
  30. };
  31. var getPatternStartIndex = function(defaultPattern, index) {
  32. if (!checkDigit(defaultPattern[index])) {
  33. while (index > 0 && !checkDigit(defaultPattern[index - 1]) && ("." === defaultPattern[index - 1] || FORMAT_SEPARATORS.indexOf(defaultPattern[index - 1]) < 0)) {
  34. index--
  35. }
  36. }
  37. return index
  38. };
  39. var getDifference = function(defaultPattern, patterns, processedIndexes, isDigit) {
  40. var i = 0;
  41. var result = [];
  42. var patternsFilter = function(pattern) {
  43. return defaultPattern[i] !== pattern[i] && (void 0 === isDigit || checkDigit(defaultPattern[i]) === isDigit)
  44. };
  45. if (!Array.isArray(patterns)) {
  46. patterns = [patterns]
  47. }
  48. for (i = 0; i < defaultPattern.length; i++) {
  49. if (processedIndexes.indexOf(i) < 0 && patterns.filter(patternsFilter).length) {
  50. i = getPatternStartIndex(defaultPattern, i);
  51. do {
  52. isDigit = checkDigit(defaultPattern[i]);
  53. if (!result.length && !isDigit && checkDigit(patterns[0][i])) {
  54. break
  55. }
  56. result.push(i);
  57. processedIndexes.unshift(i);
  58. i++
  59. } while (defaultPattern[i] && checkPatternContinue(defaultPattern, i, isDigit));
  60. break
  61. }
  62. }
  63. if (1 === result.length && ("0" === defaultPattern[processedIndexes[0] - 1] || "\u0660" === defaultPattern[processedIndexes[0] - 1])) {
  64. processedIndexes.unshift(processedIndexes[0] - 1)
  65. }
  66. return result
  67. };
  68. var replaceCharsCore = function(pattern, indexes, char, patternPositions) {
  69. var baseCharIndex = indexes[0];
  70. var patternIndex = baseCharIndex < patternPositions.length ? patternPositions[baseCharIndex] : baseCharIndex;
  71. indexes.forEach(function(_, index) {
  72. pattern = pattern.substr(0, patternIndex + index) + (char.length > 1 ? char[index] : char) + pattern.substr(patternIndex + index + 1)
  73. });
  74. if (1 === indexes.length) {
  75. pattern = pattern.replace("0" + char, char + char);
  76. pattern = pattern.replace("\u0660" + char, char + char)
  77. }
  78. return pattern
  79. };
  80. var replaceChars = function(pattern, indexes, char, patternPositions) {
  81. var i;
  82. var index;
  83. var patternIndex;
  84. if (!checkDigit(pattern[indexes[0]] || "0")) {
  85. var letterCount = Math.max(indexes.length <= 3 ? 3 : 4, char.length);
  86. while (indexes.length > letterCount) {
  87. index = indexes.pop();
  88. patternIndex = patternPositions[index];
  89. patternPositions[index] = -1;
  90. for (i = index + 1; i < patternPositions.length; i++) {
  91. patternPositions[i]--
  92. }
  93. pattern = pattern.substr(0, patternIndex) + pattern.substr(patternIndex + 1)
  94. }
  95. index = indexes[indexes.length - 1] + 1, patternIndex = index < patternPositions.length ? patternPositions[index] : index;
  96. while (indexes.length < letterCount) {
  97. indexes.push(indexes[indexes.length - 1] + 1);
  98. for (i = index; i < patternPositions.length; i++) {
  99. patternPositions[i]++
  100. }
  101. pattern = pattern.substr(0, patternIndex) + " " + pattern.substr(patternIndex)
  102. }
  103. }
  104. pattern = replaceCharsCore(pattern, indexes, char, patternPositions);
  105. return pattern
  106. };
  107. var formatValue = function(value, formatter) {
  108. if (Array.isArray(value)) {
  109. return value.map(function(value) {
  110. return (formatter(value) || "").toString()
  111. })
  112. }
  113. return (formatter(value) || "").toString()
  114. };
  115. var ESCAPE_CHARS_REGEXP = /[a-zA-Z]/g;
  116. var escapeChars = function(pattern, defaultPattern, processedIndexes, patternPositions) {
  117. var escapeIndexes = defaultPattern.split("").map(function(char, index) {
  118. if (processedIndexes.indexOf(index) < 0 && (char.match(ESCAPE_CHARS_REGEXP) || "'" === char)) {
  119. return patternPositions[index]
  120. }
  121. return -1
  122. });
  123. pattern = pattern.split("").map(function(char, index) {
  124. var result = char;
  125. var isCurrentCharEscaped = escapeIndexes.indexOf(index) >= 0;
  126. var isPrevCharEscaped = index > 0 && escapeIndexes.indexOf(index - 1) >= 0;
  127. var isNextCharEscaped = escapeIndexes.indexOf(index + 1) >= 0;
  128. if (isCurrentCharEscaped) {
  129. if (!isPrevCharEscaped) {
  130. result = "'" + result
  131. }
  132. if (!isNextCharEscaped) {
  133. result += "'"
  134. }
  135. }
  136. return result
  137. }).join("");
  138. return pattern
  139. };
  140. var getFormat = function(formatter) {
  141. var processedIndexes = [];
  142. var defaultPattern = formatValue(new Date(2009, 8, 8, 6, 5, 4), formatter);
  143. var patternPositions = defaultPattern.split("").map(function(_, index) {
  144. return index
  145. });
  146. var result = defaultPattern;
  147. var replacedPatterns = {};
  148. var datePatterns = [{
  149. date: new Date(2009, 8, 8, 6, 5, 4, 100),
  150. pattern: "S"
  151. }, {
  152. date: new Date(2009, 8, 8, 6, 5, 2),
  153. pattern: "s"
  154. }, {
  155. date: new Date(2009, 8, 8, 6, 2, 4),
  156. pattern: "m"
  157. }, {
  158. date: new Date(2009, 8, 8, 18, 5, 4),
  159. pattern: "H",
  160. isDigit: true
  161. }, {
  162. date: new Date(2009, 8, 8, 2, 5, 4),
  163. pattern: "h",
  164. isDigit: true
  165. }, {
  166. date: new Date(2009, 8, 8, 18, 5, 4),
  167. pattern: "a",
  168. isDigit: false
  169. }, {
  170. date: new Date(2009, 8, 1, 6, 5, 4),
  171. pattern: "d"
  172. }, {
  173. date: [new Date(2009, 8, 2, 6, 5, 4), new Date(2009, 8, 3, 6, 5, 4), new Date(2009, 8, 4, 6, 5, 4)],
  174. pattern: "E"
  175. }, {
  176. date: new Date(2009, 9, 6, 6, 5, 4),
  177. pattern: "M"
  178. }, {
  179. date: new Date(1998, 8, 8, 6, 5, 4),
  180. pattern: "y"
  181. }];
  182. if (!result) {
  183. return
  184. }
  185. datePatterns.forEach(function(test) {
  186. var diff = getDifference(defaultPattern, formatValue(test.date, formatter), processedIndexes, test.isDigit);
  187. var pattern = "M" === test.pattern && !replacedPatterns.d ? "L" : test.pattern;
  188. result = replaceChars(result, diff, pattern, patternPositions);
  189. replacedPatterns[pattern] = diff.length
  190. });
  191. result = escapeChars(result, defaultPattern, processedIndexes, patternPositions);
  192. if (processedIndexes.length) {
  193. return result
  194. }
  195. };
  196. exports.getFormat = getFormat;