tell-me-when
Version:
human relative date and time parser
184 lines (183 loc) • 8.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.RootNode = exports.Root = exports.Range = exports.DateTimeNode = exports.DateTime = void 0;
exports.parse = parse;
exports.tellMeWhen = tellMeWhen;
var _GrammarNode = require("./util/GrammarNode.js");
var EnglishGrammar = _interopRequireWildcard(require("./en-US.js"));
var _ParseRootNode = require("./util/ParseRootNode.js");
var base = _interopRequireWildcard(require("./util/parse.js"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
const {
group,
named,
oneOf,
longestOf
} = _GrammarNode.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);
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);
}
}
exports.DateTimeNode = DateTimeNode;
const DateTime = exports.DateTime = named('JapaneseDateTime', longestOf(Date, Time, group(Date, group(space.maybe(), Time)))).parseAs(DateTimeNode);
const Range = exports.Range = named('Range', group(named('RangeStart', DateTime), group(space.maybe(), oneOf('から', '~', '-', 'ー', '~', '-'), space.maybe()), named('RangeEnd', DateTime), group(space.maybe(), 'まで').maybe())).parseAs(EnglishGrammar.RangeNode);
class RootNode extends _ParseRootNode.ParseRootNode {
dateFns(input) {
var _ref2;
return ((_ref2 = this.find(EnglishGrammar.RangeNode) || this.find(DateTimeNode)) === null || _ref2 === void 0 ? void 0 : _ref2.dateFns(input)) || [];
}
}
exports.RootNode = RootNode;
const Root = exports.Root = group(space.maybe(), oneOf(Range, DateTime), space.maybe()).parseAs(RootNode);
function parse(input) {
return base.parse(input, {
grammar: Root
});
}
function tellMeWhen(when, options) {
return base.tellMeWhen(when, {
...options,
grammar: Root
});
}
//# sourceMappingURL=ja-JP.js.map