Skip to content

Commit c201115

Browse files
author
Wanasit Tanakitrungruang
committedDec 30, 2023
Fix: little-endian month and year case
1 parent 3f2e9ad commit c201115

5 files changed

+44
-12
lines changed
 

‎src/locales/en/configuration.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ export default class ENDefaultConfiguration {
3131
*/
3232
createCasualConfiguration(littleEndian = false): Configuration {
3333
const option = this.createConfiguration(false, littleEndian);
34-
option.parsers.unshift(new ENCasualDateParser());
35-
option.parsers.unshift(new ENCasualTimeParser());
36-
option.parsers.unshift(new ENMonthNameParser());
37-
option.parsers.unshift(new ENRelativeDateFormatParser());
38-
option.parsers.unshift(new ENTimeUnitCasualRelativeFormatParser());
34+
option.parsers.push(new ENCasualDateParser());
35+
option.parsers.push(new ENCasualTimeParser());
36+
option.parsers.push(new ENMonthNameParser());
37+
option.parsers.push(new ENRelativeDateFormatParser());
38+
option.parsers.push(new ENTimeUnitCasualRelativeFormatParser());
3939
return option;
4040
}
4141

@@ -52,7 +52,7 @@ export default class ENDefaultConfiguration {
5252
new SlashDateFormatParser(littleEndian),
5353
new ENTimeUnitWithinFormatParser(strictMode),
5454
new ENMonthNameLittleEndianParser(),
55-
new ENMonthNameMiddleEndianParser(),
55+
new ENMonthNameMiddleEndianParser(/*shouldSkipYearLikeDate=*/ littleEndian),
5656
new ENWeekdayParser(),
5757
new ENCasualYearMonthDayParser(),
5858
new ENSlashMonthFormatParser(),

‎src/locales/en/constants.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ export function parseOrdinalNumberPattern(match: string): number {
231231

232232
//-----------------------------
233233

234-
export const YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s{0,2}(?:BE|AD|BC|BCE|CE)|[1-2][0-9]{3}|[5-9][0-9])`;
234+
export const YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s{0,2}(?:BE|AD|BC|BCE|CE)|[1-2][0-9]{3}|[5-9][0-9]|2[0-5])`;
235235
export function parseYear(match: string): number {
236236
if (/BE/i.test(match)) {
237237
// Buddhist Era

‎src/locales/en/parsers/ENMonthNameMiddleEndianParser.ts

+20-5
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,16 @@ const YEAR_GROUP = 4;
3636
* - January 12:00
3737
* - January 12.44
3838
* - January 1222344
39+
* - January 21 (when shouldSkipYearLikeDate=true)
3940
*/
4041
export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWordBoundaryChecking {
42+
shouldSkipYearLikeDate: boolean;
43+
44+
constructor(shouldSkipYearLikeDate: boolean) {
45+
super();
46+
this.shouldSkipYearLikeDate = shouldSkipYearLikeDate;
47+
}
48+
4149
innerPattern(): RegExp {
4250
return PATTERN;
4351
}
@@ -49,10 +57,18 @@ export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWor
4957
return null;
5058
}
5159

52-
const components = context.createParsingComponents({
53-
day: day,
54-
month: month,
55-
});
60+
// Skip the case where the day looks like a year (ex: January 21)
61+
if (this.shouldSkipYearLikeDate) {
62+
if (!match[DATE_TO_GROUP] && !match[YEAR_GROUP] && match[DATE_GROUP].match(/^2[0-5]$/)) {
63+
return null;
64+
}
65+
}
66+
const components = context
67+
.createParsingComponents({
68+
day: day,
69+
month: month,
70+
})
71+
.addTag("parser/ENMonthNameMiddleEndianParser");
5672

5773
if (match[YEAR_GROUP]) {
5874
const year = parseYear(match[YEAR_GROUP]);
@@ -61,7 +77,6 @@ export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWor
6177
const year = findYearClosestToRef(context.refDate, day, month);
6278
components.imply("year", year);
6379
}
64-
6580
if (!match[DATE_TO_GROUP]) {
6681
return components;
6782
}

‎src/locales/en/parsers/ENMonthNameParser.ts

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export default class ENMonthNameParser extends AbstractParserWithWordBoundaryChe
4545
match.index + match[0].length
4646
);
4747
result.start.imply("day", 1);
48+
result.start.addTag("parser/ENMonthNameParser");
4849

4950
const month = MONTH_DICTIONARY[monthName];
5051
result.start.assign("month", month);

‎test/en/en_month_name_middle_endian.test.ts

+16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as chrono from "../../src";
22
import { testSingleCase, testWithExpectedDate, testUnexpectedResult } from "../test_util";
3+
import { configuration } from "../../src/locales/en";
34

45
test("Test - Single Expression", () => {
56
testSingleCase(chrono, "She is getting married soon (July 2017).", (result) => {
@@ -357,6 +358,21 @@ test("Test - year 90's parsing", () => {
357358
});
358359
});
359360

361+
test("Test - Skip year-like on little-endian configuration", () => {
362+
const chronoMiddleEndian = new chrono.Chrono(chrono.en.configuration.createCasualConfiguration(false));
363+
testSingleCase(chronoMiddleEndian, "Dec. 21", new Date(2023, 12, 10), (result) => {
364+
expect(result.start.get("year")).toBe(2023);
365+
expect(result.start.get("month")).toBe(12);
366+
expect(result.start.get("day")).toBe(21);
367+
});
368+
369+
const chronoLittleEndian = new chrono.Chrono(chrono.en.configuration.createCasualConfiguration(true));
370+
testSingleCase(chronoLittleEndian, "Dec. 21", new Date(2023, 12, 10), (result) => {
371+
expect(result.start.get("year")).toBe(2021);
372+
expect(result.start.get("month")).toBe(12);
373+
});
374+
});
375+
360376
test("Test - Impossible Dates (Strict Mode)", () => {
361377
testUnexpectedResult(chrono.strict, "August 32, 2014");
362378

0 commit comments

Comments
 (0)
Please sign in to comment.