UNPKG

@kermank/nldp

Version:

A modular date/time parser for converting natural language into dates and times

92 lines 3.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.timeOfDayRule = exports.DEFAULT_TIME_OF_DAY_PREFERENCES = void 0; const luxon_1 = require("luxon"); exports.DEFAULT_TIME_OF_DAY_PREFERENCES = { morning: { start: 7, // 7 AM end: 11, // 11 AM early: { start: 7, end: 8 }, mid: { start: 8, end: 9 }, late: { start: 9, end: 11 } }, afternoon: { start: 12, // 12 PM end: 16, // 4 PM early: { start: 12, end: 13 }, mid: { start: 13, end: 14 }, late: { start: 14, end: 16 } }, evening: { start: 17, // 5 PM end: 20, // 8 PM early: { start: 17, end: 18 }, mid: { start: 18, end: 19 }, late: { start: 19, end: 20 } }, night: { start: 21, // 9 PM end: 23, // 11 PM early: { start: 21, end: 22 }, mid: { start: 22, end: 23 }, late: { start: 23, end: 24 } } }; function createTimeOfDayComponent(startHour, endHour, span, originalText, preferences) { const referenceDate = preferences.referenceDate || luxon_1.DateTime.now(); const zone = preferences.timeZone || 'UTC'; let start = referenceDate.setZone(zone).set({ hour: startHour, minute: 0, second: 0, millisecond: 0 }); let end = referenceDate.setZone(zone).set({ hour: endHour, minute: 0, second: 0, millisecond: 0 }); // If end time is before start time, assume it spans to next day if (end < start) { end = end.plus({ days: 1 }); } return { type: 'range', span, value: { start, end }, confidence: 1, metadata: { originalText, rangeType: 'timeOfDay' } }; } function getTimeOfDayRange(timeOfDay, modifier, preferences) { const prefs = preferences.timeOfDay || exports.DEFAULT_TIME_OF_DAY_PREFERENCES; const period = prefs[timeOfDay]; if (modifier) { return period[modifier]; } return { start: period.start, end: period.end }; } exports.timeOfDayRule = { name: 'time-of-day', patterns: [ { // Matches "morning", "early morning", "late afternoon", etc. regex: /(?:(early|mid|late)\s+)?(morning|afternoon|evening|night)/i, parse: (matches, preferences) => { const [fullMatch, modifier, timeOfDay] = matches; const range = getTimeOfDayRange(timeOfDay.toLowerCase(), modifier === null || modifier === void 0 ? void 0 : modifier.toLowerCase(), preferences); const matchStart = matches.index + (fullMatch.startsWith(' ') ? 1 : 0); const matchEnd = matchStart + fullMatch.trim().length; return createTimeOfDayComponent(range.start, range.end, { start: matchStart, end: matchEnd }, fullMatch.trim(), preferences); } } ] }; //# sourceMappingURL=time-of-day.js.map