LocalDayParser.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { setDay } from "../../../setDay.js";
  2. import { Parser } from "../Parser.js";
  3. import { mapValue, parseNDigits } from "../utils.js";
  4. // Local day of week
  5. export class LocalDayParser extends Parser {
  6. priority = 90;
  7. parse(dateString, token, match, options) {
  8. const valueCallback = (value) => {
  9. // We want here floor instead of trunc, so we get -7 for value 0 instead of 0
  10. const wholeWeekDays = Math.floor((value - 1) / 7) * 7;
  11. return ((value + options.weekStartsOn + 6) % 7) + wholeWeekDays;
  12. };
  13. switch (token) {
  14. // 3
  15. case "e":
  16. case "ee": // 03
  17. return mapValue(parseNDigits(token.length, dateString), valueCallback);
  18. // 3rd
  19. case "eo":
  20. return mapValue(
  21. match.ordinalNumber(dateString, {
  22. unit: "day",
  23. }),
  24. valueCallback,
  25. );
  26. // Tue
  27. case "eee":
  28. return (
  29. match.day(dateString, {
  30. width: "abbreviated",
  31. context: "formatting",
  32. }) ||
  33. match.day(dateString, { width: "short", context: "formatting" }) ||
  34. match.day(dateString, { width: "narrow", context: "formatting" })
  35. );
  36. // T
  37. case "eeeee":
  38. return match.day(dateString, {
  39. width: "narrow",
  40. context: "formatting",
  41. });
  42. // Tu
  43. case "eeeeee":
  44. return (
  45. match.day(dateString, { width: "short", context: "formatting" }) ||
  46. match.day(dateString, { width: "narrow", context: "formatting" })
  47. );
  48. // Tuesday
  49. case "eeee":
  50. default:
  51. return (
  52. match.day(dateString, { width: "wide", context: "formatting" }) ||
  53. match.day(dateString, {
  54. width: "abbreviated",
  55. context: "formatting",
  56. }) ||
  57. match.day(dateString, { width: "short", context: "formatting" }) ||
  58. match.day(dateString, { width: "narrow", context: "formatting" })
  59. );
  60. }
  61. }
  62. validate(_date, value) {
  63. return value >= 0 && value <= 6;
  64. }
  65. set(date, _flags, value, options) {
  66. date = setDay(date, value, options);
  67. date.setHours(0, 0, 0, 0);
  68. return date;
  69. }
  70. incompatibleTokens = [
  71. "y",
  72. "R",
  73. "u",
  74. "q",
  75. "Q",
  76. "M",
  77. "L",
  78. "I",
  79. "d",
  80. "D",
  81. "E",
  82. "i",
  83. "c",
  84. "t",
  85. "T",
  86. ];
  87. }