ISODayParser.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { setISODay } from "../../../setISODay.js";
  2. import { Parser } from "../Parser.js";
  3. import { mapValue, parseNDigits } from "../utils.js";
  4. // ISO day of week
  5. export class ISODayParser extends Parser {
  6. priority = 90;
  7. parse(dateString, token, match) {
  8. const valueCallback = (value) => {
  9. if (value === 0) {
  10. return 7;
  11. }
  12. return value;
  13. };
  14. switch (token) {
  15. // 2
  16. case "i":
  17. case "ii": // 02
  18. return parseNDigits(token.length, dateString);
  19. // 2nd
  20. case "io":
  21. return match.ordinalNumber(dateString, { unit: "day" });
  22. // Tue
  23. case "iii":
  24. return mapValue(
  25. match.day(dateString, {
  26. width: "abbreviated",
  27. context: "formatting",
  28. }) ||
  29. match.day(dateString, {
  30. width: "short",
  31. context: "formatting",
  32. }) ||
  33. match.day(dateString, {
  34. width: "narrow",
  35. context: "formatting",
  36. }),
  37. valueCallback,
  38. );
  39. // T
  40. case "iiiii":
  41. return mapValue(
  42. match.day(dateString, {
  43. width: "narrow",
  44. context: "formatting",
  45. }),
  46. valueCallback,
  47. );
  48. // Tu
  49. case "iiiiii":
  50. return mapValue(
  51. match.day(dateString, {
  52. width: "short",
  53. context: "formatting",
  54. }) ||
  55. match.day(dateString, {
  56. width: "narrow",
  57. context: "formatting",
  58. }),
  59. valueCallback,
  60. );
  61. // Tuesday
  62. case "iiii":
  63. default:
  64. return mapValue(
  65. match.day(dateString, {
  66. width: "wide",
  67. context: "formatting",
  68. }) ||
  69. match.day(dateString, {
  70. width: "abbreviated",
  71. context: "formatting",
  72. }) ||
  73. match.day(dateString, {
  74. width: "short",
  75. context: "formatting",
  76. }) ||
  77. match.day(dateString, {
  78. width: "narrow",
  79. context: "formatting",
  80. }),
  81. valueCallback,
  82. );
  83. }
  84. }
  85. validate(_date, value) {
  86. return value >= 1 && value <= 7;
  87. }
  88. set(date, _flags, value) {
  89. date = setISODay(date, value);
  90. date.setHours(0, 0, 0, 0);
  91. return date;
  92. }
  93. incompatibleTokens = [
  94. "y",
  95. "Y",
  96. "u",
  97. "q",
  98. "Q",
  99. "M",
  100. "L",
  101. "w",
  102. "d",
  103. "D",
  104. "E",
  105. "e",
  106. "c",
  107. "t",
  108. "T",
  109. ];
  110. }