chrono-node 2.3.5 → 2.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +1 -1
  2. package/dist/common/refiners/ExtractTimezoneAbbrRefiner.js +6 -1
  3. package/dist/locales/de/constants.d.ts +3 -3
  4. package/dist/locales/de/constants.js +38 -20
  5. package/dist/locales/de/index.js +4 -0
  6. package/dist/locales/de/parsers/DESpecificTimeExpressionParser.d.ts +7 -0
  7. package/dist/locales/de/parsers/DESpecificTimeExpressionParser.js +114 -0
  8. package/dist/locales/de/parsers/DETimeExpressionParser.d.ts +0 -1
  9. package/dist/locales/de/parsers/DETimeExpressionParser.js +3 -21
  10. package/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.d.ts +8 -0
  11. package/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.js +34 -0
  12. package/dist/locales/en/constants.d.ts +2 -2
  13. package/dist/locales/en/constants.js +3 -0
  14. package/dist/locales/en/index.js +2 -1
  15. package/dist/locales/en/parsers/ENRelativeDateFormatParser.js +2 -2
  16. package/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js +1 -1
  17. package/dist/locales/en/refiners/ENMergeRelativeDateRefiner.d.ts +7 -0
  18. package/dist/locales/en/refiners/ENMergeRelativeDateRefiner.js +35 -0
  19. package/dist/locales/zh/hans/constants.d.ts +27 -0
  20. package/dist/locales/zh/hans/constants.js +51 -0
  21. package/dist/locales/zh/hans/index.d.ts +9 -0
  22. package/dist/locales/zh/hans/index.js +49 -0
  23. package/dist/locales/zh/hans/parsers/ZHHansCasualDateParser.d.ts +7 -0
  24. package/dist/locales/zh/hans/parsers/ZHHansCasualDateParser.js +138 -0
  25. package/dist/locales/zh/hans/parsers/ZHHansDateParser.d.ts +6 -0
  26. package/dist/locales/zh/hans/parsers/ZHHansDateParser.js +72 -0
  27. package/dist/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.d.ts +6 -0
  28. package/dist/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.js +78 -0
  29. package/dist/locales/zh/hans/parsers/ZHHansRelationWeekdayParser.d.ts +7 -0
  30. package/dist/locales/zh/hans/parsers/ZHHansRelationWeekdayParser.js +70 -0
  31. package/dist/locales/zh/hans/parsers/ZHHansTimeExpressionParser.d.ts +6 -0
  32. package/dist/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js +438 -0
  33. package/dist/locales/zh/hans/parsers/ZHHansWeekdayParser.d.ts +7 -0
  34. package/dist/locales/zh/hans/parsers/ZHHansWeekdayParser.js +46 -0
  35. package/dist/locales/zh/hans/refiners/ZHHansMergeDateRangeRefiner.d.ts +4 -0
  36. package/dist/locales/zh/hans/refiners/ZHHansMergeDateRangeRefiner.js +12 -0
  37. package/dist/locales/zh/hans/refiners/ZHHansMergeDateTimeRefiner.d.ts +4 -0
  38. package/dist/locales/zh/hans/refiners/ZHHansMergeDateTimeRefiner.js +12 -0
  39. package/dist/locales/zh/hant/index.d.ts +9 -0
  40. package/dist/locales/zh/hant/index.js +49 -0
  41. package/dist/locales/zh/index.d.ts +2 -9
  42. package/dist/locales/zh/index.js +13 -46
  43. package/dist/results.d.ts +1 -1
  44. package/dist/results.js +1 -2
  45. package/dist/timezone.d.ts +1 -1
  46. package/dist/timezone.js +3 -3
  47. package/package.json +1 -1
  48. package/src/common/refiners/ExtractTimezoneAbbrRefiner.ts +11 -1
  49. package/src/locales/de/constants.ts +42 -22
  50. package/src/locales/de/index.ts +4 -0
  51. package/src/locales/de/parsers/DESpecificTimeExpressionParser.ts +150 -0
  52. package/src/locales/de/parsers/DETimeExpressionParser.ts +4 -23
  53. package/src/locales/de/parsers/DETimeUnitRelativeFormatParser.ts +42 -0
  54. package/src/locales/en/constants.ts +5 -2
  55. package/src/locales/en/index.ts +2 -1
  56. package/src/locales/en/parsers/ENMonthNameLittleEndianParser.ts +0 -2
  57. package/src/locales/en/parsers/ENRelativeDateFormatParser.ts +2 -2
  58. package/src/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.ts +1 -1
  59. package/src/locales/en/refiners/ENMergeRelativeDateRefiner.ts +58 -0
  60. package/src/locales/zh/hans/constants.ts +52 -0
  61. package/src/locales/zh/hans/index.ts +62 -0
  62. package/src/locales/zh/hans/parsers/ZHHansCasualDateParser.ts +128 -0
  63. package/src/locales/zh/hans/parsers/ZHHansDateParser.ts +75 -0
  64. package/src/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.ts +81 -0
  65. package/src/locales/zh/hans/parsers/ZHHansRelationWeekdayParser.ts +69 -0
  66. package/src/locales/zh/hans/parsers/ZHHansTimeExpressionParser.ts +424 -0
  67. package/src/locales/zh/hans/parsers/ZHHansWeekdayParser.ts +46 -0
  68. package/src/locales/zh/hans/refiners/ZHHansMergeDateRangeRefiner.ts +7 -0
  69. package/src/locales/zh/hans/refiners/ZHHansMergeDateTimeRefiner.ts +7 -0
  70. package/src/locales/zh/hant/index.ts +63 -0
  71. package/src/locales/zh/index.ts +2 -63
  72. package/src/results.ts +2 -3
  73. package/src/timezone.ts +4 -4
  74. package/test/de/de_month_name_little_endian.test.ts +12 -0
  75. package/test/de/de_time_exp.test.ts +59 -0
  76. package/test/de/de_time_units_casual_relative.test.ts +108 -0
  77. package/test/de/de_year.test.ts +147 -0
  78. package/test/en/en_merging_relative_dates.test.ts +51 -0
  79. package/test/en/en_month.test.ts +13 -0
  80. package/test/en/en_relative.test.ts +61 -2
  81. package/test/en/en_time_units_ago.test.ts +3 -3
  82. package/test/en/en_time_units_casual_relative.test.ts +16 -0
  83. package/test/en/en_time_units_within.test.ts +2 -2
  84. package/test/en/en_timezone_exp.test.ts +3 -3
  85. package/test/fr/fr_time_units_ago.test.ts +3 -3
  86. package/test/fr/fr_time_units_within.test.ts +2 -2
  87. package/test/nl/nl_relative.test.ts +2 -2
  88. package/test/nl/nl_time_units_ago.test.ts +3 -3
  89. package/test/system_timezone.test.ts +22 -0
  90. package/test/zh/zh_hans_casual.test.ts +228 -0
  91. package/test/zh/zh_hans_date.test.ts +102 -0
  92. package/test/zh/zh_hans_deadline.test.ts +136 -0
  93. package/test/zh/zh_hans_time_exp.test.ts +182 -0
  94. package/test/zh/zh_hans_weekday.test.ts +132 -0
  95. package/test/zh/zh_hant_date.test.ts +0 -1
