chrono-node
Version:
A natural language date parser in Javascript
66 lines • 2.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const AbstractParserWithWordBoundary_1 = require("../../../../common/parsers/AbstractParserWithWordBoundary");
const constants_1 = require("../constants");
const PATTERN = new RegExp("(?<prefix>上|下|这)(?:个)?(?:星期|礼拜|周)(?<weekday>" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")");
class ZHHansRelationWeekdayParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const result = context.createParsingResult(match.index, match[0]);
const dayOfWeek = match.groups.weekday;
const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek];
if (offset === undefined)
return null;
let modifier = null;
const prefix = match.groups.prefix;
if (prefix == "上") {
modifier = "last";
}
else if (prefix == "下") {
modifier = "next";
}
else if (prefix == "这") {
modifier = "this";
}
const date = new Date(context.refDate.getTime());
let startMomentFixed = false;
const refOffset = date.getDay();
if (modifier == "last" || modifier == "past") {
date.setDate(date.getDate() + (offset - 7 - refOffset));
startMomentFixed = true;
}
else if (modifier == "next") {
date.setDate(date.getDate() + (offset + 7 - refOffset));
startMomentFixed = true;
}
else if (modifier == "this") {
date.setDate(date.getDate() + (offset - refOffset));
}
else {
let diff = offset - refOffset;
if (Math.abs(diff - 7) < Math.abs(diff)) {
diff -= 7;
}
if (Math.abs(diff + 7) < Math.abs(diff)) {
diff += 7;
}
date.setDate(date.getDate() + diff);
}
result.start.assign("weekday", offset);
if (startMomentFixed) {
result.start.assign("day", date.getDate());
result.start.assign("month", date.getMonth() + 1);
result.start.assign("year", date.getFullYear());
}
else {
result.start.imply("day", date.getDate());
result.start.imply("month", date.getMonth() + 1);
result.start.imply("year", date.getFullYear());
}
return result;
}
}
exports.default = ZHHansRelationWeekdayParser;
//# sourceMappingURL=ZHHansRelationWeekdayParser.js.map