UNPKG

chrono-node

Version:

A natural language date parser in Javascript

199 lines 4.81 kB
import { matchAnyPattern, repeatedTimeunitPattern } from "../../utils/pattern.js"; import { findMostLikelyADYear } from "../../calculation/years.js"; export const WEEKDAY_DICTIONARY = { "söndag": 0, "sön": 0, "so": 0, "måndag": 1, "mån": 1, "må": 1, "tisdag": 2, "tis": 2, "ti": 2, "onsdag": 3, "ons": 3, "on": 3, "torsdag": 4, "tors": 4, "to": 4, "fredag": 5, "fre": 5, "fr": 5, "lördag": 6, "lör": 6, "lö": 6, }; export const MONTH_DICTIONARY = { "januari": 1, "jan": 1, "jan.": 1, "februari": 2, "feb": 2, "feb.": 2, "mars": 3, "mar": 3, "mar.": 3, "april": 4, "apr": 4, "apr.": 4, "maj": 5, "juni": 6, "jun": 6, "jun.": 6, "juli": 7, "jul": 7, "jul.": 7, "augusti": 8, "aug": 8, "aug.": 8, "september": 9, "sep": 9, "sep.": 9, "sept": 9, "oktober": 10, "okt": 10, "okt.": 10, "november": 11, "nov": 11, "nov.": 11, "december": 12, "dec": 12, "dec.": 12, }; export const ORDINAL_NUMBER_DICTIONARY = { "första": 1, "andra": 2, "tredje": 3, "fjärde": 4, "femte": 5, "sjätte": 6, "sjunde": 7, "åttonde": 8, "nionde": 9, "tionde": 10, "elfte": 11, "tolfte": 12, "trettonde": 13, "fjortonde": 14, "femtonde": 15, "sextonde": 16, "sjuttonde": 17, "artonde": 18, "nittonde": 19, "tjugonde": 20, "tjugoförsta": 21, "tjugoandra": 22, "tjugotredje": 23, "tjugofjärde": 24, "tjugofemte": 25, "tjugosjätte": 26, "tjugosjunde": 27, "tjugoåttonde": 28, "tjugonionde": 29, "trettionde": 30, "trettioförsta": 31, }; export const INTEGER_WORD_DICTIONARY = { "en": 1, "ett": 1, "två": 2, "tre": 3, "fyra": 4, "fem": 5, "sex": 6, "sju": 7, "åtta": 8, "nio": 9, "tio": 10, "elva": 11, "tolv": 12, "tretton": 13, "fjorton": 14, "femton": 15, "sexton": 16, "sjutton": 17, "arton": 18, "nitton": 19, "tjugo": 20, "trettiо": 30, "fyrtio": 40, "femtio": 50, "sextio": 60, "sjuttio": 70, "åttio": 80, "nittio": 90, "hundra": 100, "tusen": 1000, }; export const TIME_UNIT_DICTIONARY = { "sekund": "second", "sekunder": "second", "sek": "second", "minut": "minute", "minuter": "minute", "min": "minute", "timme": "hour", "timmar": "hour", "tim": "hour", "dag": "day", "dagar": "day", "vecka": "week", "veckor": "week", "månad": "month", "månader": "month", "mån": "month", "år": "year", "kvartаl": "quarter", "kvartal": "quarter", }; export function parseTimeUnits(timeunitText) { const fragments = {}; let remainingText = timeunitText; let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); while (match) { collectDateTimeFragment(fragments, match); remainingText = remainingText.substring(match[0].length); match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); } return fragments; } function collectDateTimeFragment(fragments, match) { const num = parseNumberPattern(match[1]); const unit = TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; fragments[unit] = num; } export const NUMBER_PATTERN = `(?:${matchAnyPattern(INTEGER_WORD_DICTIONARY)}|\\d+)`; export const ORDINAL_NUMBER_PATTERN = `(?:${matchAnyPattern(ORDINAL_NUMBER_DICTIONARY)}|\\d{1,2}(?:e|:e))`; export const TIME_UNIT_PATTERN = `(?:${matchAnyPattern(TIME_UNIT_DICTIONARY)})`; const SINGLE_TIME_UNIT_PATTERN = `(${NUMBER_PATTERN})\\s{0,5}(${matchAnyPattern(TIME_UNIT_DICTIONARY)})\\s{0,5}`; const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); export const TIME_UNITS_PATTERN = repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN); export function parseNumberPattern(match) { const num = match.toLowerCase(); if (INTEGER_WORD_DICTIONARY[num] !== undefined) { return INTEGER_WORD_DICTIONARY[num]; } return parseInt(num); } export function parseOrdinalNumberPattern(match) { const num = match.toLowerCase(); if (ORDINAL_NUMBER_DICTIONARY[num] !== undefined) { return ORDINAL_NUMBER_DICTIONARY[num]; } return parseInt(num); } export function parseYear(match) { if (/\d+/.test(match)) { let yearNumber = parseInt(match); if (yearNumber < 100) { yearNumber = findMostLikelyADYear(yearNumber); } return yearNumber; } const num = match.toLowerCase(); if (INTEGER_WORD_DICTIONARY[num] !== undefined) { return INTEGER_WORD_DICTIONARY[num]; } return parseInt(match); } //# sourceMappingURL=constants.js.map