package/README.md CHANGED
@@ -133,7 +133,7 @@ For example:
133
133
  ```js
134
134
  const results = chrono.parse('I have an appointment tomorrow from 10 to 11 AM');
135
135
 
136
- results[0].index; // 15
136
+ results[0].index; // 22
137
137
  results[0].text; // 'tomorrow from 10 to 11 AM'
138
138
  results[0].refDate; // Sat Dec 13 2014 21:50:14 GMT-0600 (CST)
139
139
 
@@ -214,7 +214,7 @@ class ExtractTimezoneAbbrRefiner {
214
214
  return;
215
215
  }
216
216
  context.debug(() => {
217
- console.log(`Extracting timezone: '${timezoneAbbr}' into : ${extractedTimezoneOffset}`);
217
+ console.log(`Extracting timezone: '${timezoneAbbr}' into: ${extractedTimezoneOffset} for: ${result.start}`);
218
218
  });
219
219
  const currentTimezoneOffset = result.start.get("timezoneOffset");
220
220
  if (currentTimezoneOffset !== null && extractedTimezoneOffset != currentTimezoneOffset) {
@@ -225,6 +225,11 @@ class ExtractTimezoneAbbrRefiner {
225
225
  return;
226
226
  }
227
227
  }
228
+ if (result.start.isOnlyDate()) {
229
+ if (timezoneAbbr != match[1]) {
230
+ return;
231
+ }
232
+ }
228
233
  result.text += match[0];
229
234
  if (!result.start.isCertain("timezoneOffset")) {
230
235
  result.start.assign("timezoneOffset", extractedTimezoneOffset);
@@ -1,4 +1,4 @@
1
- import { OpUnitType } from "dayjs";
1
+ import { OpUnitType, QUnitType } from "dayjs";
2
2
  import { TimeUnits } from "../../utils/timeunits";
3
3
  export declare const WEEKDAY_DICTIONARY: {
4
4
  [word: string]: number;
@@ -10,11 +10,11 @@ export declare const INTEGER_WORD_DICTIONARY: {
10
10
  [word: string]: number;
11
11
  };
12
12
  export declare const TIME_UNIT_DICTIONARY: {
13
- [word: string]: OpUnitType;
13
+ [word: string]: OpUnitType | QUnitType;
14
14
  };
15
15
  export declare const NUMBER_PATTERN: string;
16
16
  export declare function parseNumberPattern(match: string): number;
17
- export declare const YEAR_PATTERN = "(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*C(?:hr)?\\.?)?)";
17
+ export declare const YEAR_PATTERN = "(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*(?:C(?:hr)?|(?:u\\.?|d\\.?(?:\\s*g\\.?)?)?\\s*Z)\\.?|\\s*(?:u\\.?|d\\.?(?:\\s*g\\.)?)\\s*Z\\.?)?)";
18
18
  export declare function parseYear(match: string): number;
19
19
  export declare const TIME_UNITS_PATTERN: string;
20
20
  export declare function parseTimeUnits(timeunitText: any): TimeUnits;
@@ -21,9 +21,12 @@ exports.WEEKDAY_DICTIONARY = {
21
21
  };
22
22
  exports.MONTH_DICTIONARY = {
23
23
  "januar": 1,
24
+ "jänner": 1,
25
+ "janner": 1,
24
26
  "jan": 1,
25
27
  "jan.": 1,
26
28
  "februar": 2,
29
+ "feber": 2,
27
30
  "feb": 2,
28
31
  "feb.": 2,
29
32
  "märz": 3,
@@ -62,6 +65,10 @@ exports.MONTH_DICTIONARY = {
62
65
  };
63
66
  exports.INTEGER_WORD_DICTIONARY = {
64
67
  "eins": 1,
68
+ "eine": 1,
69
+ "einem": 1,
70
+ "einen": 1,
71
+ "einer": 1,
65
72
  "zwei": 2,
66
73
  "drei": 3,
67
74
  "vier": 4,
@@ -77,28 +84,36 @@ exports.INTEGER_WORD_DICTIONARY = {
77
84
  "zwoelf": 12,
78
85
  };
79
86
  exports.TIME_UNIT_DICTIONARY = {
80
- sec: "second",
81
- second: "second",
82
- seconds: "second",
87
+ sek: "second",
88
+ sekunde: "second",
89
+ sekunden: "second",
83
90
  min: "minute",
84
- mins: "minute",
85
91
  minute: "minute",
86
- minutes: "minute",
92
+ minuten: "minute",
87
93
  h: "hour",
88
- hr: "hour",
89
- hrs: "hour",
90
- hour: "hour",
91
- hours: "hour",
92
- day: "d",
93
- days: "d",
94
- week: "week",
95
- weeks: "week",
96
- month: "month",
97
- months: "month",
98
- y: "year",
99
- yr: "year",
100
- year: "year",
101
- years: "year",
94
+ std: "hour",
95
+ stunde: "hour",
96
+ stunden: "hour",
97
+ tag: "d",
98
+ tage: "d",
99
+ tagen: "d",
100
+ woche: "week",
101
+ wochen: "week",
102
+ monat: "month",
103
+ monate: "month",
104
+ monaten: "month",
105
+ monats: "month",
106
+ quartal: "quarter",
107
+ quartals: "quarter",
108
+ quartale: "quarter",
109
+ quartalen: "quarter",
110
+ a: "year",
111
+ j: "year",
112
+ jr: "year",
113
+ jahr: "year",
114
+ jahre: "year",
115
+ jahren: "year",
116
+ jahres: "year",
102
117
  };
103
118
  exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?\\b(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`;
