UNPKG

tell-me-when

Version:
172 lines 7.78 kB
import { GrammarNode } from "./util/GrammarNode.mjs"; import * as EnglishGrammar from "./en-US.mjs"; import { ParseRootNode } from "./util/ParseRootNode.mjs"; import * as base from "./util/parse.mjs"; const { group, named, oneOf, longestOf } = GrammarNode; const { space, AmPmValue } = EnglishGrammar; const kanjiNumberMap = new Map([['〇', '0'], ['一', '1'], ['二', '2'], ['三', '3'], ['四', '4'], ['五', '5'], ['六', '6'], ['七', '7'], ['八', '8'], ['九', '9']]); class YearNode extends EnglishGrammar.FullYearNode { constructor(wrapped) { super(wrapped); this.wrapped = wrapped; } year(input) { const yearText = input.substring(this.from, this.to - 1).split('').map(char => kanjiNumberMap.get(char) ?? char).join(''); return parseInt(yearText); } } const JapaneseYear = named('JapaneseFullYear', /([0-9〇一二三四五六七八九]{1,4})年/).parseAs(YearNode); class MonthNameNode extends EnglishGrammar.MonthNameNode { static monthMap = new Map([['一月', 0], ['二月', 1], ['三月', 2], ['四月', 3], ['五月', 4], ['六月', 5], ['七月', 6], ['八月', 7], ['九月', 8], ['十月', 9], ['十一月', 10], ['十二月', 11], ['睦月', 0], ['如月', 1], ['弥生', 2], ['卯月', 3], ['皐月', 4], ['水無月', 5], ['文月', 6], ['葉月', 7], ['長月', 8], ['神無月', 9], ['神在月', 9], ['霜月', 10], ['師走', 11]]); month(input) { const monthText = this.substringOf(input).replace('〇', ''); return MonthNameNode.monthMap.get(monthText); } } const Month = named('JapaneseMonth', /(1[0-2]|0?[1-9])月/).parseAs(EnglishGrammar.MonthNumNode); const MonthName = named('JapaneseMonthName', /((?:〇?[一二三四五六七八九]|十[一二]?)月|睦月|如月|弥生|卯月|皐月|水無月|文月|葉月|長月|神[無在]月|霜月|師走)/).parseAs(MonthNameNode); class DayOfMonthNode extends EnglishGrammar.DayOfMonthNumNode { constructor(wrapped) { super(wrapped); this.wrapped = wrapped; } dayOfMonth(input) { const dayText = input.substring(this.from, this.to - 1); switch (dayText) { case '十': return 10; default: return parseInt(dayText.replace(/^十/, '一').replace(/十$/, '〇').replace('十', '').split('').map(char => kanjiNumberMap.get(char) ?? char).join('')); } } } const DayOfMonth = named('JapaneseDayOfMonth', /([12][0-9]|3[01]|0?[1-9]|[一二][〇一二三四五六七八九]|三[〇一]|[二三]?十[一二三四五六七八九]?|〇?[一二三四五六七八九])日/).parseAs(DayOfMonthNode); class DateNode extends EnglishGrammar.DateNode { yearFns(input) { var _this$find; return (_this$find = this.find(YearNode)) === null || _this$find === void 0 ? void 0 : _this$find.dateFns(input); } monthFns(input) { var _ref; const month = (_ref = this.find(MonthNameNode) || this.find(EnglishGrammar.MonthNumNode)) === null || _ref === void 0 ? void 0 : _ref.month(input); return month != null ? [['setMonth', month]] : undefined; } day(input) { var _this$find2; return (_this$find2 = this.find(DayOfMonthNode)) === null || _this$find2 === void 0 ? void 0 : _this$find2.dayOfMonth(input); } } const Date = named('JapaneseDate', longestOf(group(JapaneseYear, group(oneOf(Month, MonthName), DayOfMonth.maybe()).maybe()), group(oneOf(Month, MonthName), DayOfMonth.maybe()), DayOfMonth)).parseAs(DateNode); class HoursNode extends EnglishGrammar.HoursNode { hours(input) { const hoursText = input.substring(this.from, this.to - 1); switch (hoursText) { case '零': return 0; case '十': return 10; default: return parseInt(hoursText.replace(/^十/, '一').replace(/十$/, '〇').replace('十', '').split('').map(char => kanjiNumberMap.get(char) ?? char).join('')); } } } const Hours = named('JapaneseHours', /(2[0-3]|[01]?[0-9]|二?十[一二三]?|十?[一二三四五六七八九]|零)時/).parseAs(HoursNode); class MinutesNode extends EnglishGrammar.MinutesNode { minutes(input) { const minutesText = input.substring(this.from, this.to - 1); switch (minutesText) { case '零': return 0; case '十': return 10; default: return parseInt(minutesText.replace(/^十/, '一').replace(/十$/, '〇').replace('十', '').split('').map(char => kanjiNumberMap.get(char) ?? char).join('')); } } } const Minutes = named('JapaneseMinutes', /([0-5]?[0-9]|[二三四五]?十[一二三四五六七八九]?|[一二三四五六七八九]|零)分/).parseAs(MinutesNode); class SecondsNode extends EnglishGrammar.SecondsNode { seconds(input) { const secondsText = input.substring(this.from, this.to - 1); switch (secondsText) { case '零': return 0; case '十': return 10; default: return parseInt(secondsText.replace(/^十/, '一').replace(/十$/, '〇').replace('十', '').split('').map(char => kanjiNumberMap.get(char) ?? char).join('')); } } } const Seconds = named('JapaneseSeconds', /([0-5]?[0-9]|[二三四五]?十[一二三四五六七八九]?|[一二三四五六七八九]|零)秒/).parseAs(SecondsNode); class TimeNode extends EnglishGrammar.TimeNode { hours(input) { var _this$find3; return (_this$find3 = this.find(HoursNode)) === null || _this$find3 === void 0 ? void 0 : _this$find3.hours(input); } minutes(input) { var _this$find4; return (_this$find4 = this.find(MinutesNode)) === null || _this$find4 === void 0 ? void 0 : _this$find4.minutes(input); } seconds(input) { var _this$find5; return (_this$find5 = this.find(SecondsNode)) === null || _this$find5 === void 0 ? void 0 : _this$find5.seconds(input); } amPm(input) { var _this$find6; return (_this$find6 = this.find(AmPmNode)) === null || _this$find6 === void 0 ? void 0 : _this$find6.amPm(input); } } class AmPmNode extends EnglishGrammar.AmPmNode { amPm(input) { switch (this.substringOf(input)) { case '午前': return AmPmValue.AM; case '午後': return AmPmValue.PM; default: throw new Error(`unexpected`); } } } const AmPm = named('JapaneseAmPm', /午[前後]/).parseAs(AmPmNode); const Time = named('Time', longestOf(group(AmPm.maybe(), Hours, group(Minutes, Seconds.maybe())), group(AmPm.maybe(), Hours, group(Minutes, Seconds.maybe()).maybe()))).parseAs(TimeNode); export class DateTimeNode extends EnglishGrammar.DateTimeNode { date(input) { var _this$find7; return (_this$find7 = this.find(DateNode)) === null || _this$find7 === void 0 ? void 0 : _this$find7.dateFns(input); } time(input) { var _this$find8; return (_this$find8 = this.find(TimeNode)) === null || _this$find8 === void 0 ? void 0 : _this$find8.dateFns(input); } } export const DateTime = named('JapaneseDateTime', longestOf(Date, Time, group(Date, group(space.maybe(), Time)))).parseAs(DateTimeNode); export const Range = named('Range', group(named('RangeStart', DateTime), group(space.maybe(), oneOf('から', '~', '-', 'ー', '~', '-'), space.maybe()), named('RangeEnd', DateTime), group(space.maybe(), 'まで').maybe())).parseAs(EnglishGrammar.RangeNode); export class RootNode extends ParseRootNode { dateFns(input) { var _ref2; return ((_ref2 = this.find(EnglishGrammar.RangeNode) || this.find(DateTimeNode)) === null || _ref2 === void 0 ? void 0 : _ref2.dateFns(input)) || []; } } export const Root = group(space.maybe(), oneOf(Range, DateTime), space.maybe()).parseAs(RootNode); export function parse(input) { return base.parse(input, { grammar: Root }); } export function tellMeWhen(when, options) { return base.tellMeWhen(when, { ...options, grammar: Root }); } //# sourceMappingURL=ja-JP.mjs.map