chrono-node
Advanced tools
Comparing version 2.1.4 to 2.1.5
import { Parser, ParsingContext } from "../../chrono"; | ||
import { ParsingResult } from "../../results"; | ||
import { ParsingComponents, ParsingResult } from "../../results"; | ||
export declare abstract class AbstractTimeExpressionParser implements Parser { | ||
@@ -10,4 +10,4 @@ abstract primaryPrefix(): string; | ||
extract(context: ParsingContext, match: RegExpMatchArray): ParsingResult; | ||
private static extractStartTimeComponent; | ||
private static extractEndTimeComponent; | ||
extractPrimaryTimeComponents(context: ParsingContext, match: RegExpMatchArray): null | ParsingComponents; | ||
extractFollowingTimeComponents(context: ParsingContext, match: RegExpMatchArray, result: ParsingResult): null | ParsingComponents; | ||
} |
@@ -52,10 +52,8 @@ "use strict"; | ||
let result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length)); | ||
if (result.text.match(/^\d$/)) { | ||
return null; | ||
} | ||
result.start.imply("day", refDate.date()); | ||
result.start.imply("month", refDate.month() + 1); | ||
result.start.imply("year", refDate.year()); | ||
result = AbstractTimeExpressionParser.extractStartTimeComponent(result.clone(), match); | ||
if (!result) { | ||
result.start = this.extractPrimaryTimeComponents(context, match); | ||
if (!result.start) { | ||
match.index += match[0].length; | ||
return null; | ||
@@ -72,6 +70,12 @@ } | ||
} | ||
const newResult = AbstractTimeExpressionParser.extractEndTimeComponent(result.clone(), match); | ||
return newResult ? newResult : result; | ||
result.end = this.extractFollowingTimeComponents(context, match, result); | ||
if (result.end) { | ||
if (result.end) { | ||
result.text += match[0]; | ||
} | ||
} | ||
return result; | ||
} | ||
static extractStartTimeComponent(result, match) { | ||
extractPrimaryTimeComponents(context, match) { | ||
const components = context.createParsingComponents(); | ||
let hour = 0; | ||
@@ -91,3 +95,3 @@ let minute = 0; | ||
} | ||
if (hour >= 12) { | ||
if (hour > 12) { | ||
meridiem = index_1.Meridiem.PM; | ||
@@ -112,13 +116,13 @@ } | ||
} | ||
result.start.assign("hour", hour); | ||
result.start.assign("minute", minute); | ||
components.assign("hour", hour); | ||
components.assign("minute", minute); | ||
if (meridiem !== null) { | ||
result.start.assign("meridiem", meridiem); | ||
components.assign("meridiem", meridiem); | ||
} | ||
else { | ||
if (hour < 12) { | ||
result.start.imply("meridiem", index_1.Meridiem.AM); | ||
components.imply("meridiem", index_1.Meridiem.AM); | ||
} | ||
else { | ||
result.start.imply("meridiem", index_1.Meridiem.PM); | ||
components.imply("meridiem", index_1.Meridiem.PM); | ||
} | ||
@@ -130,3 +134,3 @@ } | ||
return null; | ||
result.start.assign("millisecond", millisecond); | ||
components.assign("millisecond", millisecond); | ||
} | ||
@@ -137,8 +141,8 @@ if (match[SECOND_GROUP] != null) { | ||
return null; | ||
result.start.assign("second", second); | ||
components.assign("second", second); | ||
} | ||
return result; | ||
return components; | ||
} | ||
static extractEndTimeComponent(result, match) { | ||
result.end = result.start.clone(); | ||
extractFollowingTimeComponents(context, match, result) { | ||
const components = context.createParsingComponents(); | ||
if (match[MILLI_SECOND_GROUP] != null) { | ||
@@ -148,3 +152,3 @@ const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3)); | ||
return null; | ||
result.end.assign("millisecond", millisecond); | ||
components.assign("millisecond", millisecond); | ||
} | ||
@@ -155,3 +159,3 @@ if (match[SECOND_GROUP] != null) { | ||
return null; | ||
result.end.assign("second", second); | ||
components.assign("second", second); | ||
} | ||
@@ -183,4 +187,4 @@ let hour = parseInt(match[HOUR_GROUP]); | ||
hour = 0; | ||
if (!result.end.isCertain("day")) { | ||
result.end.imply("day", result.end.get("day") + 1); | ||
if (!components.isCertain("day")) { | ||
components.imply("day", components.get("day") + 1); | ||
} | ||
@@ -209,23 +213,31 @@ } | ||
} | ||
result.text = result.text + match[0]; | ||
result.end.assign("hour", hour); | ||
result.end.assign("minute", minute); | ||
components.assign("hour", hour); | ||
components.assign("minute", minute); | ||
if (meridiem >= 0) { | ||
result.end.assign("meridiem", meridiem); | ||
components.assign("meridiem", meridiem); | ||
} | ||
else { | ||
const startAtPM = result.start.isCertain("meridiem") && result.start.get("meridiem") == index_1.Meridiem.PM; | ||
if (startAtPM && result.start.get("hour") > hour) { | ||
result.end.imply("meridiem", index_1.Meridiem.AM); | ||
const startAtPM = result.start.isCertain("meridiem") && result.start.get("hour") > 12; | ||
if (startAtPM) { | ||
if (result.start.get("hour") - 12 > hour) { | ||
components.imply("meridiem", index_1.Meridiem.AM); | ||
} | ||
else if (hour <= 12) { | ||
components.assign("hour", hour + 12); | ||
components.assign("meridiem", index_1.Meridiem.PM); | ||
} | ||
} | ||
else if (hour > 12) { | ||
result.end.imply("meridiem", index_1.Meridiem.PM); | ||
components.imply("meridiem", index_1.Meridiem.PM); | ||
} | ||
else if (hour <= 12) { | ||
components.imply("meridiem", index_1.Meridiem.AM); | ||
} | ||
} | ||
if (result.end.date().getTime() < result.start.date().getTime()) { | ||
result.end.imply("day", result.end.get("day") + 1); | ||
if (components.date().getTime() < result.start.date().getTime()) { | ||
components.imply("day", components.get("day") + 1); | ||
} | ||
return result; | ||
return components; | ||
} | ||
} | ||
exports.AbstractTimeExpressionParser = AbstractTimeExpressionParser; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const yearCalculation_1 = require("../../calculation/yearCalculation"); | ||
const PATTERN = new RegExp("(\\W|^)" + | ||
const years_1 = require("../../calculation/years"); | ||
const PATTERN = new RegExp("([^\\d]|^)" + | ||
"([0-3]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})" + | ||
"(?:" + | ||
"[\\/\\.\\-]" + | ||
"([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)" + | ||
")?" + | ||
"(?:[\\/\\.\\-]([0-9]{4}|[0-9]{2}))?" + | ||
"(\\W|$)", "i"); | ||
@@ -30,3 +27,3 @@ const OPENING_GROUP = 1; | ||
const index = match.index + match[OPENING_GROUP].length; | ||
const text = match[0].substr(match[OPENING_GROUP].length, match[0].length - match[ENDING_GROUP].length); | ||
const text = match[0].substr(match[OPENING_GROUP].length, match[0].length - match[OPENING_GROUP].length - match[ENDING_GROUP].length); | ||
if (text.match(/^\d\.\d$/) || text.match(/^\d\.\d{1,2}\.\d{1,2}\s*$/)) { | ||
@@ -58,7 +55,7 @@ return; | ||
const rawYearNumber = parseInt(match[YEAR_GROUP]); | ||
const year = yearCalculation_1.findMostLikelyADYear(rawYearNumber); | ||
const year = years_1.findMostLikelyADYear(rawYearNumber); | ||
result.start.assign("year", year); | ||
} | ||
else { | ||
const year = yearCalculation_1.findYearClosestToRef(context.refDate, day, month); | ||
const year = years_1.findYearClosestToRef(context.refDate, day, month); | ||
result.start.imply("year", year); | ||
@@ -65,0 +62,0 @@ } |
@@ -40,2 +40,8 @@ "use strict"; | ||
} | ||
if (result.start.isOnlyTime() && (!result.start.isCertain("hour") || !result.start.isCertain("minute"))) { | ||
context.debug(() => { | ||
console.log(`(Strict) Removing uncertain time component: ${result} (${result.end})`); | ||
}); | ||
return false; | ||
} | ||
return true; | ||
@@ -42,0 +48,0 @@ } |
@@ -5,3 +5,3 @@ "use strict"; | ||
const pattern_1 = require("../../utils/pattern"); | ||
const yearCalculation_1 = require("../../calculation/yearCalculation"); | ||
const years_1 = require("../../calculation/years"); | ||
exports.WEEKDAY_DICTIONARY = { | ||
@@ -195,3 +195,3 @@ sunday: 0, | ||
const rawYearNumber = parseInt(match); | ||
return yearCalculation_1.findMostLikelyADYear(rawYearNumber); | ||
return years_1.findMostLikelyADYear(rawYearNumber); | ||
} | ||
@@ -198,0 +198,0 @@ exports.parseYear = parseYear; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const yearCalculation_1 = require("../../../calculation/yearCalculation"); | ||
const years_1 = require("../../../calculation/years"); | ||
const constants_1 = require("../constants"); | ||
@@ -47,3 +47,3 @@ const constants_2 = require("../constants"); | ||
else { | ||
const year = yearCalculation_1.findYearClosestToRef(context.refDate, day, month); | ||
const year = years_1.findYearClosestToRef(context.refDate, day, month); | ||
result.start.imply("year", year); | ||
@@ -50,0 +50,0 @@ } |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const yearCalculation_1 = require("../../../calculation/yearCalculation"); | ||
const years_1 = require("../../../calculation/years"); | ||
const constants_1 = require("../constants"); | ||
@@ -44,3 +44,3 @@ const constants_2 = require("../constants"); | ||
else { | ||
const year = yearCalculation_1.findYearClosestToRef(context.refDate, day, month); | ||
const year = years_1.findYearClosestToRef(context.refDate, day, month); | ||
components.imply("year", year); | ||
@@ -47,0 +47,0 @@ } |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../constants"); | ||
const yearCalculation_1 = require("../../../calculation/yearCalculation"); | ||
const years_1 = require("../../../calculation/years"); | ||
const pattern_1 = require("../../../utils/pattern"); | ||
@@ -34,3 +34,3 @@ const constants_2 = require("../constants"); | ||
else { | ||
const year = yearCalculation_1.findYearClosestToRef(context.refDate, 1, month); | ||
const year = years_1.findYearClosestToRef(context.refDate, 1, month); | ||
components.imply("year", year); | ||
@@ -37,0 +37,0 @@ } |
@@ -0,1 +1,3 @@ | ||
import { ParsingContext } from "../../../chrono"; | ||
import { ParsingComponents } from "../../../results"; | ||
import { AbstractTimeExpressionParser } from "../../../common/parsers/AbstractTimeExpressionParser"; | ||
@@ -6,2 +8,3 @@ export default class ENTimeExpressionParser extends AbstractTimeExpressionParser { | ||
primarySuffix(): string; | ||
extractPrimaryTimeComponents(context: ParsingContext, match: RegExpMatchArray): null | ParsingComponents; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const index_1 = require("../../../index"); | ||
const AbstractTimeExpressionParser_1 = require("../../../common/parsers/AbstractTimeExpressionParser"); | ||
@@ -12,5 +13,32 @@ class ENTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { | ||
primarySuffix() { | ||
return "\\s*(?:o\\W*clock)?(?=\\W|$)"; | ||
return "(?:\\s*(?:o\\W*clock|at\\s*night|in\\s*the\\s*(?:morning|afternoon)))?(?=\\W|$)"; | ||
} | ||
extractPrimaryTimeComponents(context, match) { | ||
const components = super.extractPrimaryTimeComponents(context, match); | ||
if (components) { | ||
if (match[0].endsWith("night")) { | ||
const hour = components.get("hour"); | ||
if (hour > 6 && hour < 12) { | ||
components.assign("hour", components.get("hour") + 12); | ||
components.assign("meridiem", index_1.Meridiem.PM); | ||
} | ||
} | ||
if (match[0].endsWith("afternoon")) { | ||
const hour = components.get("hour"); | ||
if (hour >= 0 && hour <= 6) { | ||
components.assign("hour", components.get("hour") + 12); | ||
components.assign("meridiem", index_1.Meridiem.PM); | ||
} | ||
} | ||
if (match[0].endsWith("morning")) { | ||
const hour = components.get("hour"); | ||
if (hour < 12) { | ||
components.assign("hour", components.get("hour")); | ||
components.assign("meridiem", index_1.Meridiem.AM); | ||
} | ||
} | ||
} | ||
return components; | ||
} | ||
} | ||
exports.default = ENTimeExpressionParser; |
@@ -7,3 +7,2 @@ import { ParsingContext } from "../../../chrono"; | ||
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents; | ||
private extractWeekday; | ||
} |
"use strict"; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../constants"); | ||
const dayjs_1 = __importDefault(require("dayjs")); | ||
const pattern_1 = require("../../../utils/pattern"); | ||
const AbstractParserWithWordBoundary_1 = require("../../../common/parsers/AbstractParserWithWordBoundary"); | ||
const weeks_1 = require("../../../calculation/weeks"); | ||
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" + | ||
@@ -32,6 +29,16 @@ "(?:on\\s*?)?" + | ||
const postfix = match[POSTFIX_GROUP]; | ||
let modifier = prefix || postfix; | ||
modifier = modifier || ""; | ||
modifier = modifier.toLowerCase(); | ||
const date = this.extractWeekday(context.refDate, offset, modifier); | ||
let modifierWord = prefix || postfix; | ||
modifierWord = modifierWord || ""; | ||
modifierWord = modifierWord.toLowerCase(); | ||
let modifier = null; | ||
if (modifierWord == "last" || modifierWord == "past") { | ||
modifier = "last"; | ||
} | ||
else if (modifierWord == "next") { | ||
modifier = "next"; | ||
} | ||
else if (modifierWord == "this") { | ||
modifier = "this"; | ||
} | ||
const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); | ||
return context | ||
@@ -44,28 +51,3 @@ .createParsingComponents() | ||
} | ||
extractWeekday(refDate, offset, modifier) { | ||
let date = dayjs_1.default(refDate); | ||
const refOffset = date.day(); | ||
if (modifier == "last" || modifier == "past") { | ||
date = date.day(offset - 7); | ||
} | ||
else if (modifier == "next") { | ||
date = date.day(offset + 7); | ||
} | ||
else if (modifier == "this") { | ||
date = date.day(offset); | ||
} | ||
else { | ||
if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { | ||
date = date.day(offset - 7); | ||
} | ||
else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { | ||
date = date.day(offset + 7); | ||
} | ||
else { | ||
date = date.day(offset); | ||
} | ||
} | ||
return date; | ||
} | ||
} | ||
exports.default = ENWeekdayParser; |
@@ -16,5 +16,5 @@ import { OpUnitType } from "dayjs"; | ||
export declare function parseNumberPattern(match: string): number; | ||
export declare const ORDINAL_NUMBER_PATTERN = "(?:[0-9]{1,2}(?:st|nd|rd|th)?)"; | ||
export declare const ORDINAL_NUMBER_PATTERN = "(?:[0-9]{1,2}(?:er)?)"; | ||
export declare function parseOrdinalNumberPattern(match: string): number; | ||
export declare const YEAR_PATTERN = "(?:[1-9][0-9]{0,3}\\s*(?:BE|AD|BC)|[1-2][0-9]{3}|[5-9][0-9])"; | ||
export declare const YEAR_PATTERN = "(?:[1-9][0-9]{0,3}\\s*(?:AC|AD|p\\.\\s*C(?:hr?)?\\.\\s*n\\.)|[1-2][0-9]{3}|[5-9][0-9])"; | ||
export declare function parseYear(match: string): number; | ||
@@ -21,0 +21,0 @@ export declare const TIME_UNITS_PATTERN: string; |
@@ -6,100 +6,93 @@ "use strict"; | ||
exports.WEEKDAY_DICTIONARY = { | ||
sunday: 0, | ||
sun: 0, | ||
"sun.": 0, | ||
monday: 1, | ||
mon: 1, | ||
"mon.": 1, | ||
tuesday: 2, | ||
tue: 2, | ||
"tue.": 2, | ||
wednesday: 3, | ||
wed: 3, | ||
"wed.": 3, | ||
thursday: 4, | ||
thurs: 4, | ||
"thurs.": 4, | ||
thur: 4, | ||
"thur.": 4, | ||
thu: 4, | ||
"thu.": 4, | ||
friday: 5, | ||
fri: 5, | ||
"fri.": 5, | ||
saturday: 6, | ||
sat: 6, | ||
"sat.": 6, | ||
"dimanche": 0, | ||
"dim": 0, | ||
"lundi": 1, | ||
"lun": 1, | ||
"mardi": 2, | ||
"mar": 2, | ||
"mercredi": 3, | ||
"mer": 3, | ||
"jeudi": 4, | ||
"jeu": 4, | ||
"vendredi": 5, | ||
"ven": 5, | ||
"samedi": 6, | ||
"sam": 6, | ||
}; | ||
exports.MONTH_DICTIONARY = { | ||
january: 1, | ||
jan: 1, | ||
"janvier": 1, | ||
"jan": 1, | ||
"jan.": 1, | ||
february: 2, | ||
feb: 2, | ||
"feb.": 2, | ||
march: 3, | ||
mar: 3, | ||
"février": 2, | ||
"fév": 2, | ||
"fév.": 2, | ||
"fevrier": 2, | ||
"fev": 2, | ||
"fev.": 2, | ||
"mars": 3, | ||
"mar": 3, | ||
"mar.": 3, | ||
april: 4, | ||
apr: 4, | ||
"apr.": 4, | ||
may: 5, | ||
june: 6, | ||
jun: 6, | ||
"jun.": 6, | ||
july: 7, | ||
jul: 7, | ||
"avril": 4, | ||
"avr": 4, | ||
"avr.": 4, | ||
"mai": 5, | ||
"juin": 6, | ||
"jun": 6, | ||
"juillet": 7, | ||
"juil": 7, | ||
"jul": 7, | ||
"jul.": 7, | ||
august: 8, | ||
aug: 8, | ||
"aug.": 8, | ||
september: 9, | ||
sep: 9, | ||
"août": 8, | ||
"aout": 8, | ||
"septembre": 9, | ||
"sep": 9, | ||
"sep.": 9, | ||
sept: 9, | ||
"sept": 9, | ||
"sept.": 9, | ||
october: 10, | ||
oct: 10, | ||
"octobre": 10, | ||
"oct": 10, | ||
"oct.": 10, | ||
november: 11, | ||
nov: 11, | ||
"novembre": 11, | ||
"nov": 11, | ||
"nov.": 11, | ||
december: 12, | ||
dec: 12, | ||
"décembre": 12, | ||
"decembre": 12, | ||
"dec": 12, | ||
"dec.": 12, | ||
}; | ||
exports.INTEGER_WORD_DICTIONARY = { | ||
one: 1, | ||
two: 2, | ||
three: 3, | ||
four: 4, | ||
five: 5, | ||
six: 6, | ||
seven: 7, | ||
eight: 8, | ||
nine: 9, | ||
ten: 10, | ||
eleven: 11, | ||
twelve: 12, | ||
"un": 1, | ||
"deux": 2, | ||
"trois": 3, | ||
"quatre": 4, | ||
"cinq": 5, | ||
"six": 6, | ||
"sept": 7, | ||
"huit": 8, | ||
"neuf": 9, | ||
"dix": 10, | ||
"onze": 11, | ||
"douze": 12, | ||
"treize": 13, | ||
}; | ||
exports.TIME_UNIT_DICTIONARY = { | ||
sec: "second", | ||
seconde: "second", | ||
secondes: "second", | ||
min: "minute", | ||
mins: "minute", | ||
minute: "minute", | ||
minutes: "minute", | ||
h: "hour", | ||
hr: "hour", | ||
hrs: "hour", | ||
heure: "hour", | ||
heures: "hour", | ||
jour: "d", | ||
jours: "d", | ||
semaine: "week", | ||
semaines: "week", | ||
mois: "month", | ||
année: "year", | ||
années: "year", | ||
"sec": "second", | ||
"seconde": "second", | ||
"secondes": "second", | ||
"min": "minute", | ||
"mins": "minute", | ||
"minute": "minute", | ||
"minutes": "minute", | ||
"h": "hour", | ||
"hr": "hour", | ||
"hrs": "hour", | ||
"heure": "hour", | ||
"heures": "hour", | ||
"jour": "d", | ||
"jours": "d", | ||
"semaine": "week", | ||
"semaines": "week", | ||
"mois": "month", | ||
"année": "year", | ||
"années": "year", | ||
}; | ||
@@ -124,21 +117,17 @@ exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?(?:\\s*few)?|few)`; | ||
exports.parseNumberPattern = parseNumberPattern; | ||
exports.ORDINAL_NUMBER_PATTERN = `(?:[0-9]{1,2}(?:st|nd|rd|th)?)`; | ||
exports.ORDINAL_NUMBER_PATTERN = `(?:[0-9]{1,2}(?:er)?)`; | ||
function parseOrdinalNumberPattern(match) { | ||
let num = match.toLowerCase(); | ||
num = num.replace(/(?:st|nd|rd|th)$/i, ""); | ||
num = num.replace(/(?:er)$/i, ""); | ||
return parseInt(num); | ||
} | ||
exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; | ||
exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:BE|AD|BC)|[1-2][0-9]{3}|[5-9][0-9])`; | ||
exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:AC|AD|p\\.\\s*C(?:hr?)?\\.\\s*n\\.)|[1-2][0-9]{3}|[5-9][0-9])`; | ||
function parseYear(match) { | ||
if (/BE/i.test(match)) { | ||
match = match.replace(/BE/i, ""); | ||
return parseInt(match) - 543; | ||
} | ||
if (/BC/i.test(match)) { | ||
if (/AC/i.test(match)) { | ||
match = match.replace(/BC/i, ""); | ||
return -parseInt(match); | ||
} | ||
if (/AD/i.test(match)) { | ||
match = match.replace(/AD/i, ""); | ||
if (/AD/i.test(match) || /C/i.test(match)) { | ||
match = match.replace(/[^\d]+/i, ""); | ||
return parseInt(match); | ||
@@ -145,0 +134,0 @@ } |
@@ -15,2 +15,5 @@ "use strict"; | ||
const FRMergeDateRangeRefiner_1 = __importDefault(require("./refiners/FRMergeDateRangeRefiner")); | ||
const FRWeekdayParser_1 = __importDefault(require("./parsers/FRWeekdayParser")); | ||
const FRSpecificTimeExpressionParser_1 = __importDefault(require("./parsers/FRSpecificTimeExpressionParser")); | ||
const FRMonthNameLittleEndianParser_1 = __importDefault(require("./parsers/FRMonthNameLittleEndianParser")); | ||
exports.casual = new chrono_1.Chrono(createCasualConfiguration()); | ||
@@ -35,3 +38,9 @@ exports.strict = new chrono_1.Chrono(createConfiguration(true)); | ||
return configurations_1.includeCommonConfiguration({ | ||
parsers: [new SlashDateFormatParser_1.default(littleEndian), new FRTimeExpressionParser_1.default()], | ||
parsers: [ | ||
new SlashDateFormatParser_1.default(littleEndian), | ||
new FRMonthNameLittleEndianParser_1.default(), | ||
new FRTimeExpressionParser_1.default(), | ||
new FRSpecificTimeExpressionParser_1.default(), | ||
new FRWeekdayParser_1.default(), | ||
], | ||
refiners: [new FRMergeDateTimeRefiner_1.default(), new FRMergeDateRangeRefiner_1.default()], | ||
@@ -38,0 +47,0 @@ }, strictMode); |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const index_1 = require("../../../index"); | ||
const AbstractParserWithWordBoundary_1 = require("../../../common/parsers/AbstractParserWithWordBoundary"); | ||
class FRCasualTimeParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
innerPattern(context) { | ||
return /(cet?)?\s*(matin|soir|après-midi|aprem)(?=\W|$)/i; | ||
return /(cet?)?\s*(matin|soir|après-midi|aprem|a midi|à minuit)(?=\W|$)/i; | ||
} | ||
@@ -16,2 +17,3 @@ innerExtract(context, match) { | ||
component.imply("minute", 0); | ||
component.imply("meridiem", index_1.Meridiem.PM); | ||
break; | ||
@@ -21,2 +23,3 @@ case "soir": | ||
component.imply("minute", 0); | ||
component.imply("meridiem", index_1.Meridiem.PM); | ||
break; | ||
@@ -26,3 +29,13 @@ case "matin": | ||
component.imply("minute", 0); | ||
component.imply("meridiem", index_1.Meridiem.AM); | ||
break; | ||
case "a midi": | ||
component.imply("hour", 12); | ||
component.imply("minute", 0); | ||
component.imply("meridiem", index_1.Meridiem.AM); | ||
break; | ||
case "à minuit": | ||
component.imply("hour", 0); | ||
component.imply("meridiem", index_1.Meridiem.AM); | ||
break; | ||
} | ||
@@ -29,0 +42,0 @@ return component; |
import { AbstractTimeExpressionParser } from "../../../common/parsers/AbstractTimeExpressionParser"; | ||
import { ParsingComponents } from "../../../results"; | ||
import { ParsingContext } from "../../../chrono"; | ||
export default class FRTimeExpressionParser extends AbstractTimeExpressionParser { | ||
primaryPrefix(): string; | ||
followingPhase(): string; | ||
extractPrimaryTimeComponents(context: ParsingContext, match: RegExpMatchArray): ParsingComponents | null; | ||
} |
@@ -11,3 +11,9 @@ "use strict"; | ||
} | ||
extractPrimaryTimeComponents(context, match) { | ||
if (match[0].match(/^\s*\d{4}\s*$/)) { | ||
return null; | ||
} | ||
return super.extractPrimaryTimeComponents(context, match); | ||
} | ||
} | ||
exports.default = FRTimeExpressionParser; |
@@ -9,5 +9,5 @@ "use strict"; | ||
patternBetween() { | ||
return /^\s*(à|a|\\-)\s*$/i; | ||
return /^\s*(à|a|-)\s*$/i; | ||
} | ||
} | ||
exports.default = FRMergeDateRangeRefiner; |
@@ -7,3 +7,3 @@ "use strict"; | ||
const constants_1 = require("../constants"); | ||
const yearCalculation_1 = require("../../../calculation/yearCalculation"); | ||
const years_1 = require("../../../calculation/years"); | ||
const dayjs_1 = __importDefault(require("dayjs")); | ||
@@ -47,3 +47,3 @@ const PATTERN = /(?:(?:([同今本])|((昭和|平成|令和)?([0-90-9]{1,4}|元)))年\s*)?([0-90-9]{1,2})月\s*([0-90-9]{1,2})日/i; | ||
else { | ||
const year = yearCalculation_1.findYearClosestToRef(context.refDate, day, month); | ||
const year = years_1.findYearClosestToRef(context.refDate, day, month); | ||
components.imply("year", year); | ||
@@ -50,0 +50,0 @@ } |
@@ -15,2 +15,3 @@ import { Component, ParsedComponents, ParsedResult } from "./index"; | ||
assign(component: Component, value: number): ParsingComponents; | ||
delete(component: Component): void; | ||
clone(): ParsingComponents; | ||
@@ -17,0 +18,0 @@ isOnlyDate(): boolean; |
@@ -56,2 +56,6 @@ "use strict"; | ||
} | ||
delete(component) { | ||
delete this.knownValues[component]; | ||
delete this.impliedValues[component]; | ||
} | ||
clone() { | ||
@@ -58,0 +62,0 @@ const component = new ParsingComponents(new Date()); |
@@ -9,6 +9,4 @@ { | ||
}, | ||
"eslintConfig": { | ||
"rules": { | ||
"padding-line-between-statements": "off" | ||
} | ||
"prettier": { | ||
"quoteProps": "preserve" | ||
}, | ||
@@ -21,3 +19,3 @@ "jest": { | ||
"license": "MIT", | ||
"version": "2.1.4", | ||
"version": "2.1.5", | ||
"directories": { | ||
@@ -24,0 +22,0 @@ "source": "./src", |
import { Parser, ParsingContext } from "../../chrono"; | ||
import { ParsingResult } from "../../results"; | ||
import { ParsingComponents, ParsingResult } from "../../results"; | ||
import { Meridiem } from "../../index"; | ||
@@ -65,6 +65,2 @@ import dayjs from "dayjs"; | ||
if (result.text.match(/^\d$/)) { | ||
return null; | ||
} | ||
result.start.imply("day", refDate.date()); | ||
@@ -74,4 +70,5 @@ result.start.imply("month", refDate.month() + 1); | ||
result = AbstractTimeExpressionParser.extractStartTimeComponent(result.clone(), match); | ||
if (!result) { | ||
result.start = this.extractPrimaryTimeComponents(context, match); | ||
if (!result.start) { | ||
match.index += match[0].length; | ||
return null; | ||
@@ -92,7 +89,14 @@ } | ||
const newResult = AbstractTimeExpressionParser.extractEndTimeComponent(result.clone(), match); | ||
return newResult ? newResult : result; | ||
result.end = this.extractFollowingTimeComponents(context, match, result); | ||
if (result.end) { | ||
if (result.end) { | ||
result.text += match[0]; | ||
} | ||
} | ||
return result; | ||
} | ||
private static extractStartTimeComponent(result: ParsingResult, match: RegExpMatchArray): ParsingResult | null { | ||
extractPrimaryTimeComponents(context: ParsingContext, match: RegExpMatchArray): null | ParsingComponents { | ||
const components = context.createParsingComponents(); | ||
let hour = 0; | ||
@@ -117,3 +121,3 @@ let minute = 0; | ||
if (hour >= 12) { | ||
if (hour > 12) { | ||
meridiem = Meridiem.PM; | ||
@@ -141,12 +145,12 @@ } | ||
result.start.assign("hour", hour); | ||
result.start.assign("minute", minute); | ||
components.assign("hour", hour); | ||
components.assign("minute", minute); | ||
if (meridiem !== null) { | ||
result.start.assign("meridiem", meridiem); | ||
components.assign("meridiem", meridiem); | ||
} else { | ||
if (hour < 12) { | ||
result.start.imply("meridiem", Meridiem.AM); | ||
components.imply("meridiem", Meridiem.AM); | ||
} else { | ||
result.start.imply("meridiem", Meridiem.PM); | ||
components.imply("meridiem", Meridiem.PM); | ||
} | ||
@@ -160,3 +164,3 @@ } | ||
result.start.assign("millisecond", millisecond); | ||
components.assign("millisecond", millisecond); | ||
} | ||
@@ -169,10 +173,14 @@ | ||
result.start.assign("second", second); | ||
components.assign("second", second); | ||
} | ||
return result; | ||
return components; | ||
} | ||
private static extractEndTimeComponent(result: ParsingResult, match: RegExpMatchArray): ParsingResult | null { | ||
result.end = result.start.clone(); | ||
extractFollowingTimeComponents( | ||
context: ParsingContext, | ||
match: RegExpMatchArray, | ||
result: ParsingResult | ||
): null | ParsingComponents { | ||
const components = context.createParsingComponents(); | ||
@@ -184,3 +192,3 @@ // ----- Millisecond | ||
result.end.assign("millisecond", millisecond); | ||
components.assign("millisecond", millisecond); | ||
} | ||
@@ -193,3 +201,3 @@ | ||
result.end.assign("second", second); | ||
components.assign("second", second); | ||
} | ||
@@ -228,4 +236,4 @@ | ||
hour = 0; | ||
if (!result.end.isCertain("day")) { | ||
result.end.imply("day", result.end.get("day") + 1); | ||
if (!components.isCertain("day")) { | ||
components.imply("day", components.get("day") + 1); | ||
} | ||
@@ -257,24 +265,30 @@ } | ||
result.text = result.text + match[0]; | ||
result.end.assign("hour", hour); | ||
result.end.assign("minute", minute); | ||
components.assign("hour", hour); | ||
components.assign("minute", minute); | ||
if (meridiem >= 0) { | ||
result.end.assign("meridiem", meridiem); | ||
components.assign("meridiem", meridiem); | ||
} else { | ||
const startAtPM = result.start.isCertain("meridiem") && result.start.get("meridiem") == Meridiem.PM; | ||
if (startAtPM && result.start.get("hour") > hour) { | ||
// 10pm - 1 (am) | ||
result.end.imply("meridiem", Meridiem.AM); | ||
const startAtPM = result.start.isCertain("meridiem") && result.start.get("hour") > 12; | ||
if (startAtPM) { | ||
if (result.start.get("hour") - 12 > hour) { | ||
// 10pm - 1 (am) | ||
components.imply("meridiem", Meridiem.AM); | ||
} else if (hour <= 12) { | ||
components.assign("hour", hour + 12); | ||
components.assign("meridiem", Meridiem.PM); | ||
} | ||
} else if (hour > 12) { | ||
result.end.imply("meridiem", Meridiem.PM); | ||
components.imply("meridiem", Meridiem.PM); | ||
} else if (hour <= 12) { | ||
components.imply("meridiem", Meridiem.AM); | ||
} | ||
} | ||
if (result.end.date().getTime() < result.start.date().getTime()) { | ||
result.end.imply("day", result.end.get("day") + 1); | ||
if (components.date().getTime() < result.start.date().getTime()) { | ||
components.imply("day", components.get("day") + 1); | ||
} | ||
return result; | ||
return components; | ||
} | ||
} |
import { Parser, ParsingContext } from "../../chrono"; | ||
import { ParsingResult } from "../../results"; | ||
import dayjs from "dayjs"; | ||
import { findMostLikelyADYear, findYearClosestToRef } from "../../calculation/yearCalculation"; | ||
import { findMostLikelyADYear, findYearClosestToRef } from "../../calculation/years"; | ||
@@ -14,8 +14,5 @@ /** | ||
const PATTERN = new RegExp( | ||
"(\\W|^)" + | ||
"([^\\d]|^)" + | ||
"([0-3]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})" + | ||
"(?:" + | ||
"[\\/\\.\\-]" + | ||
"([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)" + | ||
")?" + | ||
"(?:[\\/\\.\\-]([0-9]{4}|[0-9]{2}))?" + | ||
"(\\W|$)", | ||
@@ -56,3 +53,6 @@ "i" | ||
const index = match.index + match[OPENING_GROUP].length; | ||
const text = match[0].substr(match[OPENING_GROUP].length, match[0].length - match[ENDING_GROUP].length); | ||
const text = match[0].substr( | ||
match[OPENING_GROUP].length, | ||
match[0].length - match[OPENING_GROUP].length - match[ENDING_GROUP].length | ||
); | ||
@@ -59,0 +59,0 @@ // '1.12', '1.12.12' is more like a version numbers |
@@ -50,4 +50,12 @@ import { Filter } from "../abstractRefiners"; | ||
if (result.start.isOnlyTime() && (!result.start.isCertain("hour") || !result.start.isCertain("minute"))) { | ||
context.debug(() => { | ||
console.log(`(Strict) Removing uncertain time component: ${result} (${result.end})`); | ||
}); | ||
return false; | ||
} | ||
return true; | ||
} | ||
} |
import { OpUnitType } from "dayjs"; | ||
import { matchAnyPattern } from "../../utils/pattern"; | ||
import { findMostLikelyADYear } from "../../calculation/yearCalculation"; | ||
import { findMostLikelyADYear } from "../../calculation/years"; | ||
@@ -5,0 +5,0 @@ export const WEEKDAY_DICTIONARY: { [word: string]: number } = { |
@@ -21,3 +21,2 @@ import ENTimeUnitDeadlineFormatParser from "./parsers/ENTimeUnitDeadlineFormatParser"; | ||
import { Chrono, Configuration } from "../../chrono"; | ||
import MergeWeekdayComponentRefiner from "../../common/refiners/MergeWeekdayComponentRefiner"; | ||
import SlashDateFormatParser from "../../common/parsers/SlashDateFormatParser"; | ||
@@ -24,0 +23,0 @@ |
@@ -1,5 +0,5 @@ | ||
import { Parser, ParsingContext } from "../../../chrono"; | ||
import { ParsingContext } from "../../../chrono"; | ||
import { ParsingResult } from "../../../results"; | ||
import { findYearClosestToRef } from "../../../calculation/yearCalculation"; | ||
import { MONTH_DICTIONARY, WEEKDAY_DICTIONARY } from "../constants"; | ||
import { findYearClosestToRef } from "../../../calculation/years"; | ||
import { MONTH_DICTIONARY } from "../constants"; | ||
import { YEAR_PATTERN, parseYear } from "../constants"; | ||
@@ -6,0 +6,0 @@ import { ORDINAL_NUMBER_PATTERN, parseOrdinalNumberPattern } from "../constants"; |
@@ -1,3 +0,3 @@ | ||
import { Parser, ParsingContext } from "../../../chrono"; | ||
import { findYearClosestToRef } from "../../../calculation/yearCalculation"; | ||
import { ParsingContext } from "../../../chrono"; | ||
import { findYearClosestToRef } from "../../../calculation/years"; | ||
import { MONTH_DICTIONARY, WEEKDAY_DICTIONARY } from "../constants"; | ||
@@ -4,0 +4,0 @@ import { ORDINAL_NUMBER_PATTERN, parseOrdinalNumberPattern } from "../constants"; |
import { MONTH_DICTIONARY } from "../constants"; | ||
import { Parser, ParsingContext } from "../../../chrono"; | ||
import { findYearClosestToRef } from "../../../calculation/yearCalculation"; | ||
import { ParsingContext } from "../../../chrono"; | ||
import { findYearClosestToRef } from "../../../calculation/years"; | ||
import { matchAnyPattern } from "../../../utils/pattern"; | ||
@@ -5,0 +5,0 @@ import { YEAR_PATTERN, parseYear } from "../constants"; |
import { Parser, ParsingContext } from "../../../chrono"; | ||
import { ParsingResult } from "../../../results"; | ||
import { ParsingComponents, ParsingResult } from "../../../results"; | ||
import dayjs from "dayjs"; | ||
@@ -17,4 +17,35 @@ import { Meridiem } from "../../../index"; | ||
primarySuffix(): string { | ||
return "\\s*(?:o\\W*clock)?(?=\\W|$)"; | ||
return "(?:\\s*(?:o\\W*clock|at\\s*night|in\\s*the\\s*(?:morning|afternoon)))?(?=\\W|$)"; | ||
} | ||
extractPrimaryTimeComponents(context: ParsingContext, match: RegExpMatchArray): null | ParsingComponents { | ||
const components = super.extractPrimaryTimeComponents(context, match); | ||
if (components) { | ||
if (match[0].endsWith("night")) { | ||
const hour = components.get("hour"); | ||
if (hour > 6 && hour < 12) { | ||
components.assign("hour", components.get("hour") + 12); | ||
components.assign("meridiem", Meridiem.PM); | ||
} | ||
} | ||
if (match[0].endsWith("afternoon")) { | ||
const hour = components.get("hour"); | ||
if (hour >= 0 && hour <= 6) { | ||
components.assign("hour", components.get("hour") + 12); | ||
components.assign("meridiem", Meridiem.PM); | ||
} | ||
} | ||
if (match[0].endsWith("morning")) { | ||
const hour = components.get("hour"); | ||
if (hour < 12) { | ||
components.assign("hour", components.get("hour")); | ||
components.assign("meridiem", Meridiem.AM); | ||
} | ||
} | ||
} | ||
return components; | ||
} | ||
} |
@@ -7,2 +7,3 @@ import { Parser, ParsingContext } from "../../../chrono"; | ||
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; | ||
import { toDayJSWeekday } from "../../../calculation/weeks"; | ||
@@ -38,7 +39,16 @@ const PATTERN = new RegExp( | ||
const postfix = match[POSTFIX_GROUP]; | ||
let modifier = prefix || postfix; | ||
modifier = modifier || ""; | ||
modifier = modifier.toLowerCase(); | ||
let modifierWord = prefix || postfix; | ||
modifierWord = modifierWord || ""; | ||
modifierWord = modifierWord.toLowerCase(); | ||
const date = this.extractWeekday(context.refDate, offset, modifier); | ||
let modifier = null; | ||
if (modifierWord == "last" || modifierWord == "past") { | ||
modifier = "last"; | ||
} else if (modifierWord == "next") { | ||
modifier = "next"; | ||
} else if (modifierWord == "this") { | ||
modifier = "this"; | ||
} | ||
const date = toDayJSWeekday(context.refDate, offset, modifier); | ||
return context | ||
@@ -51,25 +61,2 @@ .createParsingComponents() | ||
} | ||
private extractWeekday(refDate: Date, offset, modifier?: string): Dayjs { | ||
let date = dayjs(refDate); | ||
const refOffset = date.day(); | ||
if (modifier == "last" || modifier == "past") { | ||
date = date.day(offset - 7); | ||
} else if (modifier == "next") { | ||
date = date.day(offset + 7); | ||
} else if (modifier == "this") { | ||
date = date.day(offset); | ||
} else { | ||
if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { | ||
date = date.day(offset - 7); | ||
} else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { | ||
date = date.day(offset + 7); | ||
} else { | ||
date = date.day(offset); | ||
} | ||
} | ||
return date; | ||
} | ||
} |
@@ -5,65 +5,57 @@ import { OpUnitType } from "dayjs"; | ||
export const WEEKDAY_DICTIONARY: { [word: string]: number } = { | ||
sunday: 0, | ||
sun: 0, | ||
"sun.": 0, | ||
monday: 1, | ||
mon: 1, | ||
"mon.": 1, | ||
tuesday: 2, | ||
tue: 2, | ||
"tue.": 2, | ||
wednesday: 3, | ||
wed: 3, | ||
"wed.": 3, | ||
thursday: 4, | ||
thurs: 4, | ||
"thurs.": 4, | ||
thur: 4, | ||
"thur.": 4, | ||
thu: 4, | ||
"thu.": 4, | ||
friday: 5, | ||
fri: 5, | ||
"fri.": 5, | ||
saturday: 6, | ||
sat: 6, | ||
"sat.": 6, | ||
"dimanche": 0, | ||
"dim": 0, | ||
"lundi": 1, | ||
"lun": 1, | ||
"mardi": 2, | ||
"mar": 2, | ||
"mercredi": 3, | ||
"mer": 3, | ||
"jeudi": 4, | ||
"jeu": 4, | ||
"vendredi": 5, | ||
"ven": 5, | ||
"samedi": 6, | ||
"sam": 6, | ||
}; | ||
export const MONTH_DICTIONARY: { [word: string]: number } = { | ||
january: 1, | ||
jan: 1, | ||
"janvier": 1, | ||
"jan": 1, | ||
"jan.": 1, | ||
february: 2, | ||
feb: 2, | ||
"feb.": 2, | ||
march: 3, | ||
mar: 3, | ||
"février": 2, | ||
"fév": 2, | ||
"fév.": 2, | ||
"fevrier": 2, | ||
"fev": 2, | ||
"fev.": 2, | ||
"mars": 3, | ||
"mar": 3, | ||
"mar.": 3, | ||
april: 4, | ||
apr: 4, | ||
"apr.": 4, | ||
may: 5, | ||
june: 6, | ||
jun: 6, | ||
"jun.": 6, | ||
july: 7, | ||
jul: 7, | ||
"avril": 4, | ||
"avr": 4, | ||
"avr.": 4, | ||
"mai": 5, | ||
"juin": 6, | ||
"jun": 6, | ||
"juillet": 7, | ||
"juil": 7, | ||
"jul": 7, | ||
"jul.": 7, | ||
august: 8, | ||
aug: 8, | ||
"aug.": 8, | ||
september: 9, | ||
sep: 9, | ||
"août": 8, | ||
"aout": 8, | ||
"septembre": 9, | ||
"sep": 9, | ||
"sep.": 9, | ||
sept: 9, | ||
"sept": 9, | ||
"sept.": 9, | ||
october: 10, | ||
oct: 10, | ||
"octobre": 10, | ||
"oct": 10, | ||
"oct.": 10, | ||
november: 11, | ||
nov: 11, | ||
"novembre": 11, | ||
"nov": 11, | ||
"nov.": 11, | ||
december: 12, | ||
dec: 12, | ||
"décembre": 12, | ||
"decembre": 12, | ||
"dec": 12, | ||
"dec.": 12, | ||
@@ -73,36 +65,37 @@ }; | ||
export const INTEGER_WORD_DICTIONARY: { [word: string]: number } = { | ||
one: 1, | ||
two: 2, | ||
three: 3, | ||
four: 4, | ||
five: 5, | ||
six: 6, | ||
seven: 7, | ||
eight: 8, | ||
nine: 9, | ||
ten: 10, | ||
eleven: 11, | ||
twelve: 12, | ||
"un": 1, | ||
"deux": 2, | ||
"trois": 3, | ||
"quatre": 4, | ||
"cinq": 5, | ||
"six": 6, | ||
"sept": 7, | ||
"huit": 8, | ||
"neuf": 9, | ||
"dix": 10, | ||
"onze": 11, | ||
"douze": 12, | ||
"treize": 13, | ||
}; | ||
export const TIME_UNIT_DICTIONARY: { [word: string]: OpUnitType } = { | ||
sec: "second", | ||
seconde: "second", | ||
secondes: "second", | ||
min: "minute", | ||
mins: "minute", | ||
minute: "minute", | ||
minutes: "minute", | ||
h: "hour", | ||
hr: "hour", | ||
hrs: "hour", | ||
heure: "hour", | ||
heures: "hour", | ||
jour: "d", | ||
jours: "d", | ||
semaine: "week", | ||
semaines: "week", | ||
mois: "month", | ||
année: "year", | ||
années: "year", | ||
"sec": "second", | ||
"seconde": "second", | ||
"secondes": "second", | ||
"min": "minute", | ||
"mins": "minute", | ||
"minute": "minute", | ||
"minutes": "minute", | ||
"h": "hour", | ||
"hr": "hour", | ||
"hrs": "hour", | ||
"heure": "hour", | ||
"heures": "hour", | ||
"jour": "d", | ||
"jours": "d", | ||
"semaine": "week", | ||
"semaines": "week", | ||
"mois": "month", | ||
"année": "year", | ||
"années": "year", | ||
}; | ||
@@ -133,6 +126,6 @@ | ||
export const ORDINAL_NUMBER_PATTERN = `(?:[0-9]{1,2}(?:st|nd|rd|th)?)`; | ||
export const ORDINAL_NUMBER_PATTERN = `(?:[0-9]{1,2}(?:er)?)`; | ||
export function parseOrdinalNumberPattern(match: string): number { | ||
let num = match.toLowerCase(); | ||
num = num.replace(/(?:st|nd|rd|th)$/i, ""); | ||
num = num.replace(/(?:er)$/i, ""); | ||
return parseInt(num); | ||
@@ -142,13 +135,7 @@ } | ||
//----------------------------- | ||
export const YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:BE|AD|BC)|[1-2][0-9]{3}|[5-9][0-9])`; | ||
// 88 p. Chr. n. | ||
// 234 AC | ||
export const YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:AC|AD|p\\.\\s*C(?:hr?)?\\.\\s*n\\.)|[1-2][0-9]{3}|[5-9][0-9])`; | ||
export function parseYear(match: string): number { | ||
if (/BE/i.test(match)) { | ||
// Buddhist Era | ||
match = match.replace(/BE/i, ""); | ||
return parseInt(match) - 543; | ||
} | ||
if (/BC/i.test(match)) { | ||
// Before Christ | ||
if (/AC/i.test(match)) { | ||
match = match.replace(/BC/i, ""); | ||
@@ -158,4 +145,4 @@ return -parseInt(match); | ||
if (/AD/i.test(match)) { | ||
match = match.replace(/AD/i, ""); | ||
if (/AD/i.test(match) || /C/i.test(match)) { | ||
match = match.replace(/[^\d]+/i, ""); | ||
return parseInt(match); | ||
@@ -162,0 +149,0 @@ } |
@@ -10,2 +10,5 @@ import { includeCommonConfiguration } from "../../configurations"; | ||
import FRMergeDateRangeRefiner from "./refiners/FRMergeDateRangeRefiner"; | ||
import FRWeekdayParser from "./parsers/FRWeekdayParser"; | ||
import FRSpecificTimeExpressionParser from "./parsers/FRSpecificTimeExpressionParser"; | ||
import FRMonthNameLittleEndianParser from "./parsers/FRMonthNameLittleEndianParser"; | ||
@@ -34,3 +37,9 @@ // Shortcuts | ||
{ | ||
parsers: [new SlashDateFormatParser(littleEndian), new FRTimeExpressionParser()], | ||
parsers: [ | ||
new SlashDateFormatParser(littleEndian), | ||
new FRMonthNameLittleEndianParser(), | ||
new FRTimeExpressionParser(), | ||
new FRSpecificTimeExpressionParser(), | ||
new FRWeekdayParser(), | ||
], | ||
refiners: [new FRMergeDateTimeRefiner(), new FRMergeDateRangeRefiner()], | ||
@@ -37,0 +46,0 @@ }, |
@@ -10,3 +10,3 @@ import { Parser, ParsingContext } from "../../../chrono"; | ||
innerPattern(context: ParsingContext): RegExp { | ||
return /(cet?)?\s*(matin|soir|après-midi|aprem)(?=\W|$)/i; | ||
return /(cet?)?\s*(matin|soir|après-midi|aprem|a midi|à minuit)(?=\W|$)/i; | ||
} | ||
@@ -23,2 +23,3 @@ | ||
component.imply("minute", 0); | ||
component.imply("meridiem", Meridiem.PM); | ||
break; | ||
@@ -29,2 +30,3 @@ | ||
component.imply("minute", 0); | ||
component.imply("meridiem", Meridiem.PM); | ||
break; | ||
@@ -35,3 +37,15 @@ | ||
component.imply("minute", 0); | ||
component.imply("meridiem", Meridiem.AM); | ||
break; | ||
case "a midi": | ||
component.imply("hour", 12); | ||
component.imply("minute", 0); | ||
component.imply("meridiem", Meridiem.AM); | ||
break; | ||
case "à minuit": | ||
component.imply("hour", 0); | ||
component.imply("meridiem", Meridiem.AM); | ||
break; | ||
} | ||
@@ -38,0 +52,0 @@ |
import { AbstractTimeExpressionParser } from "../../../common/parsers/AbstractTimeExpressionParser"; | ||
import { ParsingComponents, ParsingResult } from "../../../results"; | ||
import { ParsingContext } from "../../../chrono"; | ||
@@ -11,2 +13,11 @@ export default class FRTimeExpressionParser extends AbstractTimeExpressionParser { | ||
} | ||
extractPrimaryTimeComponents(context: ParsingContext, match: RegExpMatchArray): ParsingComponents | null { | ||
// This looks more like a year e.g. 2020 | ||
if (match[0].match(/^\s*\d{4}\s*$/)) { | ||
return null; | ||
} | ||
return super.extractPrimaryTimeComponents(context, match); | ||
} | ||
} |
@@ -13,4 +13,4 @@ /* | ||
patternBetween(): RegExp { | ||
return /^\s*(à|a|\\-)\s*$/i; | ||
return /^\s*(à|a|-)\s*$/i; | ||
} | ||
} |
import { Parser, ParsingContext } from "../../../chrono"; | ||
import { toHankaku } from "../constants"; | ||
import { findYearClosestToRef } from "../../../calculation/yearCalculation"; | ||
import { findYearClosestToRef } from "../../../calculation/years"; | ||
@@ -5,0 +5,0 @@ import dayjs from "dayjs"; |
@@ -66,2 +66,7 @@ import { Component, ParsedComponents, ParsedResult } from "./index"; | ||
delete(component: Component) { | ||
delete this.knownValues[component]; | ||
delete this.impliedValues[component]; | ||
} | ||
clone(): ParsingComponents { | ||
@@ -68,0 +73,0 @@ const component = new ParsingComponents(new Date()); |
@@ -302,18 +302,2 @@ import * as chrono from "../../src/"; | ||
}); | ||
testSingleCase(chrono, "11 at night", new Date(2016, 10 - 1, 1, 8), (result, text) => { | ||
expect(result.text).toBe(text); | ||
expect(result.start.get("year")).toBe(2016); | ||
expect(result.start.get("month")).toBe(10); | ||
expect(result.start.get("day")).toBe(1); | ||
expect(result.start.get("hour")).toBe(23); | ||
}); | ||
testSingleCase(chrono, "11 tonight", new Date(2016, 10 - 1, 1, 8), (result, text) => { | ||
expect(result.text).toBe(text); | ||
expect(result.start.get("year")).toBe(2016); | ||
expect(result.start.get("month")).toBe(10); | ||
expect(result.start.get("day")).toBe(1); | ||
expect(result.start.get("hour")).toBe(23); | ||
}); | ||
}); | ||
@@ -320,0 +304,0 @@ |
@@ -95,6 +95,5 @@ import * as chrono from "../../src"; | ||
var resultDate = result.start.date(); | ||
var expectDate = new Date(8, 8 - 1, 10, 12); | ||
const expectDate = new Date(8, 8 - 1, 10, 12); | ||
expectDate.setFullYear(8); | ||
expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime()); | ||
expect(result.start).toBeDate(expectDate); | ||
}); | ||
@@ -105,3 +104,2 @@ | ||
expect(result.start).not.toBeNull(); | ||
expect(result.start.get("year")).toBe(2013); | ||
@@ -116,3 +114,2 @@ expect(result.start.get("month")).toBe(1); | ||
testSingleCase(chrono, "Sun, Mar. 6, 2016", new Date(2012, 7, 10), (result) => { | ||
expect(result.start).not.toBeNull(); | ||
expect(result.start.get("year")).toBe(2016); | ||
@@ -124,3 +121,2 @@ expect(result.start.get("month")).toBe(3); | ||
testSingleCase(chrono, "Sun, March 6, 2016", new Date(2012, 7, 10), (result) => { | ||
expect(result.start).not.toBeNull(); | ||
expect(result.start.get("year")).toBe(2016); | ||
@@ -132,3 +128,2 @@ expect(result.start.get("month")).toBe(3); | ||
testSingleCase(chrono, "Sun., March 6, 2016", new Date(2012, 7, 10), (result) => { | ||
expect(result.start).not.toBeNull(); | ||
expect(result.start.get("year")).toBe(2016); | ||
@@ -140,3 +135,2 @@ expect(result.start.get("month")).toBe(3); | ||
testSingleCase(chrono, "Sunday, March 6, 2016", new Date(2012, 7, 10), (result) => { | ||
expect(result.start).not.toBeNull(); | ||
expect(result.start.get("year")).toBe(2016); | ||
@@ -148,3 +142,2 @@ expect(result.start.get("month")).toBe(3); | ||
testSingleCase(chrono, "Sunday, March 6, 2016", new Date(2012, 7, 10), (result) => { | ||
expect(result.start).not.toBeNull(); | ||
expect(result.start.get("year")).toBe(2016); | ||
@@ -157,3 +150,3 @@ expect(result.start.get("month")).toBe(3); | ||
expect(result.text).toBe("Sunday, March, 6th 2016"); | ||
expect(result.start).not.toBeNull(); | ||
expect(result.start.get("year")).toBe(2016); | ||
@@ -163,2 +156,10 @@ expect(result.start.get("month")).toBe(3); | ||
}); | ||
testSingleCase(chrono, "Wed, Jan 20th, 2016 ", new Date(2012, 7, 10), (result) => { | ||
expect(result.text).toBe("Wed, Jan 20th, 2016"); | ||
expect(result.start.get("year")).toBe(2016); | ||
expect(result.start.get("month")).toBe(1); | ||
expect(result.start.get("day")).toBe(20); | ||
}); | ||
}); | ||
@@ -165,0 +166,0 @@ |
import * as chrono from "../../src"; | ||
import { testSingleCase, testUnexpectedResult, testWithExpectedDate } from "../test_util"; | ||
test("Test - Parsing Offset Expression", function () { | ||
testSingleCase(chrono, " 04/2016 ", new Date(2012, 7, 10), (result) => { | ||
expect(result.index).toBe(4); | ||
expect(result.text).toBe("04/2016"); | ||
}); | ||
}); | ||
test("Test - Single Expression", function () { | ||
@@ -5,0 +12,0 @@ testSingleCase(chrono, "The event is going ahead (04/2016)", new Date(2012, 7, 10), (result) => { |
@@ -126,2 +126,12 @@ import * as chrono from "../../src"; | ||
}); | ||
testSingleCase(chrono.fr, "a midi", (result, text) => { | ||
expect(result.text).toBe(text); | ||
expect(result.start.get("hour")).toBe(12); | ||
}); | ||
testSingleCase(chrono.fr, "à minuit", (result, text) => { | ||
expect(result.text).toBe(text); | ||
expect(result.start.get("hour")).toBe(0); | ||
}); | ||
}); | ||
@@ -156,14 +166,14 @@ | ||
// testSingleCase(chrono.fr, "La deadline est demain matin 11h", new Date(2012, 7, 10, 12), (result) => { | ||
// expect(result.index).toBe(16); | ||
// expect(result.text).toBe("demain matin 11h"); | ||
// | ||
// expect(result.start).not.toBeNull(); | ||
// expect(result.start.get("year")).toBe(2012); | ||
// expect(result.start.get("month")).toBe(8); | ||
// expect(result.start.get("day")).toBe(11); | ||
// expect(result.start.get("hour")).toBe(11); | ||
// | ||
// expect(result.start).toBeDate(new Date(2012, 7, 11, 11)); | ||
// }); | ||
testSingleCase(chrono.fr, "La deadline est demain matin 11h", new Date(2012, 7, 10, 12), (result) => { | ||
expect(result.index).toBe(16); | ||
expect(result.text).toBe("demain matin 11h"); | ||
expect(result.start).not.toBeNull(); | ||
expect(result.start.get("year")).toBe(2012); | ||
expect(result.start.get("month")).toBe(8); | ||
expect(result.start.get("day")).toBe(11); | ||
expect(result.start.get("hour")).toBe(11); | ||
expect(result.start).toBeDate(new Date(2012, 7, 11, 11)); | ||
}); | ||
}); | ||
@@ -170,0 +180,0 @@ |
@@ -32,19 +32,19 @@ import * as chrono from "../../src"; | ||
}); | ||
// | ||
// test("Test - Single Expression with weekday", function () { | ||
// testSingleCase(chrono.fr, "lundi 8/2/2016", new Date(2012, 7, 10), (result) => { | ||
// expect(result.text).toBe("lundi 8/2/2016"); | ||
// expect(result.start).toBeDate(new Date(2016, 2 - 1, 8, 12)); | ||
// }); | ||
// | ||
// testSingleCase(chrono.fr, "samedi 9/2/20 ", new Date(2012, 7, 10), (result) => { | ||
// expect(result.index).toBe(0); | ||
// expect(result.text).toBe("samedi 9/2/20"); | ||
// | ||
// expect(result.start.get("year")).toBe(2020); | ||
// expect(result.start.get("month")).toBe(2); | ||
// expect(result.start.get("day")).toBe(9); | ||
// | ||
// expect(result.start).toBeDate(new Date(2020, 2 - 1, 9, 12)); | ||
// }); | ||
// }); | ||
test("Test - Single Expression with weekday", function () { | ||
testSingleCase(chrono.fr, "lundi 8/2/2016", new Date(2012, 7, 10), (result) => { | ||
expect(result.text).toBe("lundi 8/2/2016"); | ||
expect(result.start).toBeDate(new Date(2016, 2 - 1, 8, 12)); | ||
}); | ||
testSingleCase(chrono.fr, "samedi 9/2/20 ", new Date(2012, 7, 10), (result) => { | ||
expect(result.index).toBe(0); | ||
expect(result.text).toBe("samedi 9/2/20"); | ||
expect(result.start.get("year")).toBe(2020); | ||
expect(result.start.get("month")).toBe(2); | ||
expect(result.start.get("day")).toBe(9); | ||
expect(result.start).toBeDate(new Date(2020, 2 - 1, 9, 12)); | ||
}); | ||
}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
474295
197
10822
0