104
119
  function parseNumberPattern(match) {
@@ -124,7 +139,7 @@ function parseNumberPattern(match) {
124
139
  return parseFloat(num);
125
140
  }
126
141
  exports.parseNumberPattern = parseNumberPattern;
127
- exports.YEAR_PATTERN = `(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*C(?:hr)?\\.?)?)`;
142
+ exports.YEAR_PATTERN = `(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*(?:C(?:hr)?|(?:u\\.?|d\\.?(?:\\s*g\\.?)?)?\\s*Z)\\.?|\\s*(?:u\\.?|d\\.?(?:\\s*g\\.)?)\\s*Z\\.?)?)`;
128
143
  function parseYear(match) {
129
144
  if (/v/i.test(match)) {
130
145
  return -parseInt(match.replace(/[^0-9]+/gi, ""));
@@ -132,6 +147,9 @@ function parseYear(match) {
132
147
  if (/n/i.test(match)) {
133
148
  return parseInt(match.replace(/[^0-9]+/gi, ""));
134
149
  }
150
+ if (/z/i.test(match)) {
151
+ return parseInt(match.replace(/[^0-9]+/gi, ""));
152
+ }
135
153
  const rawYearNumber = parseInt(match);
136
154
  return years_1.findMostLikelyADYear(rawYearNumber);
137
155
  }
@@ -10,11 +10,13 @@ const SlashDateFormatParser_1 = __importDefault(require("../../common/parsers/Sl
10
10
  const ISOFormatParser_1 = __importDefault(require("../../common/parsers/ISOFormatParser"));
11
11
  const DETimeExpressionParser_1 = __importDefault(require("./parsers/DETimeExpressionParser"));
12
12
  const DEWeekdayParser_1 = __importDefault(require("./parsers/DEWeekdayParser"));
13
+ const DESpecificTimeExpressionParser_1 = __importDefault(require("./parsers/DESpecificTimeExpressionParser"));
13
14
  const DEMergeDateRangeRefiner_1 = __importDefault(require("./refiners/DEMergeDateRangeRefiner"));
14
15
  const DEMergeDateTimeRefiner_1 = __importDefault(require("./refiners/DEMergeDateTimeRefiner"));
15
16
  const DECasualDateParser_1 = __importDefault(require("./parsers/DECasualDateParser"));
16
17
  const DECasualTimeParser_1 = __importDefault(require("./parsers/DECasualTimeParser"));
17
18
  const DEMonthNameLittleEndianParser_1 = __importDefault(require("./parsers/DEMonthNameLittleEndianParser"));
19
+ const DETimeUnitRelativeFormatParser_1 = __importDefault(require("./parsers/DETimeUnitRelativeFormatParser"));
18
20
  exports.casual = new chrono_1.Chrono(createCasualConfiguration());
19
21
  exports.strict = new chrono_1.Chrono(createConfiguration(true));
20
22
  function parse(text, ref, option) {
@@ -29,6 +31,7 @@ function createCasualConfiguration(littleEndian = true) {
29
31
  const option = createConfiguration(false, littleEndian);
30
32
  option.parsers.unshift(new DECasualTimeParser_1.default());
31
33
  option.parsers.unshift(new DECasualDateParser_1.default());
34
+ option.parsers.unshift(new DETimeUnitRelativeFormatParser_1.default());
32
35
  return option;
33
36
  }
34
37
  exports.createCasualConfiguration = createCasualConfiguration;
@@ -38,6 +41,7 @@ function createConfiguration(strictMode = true, littleEndian = true) {
38
41
  new ISOFormatParser_1.default(),
39
42
  new SlashDateFormatParser_1.default(littleEndian),
40
43
  new DETimeExpressionParser_1.default(),
44
+ new DESpecificTimeExpressionParser_1.default(),
41
45
  new DEMonthNameLittleEndianParser_1.default(),
42
46
  new DEWeekdayParser_1.default(),
43
47
  ],
@@ -0,0 +1,7 @@
1
+ import { Parser, ParsingContext } from "../../../chrono";
2
+ import { ParsingResult } from "../../../results";
3
+ export default class DESpecificTimeExpressionParser implements Parser {
4
+ pattern(context: any): RegExp;
5
+ extract(context: ParsingContext, match: RegExpMatchArray): ParsingResult | null;
6
+ private static extractTimeComponent;
7
+ }
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../../../index");
4
+ const FIRST_REG_PATTERN = new RegExp("(^|\\s|T)" +
5
+ "(?:(?:um|von)\\s*)?" +
6
+ "(\\d{1,2})(?:h|:)?" +
7
+ "(?:(\\d{1,2})(?:m|:)?)?" +
8
+ "(?:(\\d{1,2})(?:s)?)?" +
9
+ "(?:\\s*Uhr)?" +
10
+ "(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?" +
11
+ "(?=\\W|$)", "i");
12
+ const SECOND_REG_PATTERN = new RegExp("^\\s*(\\-|\\–|\\~|\\〜|bis(?:\\s+um)?|\\?)\\s*" +
13
+ "(\\d{1,2})(?:h|:)?" +
14
+ "(?:(\\d{1,2})(?:m|:)?)?" +
15
+ "(?:(\\d{1,2})(?:s)?)?" +
16
+ "(?:\\s*Uhr)?" +
17
+ "(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?" +
18
+ "(?=\\W|$)", "i");
19
+ const HOUR_GROUP = 2;
20
+ const MINUTE_GROUP = 3;
21
+ const SECOND_GROUP = 4;
22
+ const AM_PM_HOUR_GROUP = 5;
23
+ class DESpecificTimeExpressionParser {
24
+ pattern(context) {
25
+ return FIRST_REG_PATTERN;
26
+ }
27
+ extract(context, match) {
28
+ const result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length));
29
+ if (result.text.match(/^\d{4}$/)) {
30
+ match.index += match[0].length;
31
+ return null;
32
+ }
33
+ result.start = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match);
34
+ if (!result.start) {
35
+ match.index += match[0].length;
36
+ return null;
37
+ }
38
+ const remainingText = context.text.substring(match.index + match[0].length);
39
+ const secondMatch = SECOND_REG_PATTERN.exec(remainingText);
40
+ if (secondMatch) {
41
+ result.end = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch);
42
+ if (result.end) {
43
+ result.text += secondMatch[0];
44
+ }
45
+ }
46
+ return result;
47
+ }
48
+ static extractTimeComponent(extractingComponents, match) {
49
+ let hour = 0;
50
+ let minute = 0;
51
+ let meridiem = null;
52
+ hour = parseInt(match[HOUR_GROUP]);
53
+ if (match[MINUTE_GROUP] != null) {
54
+ minute = parseInt(match[MINUTE_GROUP]);
55
+ }
56
+ if (minute >= 60 || hour > 24) {
57
+ return null;
58
+ }
59
+ if (hour >= 12) {
60
+ meridiem = index_1.Meridiem.PM;
61
+ }
62
+ if (match[AM_PM_HOUR_GROUP] != null) {
63
+ if (hour > 12)
64
+ return null;
65
+ const ampm = match[AM_PM_HOUR_GROUP].toLowerCase();
66
+ if (ampm.match(/morgen|vormittag/)) {
67
+ meridiem = index_1.Meridiem.AM;
68
+ if (hour == 12) {
69
+ hour = 0;
70
+ }
71
+ }
72
+ if (ampm.match(/nachmittag|abend/)) {
73
+ meridiem = index_1.Meridiem.PM;
74
+ if (hour != 12) {
75
+ hour += 12;
76
+ }
77
+ }
78
+ if (ampm.match(/nacht/)) {
79
+ if (hour == 12) {
80
+ meridiem = index_1.Meridiem.AM;
81
+ hour = 0;
82
+ }
83
+ else if (hour < 6) {
84
+ meridiem = index_1.Meridiem.AM;
85
+ }
86
+ else {
87
+ meridiem = index_1.Meridiem.PM;
88
+ hour += 12;
89
+ }
90
+ }
91
+ }
92
+ extractingComponents.assign("hour", hour);
93
+ extractingComponents.assign("minute", minute);
94
+ if (meridiem !== null) {
95
+ extractingComponents.assign("meridiem", meridiem);
96
+ }
97
+ else {
98
+ if (hour < 12) {
99
+ extractingComponents.imply("meridiem", index_1.Meridiem.AM);
100
+ }
101
+ else {
102
+ extractingComponents.imply("meridiem", index_1.Meridiem.PM);
103
+ }
104
+ }
105
+ if (match[SECOND_GROUP] != null) {
106
+ const second = parseInt(match[SECOND_GROUP]);
107
+ if (second >= 60)
108
+ return null;
109
+ extractingComponents.assign("second", second);
110
+ }
111
+ return extractingComponents;
112
+ }
113
+ }
114
+ exports.default = DESpecificTimeExpressionParser;
@@ -4,6 +4,5 @@ import { ParsingContext } from "../../../chrono";
4
4
  export default class DETimeExpressionParser extends AbstractTimeExpressionParser {
5
5
  primaryPrefix(): string;
6
6
  followingPhase(): string;
7
- primarySuffix(): string;
8
7
  extractPrimaryTimeComponents(context: ParsingContext, match: RegExpMatchArray): ParsingComponents | null;
9
8
  }
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const AbstractTimeExpressionParser_1 = require("../../../common/parsers/AbstractTimeExpressionParser");
4
- const index_1 = require("../../../index");
5
4
  class DETimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser {
6
5
  primaryPrefix() {
7
6
  return "(?:(?:um|von)\\s*)?";
@@ -9,28 +8,11 @@ class DETimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTime
9
8
  followingPhase() {
10
9
  return "\\s*(?:\\-|\\–|\\~|\\〜|bis)\\s*";
11
10
  }
12
- primarySuffix() {
13
- return "(?:\\s*uhr)?(?:\\s*(?:morgens|vormittags|nachmittags|abends|nachts))?(?=\\W|$)";
14
- }
15
11
  extractPrimaryTimeComponents(context, match) {
16
- const components = super.extractPrimaryTimeComponents(context, match);
17
- if (components) {
18
- if (match[0].endsWith("morgens") || match[0].endsWith("vormittags")) {
19
- components.assign("meridiem", index_1.Meridiem.AM);
20
- const hour = components.get("hour");
21
- if (hour < 12) {
22
- components.assign("hour", components.get("hour"));
23
- }
24
- }
25
- if (match[0].endsWith("nachmittags") || match[0].endsWith("abends") || match[0].endsWith("nachts")) {
26
- components.assign("meridiem", index_1.Meridiem.PM);
27
- const hour = components.get("hour");
28
- if (hour < 12) {
29
- components.assign("hour", components.get("hour") + 12);
30
- }
31
- }
12
+ if (match[0].match(/^\s*\d{4}\s*$/)) {
13
+ return null;
32
14
  }
33
- return components;
15
+ return super.extractPrimaryTimeComponents(context, match);
34
16
  }
35
17
  }
36
18
  exports.default = DETimeExpressionParser;
@@ -0,0 +1,8 @@
1
+ import { ParsingContext } from "../../../chrono";
2
+ import { ParsingComponents } from "../../../results";
3
+ import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
4
+ export default class DETimeUnitAgoFormatParser extends AbstractParserWithWordBoundaryChecking {
5
+ constructor();
6
+ innerPattern(): RegExp;
7
+ innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents;
8
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constants_1 = require("../constants");
4
+ const results_1 = require("../../../results");
5
+ const AbstractParserWithWordBoundary_1 = require("../../../common/parsers/AbstractParserWithWordBoundary");
6
+ const timeunits_1 = require("../../../utils/timeunits");
7
+ const pattern_1 = require("../../../utils/pattern");
8
+ class DETimeUnitAgoFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
9
+ constructor() {
10
+ super();
11
+ }
12
+ innerPattern() {
13
+ return new RegExp(`(?:\\s*((?:nächste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?|vor|in)\\s*)?` +
14
+ `(${constants_1.NUMBER_PATTERN})?` +
15
+ `(?:\\s*(nächste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?)?` +
16
+ `\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})`, "i");
17
+ }
18
+ innerExtract(context, match) {
19
+ const num = match[2] ? constants_1.parseNumberPattern(match[2]) : 1;
20
+ const unit = constants_1.TIME_UNIT_DICTIONARY[match[4].toLowerCase()];
21
+ let timeUnits = {};
22
+ timeUnits[unit] = num;
23
+ let modifier = match[1] || match[3] || "";
24
+ modifier = modifier.toLowerCase();
25
+ if (!modifier) {
26
+ return;
27
+ }
28
+ if (/vor/.test(modifier) || /letzte/.test(modifier) || /vergangen/.test(modifier)) {
29
+ timeUnits = timeunits_1.reverseTimeUnits(timeUnits);
30
+ }
31
+ return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits);
32
+ }
33
+ }
34
+ exports.default = DETimeUnitAgoFormatParser;
@@ -1,4 +1,4 @@
1
- import { OpUnitType } from "dayjs";
1
+ import { OpUnitType, QUnitType } from "dayjs";
2
2
  import { TimeUnits } from "../../utils/timeunits";
3
3
  export declare const WEEKDAY_DICTIONARY: {
4
4
  [word: string]: number;
@@ -16,7 +16,7 @@ export declare const ORDINAL_WORD_DICTIONARY: {
16
16
  [word: string]: number;
17
17
  };
18
18
  export declare const TIME_UNIT_DICTIONARY: {
19
- [word: string]: OpUnitType;
19
+ [word: string]: OpUnitType | QUnitType;
20
20
  };
21
21
  export declare const NUMBER_PATTERN: string;
22
22
  export declare function parseNumberPattern(match: string): number;
@@ -121,6 +121,9 @@ exports.TIME_UNIT_DICTIONARY = {
121
121
  weeks: "week",
122
122
  month: "month",
123
123
  months: "month",
124
+ qtr: "quarter",
125
+ quarter: "quarter",
126
+ quarters: "quarter",
124
127
  y: "year",
125
128
  yr: "year",
126
129
  year: "year",
@@ -23,6 +23,7 @@ const ENRelativeDateFormatParser_1 = __importDefault(require("./parsers/ENRelati
23
23
  const chrono_1 = require("../../chrono");
24
24
  const SlashDateFormatParser_1 = __importDefault(require("../../common/parsers/SlashDateFormatParser"));
25
25
  const ENTimeUnitCasualRelativeFormatParser_1 = __importDefault(require("./parsers/ENTimeUnitCasualRelativeFormatParser"));
26
+ const ENMergeRelativeDateRefiner_1 = __importDefault(require("./refiners/ENMergeRelativeDateRefiner"));
26
27
  exports.casual = new chrono_1.Chrono(createCasualConfiguration(false));
27
28
  exports.strict = new chrono_1.Chrono(createConfiguration(true, false));
28
29
  exports.GB = new chrono_1.Chrono(createConfiguration(false, true));
@@ -58,7 +59,7 @@ function createConfiguration(strictMode = true, littleEndian = false) {
58
59
  new ENTimeUnitAgoFormatParser_1.default(strictMode),
59
60
  new ENTimeUnitLaterFormatParser_1.default(strictMode),
60
61
  ],
61
- refiners: [new ENMergeDateTimeRefiner_1.default(), new ENMergeDateRangeRefiner_1.default()],
62
+ refiners: [new ENMergeRelativeDateRefiner_1.default(), new ENMergeDateTimeRefiner_1.default(), new ENMergeDateRangeRefiner_1.default()],
62
63
  }, strictMode);
63
64
  }
64
65
  exports.createConfiguration = createConfiguration;
@@ -8,7 +8,7 @@ const results_1 = require("../../../results");
8
8
  const dayjs_1 = __importDefault(require("dayjs"));
9
9
  const AbstractParserWithWordBoundary_1 = require("../../../common/parsers/AbstractParserWithWordBoundary");
10
10
  const pattern_1 = require("../../../utils/pattern");
11
- const PATTERN = new RegExp(`(this|next|last|past)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)` + "(?=\\W|$)", "i");
11
+ const PATTERN = new RegExp(`(this|last|past|next|after\\s*this)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)` + "(?=\\W|$)", "i");
12
12
  const MODIFIER_WORD_GROUP = 1;
13
13
  const RELATIVE_WORD_GROUP = 2;
14
14
  class ENRelativeDateFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
@@ -19,7 +19,7 @@ class ENRelativeDateFormatParser extends AbstractParserWithWordBoundary_1.Abstra
19
19
  const modifier = match[MODIFIER_WORD_GROUP].toLowerCase();
20
20
  const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase();
21
21
  const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord];
22
- if (modifier == "next") {
22
+ if (modifier == "next" || modifier.startsWith("after")) {
23
23
  const timeUnits = {};
24
24
  timeUnits[timeunit] = 1;
25
25
  return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits);
@@ -4,7 +4,7 @@ const constants_1 = require("../constants");
4
4
  const results_1 = require("../../../results");
5
5
  const AbstractParserWithWordBoundary_1 = require("../../../common/parsers/AbstractParserWithWordBoundary");
6
6
  const timeunits_1 = require("../../../utils/timeunits");
7
- const PATTERN = new RegExp(`(this|last|past|next|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
7
+ const PATTERN = new RegExp(`(this|last|past|next|after|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
8
8
  class ENTimeUnitCasualRelativeFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
9
9
  innerPattern() {
10
10
  return PATTERN;
@@ -0,0 +1,7 @@
1
+ import { MergingRefiner } from "../../../common/abstractRefiners";
2
+ import { ParsingResult } from "../../../results";
3
+ export default class ENMergeRelativeDateRefiner extends MergingRefiner {
4
+ patternBetween(): RegExp;
5
+ shouldMergeResults(textBetween: string, currentResult: ParsingResult, nextResult: ParsingResult): boolean;
6
+ mergeResults(textBetween: string, currentResult: ParsingResult, nextResult: ParsingResult): ParsingResult;
7
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const abstractRefiners_1 = require("../../../common/abstractRefiners");
4
+ const results_1 = require("../../../results");
5
+ const constants_1 = require("../constants");
6
+ const timeunits_1 = require("../../../utils/timeunits");
7
+ function hasImpliedEarlierReferenceDate(result) {
8
+ return result.text.match(/\s+(before|from)$/i) != null;
9
+ }
10
+ function hasImpliedLaterReferenceDate(result) {
11
+ return result.text.match(/\s+(after|since)$/i) != null;
12
+ }
13
+ class ENMergeRelativeDateRefiner extends abstractRefiners_1.MergingRefiner {
14
+ patternBetween() {
15
+ return /^\s*$/i;
16
+ }
17
+ shouldMergeResults(textBetween, currentResult, nextResult) {
18
+ if (!textBetween.match(this.patternBetween())) {
19
+ return false;
20
+ }
21
+ if (!hasImpliedEarlierReferenceDate(currentResult) && !hasImpliedLaterReferenceDate(currentResult)) {
22
+ return false;
23
+ }
24
+ return !!nextResult.start.get("day") && !!nextResult.start.get("month") && !!nextResult.start.get("year");
25
+ }
26
+ mergeResults(textBetween, currentResult, nextResult) {
27
+ let timeUnits = constants_1.parseTimeUnits(currentResult.text);
28
+ if (hasImpliedEarlierReferenceDate(currentResult)) {
29
+ timeUnits = timeunits_1.reverseTimeUnits(timeUnits);
30
+ }
31
+ const components = results_1.ParsingComponents.createRelativeFromReference(new results_1.ReferenceWithTimezone(nextResult.start.date()), timeUnits);
32
+ return new results_1.ParsingResult(nextResult.reference, currentResult.index, `${currentResult.text}${textBetween}${nextResult.text}`, components);
33
+ }
34
+ }
35
+ exports.default = ENMergeRelativeDateRefiner;
@@ -0,0 +1,27 @@
1
+ export declare const NUMBER: {
2
+ 零: number;
3
+ 〇: number;
4
+ 一: number;
5
+ 二: number;
6
+ 两: number;
7
+ 三: number;
8
+ 四: number;
9
+ 五: number;
10
+ 六: number;
11
+ 七: number;
12
+ 八: number;
13
+ 九: number;
14
+ 十: number;
15
+ };
16
+ export declare const WEEKDAY_OFFSET: {
17
+ 天: number;
18
+ 日: number;
19
+ 一: number;
20
+ 二: number;
21
+ 三: number;
22
+ 四: number;
23
+ 五: number;
24
+ 六: number;
25
+ };
26
+ export declare function zhStringToNumber(text: string): number;
27
+ export declare function zhStringToYear(text: string): number;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.zhStringToYear = exports.zhStringToNumber = exports.WEEKDAY_OFFSET = exports.NUMBER = void 0;
4
+ exports.NUMBER = {
5
+ "零": 0,
6
+ "〇": 0,
7
+ "一": 1,
8
+ "二": 2,
9
+ "两": 2,
10
+ "三": 3,
11
+ "四": 4,
12
+ "五": 5,
13
+ "六": 6,
14
+ "七": 7,
15
+ "八": 8,
16
+ "九": 9,
17
+ "十": 10,
18
+ };
19
+ exports.WEEKDAY_OFFSET = {
20
+ "天": 0,
21
+ "日": 0,
22
+ "一": 1,
23
+ "二": 2,
24
+ "三": 3,
25
+ "四": 4,
26
+ "五": 5,
27
+ "六": 6,
28
+ };
29
+ function zhStringToNumber(text) {
30
+ let number = 0;
31
+ for (let i = 0; i < text.length; i++) {
32
+ const char = text[i];
33
+ if (char === "十") {
34
+ number = number === 0 ? exports.NUMBER[char] : number * exports.NUMBER[char];
35
+ }
36
+ else {
37
+ number += exports.NUMBER[char];
38
+ }
39
+ }
40
+ return number;
41
+ }
42
+ exports.zhStringToNumber = zhStringToNumber;
43
+ function zhStringToYear(text) {
44
+ let string = "";
45
+ for (let i = 0; i < text.length; i++) {
46
+ const char = text[i];
47
+ string = string + exports.NUMBER[char];
48
+ }
49
+ return parseInt(string);
50
+ }
51
+ exports.zhStringToYear = zhStringToYear;
@@ -0,0 +1,9 @@
1
+ import { Chrono, Configuration } from "../../../chrono";
2
+ import { ParsedResult, ParsingOption } from "../../../index";
3
+ export declare const hans: Chrono;
4
+ export declare const casual: Chrono;
5
+ export declare const strict: Chrono;
6
+ export declare function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[];
7
+ export declare function parseDate(text: string, ref?: Date, option?: ParsingOption): Date;
8
+ export declare function createCasualConfiguration(): Configuration;
9
+ export declare function createConfiguration(): Configuration;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = exports.hans = void 0;
7
+ const chrono_1 = require("../../../chrono");
8
+ const ExtractTimezoneOffsetRefiner_1 = __importDefault(require("../../../common/refiners/ExtractTimezoneOffsetRefiner"));
9
+ const configurations_1 = require("../../../configurations");
10
+ const ZHHansCasualDateParser_1 = __importDefault(require("./parsers/ZHHansCasualDateParser"));
11
+ const ZHHansDateParser_1 = __importDefault(require("./parsers/ZHHansDateParser"));
12
+ const ZHHansDeadlineFormatParser_1 = __importDefault(require("./parsers/ZHHansDeadlineFormatParser"));
13
+ const ZHHansRelationWeekdayParser_1 = __importDefault(require("./parsers/ZHHansRelationWeekdayParser"));
14
+ const ZHHansTimeExpressionParser_1 = __importDefault(require("./parsers/ZHHansTimeExpressionParser"));
15
+ const ZHHansWeekdayParser_1 = __importDefault(require("./parsers/ZHHansWeekdayParser"));
16
+ const ZHHansMergeDateRangeRefiner_1 = __importDefault(require("./refiners/ZHHansMergeDateRangeRefiner"));
17
+ const ZHHansMergeDateTimeRefiner_1 = __importDefault(require("./refiners/ZHHansMergeDateTimeRefiner"));
18
+ exports.hans = new chrono_1.Chrono(createCasualConfiguration());
19
+ exports.casual = new chrono_1.Chrono(createCasualConfiguration());
20
+ exports.strict = new chrono_1.Chrono(createConfiguration());
21
+ function parse(text, ref, option) {
22
+ return exports.casual.parse(text, ref, option);
23
+ }
24
+ exports.parse = parse;
25
+ function parseDate(text, ref, option) {
26
+ return exports.casual.parseDate(text, ref, option);
27
+ }
28
+ exports.parseDate = parseDate;
29
+ function createCasualConfiguration() {
30
+ const option = createConfiguration();
31
+ option.parsers.unshift(new ZHHansCasualDateParser_1.default());
32
+ return option;
33
+ }
34
+ exports.createCasualConfiguration = createCasualConfiguration;
35
+ function createConfiguration() {
36
+ const configuration = configurations_1.includeCommonConfiguration({
37
+ parsers: [
38
+ new ZHHansDateParser_1.default(),
39
+ new ZHHansRelationWeekdayParser_1.default(),
40
+ new ZHHansWeekdayParser_1.default(),
41
+ new ZHHansTimeExpressionParser_1.default(),
42
+ new ZHHansDeadlineFormatParser_1.default(),
43
+ ],
44
+ refiners: [new ZHHansMergeDateRangeRefiner_1.default(), new ZHHansMergeDateTimeRefiner_1.default()],
45
+ });
46
+ configuration.refiners = configuration.refiners.filter((refiner) => !(refiner instanceof ExtractTimezoneOffsetRefiner_1.default));
47
+ return configuration;
48
+ }
49
+ exports.createConfiguration = createConfiguration;