chrono-node 2.3.7 → 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.
- package/dist/common/refiners/ExtractTimezoneAbbrRefiner.js +1 -1
- package/dist/locales/de/constants.d.ts +3 -3
- package/dist/locales/de/constants.js +38 -20
- package/dist/locales/de/index.js +4 -0
- package/dist/locales/de/parsers/DESpecificTimeExpressionParser.d.ts +7 -0
- package/dist/locales/de/parsers/DESpecificTimeExpressionParser.js +114 -0
- package/dist/locales/de/parsers/DETimeExpressionParser.d.ts +0 -1
- package/dist/locales/de/parsers/DETimeExpressionParser.js +3 -21
- package/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.d.ts +8 -0
- package/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.js +34 -0
- package/dist/locales/en/constants.d.ts +2 -2
- package/dist/locales/en/constants.js +3 -0
- package/dist/results.d.ts +1 -1
- package/dist/results.js +1 -2
- package/dist/timezone.d.ts +1 -1
- package/dist/timezone.js +2 -2
- package/package.json +1 -1
- package/src/common/refiners/ExtractTimezoneAbbrRefiner.ts +3 -1
- package/src/locales/de/constants.ts +42 -22
- package/src/locales/de/index.ts +4 -0
- package/src/locales/de/parsers/DESpecificTimeExpressionParser.ts +150 -0
- package/src/locales/de/parsers/DETimeExpressionParser.ts +4 -23
- package/src/locales/de/parsers/DETimeUnitRelativeFormatParser.ts +42 -0
- package/src/locales/en/constants.ts +5 -2
- package/src/results.ts +2 -3
- package/src/timezone.ts +3 -3
- package/test/de/de_month_name_little_endian.test.ts +12 -0
- package/test/de/de_time_exp.test.ts +59 -0
- package/test/de/de_time_units_casual_relative.test.ts +108 -0
- package/test/de/de_year.test.ts +147 -0
- package/test/en/en_relative.test.ts +41 -2
- package/test/en/en_time_units_ago.test.ts +3 -3
- package/test/en/en_time_units_within.test.ts +2 -2
- package/test/en/en_timezone_exp.test.ts +3 -3
- package/test/fr/fr_time_units_ago.test.ts +3 -3
- package/test/fr/fr_time_units_within.test.ts +2 -2
- package/test/nl/nl_relative.test.ts +2 -2
- package/test/nl/nl_time_units_ago.test.ts +3 -3
- package/test/system_timezone.test.ts +22 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { Parser, ParsingContext } from "../../../chrono";
|
|
2
|
+
import { ParsingComponents, ParsingResult } from "../../../results";
|
|
3
|
+
import { Meridiem } from "../../../index";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 8h10m00s
|
|
7
|
+
* 8h10m00
|
|
8
|
+
* 8h10
|
|
9
|
+
* 8 Uhr
|
|
10
|
+
* 8h10m00s Uhr
|
|
11
|
+
* 8:10 Uhr
|
|
12
|
+
*/
|
|
13
|
+
const FIRST_REG_PATTERN = new RegExp(
|
|
14
|
+
"(^|\\s|T)" +
|
|
15
|
+
"(?:(?:um|von)\\s*)?" +
|
|
16
|
+
"(\\d{1,2})(?:h|:)?" +
|
|
17
|
+
"(?:(\\d{1,2})(?:m|:)?)?" +
|
|
18
|
+
"(?:(\\d{1,2})(?:s)?)?" +
|
|
19
|
+
"(?:\\s*Uhr)?" +
|
|
20
|
+
"(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?" +
|
|
21
|
+
"(?=\\W|$)",
|
|
22
|
+
"i"
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
const SECOND_REG_PATTERN = new RegExp(
|
|
26
|
+
"^\\s*(\\-|\\–|\\~|\\〜|bis(?:\\s+um)?|\\?)\\s*" +
|
|
27
|
+
"(\\d{1,2})(?:h|:)?" +
|
|
28
|
+
"(?:(\\d{1,2})(?:m|:)?)?" +
|
|
29
|
+
"(?:(\\d{1,2})(?:s)?)?" +
|
|
30
|
+
"(?:\\s*Uhr)?" +
|
|
31
|
+
"(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?" +
|
|
32
|
+
"(?=\\W|$)",
|
|
33
|
+
"i"
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const HOUR_GROUP = 2;
|
|
37
|
+
const MINUTE_GROUP = 3;
|
|
38
|
+
const SECOND_GROUP = 4;
|
|
39
|
+
const AM_PM_HOUR_GROUP = 5;
|
|
40
|
+
|
|
41
|
+
export default class DESpecificTimeExpressionParser implements Parser {
|
|
42
|
+
pattern(context): RegExp {
|
|
43
|
+
return FIRST_REG_PATTERN;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
extract(context: ParsingContext, match: RegExpMatchArray): ParsingResult | null {
|
|
47
|
+
const result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length));
|
|
48
|
+
|
|
49
|
+
// This looks more like a year e.g. 2020
|
|
50
|
+
if (result.text.match(/^\d{4}$/)) {
|
|
51
|
+
match.index += match[0].length;
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
result.start = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match);
|
|
56
|
+
if (!result.start) {
|
|
57
|
+
match.index += match[0].length;
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const remainingText = context.text.substring(match.index + match[0].length);
|
|
62
|
+
const secondMatch = SECOND_REG_PATTERN.exec(remainingText);
|
|
63
|
+
if (secondMatch) {
|
|
64
|
+
result.end = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch);
|
|
65
|
+
if (result.end) {
|
|
66
|
+
result.text += secondMatch[0];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private static extractTimeComponent(
|
|
74
|
+
extractingComponents: ParsingComponents,
|
|
75
|
+
match: RegExpMatchArray
|
|
76
|
+
): ParsingComponents | null {
|
|
77
|
+
let hour = 0;
|
|
78
|
+
let minute = 0;
|
|
79
|
+
let meridiem = null;
|
|
80
|
+
|
|
81
|
+
// ----- Hours
|
|
82
|
+
hour = parseInt(match[HOUR_GROUP]);
|
|
83
|
+
|
|
84
|
+
// ----- Minutes
|
|
85
|
+
if (match[MINUTE_GROUP] != null) {
|
|
86
|
+
minute = parseInt(match[MINUTE_GROUP]);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (minute >= 60 || hour > 24) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (hour >= 12) {
|
|
94
|
+
meridiem = Meridiem.PM;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// ----- AM & PM
|
|
98
|
+
if (match[AM_PM_HOUR_GROUP] != null) {
|
|
99
|
+
if (hour > 12) return null;
|
|
100
|
+
const ampm = match[AM_PM_HOUR_GROUP].toLowerCase();
|
|
101
|
+
if (ampm.match(/morgen|vormittag/)) {
|
|
102
|
+
meridiem = Meridiem.AM;
|
|
103
|
+
if (hour == 12) {
|
|
104
|
+
hour = 0;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (ampm.match(/nachmittag|abend/)) {
|
|
109
|
+
meridiem = Meridiem.PM;
|
|
110
|
+
if (hour != 12) {
|
|
111
|
+
hour += 12;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (ampm.match(/nacht/)) {
|
|
116
|
+
if (hour == 12) {
|
|
117
|
+
meridiem = Meridiem.AM;
|
|
118
|
+
hour = 0;
|
|
119
|
+
} else if (hour < 6) {
|
|
120
|
+
meridiem = Meridiem.AM;
|
|
121
|
+
} else {
|
|
122
|
+
meridiem = Meridiem.PM;
|
|
123
|
+
hour += 12;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
extractingComponents.assign("hour", hour);
|
|
129
|
+
extractingComponents.assign("minute", minute);
|
|
130
|
+
if (meridiem !== null) {
|
|
131
|
+
extractingComponents.assign("meridiem", meridiem);
|
|
132
|
+
} else {
|
|
133
|
+
if (hour < 12) {
|
|
134
|
+
extractingComponents.imply("meridiem", Meridiem.AM);
|
|
135
|
+
} else {
|
|
136
|
+
extractingComponents.imply("meridiem", Meridiem.PM);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ----- Second
|
|
141
|
+
if (match[SECOND_GROUP] != null) {
|
|
142
|
+
const second = parseInt(match[SECOND_GROUP]);
|
|
143
|
+
if (second >= 60) return null;
|
|
144
|
+
|
|
145
|
+
extractingComponents.assign("second", second);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return extractingComponents;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { AbstractTimeExpressionParser } from "../../../common/parsers/AbstractTimeExpressionParser";
|
|
2
2
|
import { ParsingComponents } from "../../../results";
|
|
3
3
|
import { ParsingContext } from "../../../chrono";
|
|
4
|
-
import { Meridiem } from "../../../index";
|
|
5
4
|
|
|
6
5
|
export default class DETimeExpressionParser extends AbstractTimeExpressionParser {
|
|
7
6
|
primaryPrefix(): string {
|
|
@@ -12,30 +11,12 @@ export default class DETimeExpressionParser extends AbstractTimeExpressionParser
|
|
|
12
11
|
return "\\s*(?:\\-|\\–|\\~|\\〜|bis)\\s*";
|
|
13
12
|
}
|
|
14
13
|
|
|
15
|
-
primarySuffix(): string {
|
|
16
|
-
return "(?:\\s*uhr)?(?:\\s*(?:morgens|vormittags|nachmittags|abends|nachts))?(?=\\W|$)";
|
|
17
|
-
}
|
|
18
|
-
|
|
19
14
|
extractPrimaryTimeComponents(context: ParsingContext, match: RegExpMatchArray): ParsingComponents | null {
|
|
20
|
-
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
components.assign("meridiem", Meridiem.AM);
|
|
24
|
-
const hour = components.get("hour");
|
|
25
|
-
if (hour < 12) {
|
|
26
|
-
components.assign("hour", components.get("hour"));
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (match[0].endsWith("nachmittags") || match[0].endsWith("abends") || match[0].endsWith("nachts")) {
|
|
31
|
-
components.assign("meridiem", Meridiem.PM);
|
|
32
|
-
const hour = components.get("hour");
|
|
33
|
-
if (hour < 12) {
|
|
34
|
-
components.assign("hour", components.get("hour") + 12);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
15
|
+
// This looks more like a year e.g. 2020
|
|
16
|
+
if (match[0].match(/^\s*\d{4}\s*$/)) {
|
|
17
|
+
return null;
|
|
37
18
|
}
|
|
38
19
|
|
|
39
|
-
return
|
|
20
|
+
return super.extractPrimaryTimeComponents(context, match);
|
|
40
21
|
}
|
|
41
22
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ParsingContext } from "../../../chrono";
|
|
2
|
+
import { NUMBER_PATTERN, parseNumberPattern, TIME_UNIT_DICTIONARY } from "../constants";
|
|
3
|
+
import { ParsingComponents } from "../../../results";
|
|
4
|
+
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
|
|
5
|
+
import { reverseTimeUnits } from "../../../utils/timeunits";
|
|
6
|
+
import { matchAnyPattern } from "../../../utils/pattern";
|
|
7
|
+
|
|
8
|
+
export default class DETimeUnitAgoFormatParser extends AbstractParserWithWordBoundaryChecking {
|
|
9
|
+
constructor() {
|
|
10
|
+
super();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
innerPattern(): RegExp {
|
|
14
|
+
return new RegExp(
|
|
15
|
+
`(?:\\s*((?:nächste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?|vor|in)\\s*)?` +
|
|
16
|
+
`(${NUMBER_PATTERN})?` +
|
|
17
|
+
`(?:\\s*(nächste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?)?` +
|
|
18
|
+
`\\s*(${matchAnyPattern(TIME_UNIT_DICTIONARY)})`,
|
|
19
|
+
"i"
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
innerExtract(context: ParsingContext, match: RegExpMatchArray) {
|
|
24
|
+
const num = match[2] ? parseNumberPattern(match[2]) : 1;
|
|
25
|
+
const unit = TIME_UNIT_DICTIONARY[match[4].toLowerCase()];
|
|
26
|
+
let timeUnits = {};
|
|
27
|
+
timeUnits[unit] = num;
|
|
28
|
+
|
|
29
|
+
// Modifier
|
|
30
|
+
let modifier = match[1] || match[3] || "";
|
|
31
|
+
modifier = modifier.toLowerCase();
|
|
32
|
+
if (!modifier) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (/vor/.test(modifier) || /letzte/.test(modifier) || /vergangen/.test(modifier)) {
|
|
37
|
+
timeUnits = reverseTimeUnits(timeUnits);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return ParsingComponents.createRelativeFromReference(context.reference, timeUnits);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OpUnitType } from "dayjs";
|
|
1
|
+
import { OpUnitType, QUnitType } from "dayjs";
|
|
2
2
|
import { matchAnyPattern, repeatedTimeunitPattern } from "../../utils/pattern";
|
|
3
3
|
import { findMostLikelyADYear } from "../../calculation/years";
|
|
4
4
|
import { TimeUnits } from "../../utils/timeunits";
|
|
@@ -133,7 +133,7 @@ export const ORDINAL_WORD_DICTIONARY: { [word: string]: number } = {
|
|
|
133
133
|
"thirty-first": 31,
|
|
134
134
|
};
|
|
135
135
|
|
|
136
|
-
export const TIME_UNIT_DICTIONARY: { [word: string]: OpUnitType } = {
|
|
136
|
+
export const TIME_UNIT_DICTIONARY: { [word: string]: OpUnitType | QUnitType } = {
|
|
137
137
|
sec: "second",
|
|
138
138
|
second: "second",
|
|
139
139
|
seconds: "second",
|
|
@@ -152,6 +152,9 @@ export const TIME_UNIT_DICTIONARY: { [word: string]: OpUnitType } = {
|
|
|
152
152
|
weeks: "week",
|
|
153
153
|
month: "month",
|
|
154
154
|
months: "month",
|
|
155
|
+
qtr: "quarter",
|
|
156
|
+
quarter: "quarter",
|
|
157
|
+
quarters: "quarter",
|
|
155
158
|
y: "year",
|
|
156
159
|
yr: "year",
|
|
157
160
|
year: "year",
|
package/src/results.ts
CHANGED
|
@@ -8,13 +8,12 @@ dayjs.extend(quarterOfYear);
|
|
|
8
8
|
|
|
9
9
|
export class ReferenceWithTimezone {
|
|
10
10
|
readonly instant: Date;
|
|
11
|
-
readonly timezoneOffset?: number;
|
|
11
|
+
readonly timezoneOffset?: number | null;
|
|
12
12
|
|
|
13
13
|
constructor(input?: ParsingReference | Date) {
|
|
14
14
|
input = input ?? new Date();
|
|
15
15
|
if (input instanceof Date) {
|
|
16
16
|
this.instant = input;
|
|
17
|
-
this.timezoneOffset = -input.getTimezoneOffset();
|
|
18
17
|
} else {
|
|
19
18
|
this.instant = input.instant ?? new Date();
|
|
20
19
|
this.timezoneOffset = toTimezoneOffset(input.timezone);
|
|
@@ -133,7 +132,7 @@ export class ParsingComponents implements ParsedComponents {
|
|
|
133
132
|
toString() {
|
|
134
133
|
return `[ParsingComponents {knownValues: ${JSON.stringify(this.knownValues)}, impliedValues: ${JSON.stringify(
|
|
135
134
|
this.impliedValues
|
|
136
|
-
)}}]`;
|
|
135
|
+
)}}, reference: ${JSON.stringify(this.reference)}]`;
|
|
137
136
|
}
|
|
138
137
|
|
|
139
138
|
dayjs() {
|
package/src/timezone.ts
CHANGED
|
@@ -192,8 +192,8 @@ export const TIMEZONE_ABBR_MAP = {
|
|
|
192
192
|
YEKT: 360,
|
|
193
193
|
};
|
|
194
194
|
|
|
195
|
-
export function toTimezoneOffset(timezoneInput
|
|
196
|
-
if (timezoneInput === null) {
|
|
195
|
+
export function toTimezoneOffset(timezoneInput?: string | number): number | null {
|
|
196
|
+
if (timezoneInput === null || timezoneInput === undefined) {
|
|
197
197
|
return null;
|
|
198
198
|
}
|
|
199
199
|
|
|
@@ -201,5 +201,5 @@ export function toTimezoneOffset(timezoneInput: string | number): number | null
|
|
|
201
201
|
return timezoneInput;
|
|
202
202
|
}
|
|
203
203
|
|
|
204
|
-
return TIMEZONE_ABBR_MAP[timezoneInput] ??
|
|
204
|
+
return TIMEZONE_ABBR_MAP[timezoneInput] ?? null;
|
|
205
205
|
}
|
|
@@ -204,6 +204,18 @@ test("Test - Range expression", function () {
|
|
|
204
204
|
|
|
205
205
|
expect(result.end).toBeDate(new Date(2013, 10 - 1, 12, 12));
|
|
206
206
|
});
|
|
207
|
+
|
|
208
|
+
testSingleCase(chrono.de, "10. jänner 2012", new Date(2012, 7, 10), (result) => {
|
|
209
|
+
expect(result.start).not.toBeNull();
|
|
210
|
+
expect(result.start.get("year")).toBe(2012);
|
|
211
|
+
expect(result.start.get("month")).toBe(1);
|
|
212
|
+
expect(result.start.get("day")).toBe(10);
|
|
213
|
+
|
|
214
|
+
expect(result.index).toBe(0);
|
|
215
|
+
expect(result.text).toBe("10. jänner 2012");
|
|
216
|
+
|
|
217
|
+
expect(result.start).toBeDate(new Date(2012, 1 - 1, 10, 12));
|
|
218
|
+
});
|
|
207
219
|
});
|
|
208
220
|
|
|
209
221
|
test("Test - Combined expression", function () {
|
|
@@ -27,6 +27,11 @@ test("Test - Simple Expression", function () {
|
|
|
27
27
|
expect(result.start.get("minute")).toBe(0);
|
|
28
28
|
});
|
|
29
29
|
|
|
30
|
+
testSingleCase(chrono.de, "um 16h", new Date(2012, 7, 10), (result) => {
|
|
31
|
+
expect(result.start.get("hour")).toBe(16);
|
|
32
|
+
expect(result.start.get("minute")).toBe(0);
|
|
33
|
+
});
|
|
34
|
+
|
|
30
35
|
testSingleCase(chrono.de, "um 7 morgens", new Date(2012, 7, 10), (result) => {
|
|
31
36
|
expect(result.start.get("hour")).toBe(7);
|
|
32
37
|
expect(result.start.get("minute")).toBe(0);
|
|
@@ -64,6 +69,22 @@ test("Test - Simple Expression", function () {
|
|
|
64
69
|
expect(result.start.get("meridiem")).toBe(Meridiem.PM);
|
|
65
70
|
expect(result.start.isCertain("meridiem")).toBeTruthy();
|
|
66
71
|
});
|
|
72
|
+
|
|
73
|
+
testSingleCase(chrono.de, "um 8 Uhr in der Nacht", new Date(2012, 7, 10), (result, text) => {
|
|
74
|
+
expect(result.text).toBe(text);
|
|
75
|
+
expect(result.start.get("hour")).toBe(20);
|
|
76
|
+
expect(result.start.get("minute")).toBe(0);
|
|
77
|
+
expect(result.start.get("meridiem")).toBe(Meridiem.PM);
|
|
78
|
+
expect(result.start.isCertain("meridiem")).toBeTruthy();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
testSingleCase(chrono.de, "um 5 Uhr in der Nacht", new Date(2012, 7, 10), (result, text) => {
|
|
82
|
+
expect(result.text).toBe(text);
|
|
83
|
+
expect(result.start.get("hour")).toBe(5);
|
|
84
|
+
expect(result.start.get("minute")).toBe(0);
|
|
85
|
+
expect(result.start.get("meridiem")).toBe(Meridiem.AM);
|
|
86
|
+
expect(result.start.isCertain("meridiem")).toBeTruthy();
|
|
87
|
+
});
|
|
67
88
|
});
|
|
68
89
|
|
|
69
90
|
test("Test - Range Expression", function () {
|
|
@@ -118,6 +139,44 @@ test("Test - Range Expression", function () {
|
|
|
118
139
|
|
|
119
140
|
expect(result.end).toBeDate(new Date(2012, 7, 10, 23, 0));
|
|
120
141
|
});
|
|
142
|
+
|
|
143
|
+
testSingleCase(chrono.de, " von 6h30 bis 23h00 ", new Date(2012, 7, 10), (result) => {
|
|
144
|
+
expect(result.index).toBe(1);
|
|
145
|
+
expect(result.text).toBe("von 6h30 bis 23h00");
|
|
146
|
+
|
|
147
|
+
expect(result.start).not.toBeNull();
|
|
148
|
+
expect(result.start.get("hour")).toBe(6);
|
|
149
|
+
expect(result.start.get("minute")).toBe(30);
|
|
150
|
+
expect(result.start.get("meridiem")).toBe(0);
|
|
151
|
+
|
|
152
|
+
expect(result.start).toBeDate(new Date(2012, 7, 10, 6, 30));
|
|
153
|
+
|
|
154
|
+
expect(result.end).not.toBeNull();
|
|
155
|
+
expect(result.end.get("hour")).toBe(23);
|
|
156
|
+
expect(result.end.get("minute")).toBe(0);
|
|
157
|
+
expect(result.end.get("meridiem")).toBe(1);
|
|
158
|
+
|
|
159
|
+
expect(result.end).toBeDate(new Date(2012, 7, 10, 23, 0));
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
testSingleCase(chrono.de, " von 6h30 morgens bis 11 am Abend", new Date(2012, 7, 10), (result) => {
|
|
163
|
+
expect(result.index).toBe(1);
|
|
164
|
+
expect(result.text).toBe("von 6h30 morgens bis 11 am Abend");
|
|
165
|
+
|
|
166
|
+
expect(result.start).not.toBeNull();
|
|
167
|
+
expect(result.start.get("hour")).toBe(6);
|
|
168
|
+
expect(result.start.get("minute")).toBe(30);
|
|
169
|
+
expect(result.start.get("meridiem")).toBe(0);
|
|
170
|
+
|
|
171
|
+
expect(result.start).toBeDate(new Date(2012, 7, 10, 6, 30));
|
|
172
|
+
|
|
173
|
+
expect(result.end).not.toBeNull();
|
|
174
|
+
expect(result.end.get("hour")).toBe(23);
|
|
175
|
+
expect(result.end.get("minute")).toBe(0);
|
|
176
|
+
expect(result.end.get("meridiem")).toBe(1);
|
|
177
|
+
|
|
178
|
+
expect(result.end).toBeDate(new Date(2012, 7, 10, 23, 0));
|
|
179
|
+
});
|
|
121
180
|
});
|
|
122
181
|
|
|
123
182
|
test("Test - Timezone extraction", function () {
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import * as chrono from "../../src";
|
|
2
|
+
import { testSingleCase, testUnexpectedResult } from "../test_util";
|
|
3
|
+
|
|
4
|
+
// test("Test - fr - modifier mandatory just after", function () {
|
|
5
|
+
// testUnexpectedResult(chrono.de, "le mois d'avril");
|
|
6
|
+
//
|
|
7
|
+
// testUnexpectedResult(chrono.de, "le mois d'avril prochain");
|
|
8
|
+
// });
|
|
9
|
+
|
|
10
|
+
test("Test - de - relative date", function () {
|
|
11
|
+
testSingleCase(chrono.de, "kommende Woche", new Date(2017, 5 - 1, 12), (result, text) => {
|
|
12
|
+
expect(result.text).toBe(text);
|
|
13
|
+
expect(result.start.get("year")).toBe(2017);
|
|
14
|
+
expect(result.start.get("month")).toBe(5);
|
|
15
|
+
expect(result.start.get("day")).toBe(19);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
testSingleCase(chrono.de, "in 2 Wochen", new Date(2017, 5 - 1, 12, 18, 11), (result, text) => {
|
|
19
|
+
expect(result.text).toBe(text);
|
|
20
|
+
expect(result.start.get("year")).toBe(2017);
|
|
21
|
+
expect(result.start.get("month")).toBe(5);
|
|
22
|
+
expect(result.start.get("day")).toBe(26);
|
|
23
|
+
expect(result.start.get("hour")).toBe(18);
|
|
24
|
+
expect(result.start.get("minute")).toBe(11);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
testSingleCase(chrono.de, "in drei Wochen", new Date(2017, 5 - 1, 12), (result, text) => {
|
|
28
|
+
expect(result.text).toBe(text);
|
|
29
|
+
expect(result.start.get("year")).toBe(2017);
|
|
30
|
+
expect(result.start.get("month")).toBe(6);
|
|
31
|
+
expect(result.start.get("day")).toBe(2);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
testSingleCase(chrono.de, "letzten Monat", new Date(2017, 5 - 1, 12), (result, text) => {
|
|
35
|
+
expect(result.text).toBe(text);
|
|
36
|
+
expect(result.start.get("year")).toBe(2017);
|
|
37
|
+
expect(result.start.get("month")).toBe(4);
|
|
38
|
+
expect(result.start.get("day")).toBe(12);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
testSingleCase(chrono.de, "in den 30 vorangegangenen Tagen", new Date(2017, 5 - 1, 12), (result, text) => {
|
|
42
|
+
expect(result.text).toBe("30 vorangegangenen Tagen");
|
|
43
|
+
expect(result.start.get("year")).toBe(2017);
|
|
44
|
+
expect(result.start.get("month")).toBe(4);
|
|
45
|
+
expect(result.start.get("day")).toBe(12);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
testSingleCase(chrono.de, "die vergangenen 24 Stunden", new Date(2017, 5 - 1, 12, 11, 27), (result, text) => {
|
|
49
|
+
expect(result.text).toBe("vergangenen 24 Stunden");
|
|
50
|
+
expect(result.start.get("year")).toBe(2017);
|
|
51
|
+
expect(result.start.get("month")).toBe(5);
|
|
52
|
+
expect(result.start.get("day")).toBe(11);
|
|
53
|
+
expect(result.start.get("hour")).toBe(11);
|
|
54
|
+
expect(result.start.get("minute")).toBe(27);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
testSingleCase(chrono.de, "in den folgenden 90 sekunden", new Date(2017, 5 - 1, 12, 11, 27, 3), (result, text) => {
|
|
58
|
+
expect(result.text).toBe("folgenden 90 sekunden");
|
|
59
|
+
expect(result.start.get("year")).toBe(2017);
|
|
60
|
+
expect(result.start.get("month")).toBe(5);
|
|
61
|
+
expect(result.start.get("day")).toBe(12);
|
|
62
|
+
expect(result.start.get("hour")).toBe(11);
|
|
63
|
+
expect(result.start.get("minute")).toBe(28);
|
|
64
|
+
expect(result.start.get("second")).toBe(33);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
testSingleCase(chrono.de, "die letzten acht Minuten", new Date(2017, 5 - 1, 12, 11, 27), (result, text) => {
|
|
68
|
+
expect(result.text).toBe("letzten acht Minuten");
|
|
69
|
+
expect(result.start.get("year")).toBe(2017);
|
|
70
|
+
expect(result.start.get("month")).toBe(5);
|
|
71
|
+
expect(result.start.get("day")).toBe(12);
|
|
72
|
+
expect(result.start.get("hour")).toBe(11);
|
|
73
|
+
expect(result.start.get("minute")).toBe(19);
|
|
74
|
+
expect(result.start.get("second")).toBe(0);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
testSingleCase(chrono.de, "letztes Quartal", new Date(2017, 5 - 1, 12, 11, 27), (result, text) => {
|
|
78
|
+
expect(result.text).toBe(text);
|
|
79
|
+
expect(result.start.get("year")).toBe(2017);
|
|
80
|
+
expect(result.start.get("month")).toBe(2);
|
|
81
|
+
expect(result.start.get("day")).toBe(12);
|
|
82
|
+
expect(result.start.get("hour")).toBe(11);
|
|
83
|
+
expect(result.start.get("minute")).toBe(27);
|
|
84
|
+
expect(result.start.get("second")).toBe(0);
|
|
85
|
+
|
|
86
|
+
expect(result.start.isCertain("month")).toBeFalsy();
|
|
87
|
+
expect(result.start.isCertain("day")).toBeFalsy();
|
|
88
|
+
expect(result.start.isCertain("hour")).toBeFalsy();
|
|
89
|
+
expect(result.start.isCertain("minute")).toBeFalsy();
|
|
90
|
+
expect(result.start.isCertain("second")).toBeFalsy();
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
testSingleCase(chrono.de, "kommendes Jahr", new Date(2017, 5 - 1, 12, 11, 27), (result, text) => {
|
|
94
|
+
expect(result.text).toBe(text);
|
|
95
|
+
expect(result.start.get("year")).toBe(2018);
|
|
96
|
+
expect(result.start.get("month")).toBe(5);
|
|
97
|
+
expect(result.start.get("day")).toBe(12);
|
|
98
|
+
expect(result.start.get("hour")).toBe(11);
|
|
99
|
+
expect(result.start.get("minute")).toBe(27);
|
|
100
|
+
expect(result.start.get("second")).toBe(0);
|
|
101
|
+
|
|
102
|
+
expect(result.start.isCertain("month")).toBeFalsy();
|
|
103
|
+
expect(result.start.isCertain("day")).toBeFalsy();
|
|
104
|
+
expect(result.start.isCertain("hour")).toBeFalsy();
|
|
105
|
+
expect(result.start.isCertain("minute")).toBeFalsy();
|
|
106
|
+
expect(result.start.isCertain("second")).toBeFalsy();
|
|
107
|
+
});
|
|
108
|
+
});
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import * as chrono from "../../src";
|
|
2
|
+
import { testSingleCase } from "../test_util";
|
|
3
|
+
//import DETimeExpressionParser from "../../src/locales/de/parsers/DETimeExpressionParser";
|
|
4
|
+
|
|
5
|
+
test("Test - Year numbers with v/nuZ Era label", () => {
|
|
6
|
+
testSingleCase(chrono.de, "10. August 234 v.u.Z.", new Date(2012, 7, 10), (result) => {
|
|
7
|
+
expect(result.index).toBe(0);
|
|
8
|
+
expect(result.text).toBe("10. August 234 v.u.Z."); // fails since text is `10 August 234`
|
|
9
|
+
|
|
10
|
+
expect(result.start).not.toBeNull();
|
|
11
|
+
expect(result.start.get("year")).toBe(-234);
|
|
12
|
+
expect(result.start.get("month")).toBe(8);
|
|
13
|
+
expect(result.start.get("day")).toBe(10);
|
|
14
|
+
|
|
15
|
+
//expect(result.start).toBeDate(new Date(-234, 8 - 1, 10, 12));
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
testSingleCase(chrono.de, "10. August 88 nuZ", new Date(2012, 7, 10), (result) => {
|
|
19
|
+
expect(result.index).toBe(0);
|
|
20
|
+
expect(result.text).toBe("10. August 88 nuZ");
|
|
21
|
+
|
|
22
|
+
expect(result.start).not.toBeNull();
|
|
23
|
+
expect(result.start.get("year")).toBe(88);
|
|
24
|
+
expect(result.start.get("month")).toBe(8);
|
|
25
|
+
expect(result.start.get("day")).toBe(10);
|
|
26
|
+
|
|
27
|
+
//const resultDate = result.start.date();
|
|
28
|
+
const expectDate = new Date(88, 8 - 1, 10, 12);
|
|
29
|
+
expectDate.setFullYear(88);
|
|
30
|
+
//expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
testSingleCase(chrono.de, "10. August 88 uZ", new Date(2012, 7, 10), (result) => {
|
|
34
|
+
expect(result.index).toBe(0);
|
|
35
|
+
expect(result.text).toBe("10. August 88 uZ");
|
|
36
|
+
|
|
37
|
+
expect(result.start).not.toBeNull();
|
|
38
|
+
expect(result.start.get("year")).toBe(88);
|
|
39
|
+
expect(result.start.get("month")).toBe(8);
|
|
40
|
+
expect(result.start.get("day")).toBe(10);
|
|
41
|
+
|
|
42
|
+
//const resultDate = result.start.date();
|
|
43
|
+
const expectDate = new Date(88, 8 - 1, 10, 12);
|
|
44
|
+
expectDate.setFullYear(88);
|
|
45
|
+
//expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
testSingleCase(chrono.de, "10. August 88 d.g.Z.", new Date(2012, 7, 10), (result) => {
|
|
49
|
+
expect(result.index).toBe(0);
|
|
50
|
+
expect(result.text).toBe("10. August 88 d.g.Z.");
|
|
51
|
+
|
|
52
|
+
expect(result.start).not.toBeNull();
|
|
53
|
+
expect(result.start.get("year")).toBe(88);
|
|
54
|
+
expect(result.start.get("month")).toBe(8);
|
|
55
|
+
expect(result.start.get("day")).toBe(10);
|
|
56
|
+
|
|
57
|
+
//const resultDate = result.start.date();
|
|
58
|
+
const expectDate = new Date(88, 8 - 1, 10, 12);
|
|
59
|
+
expectDate.setFullYear(88);
|
|
60
|
+
//expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test("Test - Year numbers with v/nChr Era label", () => {
|
|
65
|
+
testSingleCase(chrono.de, "10. August 234 v.Chr.", new Date(2012, 7, 10), (result) => {
|
|
66
|
+
expect(result.index).toBe(0);
|
|
67
|
+
expect(result.text).toBe("10. August 234 v.Chr.");
|
|
68
|
+
|
|
69
|
+
expect(result.start).not.toBeNull();
|
|
70
|
+
expect(result.start.get("year")).toBe(-234);
|
|
71
|
+
expect(result.start.get("month")).toBe(8);
|
|
72
|
+
expect(result.start.get("day")).toBe(10);
|
|
73
|
+
|
|
74
|
+
//expect(result.start).toBeDate(new Date(-234, 8 - 1, 10, 12));
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
testSingleCase(chrono.de, "10. August 88 nC", new Date(2012, 7, 10), (result) => {
|
|
78
|
+
expect(result.index).toBe(0);
|
|
79
|
+
expect(result.text).toBe("10. August 88 nC");
|
|
80
|
+
|
|
81
|
+
expect(result.start).not.toBeNull();
|
|
82
|
+
expect(result.start.get("year")).toBe(88);
|
|
83
|
+
expect(result.start.get("month")).toBe(8);
|
|
84
|
+
expect(result.start.get("day")).toBe(10);
|
|
85
|
+
|
|
86
|
+
//const resultDate = result.start.date();
|
|
87
|
+
const expectDate = new Date(88, 8 - 1, 10, 12);
|
|
88
|
+
expectDate.setFullYear(88);
|
|
89
|
+
//expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("Test - Year numbers with v/ndgZ Era label", () => {
|
|
94
|
+
testSingleCase(chrono.de, "10. August 234 v.d.Z.", new Date(2012, 7, 10), (result) => {
|
|
95
|
+
expect(result.index).toBe(0);
|
|
96
|
+
expect(result.text).toBe("10. August 234 v.d.Z.");
|
|
97
|
+
|
|
98
|
+
expect(result.start).not.toBeNull();
|
|
99
|
+
expect(result.start.get("year")).toBe(-234);
|
|
100
|
+
expect(result.start.get("month")).toBe(8);
|
|
101
|
+
expect(result.start.get("day")).toBe(10);
|
|
102
|
+
|
|
103
|
+
//expect(result.start).toBeDate(new Date(-234, 8 - 1, 10, 12));
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
testSingleCase(chrono.de, "10. August 88 ndZ", new Date(2012, 7, 10), (result) => {
|
|
107
|
+
expect(result.index).toBe(0);
|
|
108
|
+
expect(result.text).toBe("10. August 88 ndZ");
|
|
109
|
+
|
|
110
|
+
expect(result.start).not.toBeNull();
|
|
111
|
+
expect(result.start.get("year")).toBe(88);
|
|
112
|
+
expect(result.start.get("month")).toBe(8);
|
|
113
|
+
expect(result.start.get("day")).toBe(10);
|
|
114
|
+
|
|
115
|
+
//const resultDate = result.start.date();
|
|
116
|
+
const expectDate = new Date(88, 8 - 1, 10, 12);
|
|
117
|
+
expectDate.setFullYear(88);
|
|
118
|
+
//expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
testSingleCase(chrono.de, "10. August 234 v.d.g.Z.", new Date(2012, 7, 10), (result) => {
|
|
122
|
+
expect(result.index).toBe(0);
|
|
123
|
+
expect(result.text).toBe("10. August 234 v.d.g.Z.");
|
|
124
|
+
|
|
125
|
+
expect(result.start).not.toBeNull();
|
|
126
|
+
expect(result.start.get("year")).toBe(-234);
|
|
127
|
+
expect(result.start.get("month")).toBe(8);
|
|
128
|
+
expect(result.start.get("day")).toBe(10);
|
|
129
|
+
|
|
130
|
+
//expect(result.start).toBeDate(new Date(-234, 8 - 1, 10, 12));
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
testSingleCase(chrono.de, "10. August 88 ndgZ", new Date(2012, 7, 10), (result) => {
|
|
134
|
+
expect(result.index).toBe(0);
|
|
135
|
+
expect(result.text).toBe("10. August 88 ndgZ");
|
|
136
|
+
|
|
137
|
+
expect(result.start).not.toBeNull();
|
|
138
|
+
expect(result.start.get("year")).toBe(88);
|
|
139
|
+
expect(result.start.get("month")).toBe(8);
|
|
140
|
+
expect(result.start.get("day")).toBe(10);
|
|
141
|
+
|
|
142
|
+
//const resultDate = result.start.date();
|
|
143
|
+
const expectDate = new Date(88, 8 - 1, 10, 12);
|
|
144
|
+
expectDate.setFullYear(88);
|
|
145
|
+
//expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
|
|
146
|
+
});
|
|
147
|
+
});
|