f69fefe74d31c2d69d3c90e35b375947e3a9aeeb14b145ebc68db773a3016f64176ac484cea4f31d4a726371e600af87b48a3d9dbbd4950782400555b2fdfe 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. import { addFormatToken } from '../format/format';
  2. import { addRegexToken, matchUnsigned, regexEscape } from '../parse/regex';
  3. import { addParseToken } from '../parse/token';
  4. import { YEAR } from './constants';
  5. import { hooks as moment } from '../utils/hooks';
  6. import { getLocale } from '../locale/locales';
  7. import getParsingFlags from '../create/parsing-flags';
  8. import hasOwnProp from '../utils/has-own-prop';
  9. addFormatToken('N', 0, 0, 'eraAbbr');
  10. addFormatToken('NN', 0, 0, 'eraAbbr');
  11. addFormatToken('NNN', 0, 0, 'eraAbbr');
  12. addFormatToken('NNNN', 0, 0, 'eraName');
  13. addFormatToken('NNNNN', 0, 0, 'eraNarrow');
  14. addFormatToken('y', ['y', 1], 'yo', 'eraYear');
  15. addFormatToken('y', ['yy', 2], 0, 'eraYear');
  16. addFormatToken('y', ['yyy', 3], 0, 'eraYear');
  17. addFormatToken('y', ['yyyy', 4], 0, 'eraYear');
  18. addRegexToken('N', matchEraAbbr);
  19. addRegexToken('NN', matchEraAbbr);
  20. addRegexToken('NNN', matchEraAbbr);
  21. addRegexToken('NNNN', matchEraName);
  22. addRegexToken('NNNNN', matchEraNarrow);
  23. addParseToken(
  24. ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],
  25. function (input, array, config, token) {
  26. var era = config._locale.erasParse(input, token, config._strict);
  27. if (era) {
  28. getParsingFlags(config).era = era;
  29. } else {
  30. getParsingFlags(config).invalidEra = input;
  31. }
  32. }
  33. );
  34. addRegexToken('y', matchUnsigned);
  35. addRegexToken('yy', matchUnsigned);
  36. addRegexToken('yyy', matchUnsigned);
  37. addRegexToken('yyyy', matchUnsigned);
  38. addRegexToken('yo', matchEraYearOrdinal);
  39. addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
  40. addParseToken(['yo'], function (input, array, config, token) {
  41. var match;
  42. if (config._locale._eraYearOrdinalRegex) {
  43. match = input.match(config._locale._eraYearOrdinalRegex);
  44. }
  45. if (config._locale.eraYearOrdinalParse) {
  46. array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
  47. } else {
  48. array[YEAR] = parseInt(input, 10);
  49. }
  50. });
  51. export function localeEras(m, format) {
  52. var i,
  53. l,
  54. date,
  55. eras = this._eras || getLocale('en')._eras;
  56. for (i = 0, l = eras.length; i < l; ++i) {
  57. switch (typeof eras[i].since) {
  58. case 'string':
  59. // truncate time
  60. date = moment(eras[i].since).startOf('day');
  61. eras[i].since = date.valueOf();
  62. break;
  63. }
  64. switch (typeof eras[i].until) {
  65. case 'undefined':
  66. eras[i].until = +Infinity;
  67. break;
  68. case 'string':
  69. // truncate time
  70. date = moment(eras[i].until).startOf('day').valueOf();
  71. eras[i].until = date.valueOf();
  72. break;
  73. }
  74. }
  75. return eras;
  76. }
  77. export function localeErasParse(eraName, format, strict) {
  78. var i,
  79. l,
  80. eras = this.eras(),
  81. name,
  82. abbr,
  83. narrow;
  84. eraName = eraName.toUpperCase();
  85. for (i = 0, l = eras.length; i < l; ++i) {
  86. name = eras[i].name.toUpperCase();
  87. abbr = eras[i].abbr.toUpperCase();
  88. narrow = eras[i].narrow.toUpperCase();
  89. if (strict) {
  90. switch (format) {
  91. case 'N':
  92. case 'NN':
  93. case 'NNN':
  94. if (abbr === eraName) {
  95. return eras[i];
  96. }
  97. break;
  98. case 'NNNN':
  99. if (name === eraName) {
  100. return eras[i];
  101. }
  102. break;
  103. case 'NNNNN':
  104. if (narrow === eraName) {
  105. return eras[i];
  106. }
  107. break;
  108. }
  109. } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {
  110. return eras[i];
  111. }
  112. }
  113. }
  114. export function localeErasConvertYear(era, year) {
  115. var dir = era.since <= era.until ? +1 : -1;
  116. if (year === undefined) {
  117. return moment(era.since).year();
  118. } else {
  119. return moment(era.since).year() + (year - era.offset) * dir;
  120. }
  121. }
  122. export function getEraName() {
  123. var i,
  124. l,
  125. val,
  126. eras = this.localeData().eras();
  127. for (i = 0, l = eras.length; i < l; ++i) {
  128. // truncate time
  129. val = this.clone().startOf('day').valueOf();
  130. if (eras[i].since <= val && val <= eras[i].until) {
  131. return eras[i].name;
  132. }
  133. if (eras[i].until <= val && val <= eras[i].since) {
  134. return eras[i].name;
  135. }
  136. }
  137. return '';
  138. }
  139. export function getEraNarrow() {
  140. var i,
  141. l,
  142. val,
  143. eras = this.localeData().eras();
  144. for (i = 0, l = eras.length; i < l; ++i) {
  145. // truncate time
  146. val = this.clone().startOf('day').valueOf();
  147. if (eras[i].since <= val && val <= eras[i].until) {
  148. return eras[i].narrow;
  149. }
  150. if (eras[i].until <= val && val <= eras[i].since) {
  151. return eras[i].narrow;
  152. }
  153. }
  154. return '';
  155. }
  156. export function getEraAbbr() {
  157. var i,
  158. l,
  159. val,
  160. eras = this.localeData().eras();
  161. for (i = 0, l = eras.length; i < l; ++i) {
  162. // truncate time
  163. val = this.clone().startOf('day').valueOf();
  164. if (eras[i].since <= val && val <= eras[i].until) {
  165. return eras[i].abbr;
  166. }
  167. if (eras[i].until <= val && val <= eras[i].since) {
  168. return eras[i].abbr;
  169. }
  170. }
  171. return '';
  172. }
  173. export function getEraYear() {
  174. var i,
  175. l,
  176. dir,
  177. val,
  178. eras = this.localeData().eras();
  179. for (i = 0, l = eras.length; i < l; ++i) {
  180. dir = eras[i].since <= eras[i].until ? +1 : -1;
  181. // truncate time
  182. val = this.clone().startOf('day').valueOf();
  183. if (
  184. (eras[i].since <= val && val <= eras[i].until) ||
  185. (eras[i].until <= val && val <= eras[i].since)
  186. ) {
  187. return (
  188. (this.year() - moment(eras[i].since).year()) * dir +
  189. eras[i].offset
  190. );
  191. }
  192. }
  193. return this.year();
  194. }
  195. export function erasNameRegex(isStrict) {
  196. if (!hasOwnProp(this, '_erasNameRegex')) {
  197. computeErasParse.call(this);
  198. }
  199. return isStrict ? this._erasNameRegex : this._erasRegex;
  200. }
  201. export function erasAbbrRegex(isStrict) {
  202. if (!hasOwnProp(this, '_erasAbbrRegex')) {
  203. computeErasParse.call(this);
  204. }
  205. return isStrict ? this._erasAbbrRegex : this._erasRegex;
  206. }
  207. export function erasNarrowRegex(isStrict) {
  208. if (!hasOwnProp(this, '_erasNarrowRegex')) {
  209. computeErasParse.call(this);
  210. }
  211. return isStrict ? this._erasNarrowRegex : this._erasRegex;
  212. }
  213. function matchEraAbbr(isStrict, locale) {
  214. return locale.erasAbbrRegex(isStrict);
  215. }
  216. function matchEraName(isStrict, locale) {
  217. return locale.erasNameRegex(isStrict);
  218. }
  219. function matchEraNarrow(isStrict, locale) {
  220. return locale.erasNarrowRegex(isStrict);
  221. }
  222. function matchEraYearOrdinal(isStrict, locale) {
  223. return locale._eraYearOrdinalRegex || matchUnsigned;
  224. }
  225. function computeErasParse() {
  226. var abbrPieces = [],
  227. namePieces = [],
  228. narrowPieces = [],
  229. mixedPieces = [],
  230. i,
  231. l,
  232. erasName,
  233. erasAbbr,
  234. erasNarrow,
  235. eras = this.eras();
  236. for (i = 0, l = eras.length; i < l; ++i) {
  237. erasName = regexEscape(eras[i].name);
  238. erasAbbr = regexEscape(eras[i].abbr);
  239. erasNarrow = regexEscape(eras[i].narrow);
  240. namePieces.push(erasName);
  241. abbrPieces.push(erasAbbr);
  242. narrowPieces.push(erasNarrow);
  243. mixedPieces.push(erasName);
  244. mixedPieces.push(erasAbbr);
  245. mixedPieces.push(erasNarrow);
  246. }
  247. this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
  248. this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');
  249. this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');
  250. this._erasNarrowRegex = new RegExp(
  251. '^(' + narrowPieces.join('|') + ')',
  252. 'i'
  253. );
  254. }