chrono-node 2.7.0 → 2.7.2
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/cjs/common/parsers/AbstractParserWithWordBoundary.d.ts +2 -1
- package/dist/cjs/common/parsers/AbstractParserWithWordBoundary.js +9 -5
- package/dist/cjs/common/parsers/AbstractParserWithWordBoundary.js.map +1 -1
- package/dist/cjs/locales/ru/parsers/AbstractParserWithWordBoundaryChecking.d.ts +11 -0
- package/dist/cjs/locales/ru/parsers/AbstractParserWithWordBoundaryChecking.js +24 -0
- package/dist/cjs/locales/ru/parsers/AbstractParserWithWordBoundaryChecking.js.map +1 -0
- package/dist/cjs/locales/ru/parsers/RUCasualDateParser.d.ts +3 -4
- package/dist/cjs/locales/ru/parsers/RUCasualDateParser.js +4 -9
- package/dist/cjs/locales/ru/parsers/RUCasualDateParser.js.map +1 -1
- package/dist/cjs/locales/ru/parsers/RUCasualTimeParser.d.ts +3 -4
- package/dist/cjs/locales/ru/parsers/RUCasualTimeParser.js +4 -10
- package/dist/cjs/locales/ru/parsers/RUCasualTimeParser.js.map +1 -1
- package/dist/cjs/locales/ru/parsers/RUMonthNameLittleEndianParser.d.ts +3 -4
- package/dist/cjs/locales/ru/parsers/RUMonthNameLittleEndianParser.js +14 -19
- package/dist/cjs/locales/ru/parsers/RUMonthNameLittleEndianParser.js.map +1 -1
- package/dist/cjs/locales/ru/parsers/RUMonthNameParser.d.ts +3 -4
- package/dist/cjs/locales/ru/parsers/RUMonthNameParser.js +10 -14
- package/dist/cjs/locales/ru/parsers/RUMonthNameParser.js.map +1 -1
- package/dist/cjs/locales/ru/parsers/RURelativeDateFormatParser.d.ts +3 -4
- package/dist/cjs/locales/ru/parsers/RURelativeDateFormatParser.js +4 -8
- package/dist/cjs/locales/ru/parsers/RURelativeDateFormatParser.js.map +1 -1
- package/dist/cjs/locales/ru/parsers/RUTimeUnitAgoFormatParser.d.ts +3 -4
- package/dist/cjs/locales/ru/parsers/RUTimeUnitAgoFormatParser.js +4 -8
- package/dist/cjs/locales/ru/parsers/RUTimeUnitAgoFormatParser.js.map +1 -1
- package/dist/cjs/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.d.ts +3 -4
- package/dist/cjs/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js +4 -8
- package/dist/cjs/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js.map +1 -1
- package/dist/cjs/locales/ru/parsers/RUTimeUnitWithinFormatParser.js +3 -3
- package/dist/cjs/locales/ru/parsers/RUTimeUnitWithinFormatParser.js.map +1 -1
- package/dist/cjs/locales/ru/parsers/RUWeekdayParser.d.ts +3 -4
- package/dist/cjs/locales/ru/parsers/RUWeekdayParser.js +9 -14
- package/dist/cjs/locales/ru/parsers/RUWeekdayParser.js.map +1 -1
- package/dist/esm/common/parsers/AbstractParserWithWordBoundary.d.ts +2 -1
- package/dist/esm/common/parsers/AbstractParserWithWordBoundary.js +9 -5
- package/dist/esm/common/parsers/AbstractParserWithWordBoundary.js.map +1 -1
- package/dist/esm/locales/ru/parsers/AbstractParserWithWordBoundaryChecking.d.ts +11 -0
- package/dist/esm/locales/ru/parsers/AbstractParserWithWordBoundaryChecking.js +19 -0
- package/dist/esm/locales/ru/parsers/AbstractParserWithWordBoundaryChecking.js.map +1 -0
- package/dist/esm/locales/ru/parsers/RUCasualDateParser.d.ts +3 -4
- package/dist/esm/locales/ru/parsers/RUCasualDateParser.js +4 -9
- package/dist/esm/locales/ru/parsers/RUCasualDateParser.js.map +1 -1
- package/dist/esm/locales/ru/parsers/RUCasualTimeParser.d.ts +3 -4
- package/dist/esm/locales/ru/parsers/RUCasualTimeParser.js +4 -10
- package/dist/esm/locales/ru/parsers/RUCasualTimeParser.js.map +1 -1
- package/dist/esm/locales/ru/parsers/RUMonthNameLittleEndianParser.d.ts +3 -4
- package/dist/esm/locales/ru/parsers/RUMonthNameLittleEndianParser.js +15 -20
- package/dist/esm/locales/ru/parsers/RUMonthNameLittleEndianParser.js.map +1 -1
- package/dist/esm/locales/ru/parsers/RUMonthNameParser.d.ts +3 -4
- package/dist/esm/locales/ru/parsers/RUMonthNameParser.js +11 -15
- package/dist/esm/locales/ru/parsers/RUMonthNameParser.js.map +1 -1
- package/dist/esm/locales/ru/parsers/RURelativeDateFormatParser.d.ts +3 -4
- package/dist/esm/locales/ru/parsers/RURelativeDateFormatParser.js +5 -9
- package/dist/esm/locales/ru/parsers/RURelativeDateFormatParser.js.map +1 -1
- package/dist/esm/locales/ru/parsers/RUTimeUnitAgoFormatParser.d.ts +3 -4
- package/dist/esm/locales/ru/parsers/RUTimeUnitAgoFormatParser.js +5 -9
- package/dist/esm/locales/ru/parsers/RUTimeUnitAgoFormatParser.js.map +1 -1
- package/dist/esm/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.d.ts +3 -4
- package/dist/esm/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js +5 -9
- package/dist/esm/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js.map +1 -1
- package/dist/esm/locales/ru/parsers/RUTimeUnitWithinFormatParser.js +3 -3
- package/dist/esm/locales/ru/parsers/RUTimeUnitWithinFormatParser.js.map +1 -1
- package/dist/esm/locales/ru/parsers/RUWeekdayParser.d.ts +3 -4
- package/dist/esm/locales/ru/parsers/RUWeekdayParser.js +10 -15
- package/dist/esm/locales/ru/parsers/RUWeekdayParser.js.map +1 -1
- package/package.json +1 -1
- package/src/common/parsers/AbstractParserWithWordBoundary.ts +17 -9
- package/src/locales/ru/parsers/AbstractParserWithWordBoundaryChecking.ts +25 -0
- package/src/locales/ru/parsers/RUCasualDateParser.ts +4 -14
- package/src/locales/ru/parsers/RUCasualTimeParser.ts +4 -14
- package/src/locales/ru/parsers/RUMonthNameLittleEndianParser.ts +16 -26
- package/src/locales/ru/parsers/RUMonthNameParser.ts +13 -20
- package/src/locales/ru/parsers/RURelativeDateFormatParser.ts +6 -14
- package/src/locales/ru/parsers/RUTimeUnitAgoFormatParser.ts +5 -11
- package/src/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.ts +4 -13
- package/src/locales/ru/parsers/RUTimeUnitWithinFormatParser.ts +3 -4
- package/src/locales/ru/parsers/RUWeekdayParser.ts +12 -20
- package/test/en/en.test.ts +3 -3
- package/test/result.test.ts +29 -0
- package/test/ru/ru_relative.test.ts +44 -11
- package/test/ru/ru_time_units_casual_relative.test.ts +96 -30
- package/test/uk/uk_relative.test.ts +44 -11
- package/test/uk/uk_time_units_casual_relative.test.ts +40 -10
|
@@ -1,22 +1,12 @@
|
|
|
1
1
|
import { ParsingContext } from "../../../chrono";
|
|
2
|
-
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
|
|
3
2
|
import * as references from "../../../common/casualReferences";
|
|
4
3
|
import { assignSimilarDate } from "../../../utils/dayjs";
|
|
5
4
|
import dayjs from "dayjs";
|
|
6
|
-
import {
|
|
5
|
+
import { AbstractParserWithLeftRightBoundaryChecking } from "./AbstractParserWithWordBoundaryChecking";
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
REGEX_PARTS.flags
|
|
12
|
-
);
|
|
13
|
-
export default class RUCasualTimeParser extends AbstractParserWithWordBoundaryChecking {
|
|
14
|
-
patternLeftBoundary(): string {
|
|
15
|
-
return REGEX_PARTS.leftBoundary;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
innerPattern() {
|
|
19
|
-
return PATTERN;
|
|
7
|
+
export default class RUCasualTimeParser extends AbstractParserWithLeftRightBoundaryChecking {
|
|
8
|
+
innerPatternString(context: ParsingContext): string {
|
|
9
|
+
return `(сейчас|прошлым\\s*вечером|прошлой\\s*ночью|следующей\\s*ночью|сегодня\\s*ночью|этой\\s*ночью|ночью|этим утром|утром|утра|в\\s*полдень|вечером|вечера|в\\s*полночь)`;
|
|
20
10
|
}
|
|
21
11
|
|
|
22
12
|
innerExtract(context: ParsingContext, match: RegExpMatchArray) {
|
|
@@ -1,41 +1,31 @@
|
|
|
1
1
|
import { ParsingContext } from "../../../chrono";
|
|
2
2
|
import { ParsingResult } from "../../../results";
|
|
3
3
|
import { findYearClosestToRef } from "../../../calculation/years";
|
|
4
|
-
import { MONTH_DICTIONARY
|
|
4
|
+
import { MONTH_DICTIONARY } from "../constants";
|
|
5
5
|
import { YEAR_PATTERN, parseYear } from "../constants";
|
|
6
6
|
import { ORDINAL_NUMBER_PATTERN, parseOrdinalNumberPattern } from "../constants";
|
|
7
7
|
import { matchAnyPattern } from "../../../utils/pattern";
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
// prettier-ignore
|
|
11
|
-
const PATTERN = new RegExp(
|
|
12
|
-
`(?:с)?\\s*(${ORDINAL_NUMBER_PATTERN})` +
|
|
13
|
-
`(?:` +
|
|
14
|
-
`\\s{0,3}(?:по|-|–|до)?\\s{0,3}` +
|
|
15
|
-
`(${ORDINAL_NUMBER_PATTERN})` +
|
|
16
|
-
`)?` +
|
|
17
|
-
`(?:-|\\/|\\s{0,3}(?:of)?\\s{0,3})` +
|
|
18
|
-
`(${matchAnyPattern(MONTH_DICTIONARY)})` +
|
|
19
|
-
`(?:` +
|
|
20
|
-
`(?:-|\\/|,?\\s{0,3})` +
|
|
21
|
-
`(${YEAR_PATTERN}(?![^\\s]\\d))` +
|
|
22
|
-
`)?` +
|
|
23
|
-
`${REGEX_PARTS.rightBoundary}`,
|
|
24
|
-
REGEX_PARTS.flags
|
|
25
|
-
);
|
|
8
|
+
import { AbstractParserWithLeftRightBoundaryChecking } from "./AbstractParserWithWordBoundaryChecking";
|
|
26
9
|
|
|
27
10
|
const DATE_GROUP = 1;
|
|
28
11
|
const DATE_TO_GROUP = 2;
|
|
29
12
|
const MONTH_NAME_GROUP = 3;
|
|
30
13
|
const YEAR_GROUP = 4;
|
|
31
14
|
|
|
32
|
-
export default class RUMonthNameLittleEndianParser extends
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
15
|
+
export default class RUMonthNameLittleEndianParser extends AbstractParserWithLeftRightBoundaryChecking {
|
|
16
|
+
innerPatternString(context: ParsingContext): string {
|
|
17
|
+
// prettier-ignore
|
|
18
|
+
return `(?:с)?\\s*(${ORDINAL_NUMBER_PATTERN})` +
|
|
19
|
+
`(?:` +
|
|
20
|
+
`\\s{0,3}(?:по|-|–|до)?\\s{0,3}` +
|
|
21
|
+
`(${ORDINAL_NUMBER_PATTERN})` +
|
|
22
|
+
`)?` +
|
|
23
|
+
`(?:-|\\/|\\s{0,3}(?:of)?\\s{0,3})` +
|
|
24
|
+
`(${matchAnyPattern(MONTH_DICTIONARY)})` +
|
|
25
|
+
`(?:` +
|
|
26
|
+
`(?:-|\\/|,?\\s{0,3})` +
|
|
27
|
+
`(${YEAR_PATTERN}(?![^\\s]\\d))` +
|
|
28
|
+
`)?`;
|
|
39
29
|
}
|
|
40
30
|
|
|
41
31
|
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingResult {
|
|
@@ -1,20 +1,9 @@
|
|
|
1
|
-
import { FULL_MONTH_NAME_DICTIONARY, MONTH_DICTIONARY
|
|
1
|
+
import { FULL_MONTH_NAME_DICTIONARY, MONTH_DICTIONARY } from "../constants";
|
|
2
2
|
import { ParsingContext } from "../../../chrono";
|
|
3
3
|
import { findYearClosestToRef } from "../../../calculation/years";
|
|
4
4
|
import { matchAnyPattern } from "../../../utils/pattern";
|
|
5
5
|
import { YEAR_PATTERN, parseYear } from "../constants";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
const PATTERN = new RegExp(
|
|
9
|
-
`((?:в)\\s*)?` +
|
|
10
|
-
`(${matchAnyPattern(MONTH_DICTIONARY)})` +
|
|
11
|
-
`\\s*` +
|
|
12
|
-
`(?:` +
|
|
13
|
-
`[,-]?\\s*(${YEAR_PATTERN})?` +
|
|
14
|
-
`)?` +
|
|
15
|
-
`(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`,
|
|
16
|
-
REGEX_PARTS.flags
|
|
17
|
-
);
|
|
6
|
+
import { AbstractParserWithLeftBoundaryChecking } from "./AbstractParserWithWordBoundaryChecking";
|
|
18
7
|
|
|
19
8
|
const MONTH_NAME_GROUP = 2;
|
|
20
9
|
const YEAR_GROUP = 3;
|
|
@@ -25,13 +14,17 @@ const YEAR_GROUP = 3;
|
|
|
25
14
|
* - Январь 2012
|
|
26
15
|
* - Январь
|
|
27
16
|
*/
|
|
28
|
-
export default class RUMonthNameParser extends
|
|
29
|
-
|
|
30
|
-
return
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
17
|
+
export default class RUMonthNameParser extends AbstractParserWithLeftBoundaryChecking {
|
|
18
|
+
innerPatternString(context: ParsingContext): string {
|
|
19
|
+
return (
|
|
20
|
+
`((?:в)\\s*)?` +
|
|
21
|
+
`(${matchAnyPattern(MONTH_DICTIONARY)})` +
|
|
22
|
+
`\\s*` +
|
|
23
|
+
`(?:` +
|
|
24
|
+
`[,-]?\\s*(${YEAR_PATTERN})?` +
|
|
25
|
+
`)?` +
|
|
26
|
+
`(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`
|
|
27
|
+
);
|
|
35
28
|
}
|
|
36
29
|
|
|
37
30
|
innerExtract(context: ParsingContext, match: RegExpMatchArray) {
|
|
@@ -4,24 +4,16 @@ import { ParsingComponents } from "../../../results";
|
|
|
4
4
|
import dayjs from "dayjs";
|
|
5
5
|
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
|
|
6
6
|
import { matchAnyPattern } from "../../../utils/pattern";
|
|
7
|
-
|
|
8
|
-
const PATTERN = new RegExp(
|
|
9
|
-
`(в прошлом|на прошлой|на следующей|в следующем|на этой|в этом)\\s*(${matchAnyPattern(
|
|
10
|
-
TIME_UNIT_DICTIONARY
|
|
11
|
-
)})(?=\\s*)${REGEX_PARTS.rightBoundary}`,
|
|
12
|
-
REGEX_PARTS.flags
|
|
13
|
-
);
|
|
7
|
+
import { AbstractParserWithLeftRightBoundaryChecking } from "./AbstractParserWithWordBoundaryChecking";
|
|
14
8
|
|
|
15
9
|
const MODIFIER_WORD_GROUP = 1;
|
|
16
10
|
const RELATIVE_WORD_GROUP = 2;
|
|
17
11
|
|
|
18
|
-
export default class RURelativeDateFormatParser extends
|
|
19
|
-
|
|
20
|
-
return
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
innerPattern(): RegExp {
|
|
24
|
-
return PATTERN;
|
|
12
|
+
export default class RURelativeDateFormatParser extends AbstractParserWithLeftRightBoundaryChecking {
|
|
13
|
+
innerPatternString(context: ParsingContext): string {
|
|
14
|
+
return `(в прошлом|на прошлой|на следующей|в следующем|на этой|в этом)\\s*(${matchAnyPattern(
|
|
15
|
+
TIME_UNIT_DICTIONARY
|
|
16
|
+
)})`;
|
|
25
17
|
}
|
|
26
18
|
|
|
27
19
|
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents {
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
import { ParsingContext } from "../../../chrono";
|
|
2
|
-
import { parseTimeUnits,
|
|
2
|
+
import { parseTimeUnits, TIME_UNITS_PATTERN } from "../constants";
|
|
3
3
|
import { ParsingComponents } from "../../../results";
|
|
4
|
-
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
|
|
5
4
|
import { reverseTimeUnits } from "../../../utils/timeunits";
|
|
5
|
+
import { AbstractParserWithLeftBoundaryChecking } from "./AbstractParserWithWordBoundaryChecking";
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
patternLeftBoundary(): string {
|
|
11
|
-
return REGEX_PARTS.leftBoundary;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
innerPattern(): RegExp {
|
|
15
|
-
return PATTERN;
|
|
7
|
+
export default class RUTimeUnitAgoFormatParser extends AbstractParserWithLeftBoundaryChecking {
|
|
8
|
+
innerPatternString(context: ParsingContext): string {
|
|
9
|
+
return `(${TIME_UNITS_PATTERN})\\s{0,5}назад(?=(?:\\W|$))`;
|
|
16
10
|
}
|
|
17
11
|
|
|
18
12
|
innerExtract(context: ParsingContext, match: RegExpMatchArray) {
|
|
@@ -1,21 +1,12 @@
|
|
|
1
1
|
import { TIME_UNITS_PATTERN, parseTimeUnits, REGEX_PARTS } from "../constants";
|
|
2
2
|
import { ParsingContext } from "../../../chrono";
|
|
3
3
|
import { ParsingComponents } from "../../../results";
|
|
4
|
-
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
|
|
5
4
|
import { reverseTimeUnits } from "../../../utils/timeunits";
|
|
5
|
+
import { AbstractParserWithLeftRightBoundaryChecking } from "./AbstractParserWithWordBoundaryChecking";
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
);
|
|
11
|
-
|
|
12
|
-
export default class RUTimeUnitCasualRelativeFormatParser extends AbstractParserWithWordBoundaryChecking {
|
|
13
|
-
patternLeftBoundary(): string {
|
|
14
|
-
return REGEX_PARTS.leftBoundary;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
innerPattern(): RegExp {
|
|
18
|
-
return PATTERN;
|
|
7
|
+
export default class RUTimeUnitCasualRelativeFormatParser extends AbstractParserWithLeftRightBoundaryChecking {
|
|
8
|
+
innerPatternString(context: ParsingContext): string {
|
|
9
|
+
return `(эти|последние|прошлые|следующие|после|спустя|через|\\+|-)\\s*(${TIME_UNITS_PATTERN})`;
|
|
19
10
|
}
|
|
20
11
|
|
|
21
12
|
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents {
|
|
@@ -4,9 +4,6 @@ import { ParsingComponents } from "../../../results";
|
|
|
4
4
|
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
|
|
5
5
|
|
|
6
6
|
const PATTERN = `(?:(?:около|примерно)\\s*(?:~\\s*)?)?(${TIME_UNITS_PATTERN})${REGEX_PARTS.rightBoundary}`;
|
|
7
|
-
const PATTERN_WITH_PREFIX = new RegExp(`(?:в течение|в течении)\\s*${PATTERN}`, REGEX_PARTS.flags);
|
|
8
|
-
|
|
9
|
-
const PATTERN_WITHOUT_PREFIX = new RegExp(PATTERN, "i");
|
|
10
7
|
|
|
11
8
|
export default class RUTimeUnitWithinFormatParser extends AbstractParserWithWordBoundaryChecking {
|
|
12
9
|
patternLeftBoundary(): string {
|
|
@@ -14,7 +11,9 @@ export default class RUTimeUnitWithinFormatParser extends AbstractParserWithWord
|
|
|
14
11
|
}
|
|
15
12
|
|
|
16
13
|
innerPattern(context: ParsingContext): RegExp {
|
|
17
|
-
return context.option.forwardDate
|
|
14
|
+
return context.option.forwardDate
|
|
15
|
+
? new RegExp(PATTERN, REGEX_PARTS.flags)
|
|
16
|
+
: new RegExp(`(?:в течение|в течении)\\s*${PATTERN}`, REGEX_PARTS.flags);
|
|
18
17
|
}
|
|
19
18
|
|
|
20
19
|
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents {
|
|
@@ -1,32 +1,24 @@
|
|
|
1
1
|
import { ParsingContext } from "../../../chrono";
|
|
2
2
|
import { ParsingComponents } from "../../../results";
|
|
3
|
-
import {
|
|
3
|
+
import { WEEKDAY_DICTIONARY } from "../constants";
|
|
4
4
|
import { matchAnyPattern } from "../../../utils/pattern";
|
|
5
|
-
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary";
|
|
6
5
|
import { createParsingComponentsAtWeekday } from "../../../common/calculation/weekdays";
|
|
7
|
-
|
|
8
|
-
const PATTERN = new RegExp(
|
|
9
|
-
`(?:(?:,|\\(|()\\s*)?` +
|
|
10
|
-
`(?:в\\s*?)?` +
|
|
11
|
-
`(?:(эту|этот|прошлый|прошлую|следующий|следующую|следующего)\\s*)?` +
|
|
12
|
-
`(${matchAnyPattern(WEEKDAY_DICTIONARY)})` +
|
|
13
|
-
`(?:\\s*(?:,|\\)|)))?` +
|
|
14
|
-
`(?:\\s*на\\s*(этой|прошлой|следующей)\\s*неделе)?` +
|
|
15
|
-
`${REGEX_PARTS.rightBoundary}`,
|
|
16
|
-
REGEX_PARTS.flags
|
|
17
|
-
);
|
|
6
|
+
import { AbstractParserWithLeftRightBoundaryChecking } from "./AbstractParserWithWordBoundaryChecking";
|
|
18
7
|
|
|
19
8
|
const PREFIX_GROUP = 1;
|
|
20
9
|
const WEEKDAY_GROUP = 2;
|
|
21
10
|
const POSTFIX_GROUP = 3;
|
|
22
11
|
|
|
23
|
-
export default class RUWeekdayParser extends
|
|
24
|
-
|
|
25
|
-
return
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
12
|
+
export default class RUWeekdayParser extends AbstractParserWithLeftRightBoundaryChecking {
|
|
13
|
+
innerPatternString(context: ParsingContext): string {
|
|
14
|
+
return (
|
|
15
|
+
`(?:(?:,|\\(|()\\s*)?` +
|
|
16
|
+
`(?:в\\s*?)?` +
|
|
17
|
+
`(?:(эту|этот|прошлый|прошлую|следующий|следующую|следующего)\\s*)?` +
|
|
18
|
+
`(${matchAnyPattern(WEEKDAY_DICTIONARY)})` +
|
|
19
|
+
`(?:\\s*(?:,|\\)|)))?` +
|
|
20
|
+
`(?:\\s*на\\s*(этой|прошлой|следующей)\\s*неделе)?`
|
|
21
|
+
);
|
|
30
22
|
}
|
|
31
23
|
|
|
32
24
|
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents {
|
package/test/en/en.test.ts
CHANGED
|
@@ -107,10 +107,10 @@ test("Test - Random text", function () {
|
|
|
107
107
|
expect(result.end.get("month")).toBe(7);
|
|
108
108
|
});
|
|
109
109
|
|
|
110
|
-
testSingleCase(chrono, "
|
|
111
|
-
expect(result.text).toBe("
|
|
110
|
+
testSingleCase(chrono, "07-27-2022, 02:00 AM", new Date(2017, 7 - 1, 7), (result) => {
|
|
111
|
+
expect(result.text).toBe("07-27-2022, 02:00 AM");
|
|
112
112
|
expect(result.start.get("day")).toBe(27);
|
|
113
|
-
expect(result.start.get("month")).toBe(
|
|
113
|
+
expect(result.start.get("month")).toBe(7);
|
|
114
114
|
expect(result.start.get("year")).toBe(2022);
|
|
115
115
|
expect(result.start.get("hour")).toBe(2);
|
|
116
116
|
expect(result.start.get("meridiem")).toBe(Meridiem.AM);
|
package/test/result.test.ts
CHANGED
|
@@ -146,3 +146,32 @@ test("Test - Calendar Checking", () => {
|
|
|
146
146
|
expect(components.isValidDate()).toBe(false);
|
|
147
147
|
}
|
|
148
148
|
});
|
|
149
|
+
|
|
150
|
+
test("Test - Checking non-existing date during DST skip", () => {
|
|
151
|
+
// Only CET (or CEST) timezones where the DST starts on "Sunday, March 27, 2022" at "02:00 (2 am) local time"
|
|
152
|
+
const dateDstPre = new Date(2022, 3 - 1, 27, 2);
|
|
153
|
+
const dateDstPost = new Date(2022, 3 - 1, 27, 3);
|
|
154
|
+
if (dateDstPre.getTime() == dateDstPost.getTime()) {
|
|
155
|
+
const reference = new ReferenceWithTimezone(new Date());
|
|
156
|
+
|
|
157
|
+
// On "Sunday, March 27, 2022" at "02:00 local time", the clock is moved forward to "03:00 local time".
|
|
158
|
+
// Thus, the time between "02:00 and 02:59:59" does not exist.
|
|
159
|
+
expect(
|
|
160
|
+
new ParsingComponents(reference, { year: 2022, month: 3, day: 27, hour: 2, minute: 0 }).isValidDate()
|
|
161
|
+
).toBe(false);
|
|
162
|
+
expect(
|
|
163
|
+
new ParsingComponents(reference, { year: 2022, month: 3, day: 27, hour: 2, minute: 1 }).isValidDate()
|
|
164
|
+
).toBe(false);
|
|
165
|
+
expect(
|
|
166
|
+
new ParsingComponents(reference, { year: 2022, month: 3, day: 27, hour: 2, minute: 59 }).isValidDate()
|
|
167
|
+
).toBe(false);
|
|
168
|
+
|
|
169
|
+
// Otherwise, it
|
|
170
|
+
expect(
|
|
171
|
+
new ParsingComponents(reference, { year: 2022, month: 3, day: 27, hour: 1, minute: 59 }).isValidDate()
|
|
172
|
+
).toBe(true);
|
|
173
|
+
expect(
|
|
174
|
+
new ParsingComponents(reference, { year: 2022, month: 3, day: 27, hour: 3, minute: 0 }).isValidDate()
|
|
175
|
+
).toBe(true);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
@@ -5,25 +5,37 @@ test("Test - 'This' expressions", () => {
|
|
|
5
5
|
testSingleCase(chrono.ru, "на этой неделе", new Date(2017, 11 - 1, 19, 12), (result, text) => {
|
|
6
6
|
expect(result.index).toBe(0);
|
|
7
7
|
expect(result.text).toBe(text);
|
|
8
|
-
expect(result.start).
|
|
8
|
+
expect(result.start.get("year")).toBe(2017);
|
|
9
|
+
expect(result.start.get("month")).toBe(11);
|
|
10
|
+
expect(result.start.get("day")).toBe(19);
|
|
11
|
+
expect(result.start.get("hour")).toBe(12);
|
|
9
12
|
});
|
|
10
13
|
|
|
11
14
|
testSingleCase(chrono.ru, "в этом месяце", new Date(2017, 11 - 1, 19, 12), (result, text) => {
|
|
12
15
|
expect(result.index).toBe(0);
|
|
13
16
|
expect(result.text).toBe(text);
|
|
14
|
-
expect(result.start).
|
|
17
|
+
expect(result.start.get("year")).toBe(2017);
|
|
18
|
+
expect(result.start.get("month")).toBe(11);
|
|
19
|
+
expect(result.start.get("day")).toBe(1);
|
|
20
|
+
expect(result.start.get("hour")).toBe(12);
|
|
15
21
|
});
|
|
16
22
|
|
|
17
23
|
testSingleCase(chrono.ru, "в этом месяце", new Date(2017, 11 - 1, 1, 12), (result, text) => {
|
|
18
24
|
expect(result.index).toBe(0);
|
|
19
25
|
expect(result.text).toBe(text);
|
|
20
|
-
expect(result.start).
|
|
26
|
+
expect(result.start.get("year")).toBe(2017);
|
|
27
|
+
expect(result.start.get("month")).toBe(11);
|
|
28
|
+
expect(result.start.get("day")).toBe(1);
|
|
29
|
+
expect(result.start.get("hour")).toBe(12);
|
|
21
30
|
});
|
|
22
31
|
|
|
23
32
|
testSingleCase(chrono.ru, "в этом году", new Date(2017, 11 - 1, 19, 12), (result, text) => {
|
|
24
33
|
expect(result.index).toBe(0);
|
|
25
34
|
expect(result.text).toBe(text);
|
|
26
|
-
expect(result.start).
|
|
35
|
+
expect(result.start.get("year")).toBe(2017);
|
|
36
|
+
expect(result.start.get("month")).toBe(1);
|
|
37
|
+
expect(result.start.get("day")).toBe(1);
|
|
38
|
+
expect(result.start.get("hour")).toBe(12);
|
|
27
39
|
});
|
|
28
40
|
});
|
|
29
41
|
|
|
@@ -31,19 +43,28 @@ test("Test - Past relative expressions", () => {
|
|
|
31
43
|
testSingleCase(chrono.ru, "на прошлой неделе", new Date(2016, 10 - 1, 1, 12), (result, text) => {
|
|
32
44
|
expect(result.index).toBe(0);
|
|
33
45
|
expect(result.text).toBe(text);
|
|
34
|
-
expect(result.start).
|
|
46
|
+
expect(result.start.get("year")).toBe(2016);
|
|
47
|
+
expect(result.start.get("month")).toBe(9);
|
|
48
|
+
expect(result.start.get("day")).toBe(24);
|
|
49
|
+
expect(result.start.get("hour")).toBe(12);
|
|
35
50
|
});
|
|
36
51
|
|
|
37
52
|
testSingleCase(chrono.ru, "в прошлом месяце", new Date(2016, 10 - 1, 1, 12), (result, text) => {
|
|
38
53
|
expect(result.index).toBe(0);
|
|
39
54
|
expect(result.text).toBe(text);
|
|
40
|
-
expect(result.start).
|
|
55
|
+
expect(result.start.get("year")).toBe(2016);
|
|
56
|
+
expect(result.start.get("month")).toBe(9);
|
|
57
|
+
expect(result.start.get("day")).toBe(1);
|
|
58
|
+
expect(result.start.get("hour")).toBe(12);
|
|
41
59
|
});
|
|
42
60
|
|
|
43
61
|
testSingleCase(chrono.ru, "в прошлом году", new Date(2016, 10 - 1, 1, 12), (result, text) => {
|
|
44
62
|
expect(result.index).toBe(0);
|
|
45
63
|
expect(result.text).toBe(text);
|
|
46
|
-
expect(result.start).
|
|
64
|
+
expect(result.start.get("year")).toBe(2015);
|
|
65
|
+
expect(result.start.get("month")).toBe(10);
|
|
66
|
+
expect(result.start.get("day")).toBe(1);
|
|
67
|
+
expect(result.start.get("hour")).toBe(12);
|
|
47
68
|
});
|
|
48
69
|
});
|
|
49
70
|
|
|
@@ -51,24 +72,36 @@ test("Test - Future relative expressions", () => {
|
|
|
51
72
|
testSingleCase(chrono.ru, "на следующей неделе", new Date(2016, 10 - 1, 1, 12), (result, text) => {
|
|
52
73
|
expect(result.index).toBe(0);
|
|
53
74
|
expect(result.text).toBe(text);
|
|
54
|
-
expect(result.start).
|
|
75
|
+
expect(result.start.get("year")).toBe(2016);
|
|
76
|
+
expect(result.start.get("month")).toBe(10);
|
|
77
|
+
expect(result.start.get("day")).toBe(8);
|
|
78
|
+
expect(result.start.get("hour")).toBe(12);
|
|
55
79
|
});
|
|
56
80
|
|
|
57
81
|
testSingleCase(chrono.ru, "в следующем месяце", new Date(2016, 10 - 1, 1, 12), (result, text) => {
|
|
58
82
|
expect(result.index).toBe(0);
|
|
59
83
|
expect(result.text).toBe(text);
|
|
60
|
-
expect(result.start).
|
|
84
|
+
expect(result.start.get("year")).toBe(2016);
|
|
85
|
+
expect(result.start.get("month")).toBe(11);
|
|
86
|
+
expect(result.start.get("day")).toBe(1);
|
|
87
|
+
expect(result.start.get("hour")).toBe(12);
|
|
61
88
|
});
|
|
62
89
|
|
|
63
90
|
testSingleCase(chrono.ru, "в следующем квартале", new Date(2016, 10 - 1, 1, 12), (result, text) => {
|
|
64
91
|
expect(result.index).toBe(0);
|
|
65
92
|
expect(result.text).toBe(text);
|
|
66
|
-
expect(result.start).
|
|
93
|
+
expect(result.start.get("year")).toBe(2017);
|
|
94
|
+
expect(result.start.get("month")).toBe(1);
|
|
95
|
+
expect(result.start.get("day")).toBe(1);
|
|
96
|
+
expect(result.start.get("hour")).toBe(12);
|
|
67
97
|
});
|
|
68
98
|
|
|
69
99
|
testSingleCase(chrono.ru, "в следующем году", new Date(2016, 10 - 1, 1, 12), (result, text) => {
|
|
70
100
|
expect(result.index).toBe(0);
|
|
71
101
|
expect(result.text).toBe(text);
|
|
72
|
-
expect(result.start).
|
|
102
|
+
expect(result.start.get("year")).toBe(2017);
|
|
103
|
+
expect(result.start.get("month")).toBe(10);
|
|
104
|
+
expect(result.start.get("day")).toBe(1);
|
|
105
|
+
expect(result.start.get("hour")).toBe(12);
|
|
73
106
|
});
|
|
74
107
|
});
|