From a8db2e4a53d069f2bbd37a5c6735c1deb7378050 Mon Sep 17 00:00:00 2001 From: yuichkun Date: Thu, 30 Mar 2023 20:35:32 +0900 Subject: [PATCH 1/5] [JA] add support for Hiragana in CasualDateParser --- src/locales/ja/parsers/JPCasualDateParser.ts | 27 +++++++++++- test/ja/ja_casual.test.ts | 45 +++++++++++--------- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/locales/ja/parsers/JPCasualDateParser.ts b/src/locales/ja/parsers/JPCasualDateParser.ts index e0559ef1..9e67e050 100644 --- a/src/locales/ja/parsers/JPCasualDateParser.ts +++ b/src/locales/ja/parsers/JPCasualDateParser.ts @@ -3,7 +3,30 @@ import dayjs from "dayjs"; import { Meridiem } from "../../../index"; import * as references from "../../../common/casualReferences"; -const PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i; +const PATTERN = /今日|きょう|当日|とうじつ|昨日|きのう|明日|あした|今夜|こんや|今夕|こんゆう|今晩|こんばん|今朝|けさ/i; + +function normalizeTextToKanji(str: string) { + switch (str) { + case "きょう": + return "今日"; + case "とうじつ": + return "当日"; + case "きのう": + return "昨日"; + case "あした": + return "明日"; + case "こんや": + return "今夜"; + case "こんゆう": + return "今夕"; + case "こんばん": + return "今晩"; + case "けさ": + return "今朝"; + default: + return str; + } +} export default class JPCasualDateParser implements Parser { pattern() { @@ -11,7 +34,7 @@ export default class JPCasualDateParser implements Parser { } extract(context: ParsingContext, match: RegExpMatchArray) { - const text = match[0]; + const text = normalizeTextToKanji(match[0]); const date = dayjs(context.refDate); const components = context.createParsingComponents(); diff --git a/test/ja/ja_casual.test.ts b/test/ja/ja_casual.test.ts index 97e8c8b0..90bc3109 100644 --- a/test/ja/ja_casual.test.ts +++ b/test/ja/ja_casual.test.ts @@ -2,27 +2,34 @@ import * as chrono from "../../src/"; import { testSingleCase } from "../test_util"; test("Test - Single Expression", function () { - testSingleCase(chrono.ja, "今日感じたことを忘れずに", new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.index).toBe(0); - expect(result.text).toBe("今日"); + function testToday(pattern: string) { + testSingleCase(chrono.ja, `${pattern}感じたことを忘れずに`, new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe(pattern); + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + }); + } - expect(result.start).not.toBeNull(); - expect(result.start.get("year")).toBe(2012); - expect(result.start.get("month")).toBe(8); - expect(result.start.get("day")).toBe(10); + testToday("今日"); + testToday("きょう"); - expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); - }); + function testYesterday(pattern: string) { + testSingleCase(chrono.ja, `${pattern}の全国観測値ランキング`, new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe(pattern); - testSingleCase(chrono.ja, "昨日の全国観測値ランキング", new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.index).toBe(0); - expect(result.text).toBe("昨日"); + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(9); - expect(result.start).not.toBeNull(); - expect(result.start.get("year")).toBe(2012); - expect(result.start.get("month")).toBe(8); - expect(result.start.get("day")).toBe(9); - - expect(result.start).toBeDate(new Date(2012, 8 - 1, 9, 12)); - }); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 9, 12)); + }); + } + testYesterday("昨日"); + testYesterday("きのう"); }); From 3ee9da55685722d8b69bd1faa7d7a61232b22be2 Mon Sep 17 00:00:00 2001 From: yuichkun Date: Thu, 30 Mar 2023 20:45:22 +0900 Subject: [PATCH 2/5] [JA] add more tests for casual dates --- test/ja/ja_casual.test.ts | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/test/ja/ja_casual.test.ts b/test/ja/ja_casual.test.ts index 90bc3109..5de9ddc5 100644 --- a/test/ja/ja_casual.test.ts +++ b/test/ja/ja_casual.test.ts @@ -32,4 +32,60 @@ test("Test - Single Expression", function () { } testYesterday("昨日"); testYesterday("きのう"); + + function testTomorrow(pattern: string) { + testSingleCase(chrono.ja, `${pattern}の天気は晴れです`, new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe(pattern); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(11); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 11, 12)); + }); + } + + testTomorrow("明日"); + testTomorrow("あした"); + + function testTonight(pattern: string) { + testSingleCase(chrono.ja, `${pattern}には雨が降るでしょう`, new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe(pattern); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("meridiem")).toBe(chrono.Meridiem.PM); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 22)); + }); + } + + testTonight("今夜"); + testTonight("こんや"); + testTonight("今夕"); + testTonight("こんゆう"); + testTonight("今晩"); + testTonight("こんばん"); + + function testMorning(pattern: string) { + testSingleCase(chrono.ja, `${pattern}食べたパンは美味しかった`, new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.index).toBe(0); + expect(result.text).toBe(pattern); + + expect(result.start).not.toBeNull(); + expect(result.start.get("year")).toBe(2012); + expect(result.start.get("month")).toBe(8); + expect(result.start.get("day")).toBe(10); + expect(result.start.get("meridiem")).toBe(chrono.Meridiem.AM); + + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 6)); + }); + } + testMorning("今朝"); + testMorning("けさ"); }); From 835abfa0606cf292deca500314b4222d3020d70d Mon Sep 17 00:00:00 2001 From: yuichkun Date: Sun, 9 Apr 2023 16:53:19 +0900 Subject: [PATCH 3/5] [JA] rename var name to text --- src/locales/ja/parsers/JPCasualDateParser.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/locales/ja/parsers/JPCasualDateParser.ts b/src/locales/ja/parsers/JPCasualDateParser.ts index 9e67e050..293a1ff7 100644 --- a/src/locales/ja/parsers/JPCasualDateParser.ts +++ b/src/locales/ja/parsers/JPCasualDateParser.ts @@ -5,8 +5,8 @@ import * as references from "../../../common/casualReferences"; const PATTERN = /今日|きょう|当日|とうじつ|昨日|きのう|明日|あした|今夜|こんや|今夕|こんゆう|今晩|こんばん|今朝|けさ/i; -function normalizeTextToKanji(str: string) { - switch (str) { +function normalizeTextToKanji(text: string) { + switch (text) { case "きょう": return "今日"; case "とうじつ": @@ -24,7 +24,7 @@ function normalizeTextToKanji(str: string) { case "けさ": return "今朝"; default: - return str; + return text; } } From 7da7629aca325e3ab01bb001cb1e727571b009f2 Mon Sep 17 00:00:00 2001 From: yuichkun Date: Sun, 9 Apr 2023 17:00:19 +0900 Subject: [PATCH 4/5] [JA] test: remove redundant assertions --- test/ja/ja_casual.test.ts | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/test/ja/ja_casual.test.ts b/test/ja/ja_casual.test.ts index 5de9ddc5..da3557b3 100644 --- a/test/ja/ja_casual.test.ts +++ b/test/ja/ja_casual.test.ts @@ -4,12 +4,7 @@ import { testSingleCase } from "../test_util"; test("Test - Single Expression", function () { function testToday(pattern: string) { testSingleCase(chrono.ja, `${pattern}感じたことを忘れずに`, new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.index).toBe(0); expect(result.text).toBe(pattern); - expect(result.start).not.toBeNull(); - expect(result.start.get("year")).toBe(2012); - expect(result.start.get("month")).toBe(8); - expect(result.start.get("day")).toBe(10); expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); }); } @@ -19,14 +14,7 @@ test("Test - Single Expression", function () { function testYesterday(pattern: string) { testSingleCase(chrono.ja, `${pattern}の全国観測値ランキング`, new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.index).toBe(0); expect(result.text).toBe(pattern); - - expect(result.start).not.toBeNull(); - expect(result.start.get("year")).toBe(2012); - expect(result.start.get("month")).toBe(8); - expect(result.start.get("day")).toBe(9); - expect(result.start).toBeDate(new Date(2012, 8 - 1, 9, 12)); }); } @@ -35,14 +23,7 @@ test("Test - Single Expression", function () { function testTomorrow(pattern: string) { testSingleCase(chrono.ja, `${pattern}の天気は晴れです`, new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.index).toBe(0); expect(result.text).toBe(pattern); - - expect(result.start).not.toBeNull(); - expect(result.start.get("year")).toBe(2012); - expect(result.start.get("month")).toBe(8); - expect(result.start.get("day")).toBe(11); - expect(result.start).toBeDate(new Date(2012, 8 - 1, 11, 12)); }); } @@ -52,15 +33,7 @@ test("Test - Single Expression", function () { function testTonight(pattern: string) { testSingleCase(chrono.ja, `${pattern}には雨が降るでしょう`, new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.index).toBe(0); expect(result.text).toBe(pattern); - - expect(result.start).not.toBeNull(); - expect(result.start.get("year")).toBe(2012); - expect(result.start.get("month")).toBe(8); - expect(result.start.get("day")).toBe(10); - expect(result.start.get("meridiem")).toBe(chrono.Meridiem.PM); - expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 22)); }); } @@ -74,15 +47,7 @@ test("Test - Single Expression", function () { function testMorning(pattern: string) { testSingleCase(chrono.ja, `${pattern}食べたパンは美味しかった`, new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.index).toBe(0); expect(result.text).toBe(pattern); - - expect(result.start).not.toBeNull(); - expect(result.start.get("year")).toBe(2012); - expect(result.start.get("month")).toBe(8); - expect(result.start.get("day")).toBe(10); - expect(result.start.get("meridiem")).toBe(chrono.Meridiem.AM); - expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 6)); }); } From bbb1e2eb03f7fbc08cf81ab401e3076dc9eeb6fc Mon Sep 17 00:00:00 2001 From: yuichkun Date: Sun, 9 Apr 2023 17:08:27 +0900 Subject: [PATCH 5/5] [JA] refactor: make test cases more explicit --- test/ja/ja_casual.test.ts | 103 +++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 47 deletions(-) diff --git a/test/ja/ja_casual.test.ts b/test/ja/ja_casual.test.ts index da3557b3..472d12b1 100644 --- a/test/ja/ja_casual.test.ts +++ b/test/ja/ja_casual.test.ts @@ -2,55 +2,64 @@ import * as chrono from "../../src/"; import { testSingleCase } from "../test_util"; test("Test - Single Expression", function () { - function testToday(pattern: string) { - testSingleCase(chrono.ja, `${pattern}感じたことを忘れずに`, new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.text).toBe(pattern); - expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); - }); - } + testSingleCase(chrono.ja, "今日感じたことを忘れずに", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("今日"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + }); + testSingleCase(chrono.ja, "きょう感じたことを忘れずに", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("きょう"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12)); + }); - testToday("今日"); - testToday("きょう"); + testSingleCase(chrono.ja, "昨日の全国観測値ランキング", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("昨日"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 9, 12)); + }); + testSingleCase(chrono.ja, "きのうの全国観測値ランキング", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("きのう"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 9, 12)); + }); - function testYesterday(pattern: string) { - testSingleCase(chrono.ja, `${pattern}の全国観測値ランキング`, new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.text).toBe(pattern); - expect(result.start).toBeDate(new Date(2012, 8 - 1, 9, 12)); - }); - } - testYesterday("昨日"); - testYesterday("きのう"); + testSingleCase(chrono.ja, "明日の天気は晴れです", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("明日"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 11, 12)); + }); + testSingleCase(chrono.ja, "あしたの天気は晴れです", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("あした"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 11, 12)); + }); - function testTomorrow(pattern: string) { - testSingleCase(chrono.ja, `${pattern}の天気は晴れです`, new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.text).toBe(pattern); - expect(result.start).toBeDate(new Date(2012, 8 - 1, 11, 12)); - }); - } + testSingleCase(chrono.ja, "今夜には雨が降るでしょう", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("今夜"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 22)); + }); + testSingleCase(chrono.ja, "こんやには雨が降るでしょう", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("こんや"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 22)); + }); + testSingleCase(chrono.ja, "今夕には雨が降るでしょう", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("今夕"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 22)); + }); + testSingleCase(chrono.ja, "こんゆうには雨が降るでしょう", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("こんゆう"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 22)); + }); + testSingleCase(chrono.ja, "今晩には雨が降るでしょう", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("今晩"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 22)); + }); + testSingleCase(chrono.ja, "こんばんには雨が降るでしょう", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("こんばん"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 22)); + }); - testTomorrow("明日"); - testTomorrow("あした"); - - function testTonight(pattern: string) { - testSingleCase(chrono.ja, `${pattern}には雨が降るでしょう`, new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.text).toBe(pattern); - expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 22)); - }); - } - - testTonight("今夜"); - testTonight("こんや"); - testTonight("今夕"); - testTonight("こんゆう"); - testTonight("今晩"); - testTonight("こんばん"); - - function testMorning(pattern: string) { - testSingleCase(chrono.ja, `${pattern}食べたパンは美味しかった`, new Date(2012, 8 - 1, 10, 12), (result) => { - expect(result.text).toBe(pattern); - expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 6)); - }); - } - testMorning("今朝"); - testMorning("けさ"); + testSingleCase(chrono.ja, "今朝食べたパンは美味しかった", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("今朝"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 6)); + }); + testSingleCase(chrono.ja, "けさ食べたパンは美味しかった", new Date(2012, 8 - 1, 10, 12), (result) => { + expect(result.text).toBe("けさ"); + expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 6)); + }); });