UNPKG

chrono-node

Version:

A natural language date parser in Javascript

47 lines (39 loc) 1.73 kB
import { ParsingContext } from "../../../chrono"; import { ParsingComponents } from "../../../results"; import { WEEKDAY_DICTIONARY } from "../constants"; import { matchAnyPattern } from "../../../utils/pattern"; import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; import { createParsingComponentsAtWeekday } from "../../../calculation/weekdays"; const PATTERN = new RegExp( "(?:(?:\\,|\\(|\\()\\s*)?" + "(?:(viime|edellinen|edellisenä|ensi|seuraava|seuraavana|tämä|tänä)\\s*)?" + `(${matchAnyPattern(WEEKDAY_DICTIONARY)})` + "(?:\\s*(?:\\,|\\)|\\)))?" + "(?:\\s*(viime|ensi|seuraava)\\s*viikolla)?" + "(?=\\W|$)", "i" ); const PREFIX_GROUP = 1; const WEEKDAY_GROUP = 2; const SUFFIX_GROUP = 3; export default class FIWeekdayParser extends AbstractParserWithWordBoundaryChecking { innerPattern(): RegExp { return PATTERN; } innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents { const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); const offset = WEEKDAY_DICTIONARY[dayOfWeek]; const prefix = match[PREFIX_GROUP]; const postfix = match[SUFFIX_GROUP]; let modifierWord = prefix || postfix; modifierWord = modifierWord || ""; modifierWord = modifierWord.toLowerCase(); let modifier = null; if (modifierWord.match(/viime|edellinen|edellisenä/)) { modifier = "last"; } else if (modifierWord.match(/ensi|seuraava|seuraavana/)) { modifier = "next"; } return createParsingComponentsAtWeekday(context.reference, offset, modifier); } }