chrono-node
Advanced tools
Comparing version 2.2.0 to 2.2.1
@@ -12,3 +12,3 @@ import { Parser, ParsingContext } from "../../chrono"; | ||
extractFollowingTimeComponents(context: ParsingContext, match: RegExpMatchArray, result: ParsingResult): null | ParsingComponents; | ||
private static checkAndReturnStartTime; | ||
private static checkAndReturnWithoutFollowingPattern; | ||
} |
@@ -65,3 +65,3 @@ "use strict"; | ||
match[0].match(/^\s*([+-])\s*\d{3,4}$/)) { | ||
return AbstractTimeExpressionParser.checkAndReturnStartTime(result); | ||
return AbstractTimeExpressionParser.checkAndReturnWithoutFollowingPattern(result); | ||
} | ||
@@ -234,6 +234,17 @@ result.end = this.extractFollowingTimeComponents(context, match, result); | ||
} | ||
static checkAndReturnStartTime(result) { | ||
static checkAndReturnWithoutFollowingPattern(result) { | ||
if (result.text.match(/^\d$/)) { | ||
return null; | ||
} | ||
const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)$/); | ||
if (endingWithNumbers) { | ||
const endingNumbers = endingWithNumbers[1]; | ||
if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { | ||
return null; | ||
} | ||
const endingNumberVal = parseInt(endingNumbers); | ||
if (endingNumberVal > 24) { | ||
return null; | ||
} | ||
} | ||
return result; | ||
@@ -240,0 +251,0 @@ } |
@@ -5,4 +5,4 @@ import { ParsingContext } from "../../../chrono"; | ||
export default class ENTimeUnitWithinFormatParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp; | ||
innerPattern(context: ParsingContext): RegExp; | ||
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents; | ||
} |
@@ -7,4 +7,6 @@ "use strict"; | ||
class ENTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
innerPattern() { | ||
return new RegExp(`(?:within|in|for)\\s*(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?` + | ||
innerPattern(context) { | ||
const prefix = context.option.forwardDate ? "" : "(?:within|in|for)\\s*"; | ||
return new RegExp(prefix + | ||
`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?` + | ||
"(" + | ||
@@ -11,0 +13,0 @@ constants_1.TIME_UNITS_PATTERN + |
@@ -191,3 +191,3 @@ "use strict"; | ||
const SINGLE_TIME_UNIT_PATTERN_NO_CAPTURE = SINGLE_TIME_UNIT_PATTERN.replace(/\((?!\?)/g, "(?:"); | ||
exports.TIME_UNITS_PATTERN = `(?:(?:about|around)\\s*)?` + | ||
exports.TIME_UNITS_PATTERN = `(?:(?:binnen|in)\\s*)?` + | ||
`${SINGLE_TIME_UNIT_PATTERN_NO_CAPTURE}\\s*(?:,?\\s*${SINGLE_TIME_UNIT_PATTERN_NO_CAPTURE})*`; | ||
@@ -194,0 +194,0 @@ function parseTimeUnits(timeunitText) { |
@@ -19,2 +19,5 @@ "use strict"; | ||
const NLSlashMonthFormatParser_1 = __importDefault(require("./parsers/NLSlashMonthFormatParser")); | ||
const NLTimeExpressionParser_1 = __importDefault(require("./parsers/NLTimeExpressionParser")); | ||
const NLCasualYearMonthDayParser_1 = __importDefault(require("./parsers/NLCasualYearMonthDayParser")); | ||
const NLCasualDateTimeParser_1 = __importDefault(require("./parsers/NLCasualDateTimeParser")); | ||
exports.casual = new chrono_1.Chrono(createCasualConfiguration()); | ||
@@ -34,2 +37,3 @@ exports.strict = new chrono_1.Chrono(createConfiguration(true)); | ||
option.parsers.unshift(new NLCasualTimeParser_1.default()); | ||
option.parsers.unshift(new NLCasualDateTimeParser_1.default()); | ||
return option; | ||
@@ -42,7 +46,9 @@ } | ||
new SlashDateFormatParser_1.default(littleEndian), | ||
new NLTimeUnitWithinFormatParser_1.default(), | ||
new NLWeekdayParser_1.default(), | ||
new NLMonthNameMiddleEndianParser_1.default(), | ||
new NLMonthNameParser_1.default(), | ||
new NLTimeExpressionParser_1.default(), | ||
new NLTimeUnitWithinFormatParser_1.default(), | ||
new NLSlashMonthFormatParser_1.default(), | ||
new NLWeekdayParser_1.default(), | ||
new NLCasualYearMonthDayParser_1.default(), | ||
], | ||
@@ -49,0 +55,0 @@ refiners: [new NLMergeDateTimeRefiner_1.default(), new NLMergeDateRangeRefiner_1.default()], |
import { ParsingContext } from "../../../chrono"; | ||
import { ParsingComponents, ParsingResult } from "../../../results"; | ||
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; | ||
export default class ENCasualDateParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLCasualDateParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(context: ParsingContext): RegExp; | ||
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents | ParsingResult; | ||
} |
@@ -24,5 +24,5 @@ "use strict"; | ||
const references = __importStar(require("../../../common/casualReferences")); | ||
class ENCasualDateParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
class NLCasualDateParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
innerPattern(context) { | ||
return /(nu|vandaag|vanacht|morgen|morgend|gisteren)(?=\W|$)/i; | ||
return /(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i; | ||
} | ||
@@ -42,4 +42,2 @@ innerExtract(context, match) { | ||
return references.yesterday(context.refDate); | ||
case "vanacht": | ||
return references.tonight(context.refDate); | ||
} | ||
@@ -49,2 +47,2 @@ return component; | ||
} | ||
exports.default = ENCasualDateParser; | ||
exports.default = NLCasualDateParser; |
import { ParsingContext } from "../../../chrono"; | ||
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; | ||
export default class ENCasualTimeParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLCasualTimeParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp; | ||
innerExtract(context: ParsingContext, match: RegExpMatchArray): import("../../../results").ParsingComponents; | ||
} |
@@ -10,5 +10,7 @@ "use strict"; | ||
const dayjs_2 = require("../../../utils/dayjs"); | ||
class ENCasualTimeParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
const DAY_GROUP = 1; | ||
const MOMENT_GROUP = 2; | ||
class NLCasualTimeParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
innerPattern() { | ||
return /(?:this)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i; | ||
return /(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i; | ||
} | ||
@@ -18,3 +20,8 @@ innerExtract(context, match) { | ||
const component = context.createParsingComponents(); | ||
switch (match[1].toLowerCase()) { | ||
if (match[DAY_GROUP] === "deze") { | ||
component.assign("day", context.refDate.getDate()); | ||
component.assign("month", context.refDate.getMonth() + 1); | ||
component.assign("year", context.refDate.getFullYear()); | ||
} | ||
switch (match[MOMENT_GROUP].toLowerCase()) { | ||
case "namiddag": | ||
@@ -50,2 +57,2 @@ case "'s namiddags": | ||
} | ||
exports.default = ENCasualTimeParser; | ||
exports.default = NLCasualTimeParser; |
import { ParsingContext } from "../../../chrono"; | ||
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; | ||
export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLMonthNameMiddleEndianParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp; | ||
innerExtract(context: ParsingContext, match: RegExpMatchArray): import("../../../results").ParsingComponents | import("../../../results").ParsingResult; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const years_1 = require("../../../calculation/years"); | ||
const constants_1 = require("../../en/constants"); | ||
const constants_2 = require("../../en/constants"); | ||
const constants_3 = require("../../en/constants"); | ||
const constants_1 = require("../constants"); | ||
const constants_2 = require("../constants"); | ||
const constants_3 = require("../constants"); | ||
const pattern_1 = require("../../../utils/pattern"); | ||
const AbstractParserWithWordBoundary_1 = require("../../../common/parsers/AbstractParserWithWordBoundary"); | ||
const PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})` + | ||
"(?:-|/|\\s*,?\\s*)" + | ||
`(${constants_2.ORDINAL_NUMBER_PATTERN})(?!\\s*)\\s*` + | ||
"(?:" + | ||
"(?:to|\\-)\\s*" + | ||
`(${constants_2.ORDINAL_NUMBER_PATTERN})\\s*` + | ||
const PATTERN = new RegExp("(?:on\\s*?)?" + | ||
`(${constants_2.ORDINAL_NUMBER_PATTERN})` + | ||
"(?:\\s*" + | ||
"(?:tot|\\-|\\–|until|through|till|\\s)\\s*" + | ||
`(${constants_2.ORDINAL_NUMBER_PATTERN})` + | ||
")?" + | ||
"(?:-|/|\\s*(?:of)?\\s*)" + | ||
"(" + | ||
pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY) + | ||
")" + | ||
"(?:" + | ||
"(?:-|/|\\s*,?\\s*)" + | ||
`(${constants_3.YEAR_PATTERN})` + | ||
"(?:-|/|,?\\s*)" + | ||
`(${constants_3.YEAR_PATTERN}(?![^\\s]\\d))` + | ||
")?" + | ||
"(?=\\W|$)(?!\\:\\d)", "i"); | ||
const MONTH_NAME_GROUP = 1; | ||
const DATE_GROUP = 2; | ||
const DATE_TO_GROUP = 3; | ||
"(?=\\W|$)", "i"); | ||
const MONTH_NAME_GROUP = 3; | ||
const DATE_GROUP = 1; | ||
const DATE_TO_GROUP = 2; | ||
const YEAR_GROUP = 4; | ||
class ENMonthNameMiddleEndianParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
class NLMonthNameMiddleEndianParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
innerPattern() { | ||
@@ -33,2 +36,3 @@ return PATTERN; | ||
if (day > 31) { | ||
match.index = match.index + match[DATE_GROUP].length; | ||
return null; | ||
@@ -59,2 +63,2 @@ } | ||
} | ||
exports.default = ENMonthNameMiddleEndianParser; | ||
exports.default = NLMonthNameMiddleEndianParser; |
import { ParsingContext } from "../../../chrono"; | ||
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; | ||
export default class ENMonthNameParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLMonthNameParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp; | ||
innerExtract(context: ParsingContext, match: RegExpMatchArray): import("../../../results").ParsingComponents; | ||
} |
@@ -9,4 +9,4 @@ "use strict"; | ||
const PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})` + | ||
"\\s*" + | ||
"(?:" + | ||
`\\s*` + | ||
`(?:` + | ||
`[,-]?\\s*(${constants_2.YEAR_PATTERN})?` + | ||
@@ -17,3 +17,3 @@ ")?" + | ||
const YEAR_GROUP = 2; | ||
class ENMonthNameParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
class NLMonthNameParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
innerPattern() { | ||
@@ -23,5 +23,2 @@ return PATTERN; | ||
innerExtract(context, match) { | ||
if (match[0].length <= 3) { | ||
return null; | ||
} | ||
const components = context.createParsingComponents(); | ||
@@ -43,2 +40,2 @@ components.imply("day", 1); | ||
} | ||
exports.default = ENMonthNameParser; | ||
exports.default = NLMonthNameParser; |
import { ParsingContext } from "../../../chrono"; | ||
import { ParsingComponents } from "../../../results"; | ||
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; | ||
export default class ENSlashMonthFormatParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLSlashMonthFormatParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp; | ||
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents; | ||
} |
@@ -7,3 +7,3 @@ "use strict"; | ||
const YEAR_GROUP = 2; | ||
class ENSlashMonthFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
class NLSlashMonthFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
innerPattern() { | ||
@@ -18,2 +18,2 @@ return PATTERN; | ||
} | ||
exports.default = ENSlashMonthFormatParser; | ||
exports.default = NLSlashMonthFormatParser; |
import { ParsingContext } from "../../../chrono"; | ||
import { ParsingComponents } from "../../../results"; | ||
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; | ||
export default class ENTimeUnitWithinFormatParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLTimeUnitWithinFormatParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp; | ||
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../../en/constants"); | ||
const constants_1 = require("../constants"); | ||
const results_1 = require("../../../results"); | ||
const AbstractParserWithWordBoundary_1 = require("../../../common/parsers/AbstractParserWithWordBoundary"); | ||
class ENTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
class NLTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
innerPattern() { | ||
return new RegExp(`(?:binnen|in)\\s*` + "(" + constants_1.TIME_UNITS_PATTERN + ")" + `(?=\\W|$)`, "i"); | ||
return new RegExp(`(?:binnen|in|binnen de|voor)\\s*` + "(" + constants_1.TIME_UNITS_PATTERN + ")" + `(?=\\W|$)`, "i"); | ||
} | ||
@@ -15,2 +15,2 @@ innerExtract(context, match) { | ||
} | ||
exports.default = ENTimeUnitWithinFormatParser; | ||
exports.default = NLTimeUnitWithinFormatParser; |
import { ParsingContext } from "../../../chrono"; | ||
import { ParsingComponents } from "../../../results"; | ||
import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; | ||
export default class ENWeekdayParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLWeekdayParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp; | ||
innerExtract(context: ParsingContext, match: RegExpMatchArray): ParsingComponents; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../../en/constants"); | ||
const constants_1 = require("../../nl/constants"); | ||
const pattern_1 = require("../../../utils/pattern"); | ||
@@ -8,7 +8,5 @@ const AbstractParserWithWordBoundary_1 = require("../../../common/parsers/AbstractParserWithWordBoundary"); | ||
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" + | ||
"(?:on\\s*?)?" + | ||
"(?:(this|last|past|next)\\s*)?" + | ||
"(?:op\\s*?)?" + | ||
"(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?" + | ||
`(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})` + | ||
"(?:\\s*(?:\\,|\\)|\\)))?" + | ||
"(?:\\s*(this|last|past|next)\\s*week)?" + | ||
"(?=\\W|$)", "i"); | ||
@@ -18,3 +16,3 @@ const PREFIX_GROUP = 1; | ||
const POSTFIX_GROUP = 3; | ||
class ENWeekdayParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
class NLWeekdayParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { | ||
innerPattern() { | ||
@@ -32,9 +30,9 @@ return PATTERN; | ||
let modifier = null; | ||
if (modifierWord == "last" || modifierWord == "past") { | ||
if (modifierWord == "vorige") { | ||
modifier = "last"; | ||
} | ||
else if (modifierWord == "next") { | ||
else if (modifierWord == "volgende") { | ||
modifier = "next"; | ||
} | ||
else if (modifierWord == "this") { | ||
else if (modifierWord == "deze") { | ||
modifier = "this"; | ||
@@ -51,2 +49,2 @@ } | ||
} | ||
exports.default = ENWeekdayParser; | ||
exports.default = NLWeekdayParser; |
@@ -9,5 +9,5 @@ "use strict"; | ||
patternBetween() { | ||
return new RegExp("^\\s*(om|na|voor|,|-)?\\s*$"); | ||
return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$"); | ||
} | ||
} | ||
exports.default = NLMergeDateTimeRefiner; |
@@ -18,3 +18,3 @@ { | ||
"license": "MIT", | ||
"version": "2.2.0", | ||
"version": "2.2.1", | ||
"directories": { | ||
@@ -21,0 +21,0 @@ "source": "./src", |
@@ -83,3 +83,3 @@ import { Parser, ParsingContext } from "../../chrono"; | ||
) { | ||
return AbstractTimeExpressionParser.checkAndReturnStartTime(result); | ||
return AbstractTimeExpressionParser.checkAndReturnWithoutFollowingPattern(result); | ||
} | ||
@@ -289,3 +289,3 @@ | ||
private static checkAndReturnStartTime(result) { | ||
private static checkAndReturnWithoutFollowingPattern(result) { | ||
// Single digit (e.g "1") should not be counted as time expression | ||
@@ -296,4 +296,21 @@ if (result.text.match(/^\d$/)) { | ||
// If it ends only with numbers or dots | ||
const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)$/); | ||
if (endingWithNumbers) { | ||
const endingNumbers: string = endingWithNumbers[1]; | ||
// If it ends only with dot single digit, e.g. "at 1.2" | ||
if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { | ||
return null; | ||
} | ||
// If it ends only with numbers above 24, e.g. "at 25" | ||
const endingNumberVal = parseInt(endingNumbers); | ||
if (endingNumberVal > 24) { | ||
return null; | ||
} | ||
} | ||
return result; | ||
} | ||
} |
@@ -7,5 +7,7 @@ import { TIME_UNITS_PATTERN, parseTimeUnits } from "../constants"; | ||
export default class ENTimeUnitWithinFormatParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp { | ||
innerPattern(context: ParsingContext): RegExp { | ||
const prefix = context.option.forwardDate ? "" : "(?:within|in|for)\\s*"; | ||
return new RegExp( | ||
`(?:within|in|for)\\s*(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?` + | ||
prefix + | ||
`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?` + | ||
"(" + | ||
@@ -12,0 +14,0 @@ TIME_UNITS_PATTERN + |
@@ -216,3 +216,3 @@ import { OpUnitType } from "dayjs"; | ||
export const TIME_UNITS_PATTERN = | ||
`(?:(?:about|around)\\s*)?` + | ||
`(?:(?:binnen|in)\\s*)?` + | ||
`${SINGLE_TIME_UNIT_PATTERN_NO_CAPTURE}\\s*(?:,?\\s*${SINGLE_TIME_UNIT_PATTERN_NO_CAPTURE})*`; | ||
@@ -219,0 +219,0 @@ |
@@ -14,2 +14,5 @@ import { includeCommonConfiguration } from "../../configurations"; | ||
import NLSlashMonthFormatParser from "./parsers/NLSlashMonthFormatParser"; | ||
import NLTimeExpressionParser from "./parsers/NLTimeExpressionParser"; | ||
import NLCasualYearMonthDayParser from "./parsers/NLCasualYearMonthDayParser"; | ||
import NLCasualDateTimeParser from "./parsers/NLCasualDateTimeParser"; | ||
@@ -32,2 +35,3 @@ // Shortcuts | ||
option.parsers.unshift(new NLCasualTimeParser()); | ||
option.parsers.unshift(new NLCasualDateTimeParser()); | ||
return option; | ||
@@ -41,7 +45,9 @@ } | ||
new SlashDateFormatParser(littleEndian), | ||
new NLTimeUnitWithinFormatParser(), | ||
new NLWeekdayParser(), | ||
new NLMonthNameMiddleEndianParser(), | ||
new NLMonthNameParser(), | ||
new NLTimeExpressionParser(), | ||
new NLTimeUnitWithinFormatParser(), | ||
new NLSlashMonthFormatParser(), | ||
new NLWeekdayParser(), | ||
new NLCasualYearMonthDayParser(), | ||
], | ||
@@ -48,0 +54,0 @@ refiners: [new NLMergeDateTimeRefiner(), new NLMergeDateRangeRefiner()], |
@@ -6,5 +6,5 @@ import { ParsingContext } from "../../../chrono"; | ||
export default class ENCasualDateParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLCasualDateParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(context: ParsingContext): RegExp { | ||
return /(nu|vandaag|vanacht|morgen|morgend|gisteren)(?=\W|$)/i; | ||
return /(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i; | ||
} | ||
@@ -29,5 +29,2 @@ | ||
return references.yesterday(context.refDate); | ||
case "vanacht": | ||
return references.tonight(context.refDate); | ||
} | ||
@@ -34,0 +31,0 @@ |
@@ -7,5 +7,8 @@ import { ParsingContext } from "../../../chrono"; | ||
export default class ENCasualTimeParser extends AbstractParserWithWordBoundaryChecking { | ||
const DAY_GROUP = 1; | ||
const MOMENT_GROUP = 2; | ||
export default class NLCasualTimeParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern() { | ||
return /(?:this)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i; | ||
return /(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i; | ||
} | ||
@@ -17,3 +20,9 @@ | ||
switch (match[1].toLowerCase()) { | ||
if (match[DAY_GROUP] === "deze") { | ||
component.assign("day", context.refDate.getDate()); | ||
component.assign("month", context.refDate.getMonth() + 1); | ||
component.assign("year", context.refDate.getFullYear()); | ||
} | ||
switch (match[MOMENT_GROUP].toLowerCase()) { | ||
case "namiddag": | ||
@@ -20,0 +29,0 @@ case "'s namiddags": |
import { ParsingContext } from "../../../chrono"; | ||
import { findYearClosestToRef } from "../../../calculation/years"; | ||
import { MONTH_DICTIONARY } from "../../en/constants"; | ||
import { ORDINAL_NUMBER_PATTERN, parseOrdinalNumberPattern } from "../../en/constants"; | ||
import { YEAR_PATTERN, parseYear } from "../../en/constants"; | ||
import { MONTH_DICTIONARY } from "../constants"; | ||
import { ORDINAL_NUMBER_PATTERN, parseOrdinalNumberPattern } from "../constants"; | ||
import { YEAR_PATTERN, parseYear } from "../constants"; | ||
import { matchAnyPattern } from "../../../utils/pattern"; | ||
@@ -10,33 +10,41 @@ import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; | ||
const PATTERN = new RegExp( | ||
`(${matchAnyPattern(MONTH_DICTIONARY)})` + | ||
"(?:-|/|\\s*,?\\s*)" + | ||
`(${ORDINAL_NUMBER_PATTERN})(?!\\s*)\\s*` + | ||
"(?:" + | ||
"(?:to|\\-)\\s*" + | ||
`(${ORDINAL_NUMBER_PATTERN})\\s*` + | ||
"(?:on\\s*?)?" + | ||
`(${ORDINAL_NUMBER_PATTERN})` + | ||
"(?:\\s*" + | ||
"(?:tot|\\-|\\–|until|through|till|\\s)\\s*" + | ||
`(${ORDINAL_NUMBER_PATTERN})` + | ||
")?" + | ||
"(?:-|/|\\s*(?:of)?\\s*)" + | ||
"(" + | ||
matchAnyPattern(MONTH_DICTIONARY) + | ||
")" + | ||
"(?:" + | ||
"(?:-|/|\\s*,?\\s*)" + | ||
`(${YEAR_PATTERN})` + | ||
"(?:-|/|,?\\s*)" + | ||
`(${YEAR_PATTERN}(?![^\\s]\\d))` + | ||
")?" + | ||
"(?=\\W|$)(?!\\:\\d)", | ||
"(?=\\W|$)", | ||
"i" | ||
); | ||
const MONTH_NAME_GROUP = 1; | ||
const DATE_GROUP = 2; | ||
const DATE_TO_GROUP = 3; | ||
const MONTH_NAME_GROUP = 3; | ||
const DATE_GROUP = 1; | ||
const DATE_TO_GROUP = 2; | ||
const YEAR_GROUP = 4; | ||
/** | ||
* The parser for parsing US's date format that begin with month's name. | ||
* - January 13 | ||
* - January 13, 2012 | ||
* - January 13 - 15, 2012 | ||
* Note: Watch out for: | ||
* - January 12:00 | ||
* - January 12.44 | ||
* - January 1222344 | ||
* The parser for parsing BE/NL date format with month's name in full writing | ||
* - 1 januari 2019 | ||
* - 01 januari 2019 | ||
* - 10 januari 2019 | ||
* - 13 januari | ||
* - 10 - 25 maart | ||
* - 10 - 25 maart 2019 | ||
* - 1 aug 2019 | ||
* - 1 september 200 voor Christus | ||
* - 1 september 2002 na Christus | ||
* - 19 januari 87 | ||
* - 12de juli 2013 | ||
* - 1ste november 2013 | ||
*/ | ||
export default class ENMonthNameMiddleEndianParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLMonthNameMiddleEndianParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp { | ||
@@ -50,2 +58,4 @@ return PATTERN; | ||
if (day > 31) { | ||
// e.g. "[96 Aug]" => "9[6 Aug]", we need to shift away from the next number | ||
match.index = match.index + match[DATE_GROUP].length; | ||
return null; | ||
@@ -52,0 +62,0 @@ } |
@@ -10,4 +10,4 @@ import { MONTH_DICTIONARY } from "../constants"; | ||
`(${matchAnyPattern(MONTH_DICTIONARY)})` + | ||
"\\s*" + | ||
"(?:" + | ||
`\\s*` + | ||
`(?:` + | ||
`[,-]?\\s*(${YEAR_PATTERN})?` + | ||
@@ -24,7 +24,7 @@ ")?" + | ||
* The parser for parsing month name and year. | ||
* - January, 2012 | ||
* - January 2012 | ||
* - January | ||
* - januari, 2012 | ||
* - januari 2012 | ||
* - januari | ||
*/ | ||
export default class ENMonthNameParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLMonthNameParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp { | ||
@@ -35,6 +35,2 @@ return PATTERN; | ||
innerExtract(context: ParsingContext, match: RegExpMatchArray) { | ||
if (match[0].length <= 3) { | ||
return null; | ||
} | ||
const components = context.createParsingComponents(); | ||
@@ -41,0 +37,0 @@ components.imply("day", 1); |
@@ -15,3 +15,3 @@ import { ParsingContext } from "../../../chrono"; | ||
*/ | ||
export default class ENSlashMonthFormatParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLSlashMonthFormatParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp { | ||
@@ -18,0 +18,0 @@ return PATTERN; |
@@ -1,2 +0,2 @@ | ||
import { TIME_UNITS_PATTERN, parseTimeUnits } from "../../en/constants"; | ||
import { TIME_UNITS_PATTERN, parseTimeUnits } from "../constants"; | ||
import { ParsingContext } from "../../../chrono"; | ||
@@ -6,5 +6,5 @@ import { ParsingComponents } from "../../../results"; | ||
export default class ENTimeUnitWithinFormatParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLTimeUnitWithinFormatParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp { | ||
return new RegExp(`(?:binnen|in)\\s*` + "(" + TIME_UNITS_PATTERN + ")" + `(?=\\W|$)`, "i"); | ||
return new RegExp(`(?:binnen|in|binnen de|voor)\\s*` + "(" + TIME_UNITS_PATTERN + ")" + `(?=\\W|$)`, "i"); | ||
} | ||
@@ -11,0 +11,0 @@ |
import { ParsingContext } from "../../../chrono"; | ||
import { ParsingComponents } from "../../../results"; | ||
import { WEEKDAY_DICTIONARY } from "../../en/constants"; | ||
import { WEEKDAY_DICTIONARY } from "../../nl/constants"; | ||
import { matchAnyPattern } from "../../../utils/pattern"; | ||
@@ -10,7 +10,5 @@ import { AbstractParserWithWordBoundaryChecking } from "../../../common/parsers/AbstractParserWithWordBoundary"; | ||
"(?:(?:\\,|\\(|\\()\\s*)?" + | ||
"(?:on\\s*?)?" + | ||
"(?:(this|last|past|next)\\s*)?" + | ||
"(?:op\\s*?)?" + | ||
"(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?" + | ||
`(${matchAnyPattern(WEEKDAY_DICTIONARY)})` + | ||
"(?:\\s*(?:\\,|\\)|\\)))?" + | ||
"(?:\\s*(this|last|past|next)\\s*week)?" + | ||
"(?=\\W|$)", | ||
@@ -24,3 +22,3 @@ "i" | ||
export default class ENWeekdayParser extends AbstractParserWithWordBoundaryChecking { | ||
export default class NLWeekdayParser extends AbstractParserWithWordBoundaryChecking { | ||
innerPattern(): RegExp { | ||
@@ -40,7 +38,7 @@ return PATTERN; | ||
let modifier = null; | ||
if (modifierWord == "last" || modifierWord == "past") { | ||
if (modifierWord == "vorige") { | ||
modifier = "last"; | ||
} else if (modifierWord == "next") { | ||
} else if (modifierWord == "volgende") { | ||
modifier = "next"; | ||
} else if (modifierWord == "this") { | ||
} else if (modifierWord == "deze") { | ||
modifier = "this"; | ||
@@ -47,0 +45,0 @@ } |
@@ -11,4 +11,4 @@ import AbstractMergeDateTimeRefiner from "../../../common/refiners/AbstractMergeDateTimeRefiner"; | ||
patternBetween(): RegExp { | ||
return new RegExp("^\\s*(om|na|voor|,|-)?\\s*$"); | ||
return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$"); | ||
} | ||
} |
@@ -231,3 +231,21 @@ import * as chrono from "../../src"; | ||
test("Test - Parsing negative cases", function () { | ||
test("Test - Parsing causal positive cases", function () { | ||
testSingleCase(chrono.casual, "at 1", (result) => { | ||
expect(result.text).toBe("at 1"); | ||
expect(result.start.get("hour")).toBe(1); | ||
}); | ||
testSingleCase(chrono.casual, "at 12", (result) => { | ||
expect(result.text).toBe("at 12"); | ||
expect(result.start.get("hour")).toBe(12); | ||
}); | ||
testSingleCase(chrono.casual, "at 12.30", (result) => { | ||
expect(result.text).toBe("at 12.30"); | ||
expect(result.start.get("hour")).toBe(12); | ||
expect(result.start.get("minute")).toBe(30); | ||
}); | ||
}); | ||
test("Test - Parsing negative cases : [year-like] pattern", function () { | ||
testUnexpectedResult(chrono, "2020"); | ||
@@ -237,1 +255,9 @@ | ||
}); | ||
test("Test - Parsing negative cases : 'at [some numbers]'", function () { | ||
testUnexpectedResult(chrono, "I'm at 101,194 points!"); | ||
testUnexpectedResult(chrono, "I'm at 101 points!"); | ||
testUnexpectedResult(chrono, "I'm at 10.1"); | ||
}); |
@@ -314,2 +314,17 @@ import * as chrono from "../../src"; | ||
}); | ||
testSingleCase(chrono, "give it 2 months", new Date(2016, 10 - 1, 1, 14, 52), { forwardDate: true }, (result) => { | ||
expect(result.text).toBe("2 months"); | ||
expect(result.start.get("year")).toBe(2016); | ||
expect(result.start.get("month")).toBe(12); | ||
expect(result.start.get("day")).toBe(1); | ||
expect(result.start.get("hour")).toBe(14); | ||
expect(result.start.get("minute")).toBe(52); | ||
expect(result.start.isCertain("year")).toBeTruthy(); | ||
expect(result.start.isCertain("month")).toBeTruthy(); | ||
expect(result.start.isCertain("day")).toBeFalsy(); | ||
expect(result.start.isCertain("hour")).toBeFalsy(); | ||
expect(result.start.isCertain("minute")).toBeFalsy(); | ||
}); | ||
}); |
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
787206
337
17763