Skip to content

Commit be6e995

Browse files
author
Wanasit Tanakitrungruang
committedAug 10, 2024·
New: (en) Add year suffix extraction refiner
1 parent be759f7 commit be6e995

File tree

3 files changed

+68
-1
lines changed

3 files changed

+68
-1
lines changed
 

‎src/locales/en/configuration.ts

+5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import ENTimeUnitCasualRelativeFormatParser from "./parsers/ENTimeUnitCasualRela
2323
import ENMergeRelativeAfterDateRefiner from "./refiners/ENMergeRelativeAfterDateRefiner";
2424
import ENMergeRelativeFollowByDateRefiner from "./refiners/ENMergeRelativeFollowByDateRefiner";
2525
import OverlapRemovalRefiner from "../../common/refiners/OverlapRemovalRefiner";
26+
import ENExtractYearSuffixRefiner from "./refiners/ENExtractYearSuffixRefiner";
2627

2728
export default class ENDefaultConfiguration {
2829
/**
@@ -71,6 +72,10 @@ export default class ENDefaultConfiguration {
7172

7273
// Re-apply the date time refiner again after the timezone refinement and exclusion in common refiners.
7374
options.refiners.push(new ENMergeDateTimeRefiner());
75+
76+
// Extract year after merging date and time
77+
options.refiners.push(new ENExtractYearSuffixRefiner());
78+
7479
// Keep the date range refiner at the end (after all other refinements).
7580
options.refiners.push(new ENMergeDateRangeRefiner());
7681
return options;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { ParsingContext, Refiner } from "../../../chrono";
2+
import { ParsingResult } from "../../../results";
3+
import { YEAR_PATTERN, parseYear } from "../constants";
4+
5+
const YEAR_SUFFIX_PATTERN = new RegExp(`^\\s*(${YEAR_PATTERN})`, "i");
6+
const YEAR_GROUP = 1;
7+
export default class ENExtractYearSuffixRefiner implements Refiner {
8+
refine(context: ParsingContext, results: ParsingResult[]): ParsingResult[] {
9+
results.forEach(function (result) {
10+
context.debug(() => {
11+
console.log("ENExtractYearSuffixRefiner", result.text, result.start);
12+
});
13+
if (!result.start.isDateWithUnknownYear()) {
14+
return;
15+
}
16+
17+
const suffix = context.text.substring(result.index + result.text.length);
18+
const match = YEAR_SUFFIX_PATTERN.exec(suffix);
19+
if (!match) {
20+
return;
21+
}
22+
23+
context.debug(() => {
24+
console.log(`Extracting year: '${match[0]}' into : ${result}`);
25+
});
26+
27+
const year = parseYear(match[YEAR_GROUP]);
28+
if (result.end != null) {
29+
result.end.assign("year", year);
30+
}
31+
result.start.assign("year", year);
32+
result.text += match[0];
33+
});
34+
35+
return results;
36+
}
37+
}

‎test/en/en_year.test.ts

+26-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as chrono from "../../src";
22
import { testSingleCase, testUnexpectedResult } from "../test_util";
3-
import ENTimeExpressionParser from "../../src/locales/en/parsers/ENTimeExpressionParser";
3+
import { Meridiem } from "../../src";
44

55
test("Test - Year numbers with BCE/CE Era label", () => {
66
testSingleCase(chrono, "10 August 234 BCE", new Date(2012, 7, 10), (result) => {
@@ -73,3 +73,28 @@ test("Test - Year numbers with Buddhist Era label", () => {
7373
expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
7474
});
7575
});
76+
77+
test("Test - Year number after date/time expression", () => {
78+
testSingleCase(chrono, "Thu Oct 26 11:00:09 2023", new Date(2016, 10 - 1, 1, 8), (result, text) => {
79+
expect(result.start.get("year")).toBe(2023);
80+
expect(result.start.get("month")).toBe(10);
81+
expect(result.start.get("day")).toBe(26);
82+
83+
expect(result.start.get("hour")).toBe(11);
84+
expect(result.start.get("minute")).toBe(0);
85+
expect(result.start.get("second")).toBe(9);
86+
expect(result.start.get("meridiem")).toBe(Meridiem.AM);
87+
});
88+
89+
testSingleCase(chrono, "Thu Oct 26 11:00:09 EDT 2023", new Date(2016, 10 - 1, 1, 8), (result, text) => {
90+
expect(result.start.get("year")).toBe(2023);
91+
expect(result.start.get("month")).toBe(10);
92+
expect(result.start.get("day")).toBe(26);
93+
94+
expect(result.start.get("hour")).toBe(11);
95+
expect(result.start.get("minute")).toBe(0);
96+
expect(result.start.get("second")).toBe(9);
97+
expect(result.start.get("meridiem")).toBe(Meridiem.AM);
98+
expect(result.start.get("timezoneOffset")).toBe(-240);
99+
});
100+
});

0 commit comments

Comments
 (0)
Please sign in to comment.