|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
var obsidian = require('obsidian');
|
|
|
|
|
|
|
|
|
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
|
|
|
|
|
|
|
|
var obsidian__default = /*#__PURE__*/_interopDefaultLegacy(obsidian);
|
|
|
|
|
|
|
|
|
|
/*! *****************************************************************************
|
|
|
|
|
Copyright (c) Microsoft Corporation.
|
|
|
|
|
|
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
|
purpose with or without fee is hereby granted.
|
|
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
|
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
|
|
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
|
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
|
|
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
|
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
|
PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
***************************************************************************** */
|
|
|
|
|
/* global Reflect, Promise */
|
|
|
|
|
|
|
|
|
|
var extendStatics = function(d, b) {
|
|
|
|
|
extendStatics = Object.setPrototypeOf ||
|
|
|
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
|
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
|
|
|
return extendStatics(d, b);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function __extends(d, b) {
|
|
|
|
|
if (typeof b !== "function" && b !== null)
|
|
|
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
|
|
|
extendStatics(d, b);
|
|
|
|
|
function __() { this.constructor = d; }
|
|
|
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function __awaiter(thisArg, _arguments, P, generator) {
|
|
|
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
|
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
|
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
|
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
|
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
|
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function __generator(thisArg, body) {
|
|
|
|
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
|
|
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
|
|
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
|
|
|
function step(op) {
|
|
|
|
|
if (f) throw new TypeError("Generator is already executing.");
|
|
|
|
|
while (_) try {
|
|
|
|
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
|
|
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
|
|
|
switch (op[0]) {
|
|
|
|
|
case 0: case 1: t = op; break;
|
|
|
|
|
case 4: _.label++; return { value: op[1], done: false };
|
|
|
|
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
|
|
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
|
|
|
default:
|
|
|
|
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
|
|
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
|
|
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
|
|
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
|
|
|
if (t[2]) _.ops.pop();
|
|
|
|
|
_.trys.pop(); continue;
|
|
|
|
|
}
|
|
|
|
|
op = body.call(thisArg, _);
|
|
|
|
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
|
|
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
|
|
|
|
|
|
|
|
function getDefaultExportFromCjs (x) {
|
|
|
|
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function createCommonjsModule(fn, basedir, module) {
|
|
|
|
|
return module = {
|
|
|
|
|
path: basedir,
|
|
|
|
|
exports: {},
|
|
|
|
|
require: function (path, base) {
|
|
|
|
|
return commonjsRequire(path, (base === undefined || base === null) ? module.path : base);
|
|
|
|
|
}
|
|
|
|
|
}, fn(module, module.exports), module.exports;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function commonjsRequire () {
|
|
|
|
|
throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var main = createCommonjsModule(function (module, exports) {
|
|
|
|
|
|
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const DEFAULT_DAILY_NOTE_FORMAT = "YYYY-MM-DD";
|
|
|
|
|
const DEFAULT_WEEKLY_NOTE_FORMAT = "gggg-[W]ww";
|
|
|
|
|
const DEFAULT_MONTHLY_NOTE_FORMAT = "YYYY-MM";
|
|
|
|
|
|
|
|
|
|
function shouldUsePeriodicNotesSettings(periodicity) {
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
const periodicNotes = window.app.plugins.getPlugin("periodic-notes");
|
|
|
|
|
return periodicNotes && periodicNotes.settings?.[periodicity]?.enabled;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Read the user settings for the `daily-notes` plugin
|
|
|
|
|
* to keep behavior of creating a new note in-sync.
|
|
|
|
|
*/
|
|
|
|
|
function getDailyNoteSettings() {
|
|
|
|
|
try {
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
const { internalPlugins, plugins } = window.app;
|
|
|
|
|
if (shouldUsePeriodicNotesSettings("daily")) {
|
|
|
|
|
const { format, folder, template } = plugins.getPlugin("periodic-notes")?.settings?.daily || {};
|
|
|
|
|
return {
|
|
|
|
|
format: format || DEFAULT_DAILY_NOTE_FORMAT,
|
|
|
|
|
folder: folder?.trim() || "",
|
|
|
|
|
template: template?.trim() || "",
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
const { folder, format, template } = internalPlugins.getPluginById("daily-notes")?.instance?.options || {};
|
|
|
|
|
return {
|
|
|
|
|
format: format || DEFAULT_DAILY_NOTE_FORMAT,
|
|
|
|
|
folder: folder?.trim() || "",
|
|
|
|
|
template: template?.trim() || "",
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
catch (err) {
|
|
|
|
|
console.info("No custom daily note settings found!", err);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Read the user settings for the `weekly-notes` plugin
|
|
|
|
|
* to keep behavior of creating a new note in-sync.
|
|
|
|
|
*/
|
|
|
|
|
function getWeeklyNoteSettings() {
|
|
|
|
|
try {
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
const pluginManager = window.app.plugins;
|
|
|
|
|
const calendarSettings = pluginManager.getPlugin("calendar")?.options;
|
|
|
|
|
const periodicNotesSettings = pluginManager.getPlugin("periodic-notes")
|
|
|
|
|
?.settings?.weekly;
|
|
|
|
|
if (shouldUsePeriodicNotesSettings("weekly")) {
|
|
|
|
|
return {
|
|
|
|
|
format: periodicNotesSettings.format || DEFAULT_WEEKLY_NOTE_FORMAT,
|
|
|
|
|
folder: periodicNotesSettings.folder?.trim() || "",
|
|
|
|
|
template: periodicNotesSettings.template?.trim() || "",
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
const settings = calendarSettings || {};
|
|
|
|
|
return {
|
|
|
|
|
format: settings.weeklyNoteFormat || DEFAULT_WEEKLY_NOTE_FORMAT,
|
|
|
|
|
folder: settings.weeklyNoteFolder?.trim() || "",
|
|
|
|
|
template: settings.weeklyNoteTemplate?.trim() || "",
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
catch (err) {
|
|
|
|
|
console.info("No custom weekly note settings found!", err);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Read the user settings for the `periodic-notes` plugin
|
|
|
|
|
* to keep behavior of creating a new note in-sync.
|
|
|
|
|
*/
|
|
|
|
|
function getMonthlyNoteSettings() {
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
const pluginManager = window.app.plugins;
|
|
|
|
|
try {
|
|
|
|
|
const settings = (shouldUsePeriodicNotesSettings("monthly") &&
|
|
|
|
|
pluginManager.getPlugin("periodic-notes")?.settings?.monthly) ||
|
|
|
|
|
{};
|
|
|
|
|
return {
|
|
|
|
|
format: settings.format || DEFAULT_MONTHLY_NOTE_FORMAT,
|
|
|
|
|
folder: settings.folder?.trim() || "",
|
|
|
|
|
template: settings.template?.trim() || "",
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
catch (err) {
|
|
|
|
|
console.info("No custom monthly note settings found!", err);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Credit: @creationix/path.js
|
|
|
|
|
function join(...partSegments) {
|
|
|
|
|
// Split the inputs into a list of path commands.
|
|
|
|
|
let parts = [];
|
|
|
|
|
for (let i = 0, l = partSegments.length; i < l; i++) {
|
|
|
|
|
parts = parts.concat(partSegments[i].split("/"));
|
|
|
|
|
}
|
|
|
|
|
// Interpret the path commands to get the new resolved path.
|
|
|
|
|
const newParts = [];
|
|
|
|
|
for (let i = 0, l = parts.length; i < l; i++) {
|
|
|
|
|
const part = parts[i];
|
|
|
|
|
// Remove leading and trailing slashes
|
|
|
|
|
// Also remove "." segments
|
|
|
|
|
if (!part || part === ".")
|
|
|
|
|
continue;
|
|
|
|
|
// Push new path segments.
|
|
|
|
|
else
|
|
|
|
|
newParts.push(part);
|
|
|
|
|
}
|
|
|
|
|
// Preserve the initial slash if there was one.
|
|
|
|
|
if (parts[0] === "")
|
|
|
|
|
newParts.unshift("");
|
|
|
|
|
// Turn back into a single string path.
|
|
|
|
|
return newParts.join("/");
|
|
|
|
|
}
|
|
|
|
|
function basename(fullPath) {
|
|
|
|
|
let base = fullPath.substring(fullPath.lastIndexOf("/") + 1);
|
|
|
|
|
if (base.lastIndexOf(".") != -1)
|
|
|
|
|
base = base.substring(0, base.lastIndexOf("."));
|
|
|
|
|
return base;
|
|
|
|
|
}
|
|
|
|
|
async function ensureFolderExists(path) {
|
|
|
|
|
const dirs = path.replace(/\\/g, "/").split("/");
|
|
|
|
|
dirs.pop(); // remove basename
|
|
|
|
|
if (dirs.length) {
|
|
|
|
|
const dir = join(...dirs);
|
|
|
|
|
if (!window.app.vault.getAbstractFileByPath(dir)) {
|
|
|
|
|
await window.app.vault.createFolder(dir);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
async function getNotePath(directory, filename) {
|
|
|
|
|
if (!filename.endsWith(".md")) {
|
|
|
|
|
filename += ".md";
|
|
|
|
|
}
|
|
|
|
|
const path = obsidian__default['default'].normalizePath(join(directory, filename));
|
|
|
|
|
await ensureFolderExists(path);
|
|
|
|
|
return path;
|
|
|
|
|
}
|
|
|
|
|
async function getTemplateInfo(template) {
|
|
|
|
|
const { metadataCache, vault } = window.app;
|
|
|
|
|
const templatePath = obsidian__default['default'].normalizePath(template);
|
|
|
|
|
if (templatePath === "/") {
|
|
|
|
|
return Promise.resolve(["", null]);
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
const templateFile = metadataCache.getFirstLinkpathDest(templatePath, "");
|
|
|
|
|
const contents = await vault.cachedRead(templateFile);
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
const IFoldInfo = window.app.foldManager.load(templateFile);
|
|
|
|
|
return [contents, IFoldInfo];
|
|
|
|
|
}
|
|
|
|
|
catch (err) {
|
|
|
|
|
console.error(`Failed to read the daily note template '${templatePath}'`, err);
|
|
|
|
|
new obsidian__default['default'].Notice("Failed to read the daily note template");
|
|
|
|
|
return ["", null];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* dateUID is a way of weekly identifying daily/weekly/monthly notes.
|
|
|
|
|
* They are prefixed with the granularity to avoid ambiguity.
|
|
|
|
|
*/
|
|
|
|
|
function getDateUID(date, granularity = "day") {
|
|
|
|
|
const ts = date.clone().startOf(granularity).format();
|
|
|
|
|
return `${granularity}-${ts}`;
|
|
|
|
|
}
|
|
|
|
|
function removeEscapedCharacters(format) {
|
|
|
|
|
return format.replace(/\[[^\]]*\]/g, ""); // remove everything within brackets
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* XXX: When parsing dates that contain both week numbers and months,
|
|
|
|
|
* Moment choses to ignore the week numbers. For the week dateUID, we
|
|
|
|
|
* want the opposite behavior. Strip the MMM from the format to patch.
|
|
|
|
|
*/
|
|
|
|
|
function isFormatAmbiguous(format, granularity) {
|
|
|
|
|
if (granularity === "week") {
|
|
|
|
|
const cleanFormat = removeEscapedCharacters(format);
|
|
|
|
|
return (/w{1,2}/i.test(cleanFormat) &&
|
|
|
|
|
(/M{1,4}/.test(cleanFormat) || /D{1,4}/.test(cleanFormat)));
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
function getDateFromFile(file, granularity) {
|
|
|
|
|
return getDateFromFilename(file.basename, granularity);
|
|
|
|
|
}
|
|
|
|
|
function getDateFromPath(path, granularity) {
|
|
|
|
|
return getDateFromFilename(basename(path), granularity);
|
|
|
|
|
}
|
|
|
|
|
function getDateFromFilename(filename, granularity) {
|
|
|
|
|
const getSettings = {
|
|
|
|
|
day: getDailyNoteSettings,
|
|
|
|
|
week: getWeeklyNoteSettings,
|
|
|
|
|
month: getMonthlyNoteSettings,
|
|
|
|
|
};
|
|
|
|
|
const format = getSettings[granularity]().format.split("/").pop();
|
|
|
|
|
const noteDate = window.moment(filename, format, true);
|
|
|
|
|
if (!noteDate.isValid()) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (isFormatAmbiguous(format, granularity)) {
|
|
|
|
|
if (granularity === "week") {
|
|
|
|
|
const cleanFormat = removeEscapedCharacters(format);
|
|
|
|
|
if (/w{1,2}/i.test(cleanFormat)) {
|
|
|
|
|
return window.moment(filename,
|
|
|
|
|
// If format contains week, remove day & month formatting
|
|
|
|
|
format.replace(/M{1,4}/g, "").replace(/D{1,4}/g, ""), false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return noteDate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class DailyNotesFolderMissingError extends Error {
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* This function mimics the behavior of the daily-notes plugin
|
|
|
|
|
* so it will replace {{date}}, {{title}}, and {{time}} with the
|
|
|
|
|
* formatted timestamp.
|
|
|
|
|
*
|
|
|
|
|
* Note: it has an added bonus that it's not 'today' specific.
|
|
|
|
|
*/
|
|
|
|
|
async function createDailyNote(date) {
|
|
|
|
|
const app = window.app;
|
|
|
|
|
const { vault } = app;
|
|
|
|
|
const moment = window.moment;
|
|
|
|
|
const { template, format, folder } = getDailyNoteSettings();
|
|
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
|
|
const filename = date.format(format);
|
|
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
|
|
try {
|
|
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents
|
|
|
|
|
.replace(/{{\s*date\s*}}/gi, filename)
|
|
|
|
|
.replace(/{{\s*time\s*}}/gi, moment().format("HH:mm"))
|
|
|
|
|
.replace(/{{\s*title\s*}}/gi, filename)
|
|
|
|
|
.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
|
|
const now = moment();
|
|
|
|
|
const currentDate = date.clone().set({
|
|
|
|
|
hour: now.get("hour"),
|
|
|
|
|
minute: now.get("minute"),
|
|
|
|
|
second: now.get("second"),
|
|
|
|
|
});
|
|
|
|
|
if (calc) {
|
|
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
|
|
}
|
|
|
|
|
if (momentFormat) {
|
|
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
|
|
}
|
|
|
|
|
return currentDate.format(format);
|
|
|
|
|
})
|
|
|
|
|
.replace(/{{\s*yesterday\s*}}/gi, date.clone().subtract(1, "day").format(format))
|
|
|
|
|
.replace(/{{\s*tomorrow\s*}}/gi, date.clone().add(1, "d").format(format)));
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
app.foldManager.save(createdFile, IFoldInfo);
|
|
|
|
|
return createdFile;
|
|
|
|
|
}
|
|
|
|
|
catch (err) {
|
|
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
|
|
new obsidian__default['default'].Notice("Unable to create new file.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function getDailyNote(date, dailyNotes) {
|
|
|
|
|
return dailyNotes[getDateUID(date, "day")] ?? null;
|
|
|
|
|
}
|
|
|
|
|
function getAllDailyNotes() {
|
|
|
|
|
/**
|
|
|
|
|
* Find all daily notes in the daily note folder
|
|
|
|
|
*/
|
|
|
|
|
const { vault } = window.app;
|
|
|
|
|
const { folder } = getDailyNoteSettings();
|
|
|
|
|
const dailyNotesFolder = vault.getAbstractFileByPath(obsidian__default['default'].normalizePath(folder));
|
|
|
|
|
if (!dailyNotesFolder) {
|
|
|
|
|
throw new DailyNotesFolderMissingError("Failed to find daily notes folder");
|
|
|
|
|
}
|
|
|
|
|
const dailyNotes = {};
|
|
|
|
|
obsidian__default['default'].Vault.recurseChildren(dailyNotesFolder, (note) => {
|
|
|
|
|
if (note instanceof obsidian__default['default'].TFile) {
|
|
|
|
|
const date = getDateFromFile(note, "day");
|
|
|
|
|
if (date) {
|
|
|
|
|
const dateString = getDateUID(date, "day");
|
|
|
|
|
dailyNotes[dateString] = note;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return dailyNotes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class WeeklyNotesFolderMissingError extends Error {
|
|
|
|
|
}
|
|
|
|
|
function getDaysOfWeek() {
|
|
|
|
|
const { moment } = window;
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
let weekStart = moment.localeData()._week.dow;
|
|
|
|
|
const daysOfWeek = [
|
|
|
|
|
"sunday",
|
|
|
|
|
"monday",
|
|
|
|
|
"tuesday",
|
|
|
|
|
"wednesday",
|
|
|
|
|
"thursday",
|
|
|
|
|
"friday",
|
|
|
|
|
"saturday",
|
|
|
|
|
];
|
|
|
|
|
while (weekStart) {
|
|
|
|
|
daysOfWeek.push(daysOfWeek.shift());
|
|
|
|
|
weekStart--;
|
|
|
|
|
}
|
|
|
|
|
return daysOfWeek;
|
|
|
|
|
}
|
|
|
|
|
function getDayOfWeekNumericalValue(dayOfWeekName) {
|
|
|
|
|
return getDaysOfWeek().indexOf(dayOfWeekName.toLowerCase());
|
|
|
|
|
}
|
|
|
|
|
async function createWeeklyNote(date) {
|
|
|
|
|
const { vault } = window.app;
|
|
|
|
|
const { template, format, folder } = getWeeklyNoteSettings();
|
|
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
|
|
const filename = date.format(format);
|
|
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
|
|
try {
|
|
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents
|
|
|
|
|
.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
|
|
const now = window.moment();
|
|
|
|
|
const currentDate = date.clone().set({
|
|
|
|
|
hour: now.get("hour"),
|
|
|
|
|
minute: now.get("minute"),
|
|
|
|
|
second: now.get("second"),
|
|
|
|
|
});
|
|
|
|
|
if (calc) {
|
|
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
|
|
}
|
|
|
|
|
if (momentFormat) {
|
|
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
|
|
}
|
|
|
|
|
return currentDate.format(format);
|
|
|
|
|
})
|
|
|
|
|
.replace(/{{\s*title\s*}}/gi, filename)
|
|
|
|
|
.replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm"))
|
|
|
|
|
.replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi, (_, dayOfWeek, momentFormat) => {
|
|
|
|
|
const day = getDayOfWeekNumericalValue(dayOfWeek);
|
|
|
|
|
return date.weekday(day).format(momentFormat.trim());
|
|
|
|
|
}));
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
window.app.foldManager.save(createdFile, IFoldInfo);
|
|
|
|
|
return createdFile;
|
|
|
|
|
}
|
|
|
|
|
catch (err) {
|
|
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
|
|
new obsidian__default['default'].Notice("Unable to create new file.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function getWeeklyNote(date, weeklyNotes) {
|
|
|
|
|
return weeklyNotes[getDateUID(date, "week")] ?? null;
|
|
|
|
|
}
|
|
|
|
|
function getAllWeeklyNotes() {
|
|
|
|
|
const weeklyNotes = {};
|
|
|
|
|
if (!appHasWeeklyNotesPluginLoaded()) {
|
|
|
|
|
return weeklyNotes;
|
|
|
|
|
}
|
|
|
|
|
const { vault } = window.app;
|
|
|
|
|
const { folder } = getWeeklyNoteSettings();
|
|
|
|
|
const weeklyNotesFolder = vault.getAbstractFileByPath(obsidian__default['default'].normalizePath(folder));
|
|
|
|
|
if (!weeklyNotesFolder) {
|
|
|
|
|
throw new WeeklyNotesFolderMissingError("Failed to find weekly notes folder");
|
|
|
|
|
}
|
|
|
|
|
obsidian__default['default'].Vault.recurseChildren(weeklyNotesFolder, (note) => {
|
|
|
|
|
if (note instanceof obsidian__default['default'].TFile) {
|
|
|
|
|
const date = getDateFromFile(note, "week");
|
|
|
|
|
if (date) {
|
|
|
|
|
const dateString = getDateUID(date, "week");
|
|
|
|
|
weeklyNotes[dateString] = note;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return weeklyNotes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class MonthlyNotesFolderMissingError extends Error {
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* This function mimics the behavior of the daily-notes plugin
|
|
|
|
|
* so it will replace {{date}}, {{title}}, and {{time}} with the
|
|
|
|
|
* formatted timestamp.
|
|
|
|
|
*
|
|
|
|
|
* Note: it has an added bonus that it's not 'today' specific.
|
|
|
|
|
*/
|
|
|
|
|
async function createMonthlyNote(date) {
|
|
|
|
|
const { vault } = window.app;
|
|
|
|
|
const { template, format, folder } = getMonthlyNoteSettings();
|
|
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
|
|
const filename = date.format(format);
|
|
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
|
|
try {
|
|
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents
|
|
|
|
|
.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
|
|
const now = window.moment();
|
|
|
|
|
const currentDate = date.clone().set({
|
|
|
|
|
hour: now.get("hour"),
|
|
|
|
|
minute: now.get("minute"),
|
|
|
|
|
second: now.get("second"),
|
|
|
|
|
});
|
|
|
|
|
if (calc) {
|
|
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
|
|
}
|
|
|
|
|
if (momentFormat) {
|
|
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
|
|
}
|
|
|
|
|
return currentDate.format(format);
|
|
|
|
|
})
|
|
|
|
|
.replace(/{{\s*date\s*}}/gi, filename)
|
|
|
|
|
.replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm"))
|
|
|
|
|
.replace(/{{\s*title\s*}}/gi, filename));
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
window.app.foldManager.save(createdFile, IFoldInfo);
|
|
|
|
|
return createdFile;
|
|
|
|
|
}
|
|
|
|
|
catch (err) {
|
|
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
|
|
new obsidian__default['default'].Notice("Unable to create new file.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function getMonthlyNote(date, monthlyNotes) {
|
|
|
|
|
return monthlyNotes[getDateUID(date, "month")] ?? null;
|
|
|
|
|
}
|
|
|
|
|
function getAllMonthlyNotes() {
|
|
|
|
|
const monthlyNotes = {};
|
|
|
|
|
if (!appHasMonthlyNotesPluginLoaded()) {
|
|
|
|
|
return monthlyNotes;
|
|
|
|
|
}
|
|
|
|
|
const { vault } = window.app;
|
|
|
|
|
const { folder } = getMonthlyNoteSettings();
|
|
|
|
|
const monthlyNotesFolder = vault.getAbstractFileByPath(obsidian__default['default'].normalizePath(folder));
|
|
|
|
|
if (!monthlyNotesFolder) {
|
|
|
|
|
throw new MonthlyNotesFolderMissingError("Failed to find monthly notes folder");
|
|
|
|
|
}
|
|
|
|
|
obsidian__default['default'].Vault.recurseChildren(monthlyNotesFolder, (note) => {
|
|
|
|
|
if (note instanceof obsidian__default['default'].TFile) {
|
|
|
|
|
const date = getDateFromFile(note, "month");
|
|
|
|
|
if (date) {
|
|
|
|
|
const dateString = getDateUID(date, "month");
|
|
|
|
|
monthlyNotes[dateString] = note;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return monthlyNotes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function appHasDailyNotesPluginLoaded() {
|
|
|
|
|
const { app } = window;
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
const dailyNotesPlugin = app.internalPlugins.plugins["daily-notes"];
|
|
|
|
|
if (dailyNotesPlugin && dailyNotesPlugin.enabled) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
const periodicNotes = app.plugins.getPlugin("periodic-notes");
|
|
|
|
|
return periodicNotes && periodicNotes.settings?.daily?.enabled;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* XXX: "Weekly Notes" live in either the Calendar plugin or the periodic-notes plugin.
|
|
|
|
|
* Check both until the weekly notes feature is removed from the Calendar plugin.
|
|
|
|
|
*/
|
|
|
|
|
function appHasWeeklyNotesPluginLoaded() {
|
|
|
|
|
const { app } = window;
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
if (app.plugins.getPlugin("calendar")) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
const periodicNotes = app.plugins.getPlugin("periodic-notes");
|
|
|
|
|
return periodicNotes && periodicNotes.settings?.weekly?.enabled;
|
|
|
|
|
}
|
|
|
|
|
function appHasMonthlyNotesPluginLoaded() {
|
|
|
|
|
const { app } = window;
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
const periodicNotes = app.plugins.getPlugin("periodic-notes");
|
|
|
|
|
return periodicNotes && periodicNotes.settings?.monthly?.enabled;
|
|
|
|
|
}
|
|
|
|
|
function getPeriodicNoteSettings(granularity) {
|
|
|
|
|
const getSettings = {
|
|
|
|
|
day: getDailyNoteSettings,
|
|
|
|
|
week: getWeeklyNoteSettings,
|
|
|
|
|
month: getMonthlyNoteSettings,
|
|
|
|
|
}[granularity];
|
|
|
|
|
return getSettings();
|
|
|
|
|
}
|
|
|
|
|
function createPeriodicNote(granularity, date) {
|
|
|
|
|
const createFn = {
|
|
|
|
|
day: createDailyNote,
|
|
|
|
|
month: createMonthlyNote,
|
|
|
|
|
week: createWeeklyNote,
|
|
|
|
|
};
|
|
|
|
|
return createFn[granularity](date);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
exports.DEFAULT_DAILY_NOTE_FORMAT = DEFAULT_DAILY_NOTE_FORMAT;
|
|
|
|
|
exports.DEFAULT_MONTHLY_NOTE_FORMAT = DEFAULT_MONTHLY_NOTE_FORMAT;
|
|
|
|
|
exports.DEFAULT_WEEKLY_NOTE_FORMAT = DEFAULT_WEEKLY_NOTE_FORMAT;
|
|
|
|
|
exports.appHasDailyNotesPluginLoaded = appHasDailyNotesPluginLoaded;
|
|
|
|
|
exports.appHasMonthlyNotesPluginLoaded = appHasMonthlyNotesPluginLoaded;
|
|
|
|
|
exports.appHasWeeklyNotesPluginLoaded = appHasWeeklyNotesPluginLoaded;
|
|
|
|
|
exports.createDailyNote = createDailyNote;
|
|
|
|
|
exports.createMonthlyNote = createMonthlyNote;
|
|
|
|
|
exports.createPeriodicNote = createPeriodicNote;
|
|
|
|
|
exports.createWeeklyNote = createWeeklyNote;
|
|
|
|
|
exports.getAllDailyNotes = getAllDailyNotes;
|
|
|
|
|
exports.getAllMonthlyNotes = getAllMonthlyNotes;
|
|
|
|
|
exports.getAllWeeklyNotes = getAllWeeklyNotes;
|
|
|
|
|
exports.getDailyNote = getDailyNote;
|
|
|
|
|
exports.getDailyNoteSettings = getDailyNoteSettings;
|
|
|
|
|
exports.getDateFromFile = getDateFromFile;
|
|
|
|
|
exports.getDateFromPath = getDateFromPath;
|
|
|
|
|
exports.getDateUID = getDateUID;
|
|
|
|
|
exports.getMonthlyNote = getMonthlyNote;
|
|
|
|
|
exports.getMonthlyNoteSettings = getMonthlyNoteSettings;
|
|
|
|
|
exports.getPeriodicNoteSettings = getPeriodicNoteSettings;
|
|
|
|
|
exports.getTemplateInfo = getTemplateInfo;
|
|
|
|
|
exports.getWeeklyNote = getWeeklyNote;
|
|
|
|
|
exports.getWeeklyNoteSettings = getWeeklyNoteSettings;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var DatePickerModal = /** @class */ (function (_super) {
|
|
|
|
|
__extends(DatePickerModal, _super);
|
|
|
|
|
function DatePickerModal(app, plugin) {
|
|
|
|
|
var _this = _super.call(this, app) || this;
|
|
|
|
|
_this.plugin = plugin;
|
|
|
|
|
_this.activeView = _this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
|
|
|
if (_this.activeView) {
|
|
|
|
|
_this.activeEditor = _this.activeView.sourceMode.cmEditor;
|
|
|
|
|
_this.activeCursor = _this.activeEditor.getCursor();
|
|
|
|
|
}
|
|
|
|
|
return _this;
|
|
|
|
|
}
|
|
|
|
|
DatePickerModal.prototype.onOpen = function () {
|
|
|
|
|
var _this = this;
|
|
|
|
|
var previewEl;
|
|
|
|
|
var dateInput = "";
|
|
|
|
|
var momentFormat = this.plugin.settings.modalMomentFormat;
|
|
|
|
|
var insertAsLink = this.plugin.settings.modalToggleLink;
|
|
|
|
|
var getDateStr = function () {
|
|
|
|
|
var cleanDateInput = dateInput;
|
|
|
|
|
var shouldIncludeAlias = false;
|
|
|
|
|
if (dateInput.endsWith("|")) {
|
|
|
|
|
shouldIncludeAlias = true;
|
|
|
|
|
cleanDateInput = dateInput.slice(0, -1);
|
|
|
|
|
}
|
|
|
|
|
var parsedDate = _this.plugin.parseDate(cleanDateInput || "today");
|
|
|
|
|
var parsedDateString = parsedDate.moment.isValid()
|
|
|
|
|
? parsedDate.moment.format(momentFormat)
|
|
|
|
|
: "";
|
|
|
|
|
if (insertAsLink) {
|
|
|
|
|
parsedDateString = shouldIncludeAlias
|
|
|
|
|
? "[[" + parsedDateString + "|" + cleanDateInput + "]]"
|
|
|
|
|
: "[[" + parsedDateString + "]]";
|
|
|
|
|
}
|
|
|
|
|
return parsedDateString;
|
|
|
|
|
};
|
|
|
|
|
this.contentEl.createEl("form", {}, function (formEl) {
|
|
|
|
|
var dateInputEl = new obsidian.Setting(formEl)
|
|
|
|
|
.setName("Date")
|
|
|
|
|
.setDesc(getDateStr())
|
|
|
|
|
.addText(function (textEl) {
|
|
|
|
|
textEl.setPlaceholder("Today");
|
|
|
|
|
textEl.onChange(function (value) {
|
|
|
|
|
dateInput = value;
|
|
|
|
|
previewEl.setText(getDateStr());
|
|
|
|
|
});
|
|
|
|
|
window.setTimeout(function () { return textEl.inputEl.focus(); }, 10);
|
|
|
|
|
});
|
|
|
|
|
previewEl = dateInputEl.descEl;
|
|
|
|
|
new obsidian.Setting(formEl)
|
|
|
|
|
.setName("Date Format")
|
|
|
|
|
.setDesc("Moment format to be used")
|
|
|
|
|
.addMomentFormat(function (momentEl) {
|
|
|
|
|
momentEl.setPlaceholder("YYYY-MM-DD HH:mm");
|
|
|
|
|
momentEl.setValue(momentFormat);
|
|
|
|
|
momentEl.onChange(function (value) {
|
|
|
|
|
momentFormat = value.trim() || "YYYY-MM-DD HH:mm";
|
|
|
|
|
_this.plugin.settings.modalMomentFormat = momentFormat;
|
|
|
|
|
_this.plugin.saveSettings();
|
|
|
|
|
previewEl.setText(getDateStr());
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
new obsidian.Setting(formEl).setName("Add as link?").addToggle(function (toggleEl) {
|
|
|
|
|
toggleEl
|
|
|
|
|
.setValue(_this.plugin.settings.modalToggleLink)
|
|
|
|
|
.onChange(function (value) {
|
|
|
|
|
insertAsLink = value;
|
|
|
|
|
_this.plugin.settings.modalToggleLink = insertAsLink;
|
|
|
|
|
_this.plugin.saveSettings();
|
|
|
|
|
previewEl.setText(getDateStr());
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
formEl.createDiv("modal-button-container", function (buttonContainerEl) {
|
|
|
|
|
buttonContainerEl
|
|
|
|
|
.createEl("button", { attr: { type: "button" }, text: "Never mind" })
|
|
|
|
|
.addEventListener("click", function () { return _this.close(); });
|
|
|
|
|
buttonContainerEl.createEl("button", {
|
|
|
|
|
attr: { type: "submit" },
|
|
|
|
|
cls: "mod-cta",
|
|
|
|
|
text: "Insert Date",
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
formEl.addEventListener("submit", function (e) {
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
_this.close();
|
|
|
|
|
_this.plugin.insertDateString(getDateStr(), _this.activeEditor, _this.activeCursor);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
return DatePickerModal;
|
|
|
|
|
}(obsidian.Modal));
|
|
|
|
|
|
|
|
|
|
var pattern = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.matchAnyPattern = exports.extractTerms = exports.repeatedTimeunitPattern = void 0;
|
|
|
|
|
function repeatedTimeunitPattern(prefix, singleTimeunitPattern) {
|
|
|
|
|
const singleTimeunitPatternNoCapture = singleTimeunitPattern.replace(/\((?!\?)/g, "(?:");
|
|
|
|
|
return `${prefix}${singleTimeunitPatternNoCapture}\\s*(?:,?\\s{0,5}${singleTimeunitPatternNoCapture}){0,10}`;
|
|
|
|
|
}
|
|
|
|
|
exports.repeatedTimeunitPattern = repeatedTimeunitPattern;
|
|
|
|
|
function extractTerms(dictionary) {
|
|
|
|
|
let keys;
|
|
|
|
|
if (dictionary instanceof Array) {
|
|
|
|
|
keys = [...dictionary];
|
|
|
|
|
}
|
|
|
|
|
else if (dictionary instanceof Map) {
|
|
|
|
|
keys = Array.from(dictionary.keys());
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
keys = Object.keys(dictionary);
|
|
|
|
|
}
|
|
|
|
|
return keys;
|
|
|
|
|
}
|
|
|
|
|
exports.extractTerms = extractTerms;
|
|
|
|
|
function matchAnyPattern(dictionary) {
|
|
|
|
|
const joinedTerms = extractTerms(dictionary)
|
|
|
|
|
.sort((a, b) => b.length - a.length)
|
|
|
|
|
.join("|")
|
|
|
|
|
.replace(/\./g, "\\.");
|
|
|
|
|
return `(?:${joinedTerms})`;
|
|
|
|
|
}
|
|
|
|
|
exports.matchAnyPattern = matchAnyPattern;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var dayjs_min = createCommonjsModule(function (module, exports) {
|
|
|
|
|
!function(t,e){module.exports=e();}(commonjsGlobal,function(){var t="millisecond",e="second",n="minute",r="hour",i="day",s="week",u="month",a="quarter",o="year",f="date",h=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,c=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,d={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},$=function(t,e,n){var r=String(t);return !r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},l={s:$,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return (e<=0?"+":"-")+$(r,2,"0")+":"+$(i,2,"0")},m:function t(e,n){if(e.date()<n.date())return -t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,u),s=n-i<0,a=e.clone().add(r+(s?-1:1),u);return +(-(r+(n-i)/(s?i-a:a-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(h){return {M:u,y:o,w:s,d:i,D:f,h:r,m:n,s:e,ms:t,Q:a}[h]||String(h||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},y="en",M={};M[y]=d;var m=function(t){return t instanceof S},D=function(t,e,n){var r;if(!t)return y;if("string"==typeof t)M[t]&&(r=t),e&&(M[t]=e,r=t);else {var i=t.name;M[i]=t,r=i;}return !n&&r&&(y=r),r||!n&&y},v=function(t,e){if(m(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new S(n)},g=l;g.l=D,g.i=m,g.w=function(t,e){return v(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var S=function(){function d(t){this.$L=D(t.locale,null,!0),this.parse(t);}var $=d.prototype;return $.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(g.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var r=e.match(h);if(r){var i=r[2]-1||0,s=(r[7]||"0").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.$x=t.x||{},this.init();},$.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds();},$.$utils=function(){return g},$.isValid=function(){return !("Invalid Date"===this.$d.toString())},$.isSame=function(t,e){var n=v(t);return this.startOf(e)<=n&&n<=this.endOf(e)},$.isAfter=function(t,e){return v(t)<this.startOf(e)},$.isBefore=function(t,e){return this.endOf(e)<v(t)},$.$g=function(t,e,n){return g.u(t)?this[e]:this.set(n,t)},$.unix=function(){return Math.floor(this.valueOf()/1e3)},$.valueOf=function(){return this.$d.getTime()},$.startOf=function(t,a){var h=this,c=!!g.u(a)||a,d=g.p(t),$=function(t,e){var n=g.w(h.$u?Date.UTC(h.$y,e,t):new Date(h.$y,e,t),h);return c?n:n.endOf(i)},l=function(t,e){return g.w(h.toDate()[t].apply(h.toDate("s"),(c?[0,0,0,0]:[23,59,59,999]).slice(e)),h)},y=this.$W,M=this.$M,m=this.$D,D="set"+(this.$u?"UTC":"");switch(d){case o:return c?$(1,0):$(31,11);case u:return c?$(1,M):$(0,M+1);case s:var v=this.$locale().weekStart||0,S=(y<v?y+7:y)-v;return $(c?m-S:m+(6-S),M);case i:case f:return l(D+"Hours",0);case r:return l(D+"Minutes",1);case n:return l(D+"Seconds",2);case e:return l(D+"Milliseconds",3);default:return this.clone()}},$.endOf=function(t){return this.startOf(t,!1)},$.$set=function(s,a){var h,c=g.p(s),d="set"+(this.$u?"UTC":""),$=(h={},h[i]=d+"Date",h[f]=d+"Date",h[u]=d+"Month",h[o]=d+"FullYear",h[r]=d+"Hours",h[n]=d+"Minutes",h[e]=d+"Seconds",h[t]=d+"Milliseconds",h)[c],l=c===i?this.$D+(a-this.$W):a;if(c===u||c===o){var y=this.clone().set(f,1);y.$d[$](l),y.init(),this.$d=y.set(f,Math.min(this.$D,y.daysInMonth())).$d;}else $&&this.$d[$](l);return this.init(),this},$.set=function(t,e){return this.clone().$set(t,e)},$.get=function(t){return this[g.p(t)]()},$.add=function(t,a){var f,h=this;t=Number(t);var c=g.p(a),d=function(e){var n=v(h);return g.w(n.date(n.date()+Math.r
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var years = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.findYearClosestToRef = exports.findMostLikelyADYear = void 0;
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
function findMostLikelyADYear(yearNumber) {
|
|
|
|
|
if (yearNumber < 100) {
|
|
|
|
|
if (yearNumber > 50) {
|
|
|
|
|
yearNumber = yearNumber + 1900;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
yearNumber = yearNumber + 2000;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return yearNumber;
|
|
|
|
|
}
|
|
|
|
|
exports.findMostLikelyADYear = findMostLikelyADYear;
|
|
|
|
|
function findYearClosestToRef(refDate, day, month) {
|
|
|
|
|
const refMoment = dayjs_1.default(refDate);
|
|
|
|
|
let dateMoment = refMoment;
|
|
|
|
|
dateMoment = dateMoment.month(month - 1);
|
|
|
|
|
dateMoment = dateMoment.date(day);
|
|
|
|
|
dateMoment = dateMoment.year(refMoment.year());
|
|
|
|
|
const nextYear = dateMoment.add(1, "y");
|
|
|
|
|
const lastYear = dateMoment.add(-1, "y");
|
|
|
|
|
if (Math.abs(nextYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) {
|
|
|
|
|
dateMoment = nextYear;
|
|
|
|
|
}
|
|
|
|
|
else if (Math.abs(lastYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) {
|
|
|
|
|
dateMoment = lastYear;
|
|
|
|
|
}
|
|
|
|
|
return dateMoment.year();
|
|
|
|
|
}
|
|
|
|
|
exports.findYearClosestToRef = findYearClosestToRef;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var constants$5 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.FULL_MONTH_NAME_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
};
|
|
|
|
|
exports.FULL_MONTH_NAME_DICTIONARY = {
|
|
|
|
|
january: 1,
|
|
|
|
|
february: 2,
|
|
|
|
|
march: 3,
|
|
|
|
|
april: 4,
|
|
|
|
|
may: 5,
|
|
|
|
|
june: 6,
|
|
|
|
|
july: 7,
|
|
|
|
|
august: 8,
|
|
|
|
|
september: 9,
|
|
|
|
|
october: 10,
|
|
|
|
|
november: 11,
|
|
|
|
|
december: 12,
|
|
|
|
|
};
|
|
|
|
|
exports.MONTH_DICTIONARY = Object.assign(Object.assign({}, exports.FULL_MONTH_NAME_DICTIONARY), { jan: 1, "jan.": 1, feb: 2, "feb.": 2, mar: 3, "mar.": 3, apr: 4, "apr.": 4, jun: 6, "jun.": 6, jul: 7, "jul.": 7, aug: 8, "aug.": 8, sep: 9, "sep.": 9, sept: 9, "sept.": 9, oct: 10, "oct.": 10, nov: 11, "nov.": 11, 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,
|
|
|
|
|
};
|
|
|
|
|
exports.ORDINAL_WORD_DICTIONARY = {
|
|
|
|
|
first: 1,
|
|
|
|
|
second: 2,
|
|
|
|
|
third: 3,
|
|
|
|
|
fourth: 4,
|
|
|
|
|
fifth: 5,
|
|
|
|
|
sixth: 6,
|
|
|
|
|
seventh: 7,
|
|
|
|
|
eighth: 8,
|
|
|
|
|
ninth: 9,
|
|
|
|
|
tenth: 10,
|
|
|
|
|
eleventh: 11,
|
|
|
|
|
twelfth: 12,
|
|
|
|
|
thirteenth: 13,
|
|
|
|
|
fourteenth: 14,
|
|
|
|
|
fifteenth: 15,
|
|
|
|
|
sixteenth: 16,
|
|
|
|
|
seventeenth: 17,
|
|
|
|
|
eighteenth: 18,
|
|
|
|
|
nineteenth: 19,
|
|
|
|
|
twentieth: 20,
|
|
|
|
|
"twenty first": 21,
|
|
|
|
|
"twenty-first": 21,
|
|
|
|
|
"twenty second": 22,
|
|
|
|
|
"twenty-second": 22,
|
|
|
|
|
"twenty third": 23,
|
|
|
|
|
"twenty-third": 23,
|
|
|
|
|
"twenty fourth": 24,
|
|
|
|
|
"twenty-fourth": 24,
|
|
|
|
|
"twenty fifth": 25,
|
|
|
|
|
"twenty-fifth": 25,
|
|
|
|
|
"twenty sixth": 26,
|
|
|
|
|
"twenty-sixth": 26,
|
|
|
|
|
"twenty seventh": 27,
|
|
|
|
|
"twenty-seventh": 27,
|
|
|
|
|
"twenty eighth": 28,
|
|
|
|
|
"twenty-eighth": 28,
|
|
|
|
|
"twenty ninth": 29,
|
|
|
|
|
"twenty-ninth": 29,
|
|
|
|
|
"thirtieth": 30,
|
|
|
|
|
"thirty first": 31,
|
|
|
|
|
"thirty-first": 31,
|
|
|
|
|
};
|
|
|
|
|
exports.TIME_UNIT_DICTIONARY = {
|
|
|
|
|
sec: "second",
|
|
|
|
|
second: "second",
|
|
|
|
|
seconds: "second",
|
|
|
|
|
min: "minute",
|
|
|
|
|
mins: "minute",
|
|
|
|
|
minute: "minute",
|
|
|
|
|
minutes: "minute",
|
|
|
|
|
h: "hour",
|
|
|
|
|
hr: "hour",
|
|
|
|
|
hrs: "hour",
|
|
|
|
|
hour: "hour",
|
|
|
|
|
hours: "hour",
|
|
|
|
|
day: "d",
|
|
|
|
|
days: "d",
|
|
|
|
|
week: "week",
|
|
|
|
|
weeks: "week",
|
|
|
|
|
month: "month",
|
|
|
|
|
months: "month",
|
|
|
|
|
y: "year",
|
|
|
|
|
yr: "year",
|
|
|
|
|
year: "year",
|
|
|
|
|
years: "year",
|
|
|
|
|
};
|
|
|
|
|
exports.NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`;
|
|
|
|
|
function parseNumberPattern(match) {
|
|
|
|
|
const num = match.toLowerCase();
|
|
|
|
|
if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) {
|
|
|
|
|
return exports.INTEGER_WORD_DICTIONARY[num];
|
|
|
|
|
}
|
|
|
|
|
else if (num === "a" || num === "an") {
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
else if (num.match(/few/)) {
|
|
|
|
|
return 3;
|
|
|
|
|
}
|
|
|
|
|
else if (num.match(/half/)) {
|
|
|
|
|
return 0.5;
|
|
|
|
|
}
|
|
|
|
|
else if (num.match(/couple/)) {
|
|
|
|
|
return 2;
|
|
|
|
|
}
|
|
|
|
|
else if (num.match(/several/)) {
|
|
|
|
|
return 7;
|
|
|
|
|
}
|
|
|
|
|
return parseFloat(num);
|
|
|
|
|
}
|
|
|
|
|
exports.parseNumberPattern = parseNumberPattern;
|
|
|
|
|
exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:st|nd|rd|th)?)`;
|
|
|
|
|
function parseOrdinalNumberPattern(match) {
|
|
|
|
|
let num = match.toLowerCase();
|
|
|
|
|
if (exports.ORDINAL_WORD_DICTIONARY[num] !== undefined) {
|
|
|
|
|
return exports.ORDINAL_WORD_DICTIONARY[num];
|
|
|
|
|
}
|
|
|
|
|
num = num.replace(/(?:st|nd|rd|th)$/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])`;
|
|
|
|
|
function parseYear(match) {
|
|
|
|
|
if (/BE/i.test(match)) {
|
|
|
|
|
match = match.replace(/BE/i, "");
|
|
|
|
|
return parseInt(match) - 543;
|
|
|
|
|
}
|
|
|
|
|
if (/BC/i.test(match)) {
|
|
|
|
|
match = match.replace(/BC/i, "");
|
|
|
|
|
return -parseInt(match);
|
|
|
|
|
}
|
|
|
|
|
if (/AD/i.test(match)) {
|
|
|
|
|
match = match.replace(/AD/i, "");
|
|
|
|
|
return parseInt(match);
|
|
|
|
|
}
|
|
|
|
|
const rawYearNumber = parseInt(match);
|
|
|
|
|
return years.findMostLikelyADYear(rawYearNumber);
|
|
|
|
|
}
|
|
|
|
|
exports.parseYear = parseYear;
|
|
|
|
|
const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`;
|
|
|
|
|
const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i");
|
|
|
|
|
exports.TIME_UNITS_PATTERN = pattern.repeatedTimeunitPattern(`(?:(?:about|around)\\s*)?`, SINGLE_TIME_UNIT_PATTERN);
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
exports.parseTimeUnits = parseTimeUnits;
|
|
|
|
|
function collectDateTimeFragment(fragments, match) {
|
|
|
|
|
const num = parseNumberPattern(match[1]);
|
|
|
|
|
const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()];
|
|
|
|
|
fragments[unit] = num;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var quarterOfYear = createCommonjsModule(function (module, exports) {
|
|
|
|
|
!function(t,n){module.exports=n();}(commonjsGlobal,function(){var t="month",n="quarter";return function(r,i){var e=i.prototype;e.quarter=function(t){return this.$utils().u(t)?Math.ceil((this.month()+1)/3):this.month(this.month()%3+3*(t-1))};var u=e.add;e.add=function(r,i){return r=Number(r),this.$utils().p(i)===n?this.add(3*r,t):u.bind(this)(r,i)};var s=e.startOf;e.startOf=function(r,i){var e=this.$utils(),u=!!e.u(i)||i;if(e.p(r)===n){var a=this.quarter()-1;return u?this.month(3*a).startOf(t).startOf("day"):this.month(3*a+2).endOf(t).endOf("day")}return s.bind(this)(r,i)};}});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var dayjs = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.implySimilarTime = exports.assignSimilarTime = exports.assignSimilarDate = exports.assignTheNextDay = void 0;
|
|
|
|
|
function assignTheNextDay(component, targetDayJs) {
|
|
|
|
|
targetDayJs = targetDayJs.add(1, "day");
|
|
|
|
|
assignSimilarDate(component, targetDayJs);
|
|
|
|
|
implySimilarTime(component, targetDayJs);
|
|
|
|
|
}
|
|
|
|
|
exports.assignTheNextDay = assignTheNextDay;
|
|
|
|
|
function assignSimilarDate(component, targetDayJs) {
|
|
|
|
|
component.assign("day", targetDayJs.date());
|
|
|
|
|
component.assign("month", targetDayJs.month() + 1);
|
|
|
|
|
component.assign("year", targetDayJs.year());
|
|
|
|
|
}
|
|
|
|
|
exports.assignSimilarDate = assignSimilarDate;
|
|
|
|
|
function assignSimilarTime(component, targetDayJs) {
|
|
|
|
|
component.assign("hour", targetDayJs.hour());
|
|
|
|
|
component.assign("minute", targetDayJs.minute());
|
|
|
|
|
component.assign("second", targetDayJs.second());
|
|
|
|
|
component.assign("millisecond", targetDayJs.millisecond());
|
|
|
|
|
component.assign("timezoneOffset", targetDayJs.utcOffset());
|
|
|
|
|
}
|
|
|
|
|
exports.assignSimilarTime = assignSimilarTime;
|
|
|
|
|
function implySimilarTime(component, targetDayJs) {
|
|
|
|
|
component.imply("hour", targetDayJs.hour());
|
|
|
|
|
component.imply("minute", targetDayJs.minute());
|
|
|
|
|
component.imply("second", targetDayJs.second());
|
|
|
|
|
component.imply("millisecond", targetDayJs.millisecond());
|
|
|
|
|
component.imply("timezoneOffset", targetDayJs.utcOffset());
|
|
|
|
|
}
|
|
|
|
|
exports.implySimilarTime = implySimilarTime;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var results = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.ParsingResult = exports.ParsingComponents = void 0;
|
|
|
|
|
const quarterOfYear_1 = __importDefault(quarterOfYear);
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
|
|
|
|
|
dayjs_1.default.extend(quarterOfYear_1.default);
|
|
|
|
|
class ParsingComponents {
|
|
|
|
|
constructor(refDate, knownComponents) {
|
|
|
|
|
this.knownValues = {};
|
|
|
|
|
this.impliedValues = {};
|
|
|
|
|
if (knownComponents) {
|
|
|
|
|
for (const key in knownComponents) {
|
|
|
|
|
this.knownValues[key] = knownComponents[key];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const refDayJs = dayjs_1.default(refDate);
|
|
|
|
|
this.imply("day", refDayJs.date());
|
|
|
|
|
this.imply("month", refDayJs.month() + 1);
|
|
|
|
|
this.imply("year", refDayJs.year());
|
|
|
|
|
this.imply("hour", 12);
|
|
|
|
|
this.imply("minute", 0);
|
|
|
|
|
this.imply("second", 0);
|
|
|
|
|
this.imply("millisecond", 0);
|
|
|
|
|
}
|
|
|
|
|
get(component) {
|
|
|
|
|
if (component in this.knownValues) {
|
|
|
|
|
return this.knownValues[component];
|
|
|
|
|
}
|
|
|
|
|
if (component in this.impliedValues) {
|
|
|
|
|
return this.impliedValues[component];
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
isCertain(component) {
|
|
|
|
|
return component in this.knownValues;
|
|
|
|
|
}
|
|
|
|
|
getCertainComponents() {
|
|
|
|
|
return Object.keys(this.knownValues);
|
|
|
|
|
}
|
|
|
|
|
imply(component, value) {
|
|
|
|
|
if (component in this.knownValues) {
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
this.impliedValues[component] = value;
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
assign(component, value) {
|
|
|
|
|
this.knownValues[component] = value;
|
|
|
|
|
delete this.impliedValues[component];
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
delete(component) {
|
|
|
|
|
delete this.knownValues[component];
|
|
|
|
|
delete this.impliedValues[component];
|
|
|
|
|
}
|
|
|
|
|
clone() {
|
|
|
|
|
const component = new ParsingComponents(new Date());
|
|
|
|
|
component.knownValues = {};
|
|
|
|
|
component.impliedValues = {};
|
|
|
|
|
for (const key in this.knownValues) {
|
|
|
|
|
component.knownValues[key] = this.knownValues[key];
|
|
|
|
|
}
|
|
|
|
|
for (const key in this.impliedValues) {
|
|
|
|
|
component.impliedValues[key] = this.impliedValues[key];
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
isOnlyDate() {
|
|
|
|
|
return !this.isCertain("hour") && !this.isCertain("minute") && !this.isCertain("second");
|
|
|
|
|
}
|
|
|
|
|
isOnlyTime() {
|
|
|
|
|
return !this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month");
|
|
|
|
|
}
|
|
|
|
|
isOnlyWeekdayComponent() {
|
|
|
|
|
return this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month");
|
|
|
|
|
}
|
|
|
|
|
isOnlyDayMonthComponent() {
|
|
|
|
|
return this.isCertain("day") && this.isCertain("month") && !this.isCertain("year");
|
|
|
|
|
}
|
|
|
|
|
isValidDate() {
|
|
|
|
|
const date = this.isCertain("timezoneOffset") ? this.dateWithoutTimezoneAdjustment() : this.date();
|
|
|
|
|
if (date.getFullYear() !== this.get("year"))
|
|
|
|
|
return false;
|
|
|
|
|
if (date.getMonth() !== this.get("month") - 1)
|
|
|
|
|
return false;
|
|
|
|
|
if (date.getDate() !== this.get("day"))
|
|
|
|
|
return false;
|
|
|
|
|
if (this.get("hour") != null && date.getHours() != this.get("hour"))
|
|
|
|
|
return false;
|
|
|
|
|
if (this.get("minute") != null && date.getMinutes() != this.get("minute"))
|
|
|
|
|
return false;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
toString() {
|
|
|
|
|
return `[ParsingComponents {knownValues: ${JSON.stringify(this.knownValues)}, impliedValues: ${JSON.stringify(this.impliedValues)}}]`;
|
|
|
|
|
}
|
|
|
|
|
dayjs() {
|
|
|
|
|
return dayjs_1.default(this.date());
|
|
|
|
|
}
|
|
|
|
|
date() {
|
|
|
|
|
const date = this.dateWithoutTimezoneAdjustment();
|
|
|
|
|
return new Date(date.getTime() + this.getTimezoneAdjustmentMinute(date) * 60000);
|
|
|
|
|
}
|
|
|
|
|
dateWithoutTimezoneAdjustment() {
|
|
|
|
|
const date = new Date(this.get("year"), this.get("month") - 1, this.get("day"), this.get("hour"), this.get("minute"), this.get("second"), this.get("millisecond"));
|
|
|
|
|
date.setFullYear(this.get("year"));
|
|
|
|
|
return date;
|
|
|
|
|
}
|
|
|
|
|
getTimezoneAdjustmentMinute(date) {
|
|
|
|
|
var _a;
|
|
|
|
|
date = date !== null && date !== void 0 ? date : new Date();
|
|
|
|
|
const currentTimezoneOffset = -date.getTimezoneOffset();
|
|
|
|
|
const targetTimezoneOffset = (_a = this.get("timezoneOffset")) !== null && _a !== void 0 ? _a : currentTimezoneOffset;
|
|
|
|
|
return currentTimezoneOffset - targetTimezoneOffset;
|
|
|
|
|
}
|
|
|
|
|
static createRelativeFromRefDate(refDate, fragments) {
|
|
|
|
|
let date = dayjs_1.default(refDate);
|
|
|
|
|
for (const key in fragments) {
|
|
|
|
|
date = date.add(fragments[key], key);
|
|
|
|
|
}
|
|
|
|
|
const components = new ParsingComponents(refDate);
|
|
|
|
|
if (fragments["hour"] || fragments["minute"] || fragments["second"]) {
|
|
|
|
|
dayjs.assignSimilarTime(components, date);
|
|
|
|
|
dayjs.assignSimilarDate(components, date);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
dayjs.implySimilarTime(components, date);
|
|
|
|
|
if (fragments["d"]) {
|
|
|
|
|
components.assign("day", date.date());
|
|
|
|
|
components.assign("month", date.month() + 1);
|
|
|
|
|
components.assign("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (fragments["week"]) {
|
|
|
|
|
components.imply("weekday", date.day());
|
|
|
|
|
}
|
|
|
|
|
components.imply("day", date.date());
|
|
|
|
|
if (fragments["month"]) {
|
|
|
|
|
components.assign("month", date.month() + 1);
|
|
|
|
|
components.assign("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
components.imply("month", date.month() + 1);
|
|
|
|
|
if (fragments["year"]) {
|
|
|
|
|
components.assign("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
components.imply("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.ParsingComponents = ParsingComponents;
|
|
|
|
|
class ParsingResult {
|
|
|
|
|
constructor(refDate, index, text, start, end) {
|
|
|
|
|
this.refDate = refDate;
|
|
|
|
|
this.index = index;
|
|
|
|
|
this.text = text;
|
|
|
|
|
this.start = start || new ParsingComponents(this.refDate);
|
|
|
|
|
this.end = end;
|
|
|
|
|
}
|
|
|
|
|
clone() {
|
|
|
|
|
const result = new ParsingResult(this.refDate, this.index, this.text);
|
|
|
|
|
result.start = this.start ? this.start.clone() : null;
|
|
|
|
|
result.end = this.end ? this.end.clone() : null;
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
date() {
|
|
|
|
|
return this.start.date();
|
|
|
|
|
}
|
|
|
|
|
toString() {
|
|
|
|
|
return `[ParsingResult {index: ${this.index}, text: '${this.text}', ...}]`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.ParsingResult = ParsingResult;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var AbstractParserWithWordBoundary = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.AbstractParserWithWordBoundaryChecking = void 0;
|
|
|
|
|
class AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
constructor() {
|
|
|
|
|
this.cachedInnerPattern = null;
|
|
|
|
|
this.cachedPattern = null;
|
|
|
|
|
}
|
|
|
|
|
pattern(context) {
|
|
|
|
|
const innerPattern = this.innerPattern(context);
|
|
|
|
|
if (innerPattern == this.cachedInnerPattern) {
|
|
|
|
|
return this.cachedPattern;
|
|
|
|
|
}
|
|
|
|
|
this.cachedPattern = new RegExp(`(\\W|^)${innerPattern.source}`, innerPattern.flags);
|
|
|
|
|
this.cachedInnerPattern = innerPattern;
|
|
|
|
|
return this.cachedPattern;
|
|
|
|
|
}
|
|
|
|
|
extract(context, match) {
|
|
|
|
|
const header = match[1];
|
|
|
|
|
match.index = match.index + header.length;
|
|
|
|
|
match[0] = match[0].substring(header.length);
|
|
|
|
|
for (let i = 2; i < match.length; i++) {
|
|
|
|
|
match[i - 1] = match[i];
|
|
|
|
|
}
|
|
|
|
|
return this.innerExtract(context, match);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.AbstractParserWithWordBoundaryChecking = AbstractParserWithWordBoundaryChecking;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENTimeUnitWithinFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN_WITH_PREFIX = new RegExp(`(?:within|in|for)\\s*` +
|
|
|
|
|
`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants$5.TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
|
|
|
|
|
const PATTERN_WITHOUT_PREFIX = new RegExp(`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants$5.TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
|
|
|
|
|
class ENTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern(context) {
|
|
|
|
|
return context.option.forwardDate ? PATTERN_WITHOUT_PREFIX : PATTERN_WITH_PREFIX;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const timeUnits = constants$5.parseTimeUnits(match[1]);
|
|
|
|
|
return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENTimeUnitWithinFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENMonthNameLittleEndianParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const constants_2 = constants$5;
|
|
|
|
|
const constants_3 = constants$5;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("(?:on\\s*?)?" +
|
|
|
|
|
`(${constants_3.ORDINAL_NUMBER_PATTERN})` +
|
|
|
|
|
"(?:\\s*" +
|
|
|
|
|
"(?:to|\\-|\\–|until|through|till|\\s)\\s*" +
|
|
|
|
|
`(${constants_3.ORDINAL_NUMBER_PATTERN})` +
|
|
|
|
|
")?" +
|
|
|
|
|
"(?:-|/|\\s*(?:of)?\\s*)" +
|
|
|
|
|
"(" +
|
|
|
|
|
pattern.matchAnyPattern(constants$5.MONTH_DICTIONARY) +
|
|
|
|
|
")" +
|
|
|
|
|
"(?:" +
|
|
|
|
|
"(?:-|/|,?\\s*)" +
|
|
|
|
|
`(${constants_2.YEAR_PATTERN}(?![^\\s]\\d))` +
|
|
|
|
|
")?" +
|
|
|
|
|
"(?=\\W|$)", "i");
|
|
|
|
|
const DATE_GROUP = 1;
|
|
|
|
|
const DATE_TO_GROUP = 2;
|
|
|
|
|
const MONTH_NAME_GROUP = 3;
|
|
|
|
|
const YEAR_GROUP = 4;
|
|
|
|
|
class ENMonthNameLittleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const result = context.createParsingResult(match.index, match[0]);
|
|
|
|
|
const month = constants$5.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
|
|
|
|
|
const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]);
|
|
|
|
|
if (day > 31) {
|
|
|
|
|
match.index = match.index + match[DATE_GROUP].length;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
result.start.assign("month", month);
|
|
|
|
|
result.start.assign("day", day);
|
|
|
|
|
if (match[YEAR_GROUP]) {
|
|
|
|
|
const yearNumber = constants_2.parseYear(match[YEAR_GROUP]);
|
|
|
|
|
result.start.assign("year", yearNumber);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const year = years.findYearClosestToRef(context.refDate, day, month);
|
|
|
|
|
result.start.imply("year", year);
|
|
|
|
|
}
|
|
|
|
|
if (match[DATE_TO_GROUP]) {
|
|
|
|
|
const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]);
|
|
|
|
|
result.end = result.start.clone();
|
|
|
|
|
result.end.assign("day", endDate);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENMonthNameLittleEndianParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENMonthNameMiddleEndianParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const constants_2 = constants$5;
|
|
|
|
|
const constants_3 = constants$5;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp(`(${pattern.matchAnyPattern(constants$5.MONTH_DICTIONARY)})` +
|
|
|
|
|
"(?:-|/|\\s*,?\\s*)" +
|
|
|
|
|
`(${constants_2.ORDINAL_NUMBER_PATTERN})(?!\\s*(?:am|pm))\\s*` +
|
|
|
|
|
"(?:" +
|
|
|
|
|
"(?:to|\\-)\\s*" +
|
|
|
|
|
`(${constants_2.ORDINAL_NUMBER_PATTERN})\\s*` +
|
|
|
|
|
")?" +
|
|
|
|
|
"(?:" +
|
|
|
|
|
"(?:-|/|\\s*,?\\s*)" +
|
|
|
|
|
`(${constants_3.YEAR_PATTERN})` +
|
|
|
|
|
")?" +
|
|
|
|
|
"(?=\\W|$)(?!\\:\\d)", "i");
|
|
|
|
|
const MONTH_NAME_GROUP = 1;
|
|
|
|
|
const DATE_GROUP = 2;
|
|
|
|
|
const DATE_TO_GROUP = 3;
|
|
|
|
|
const YEAR_GROUP = 4;
|
|
|
|
|
class ENMonthNameMiddleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const month = constants$5.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
|
|
|
|
|
const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]);
|
|
|
|
|
if (day > 31) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const components = context.createParsingComponents({
|
|
|
|
|
day: day,
|
|
|
|
|
month: month,
|
|
|
|
|
});
|
|
|
|
|
if (match[YEAR_GROUP]) {
|
|
|
|
|
const year = constants_3.parseYear(match[YEAR_GROUP]);
|
|
|
|
|
components.assign("year", year);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const year = years.findYearClosestToRef(context.refDate, day, month);
|
|
|
|
|
components.imply("year", year);
|
|
|
|
|
}
|
|
|
|
|
if (!match[DATE_TO_GROUP]) {
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]);
|
|
|
|
|
const result = context.createParsingResult(match.index, match[0]);
|
|
|
|
|
result.start = components;
|
|
|
|
|
result.end = components.clone();
|
|
|
|
|
result.end.assign("day", endDate);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENMonthNameMiddleEndianParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENMonthNameParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const constants_2 = constants$5;
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp(`((?:in)\\s*)?` +
|
|
|
|
|
`(${pattern.matchAnyPattern(constants$5.MONTH_DICTIONARY)})` +
|
|
|
|
|
`\\s*` +
|
|
|
|
|
`(?:` +
|
|
|
|
|
`[,-]?\\s*(${constants_2.YEAR_PATTERN})?` +
|
|
|
|
|
")?" +
|
|
|
|
|
"(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)", "i");
|
|
|
|
|
const PREFIX_GROUP = 1;
|
|
|
|
|
const MONTH_NAME_GROUP = 2;
|
|
|
|
|
const YEAR_GROUP = 3;
|
|
|
|
|
class ENMonthNameParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const monthName = match[MONTH_NAME_GROUP].toLowerCase();
|
|
|
|
|
if (match[0].length <= 3 && !constants$5.FULL_MONTH_NAME_DICTIONARY[monthName]) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const result = context.createParsingResult(match.index + (match[PREFIX_GROUP] || "").length, match.index + match[0].length);
|
|
|
|
|
result.start.imply("day", 1);
|
|
|
|
|
const month = constants$5.MONTH_DICTIONARY[monthName];
|
|
|
|
|
result.start.assign("month", month);
|
|
|
|
|
if (match[YEAR_GROUP]) {
|
|
|
|
|
const year = constants_2.parseYear(match[YEAR_GROUP]);
|
|
|
|
|
result.start.assign("year", year);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const year = years.findYearClosestToRef(context.refDate, 1, month);
|
|
|
|
|
result.start.imply("year", year);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENMonthNameParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENCasualYearMonthDayParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s]` +
|
|
|
|
|
`(?:(${pattern.matchAnyPattern(constants$5.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]` +
|
|
|
|
|
`([0-9]{1,2})` +
|
|
|
|
|
"(?=\\W|$)", "i");
|
|
|
|
|
const YEAR_NUMBER_GROUP = 1;
|
|
|
|
|
const MONTH_NAME_GROUP = 2;
|
|
|
|
|
const MONTH_NUMBER_GROUP = 3;
|
|
|
|
|
const DATE_NUMBER_GROUP = 4;
|
|
|
|
|
class ENCasualYearMonthDayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const month = match[MONTH_NUMBER_GROUP]
|
|
|
|
|
? parseInt(match[MONTH_NUMBER_GROUP])
|
|
|
|
|
: constants$5.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
|
|
|
|
|
if (month < 1 || month > 12) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const year = parseInt(match[YEAR_NUMBER_GROUP]);
|
|
|
|
|
const day = parseInt(match[DATE_NUMBER_GROUP]);
|
|
|
|
|
return {
|
|
|
|
|
day: day,
|
|
|
|
|
month: month,
|
|
|
|
|
year: year,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENCasualYearMonthDayParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENSlashMonthFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})" + "", "i");
|
|
|
|
|
const MONTH_GROUP = 1;
|
|
|
|
|
const YEAR_GROUP = 2;
|
|
|
|
|
class ENSlashMonthFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const year = parseInt(match[YEAR_GROUP]);
|
|
|
|
|
const month = parseInt(match[MONTH_GROUP]);
|
|
|
|
|
return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENSlashMonthFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var AbstractTimeExpressionParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.AbstractTimeExpressionParser = void 0;
|
|
|
|
|
|
|
|
|
|
function primaryTimePattern(primaryPrefix, primarySuffix) {
|
|
|
|
|
return new RegExp("(^|\\s|T|\\b)" +
|
|
|
|
|
`${primaryPrefix}` +
|
|
|
|
|
"(\\d{1,4})" +
|
|
|
|
|
"(?:" +
|
|
|
|
|
"(?:\\.|\\:|\\:)" +
|
|
|
|
|
"(\\d{1,2})" +
|
|
|
|
|
"(?:" +
|
|
|
|
|
"(?:\\:|\\:)" +
|
|
|
|
|
"(\\d{2})" +
|
|
|
|
|
"(?:\\.(\\d{1,6}))?" +
|
|
|
|
|
")?" +
|
|
|
|
|
")?" +
|
|
|
|
|
"(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?" +
|
|
|
|
|
`${primarySuffix}`, "i");
|
|
|
|
|
}
|
|
|
|
|
function followingTimePatten(followingPhase, followingSuffix) {
|
|
|
|
|
return new RegExp(`^(${followingPhase})` +
|
|
|
|
|
"(\\d{1,4})" +
|
|
|
|
|
"(?:" +
|
|
|
|
|
"(?:\\.|\\:|\\:)" +
|
|
|
|
|
"(\\d{1,2})" +
|
|
|
|
|
"(?:" +
|
|
|
|
|
"(?:\\.|\\:|\\:)" +
|
|
|
|
|
"(\\d{1,2})(?:\\.(\\d{1,6}))?" +
|
|
|
|
|
")?" +
|
|
|
|
|
")?" +
|
|
|
|
|
"(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?" +
|
|
|
|
|
`${followingSuffix}`, "i");
|
|
|
|
|
}
|
|
|
|
|
const HOUR_GROUP = 2;
|
|
|
|
|
const MINUTE_GROUP = 3;
|
|
|
|
|
const SECOND_GROUP = 4;
|
|
|
|
|
const MILLI_SECOND_GROUP = 5;
|
|
|
|
|
const AM_PM_HOUR_GROUP = 6;
|
|
|
|
|
class AbstractTimeExpressionParser {
|
|
|
|
|
constructor(strictMode = false) {
|
|
|
|
|
this.cachedPrimaryPrefix = null;
|
|
|
|
|
this.cachedPrimarySuffix = null;
|
|
|
|
|
this.cachedPrimaryTimePattern = null;
|
|
|
|
|
this.cachedFollowingPhase = null;
|
|
|
|
|
this.cachedFollowingSuffix = null;
|
|
|
|
|
this.cachedFollowingTimePatten = null;
|
|
|
|
|
this.strictMode = strictMode;
|
|
|
|
|
}
|
|
|
|
|
primarySuffix() {
|
|
|
|
|
return "(?=\\W|$)";
|
|
|
|
|
}
|
|
|
|
|
followingSuffix() {
|
|
|
|
|
return "(?=\\W|$)";
|
|
|
|
|
}
|
|
|
|
|
pattern(context) {
|
|
|
|
|
return this.getPrimaryTimePatternThroughCache();
|
|
|
|
|
}
|
|
|
|
|
extract(context, match) {
|
|
|
|
|
const startComponents = this.extractPrimaryTimeComponents(context, match);
|
|
|
|
|
if (!startComponents) {
|
|
|
|
|
match.index += match[0].length;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const index = match.index + match[1].length;
|
|
|
|
|
const text = match[0].substring(match[1].length);
|
|
|
|
|
const result = context.createParsingResult(index, text, startComponents);
|
|
|
|
|
match.index += match[0].length;
|
|
|
|
|
const remainingText = context.text.substring(match.index);
|
|
|
|
|
const followingPattern = this.getFollowingTimePatternThroughCache();
|
|
|
|
|
const followingMatch = followingPattern.exec(remainingText);
|
|
|
|
|
if (!followingMatch ||
|
|
|
|
|
followingMatch[0].match(/^\s*([+-])\s*\d{3,4}$/)) {
|
|
|
|
|
return this.checkAndReturnWithoutFollowingPattern(result);
|
|
|
|
|
}
|
|
|
|
|
result.end = this.extractFollowingTimeComponents(context, followingMatch, result);
|
|
|
|
|
if (result.end) {
|
|
|
|
|
result.text += followingMatch[0];
|
|
|
|
|
}
|
|
|
|
|
return this.checkAndReturnWithFollowingPattern(result);
|
|
|
|
|
}
|
|
|
|
|
extractPrimaryTimeComponents(context, match, strict = false) {
|
|
|
|
|
const components = context.createParsingComponents();
|
|
|
|
|
let minute = 0;
|
|
|
|
|
let meridiem = null;
|
|
|
|
|
let hour = parseInt(match[HOUR_GROUP]);
|
|
|
|
|
if (hour > 100) {
|
|
|
|
|
if (this.strictMode || match[MINUTE_GROUP] != null) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
minute = hour % 100;
|
|
|
|
|
hour = Math.floor(hour / 100);
|
|
|
|
|
}
|
|
|
|
|
if (hour > 24) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (match[MINUTE_GROUP] != null) {
|
|
|
|
|
if (match[MINUTE_GROUP].length == 1 && !match[AM_PM_HOUR_GROUP]) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
minute = parseInt(match[MINUTE_GROUP]);
|
|
|
|
|
}
|
|
|
|
|
if (minute >= 60) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (hour > 12) {
|
|
|
|
|
meridiem = dist.Meridiem.PM;
|
|
|
|
|
}
|
|
|
|
|
if (match[AM_PM_HOUR_GROUP] != null) {
|
|
|
|
|
if (hour > 12)
|
|
|
|
|
return null;
|
|
|
|
|
const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();
|
|
|
|
|
if (ampm == "a") {
|
|
|
|
|
meridiem = dist.Meridiem.AM;
|
|
|
|
|
if (hour == 12) {
|
|
|
|
|
hour = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (ampm == "p") {
|
|
|
|
|
meridiem = dist.Meridiem.PM;
|
|
|
|
|
if (hour != 12) {
|
|
|
|
|
hour += 12;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
components.assign("hour", hour);
|
|
|
|
|
components.assign("minute", minute);
|
|
|
|
|
if (meridiem !== null) {
|
|
|
|
|
components.assign("meridiem", meridiem);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (hour < 12) {
|
|
|
|
|
components.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
components.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (match[MILLI_SECOND_GROUP] != null) {
|
|
|
|
|
const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));
|
|
|
|
|
if (millisecond >= 1000)
|
|
|
|
|
return null;
|
|
|
|
|
components.assign("millisecond", millisecond);
|
|
|
|
|
}
|
|
|
|
|
if (match[SECOND_GROUP] != null) {
|
|
|
|
|
const second = parseInt(match[SECOND_GROUP]);
|
|
|
|
|
if (second >= 60)
|
|
|
|
|
return null;
|
|
|
|
|
components.assign("second", second);
|
|
|
|
|
}
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
extractFollowingTimeComponents(context, match, result) {
|
|
|
|
|
const components = context.createParsingComponents();
|
|
|
|
|
if (match[MILLI_SECOND_GROUP] != null) {
|
|
|
|
|
const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));
|
|
|
|
|
if (millisecond >= 1000)
|
|
|
|
|
return null;
|
|
|
|
|
components.assign("millisecond", millisecond);
|
|
|
|
|
}
|
|
|
|
|
if (match[SECOND_GROUP] != null) {
|
|
|
|
|
const second = parseInt(match[SECOND_GROUP]);
|
|
|
|
|
if (second >= 60)
|
|
|
|
|
return null;
|
|
|
|
|
components.assign("second", second);
|
|
|
|
|
}
|
|
|
|
|
let hour = parseInt(match[HOUR_GROUP]);
|
|
|
|
|
let minute = 0;
|
|
|
|
|
let meridiem = -1;
|
|
|
|
|
if (match[MINUTE_GROUP] != null) {
|
|
|
|
|
minute = parseInt(match[MINUTE_GROUP]);
|
|
|
|
|
}
|
|
|
|
|
else if (hour > 100) {
|
|
|
|
|
minute = hour % 100;
|
|
|
|
|
hour = Math.floor(hour / 100);
|
|
|
|
|
}
|
|
|
|
|
if (minute >= 60 || hour > 24) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (hour >= 12) {
|
|
|
|
|
meridiem = dist.Meridiem.PM;
|
|
|
|
|
}
|
|
|
|
|
if (match[AM_PM_HOUR_GROUP] != null) {
|
|
|
|
|
if (hour > 12) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();
|
|
|
|
|
if (ampm == "a") {
|
|
|
|
|
meridiem = dist.Meridiem.AM;
|
|
|
|
|
if (hour == 12) {
|
|
|
|
|
hour = 0;
|
|
|
|
|
if (!components.isCertain("day")) {
|
|
|
|
|
components.imply("day", components.get("day") + 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (ampm == "p") {
|
|
|
|
|
meridiem = dist.Meridiem.PM;
|
|
|
|
|
if (hour != 12)
|
|
|
|
|
hour += 12;
|
|
|
|
|
}
|
|
|
|
|
if (!result.start.isCertain("meridiem")) {
|
|
|
|
|
if (meridiem == dist.Meridiem.AM) {
|
|
|
|
|
result.start.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
if (result.start.get("hour") == 12) {
|
|
|
|
|
result.start.assign("hour", 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
result.start.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
if (result.start.get("hour") != 12) {
|
|
|
|
|
result.start.assign("hour", result.start.get("hour") + 12);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
components.assign("hour", hour);
|
|
|
|
|
components.assign("minute", minute);
|
|
|
|
|
if (meridiem >= 0) {
|
|
|
|
|
components.assign("meridiem", meridiem);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const startAtPM = result.start.isCertain("meridiem") && result.start.get("hour") > 12;
|
|
|
|
|
if (startAtPM) {
|
|
|
|
|
if (result.start.get("hour") - 12 > hour) {
|
|
|
|
|
components.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
}
|
|
|
|
|
else if (hour <= 12) {
|
|
|
|
|
components.assign("hour", hour + 12);
|
|
|
|
|
components.assign("meridiem", dist.Meridiem.PM);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (hour > 12) {
|
|
|
|
|
components.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
}
|
|
|
|
|
else if (hour <= 12) {
|
|
|
|
|
components.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (components.date().getTime() < result.start.date().getTime()) {
|
|
|
|
|
components.imply("day", components.get("day") + 1);
|
|
|
|
|
}
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
checkAndReturnWithoutFollowingPattern(result) {
|
|
|
|
|
if (result.text.match(/^\d$/)) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)$/);
|
|
|
|
|
if (endingWithNumbers) {
|
|
|
|
|
const endingNumbers = endingWithNumbers[1];
|
|
|
|
|
if (this.strictMode) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const endingNumberVal = parseInt(endingNumbers);
|
|
|
|
|
if (endingNumberVal > 24) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
checkAndReturnWithFollowingPattern(result) {
|
|
|
|
|
if (result.text.match(/^\d+-\d+$/)) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)\s*-\s*(\d[\d.]+)$/);
|
|
|
|
|
if (endingWithNumbers) {
|
|
|
|
|
if (this.strictMode) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const startingNumbers = endingWithNumbers[1];
|
|
|
|
|
const endingNumbers = endingWithNumbers[2];
|
|
|
|
|
if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const endingNumberVal = parseInt(endingNumbers);
|
|
|
|
|
const startingNumberVal = parseInt(startingNumbers);
|
|
|
|
|
if (endingNumberVal > 24 || startingNumberVal > 24) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
getPrimaryTimePatternThroughCache() {
|
|
|
|
|
const primaryPrefix = this.primaryPrefix();
|
|
|
|
|
const primarySuffix = this.primarySuffix();
|
|
|
|
|
if (this.cachedPrimaryPrefix === primaryPrefix && this.cachedPrimarySuffix === primarySuffix) {
|
|
|
|
|
return this.cachedPrimaryTimePattern;
|
|
|
|
|
}
|
|
|
|
|
this.cachedPrimaryTimePattern = primaryTimePattern(primaryPrefix, primarySuffix);
|
|
|
|
|
this.cachedPrimaryPrefix = primaryPrefix;
|
|
|
|
|
this.cachedPrimarySuffix = primarySuffix;
|
|
|
|
|
return this.cachedPrimaryTimePattern;
|
|
|
|
|
}
|
|
|
|
|
getFollowingTimePatternThroughCache() {
|
|
|
|
|
const followingPhase = this.followingPhase();
|
|
|
|
|
const followingSuffix = this.followingSuffix();
|
|
|
|
|
if (this.cachedFollowingPhase === followingPhase && this.cachedFollowingSuffix === followingSuffix) {
|
|
|
|
|
return this.cachedFollowingTimePatten;
|
|
|
|
|
}
|
|
|
|
|
this.cachedFollowingTimePatten = followingTimePatten(followingPhase, followingSuffix);
|
|
|
|
|
this.cachedFollowingPhase = followingPhase;
|
|
|
|
|
this.cachedFollowingSuffix = followingSuffix;
|
|
|
|
|
return this.cachedFollowingTimePatten;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.AbstractTimeExpressionParser = AbstractTimeExpressionParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENTimeExpressionParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ENTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser {
|
|
|
|
|
constructor(strictMode) {
|
|
|
|
|
super(strictMode);
|
|
|
|
|
}
|
|
|
|
|
followingPhase() {
|
|
|
|
|
return "\\s*(?:\\-|\\–|\\~|\\〜|to|\\?)\\s*";
|
|
|
|
|
}
|
|
|
|
|
primaryPrefix() {
|
|
|
|
|
return "(?:(?:at|from)\\s*)??";
|
|
|
|
|
}
|
|
|
|
|
primarySuffix() {
|
|
|
|
|
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", dist.Meridiem.PM);
|
|
|
|
|
}
|
|
|
|
|
else if (hour < 6) {
|
|
|
|
|
components.assign("meridiem", dist.Meridiem.AM);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (match[0].endsWith("afternoon")) {
|
|
|
|
|
components.assign("meridiem", dist.Meridiem.PM);
|
|
|
|
|
const hour = components.get("hour");
|
|
|
|
|
if (hour >= 0 && hour <= 6) {
|
|
|
|
|
components.assign("hour", components.get("hour") + 12);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (match[0].endsWith("morning")) {
|
|
|
|
|
components.assign("meridiem", dist.Meridiem.AM);
|
|
|
|
|
const hour = components.get("hour");
|
|
|
|
|
if (hour < 12) {
|
|
|
|
|
components.assign("hour", components.get("hour"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENTimeExpressionParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var timeunits = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.addImpliedTimeUnits = exports.reverseTimeUnits = void 0;
|
|
|
|
|
function reverseTimeUnits(timeUnits) {
|
|
|
|
|
const reversed = {};
|
|
|
|
|
for (const key in timeUnits) {
|
|
|
|
|
reversed[key] = -timeUnits[key];
|
|
|
|
|
}
|
|
|
|
|
return reversed;
|
|
|
|
|
}
|
|
|
|
|
exports.reverseTimeUnits = reverseTimeUnits;
|
|
|
|
|
function addImpliedTimeUnits(components, timeUnits) {
|
|
|
|
|
const output = components.clone();
|
|
|
|
|
let date = components.dayjs();
|
|
|
|
|
for (const key in timeUnits) {
|
|
|
|
|
date = date.add(timeUnits[key], key);
|
|
|
|
|
}
|
|
|
|
|
if ("day" in timeUnits || "d" in timeUnits || "week" in timeUnits || "month" in timeUnits || "year" in timeUnits) {
|
|
|
|
|
output.imply("day", date.date());
|
|
|
|
|
output.imply("month", date.month() + 1);
|
|
|
|
|
output.imply("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
if ("second" in timeUnits || "minute" in timeUnits || "hour" in timeUnits) {
|
|
|
|
|
output.imply("second", date.second());
|
|
|
|
|
output.imply("minute", date.minute());
|
|
|
|
|
output.imply("hour", date.hour());
|
|
|
|
|
}
|
|
|
|
|
return output;
|
|
|
|
|
}
|
|
|
|
|
exports.addImpliedTimeUnits = addImpliedTimeUnits;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENTimeUnitAgoFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("" + "(" + constants$5.TIME_UNITS_PATTERN + ")" + "(?:ago|before|earlier)(?=(?:\\W|$))", "i");
|
|
|
|
|
const STRICT_PATTERN = new RegExp("" + "(" + constants$5.TIME_UNITS_PATTERN + ")" + "ago(?=(?:\\W|$))", "i");
|
|
|
|
|
class ENTimeUnitAgoFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
constructor(strictMode) {
|
|
|
|
|
super();
|
|
|
|
|
this.strictMode = strictMode;
|
|
|
|
|
}
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return this.strictMode ? STRICT_PATTERN : PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const timeUnits = constants$5.parseTimeUnits(match[1]);
|
|
|
|
|
const outputTimeUnits = timeunits.reverseTimeUnits(timeUnits);
|
|
|
|
|
return results.ParsingComponents.createRelativeFromRefDate(context.refDate, outputTimeUnits);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENTimeUnitAgoFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENTimeUnitLaterFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("" + "(" + constants$5.TIME_UNITS_PATTERN + ")" + "(later|after|from now|henceforth|forward|out)" + "(?=(?:\\W|$))", "i");
|
|
|
|
|
const STRICT_PATTERN = new RegExp("" + "(" + constants$5.TIME_UNITS_PATTERN + ")" + "(later|from now)" + "(?=(?:\\W|$))", "i");
|
|
|
|
|
const GROUP_NUM_TIMEUNITS = 1;
|
|
|
|
|
class ENTimeUnitLaterFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
constructor(strictMode) {
|
|
|
|
|
super();
|
|
|
|
|
this.strictMode = strictMode;
|
|
|
|
|
}
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return this.strictMode ? STRICT_PATTERN : PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const fragments = constants$5.parseTimeUnits(match[GROUP_NUM_TIMEUNITS]);
|
|
|
|
|
return results.ParsingComponents.createRelativeFromRefDate(context.refDate, fragments);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENTimeUnitLaterFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var abstractRefiners = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.MergingRefiner = exports.Filter = void 0;
|
|
|
|
|
class Filter {
|
|
|
|
|
refine(context, results) {
|
|
|
|
|
return results.filter((r) => this.isValid(context, r));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.Filter = Filter;
|
|
|
|
|
class MergingRefiner {
|
|
|
|
|
refine(context, results) {
|
|
|
|
|
if (results.length < 2) {
|
|
|
|
|
return results;
|
|
|
|
|
}
|
|
|
|
|
const mergedResults = [];
|
|
|
|
|
let curResult = results[0];
|
|
|
|
|
let nextResult = null;
|
|
|
|
|
for (let i = 1; i < results.length; i++) {
|
|
|
|
|
nextResult = results[i];
|
|
|
|
|
const textBetween = context.text.substring(curResult.index + curResult.text.length, nextResult.index);
|
|
|
|
|
if (!this.shouldMergeResults(textBetween, curResult, nextResult, context)) {
|
|
|
|
|
mergedResults.push(curResult);
|
|
|
|
|
curResult = nextResult;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const left = curResult;
|
|
|
|
|
const right = nextResult;
|
|
|
|
|
const mergedResult = this.mergeResults(textBetween, left, right, context);
|
|
|
|
|
context.debug(() => {
|
|
|
|
|
console.log(`${this.constructor.name} merged ${left} and ${right} into ${mergedResult}`);
|
|
|
|
|
});
|
|
|
|
|
curResult = mergedResult;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (curResult != null) {
|
|
|
|
|
mergedResults.push(curResult);
|
|
|
|
|
}
|
|
|
|
|
return mergedResults;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.MergingRefiner = MergingRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var AbstractMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
class AbstractMergeDateRangeRefiner extends abstractRefiners.MergingRefiner {
|
|
|
|
|
shouldMergeResults(textBetween, currentResult, nextResult) {
|
|
|
|
|
return !currentResult.end && !nextResult.end && textBetween.match(this.patternBetween()) != null;
|
|
|
|
|
}
|
|
|
|
|
mergeResults(textBetween, fromResult, toResult) {
|
|
|
|
|
if (!fromResult.start.isOnlyWeekdayComponent() && !toResult.start.isOnlyWeekdayComponent()) {
|
|
|
|
|
toResult.start.getCertainComponents().forEach((key) => {
|
|
|
|
|
if (!fromResult.start.isCertain(key)) {
|
|
|
|
|
fromResult.start.assign(key, toResult.start.get(key));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
fromResult.start.getCertainComponents().forEach((key) => {
|
|
|
|
|
if (!toResult.start.isCertain(key)) {
|
|
|
|
|
toResult.start.assign(key, fromResult.start.get(key));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (fromResult.start.date().getTime() > toResult.start.date().getTime()) {
|
|
|
|
|
let fromMoment = fromResult.start.dayjs();
|
|
|
|
|
let toMoment = toResult.start.dayjs();
|
|
|
|
|
if (fromResult.start.isOnlyWeekdayComponent() && fromMoment.add(-7, "days").isBefore(toMoment)) {
|
|
|
|
|
fromMoment = fromMoment.add(-7, "days");
|
|
|
|
|
fromResult.start.imply("day", fromMoment.date());
|
|
|
|
|
fromResult.start.imply("month", fromMoment.month() + 1);
|
|
|
|
|
fromResult.start.imply("year", fromMoment.year());
|
|
|
|
|
}
|
|
|
|
|
else if (toResult.start.isOnlyWeekdayComponent() && toMoment.add(7, "days").isAfter(fromMoment)) {
|
|
|
|
|
toMoment = toMoment.add(7, "days");
|
|
|
|
|
toResult.start.imply("day", toMoment.date());
|
|
|
|
|
toResult.start.imply("month", toMoment.month() + 1);
|
|
|
|
|
toResult.start.imply("year", toMoment.year());
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
[toResult, fromResult] = [fromResult, toResult];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const result = fromResult.clone();
|
|
|
|
|
result.start = fromResult.start;
|
|
|
|
|
result.end = toResult.start;
|
|
|
|
|
result.index = Math.min(fromResult.index, toResult.index);
|
|
|
|
|
if (fromResult.index < toResult.index) {
|
|
|
|
|
result.text = fromResult.text + textBetween + toResult.text;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
result.text = toResult.text + textBetween + fromResult.text;
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = AbstractMergeDateRangeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1);
|
|
|
|
|
class ENMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default {
|
|
|
|
|
patternBetween() {
|
|
|
|
|
return /^\s*(to|-)\s*$/i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENMergeDateRangeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var mergingCalculation = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.mergeDateTimeComponent = exports.mergeDateTimeResult = void 0;
|
|
|
|
|
|
|
|
|
|
function mergeDateTimeResult(dateResult, timeResult) {
|
|
|
|
|
const result = dateResult.clone();
|
|
|
|
|
const beginDate = dateResult.start;
|
|
|
|
|
const beginTime = timeResult.start;
|
|
|
|
|
result.start = mergeDateTimeComponent(beginDate, beginTime);
|
|
|
|
|
if (dateResult.end != null || timeResult.end != null) {
|
|
|
|
|
const endDate = dateResult.end == null ? dateResult.start : dateResult.end;
|
|
|
|
|
const endTime = timeResult.end == null ? timeResult.start : timeResult.end;
|
|
|
|
|
const endDateTime = mergeDateTimeComponent(endDate, endTime);
|
|
|
|
|
if (dateResult.end == null && endDateTime.date().getTime() < result.start.date().getTime()) {
|
|
|
|
|
if (endDateTime.isCertain("day")) {
|
|
|
|
|
endDateTime.assign("day", endDateTime.get("day") + 1);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
endDateTime.imply("day", endDateTime.get("day") + 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
result.end = endDateTime;
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
exports.mergeDateTimeResult = mergeDateTimeResult;
|
|
|
|
|
function mergeDateTimeComponent(dateComponent, timeComponent) {
|
|
|
|
|
const dateTimeComponent = dateComponent.clone();
|
|
|
|
|
if (timeComponent.isCertain("hour")) {
|
|
|
|
|
dateTimeComponent.assign("hour", timeComponent.get("hour"));
|
|
|
|
|
dateTimeComponent.assign("minute", timeComponent.get("minute"));
|
|
|
|
|
if (timeComponent.isCertain("second")) {
|
|
|
|
|
dateTimeComponent.assign("second", timeComponent.get("second"));
|
|
|
|
|
if (timeComponent.isCertain("millisecond")) {
|
|
|
|
|
dateTimeComponent.assign("millisecond", timeComponent.get("millisecond"));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
dateTimeComponent.imply("millisecond", timeComponent.get("millisecond"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
dateTimeComponent.imply("second", timeComponent.get("second"));
|
|
|
|
|
dateTimeComponent.imply("millisecond", timeComponent.get("millisecond"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
dateTimeComponent.imply("hour", timeComponent.get("hour"));
|
|
|
|
|
dateTimeComponent.imply("minute", timeComponent.get("minute"));
|
|
|
|
|
dateTimeComponent.imply("second", timeComponent.get("second"));
|
|
|
|
|
dateTimeComponent.imply("millisecond", timeComponent.get("millisecond"));
|
|
|
|
|
}
|
|
|
|
|
if (timeComponent.isCertain("timezoneOffset")) {
|
|
|
|
|
dateTimeComponent.assign("timezoneOffset", timeComponent.get("timezoneOffset"));
|
|
|
|
|
}
|
|
|
|
|
if (timeComponent.isCertain("meridiem")) {
|
|
|
|
|
dateTimeComponent.assign("meridiem", timeComponent.get("meridiem"));
|
|
|
|
|
}
|
|
|
|
|
else if (timeComponent.get("meridiem") != null && dateTimeComponent.get("meridiem") == null) {
|
|
|
|
|
dateTimeComponent.imply("meridiem", timeComponent.get("meridiem"));
|
|
|
|
|
}
|
|
|
|
|
if (dateTimeComponent.get("meridiem") == dist.Meridiem.PM && dateTimeComponent.get("hour") < 12) {
|
|
|
|
|
if (timeComponent.isCertain("hour")) {
|
|
|
|
|
dateTimeComponent.assign("hour", dateTimeComponent.get("hour") + 12);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
dateTimeComponent.imply("hour", dateTimeComponent.get("hour") + 12);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return dateTimeComponent;
|
|
|
|
|
}
|
|
|
|
|
exports.mergeDateTimeComponent = mergeDateTimeComponent;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var AbstractMergeDateTimeRefiner = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ENMergeDateTimeRefiner extends abstractRefiners.MergingRefiner {
|
|
|
|
|
shouldMergeResults(textBetween, currentResult, nextResult) {
|
|
|
|
|
return (((currentResult.start.isOnlyDate() && nextResult.start.isOnlyTime()) ||
|
|
|
|
|
(nextResult.start.isOnlyDate() && currentResult.start.isOnlyTime())) &&
|
|
|
|
|
textBetween.match(this.patternBetween()) != null);
|
|
|
|
|
}
|
|
|
|
|
mergeResults(textBetween, currentResult, nextResult) {
|
|
|
|
|
const result = currentResult.start.isOnlyDate()
|
|
|
|
|
? mergingCalculation.mergeDateTimeResult(currentResult, nextResult)
|
|
|
|
|
: mergingCalculation.mergeDateTimeResult(nextResult, currentResult);
|
|
|
|
|
result.index = currentResult.index;
|
|
|
|
|
result.text = currentResult.text + textBetween + nextResult.text;
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENMergeDateTimeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENMergeDateTimeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const AbstractMergeDateTimeRefiner_1 = __importDefault(AbstractMergeDateTimeRefiner);
|
|
|
|
|
class ENMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default {
|
|
|
|
|
patternBetween() {
|
|
|
|
|
return new RegExp("^\\s*(T|at|after|before|on|of|,|-)?\\s*$");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENMergeDateTimeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ExtractTimezoneAbbrRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const TIMEZONE_NAME_PATTERN = new RegExp("^\\s*\\(?([A-Z]{2,4})\\)?(?=\\W|$)", "i");
|
|
|
|
|
const DEFAULT_TIMEZONE_ABBR_MAP = {
|
|
|
|
|
ACDT: 630,
|
|
|
|
|
ACST: 570,
|
|
|
|
|
ADT: -180,
|
|
|
|
|
AEDT: 660,
|
|
|
|
|
AEST: 600,
|
|
|
|
|
AFT: 270,
|
|
|
|
|
AKDT: -480,
|
|
|
|
|
AKST: -540,
|
|
|
|
|
ALMT: 360,
|
|
|
|
|
AMST: -180,
|
|
|
|
|
AMT: -240,
|
|
|
|
|
ANAST: 720,
|
|
|
|
|
ANAT: 720,
|
|
|
|
|
AQTT: 300,
|
|
|
|
|
ART: -180,
|
|
|
|
|
AST: -240,
|
|
|
|
|
AWDT: 540,
|
|
|
|
|
AWST: 480,
|
|
|
|
|
AZOST: 0,
|
|
|
|
|
AZOT: -60,
|
|
|
|
|
AZST: 300,
|
|
|
|
|
AZT: 240,
|
|
|
|
|
BNT: 480,
|
|
|
|
|
BOT: -240,
|
|
|
|
|
BRST: -120,
|
|
|
|
|
BRT: -180,
|
|
|
|
|
BST: 60,
|
|
|
|
|
BTT: 360,
|
|
|
|
|
CAST: 480,
|
|
|
|
|
CAT: 120,
|
|
|
|
|
CCT: 390,
|
|
|
|
|
CDT: -300,
|
|
|
|
|
CEST: 120,
|
|
|
|
|
CET: 60,
|
|
|
|
|
CHADT: 825,
|
|
|
|
|
CHAST: 765,
|
|
|
|
|
CKT: -600,
|
|
|
|
|
CLST: -180,
|
|
|
|
|
CLT: -240,
|
|
|
|
|
COT: -300,
|
|
|
|
|
CST: -360,
|
|
|
|
|
CVT: -60,
|
|
|
|
|
CXT: 420,
|
|
|
|
|
ChST: 600,
|
|
|
|
|
DAVT: 420,
|
|
|
|
|
EASST: -300,
|
|
|
|
|
EAST: -360,
|
|
|
|
|
EAT: 180,
|
|
|
|
|
ECT: -300,
|
|
|
|
|
EDT: -240,
|
|
|
|
|
EEST: 180,
|
|
|
|
|
EET: 120,
|
|
|
|
|
EGST: 0,
|
|
|
|
|
EGT: -60,
|
|
|
|
|
EST: -300,
|
|
|
|
|
ET: -300,
|
|
|
|
|
FJST: 780,
|
|
|
|
|
FJT: 720,
|
|
|
|
|
FKST: -180,
|
|
|
|
|
FKT: -240,
|
|
|
|
|
FNT: -120,
|
|
|
|
|
GALT: -360,
|
|
|
|
|
GAMT: -540,
|
|
|
|
|
GET: 240,
|
|
|
|
|
GFT: -180,
|
|
|
|
|
GILT: 720,
|
|
|
|
|
GMT: 0,
|
|
|
|
|
GST: 240,
|
|
|
|
|
GYT: -240,
|
|
|
|
|
HAA: -180,
|
|
|
|
|
HAC: -300,
|
|
|
|
|
HADT: -540,
|
|
|
|
|
HAE: -240,
|
|
|
|
|
HAP: -420,
|
|
|
|
|
HAR: -360,
|
|
|
|
|
HAST: -600,
|
|
|
|
|
HAT: -90,
|
|
|
|
|
HAY: -480,
|
|
|
|
|
HKT: 480,
|
|
|
|
|
HLV: -210,
|
|
|
|
|
HNA: -240,
|
|
|
|
|
HNC: -360,
|
|
|
|
|
HNE: -300,
|
|
|
|
|
HNP: -480,
|
|
|
|
|
HNR: -420,
|
|
|
|
|
HNT: -150,
|
|
|
|
|
HNY: -540,
|
|
|
|
|
HOVT: 420,
|
|
|
|
|
ICT: 420,
|
|
|
|
|
IDT: 180,
|
|
|
|
|
IOT: 360,
|
|
|
|
|
IRDT: 270,
|
|
|
|
|
IRKST: 540,
|
|
|
|
|
IRKT: 540,
|
|
|
|
|
IRST: 210,
|
|
|
|
|
IST: 330,
|
|
|
|
|
JST: 540,
|
|
|
|
|
KGT: 360,
|
|
|
|
|
KRAST: 480,
|
|
|
|
|
KRAT: 480,
|
|
|
|
|
KST: 540,
|
|
|
|
|
KUYT: 240,
|
|
|
|
|
LHDT: 660,
|
|
|
|
|
LHST: 630,
|
|
|
|
|
LINT: 840,
|
|
|
|
|
MAGST: 720,
|
|
|
|
|
MAGT: 720,
|
|
|
|
|
MART: -510,
|
|
|
|
|
MAWT: 300,
|
|
|
|
|
MDT: -360,
|
|
|
|
|
MESZ: 120,
|
|
|
|
|
MEZ: 60,
|
|
|
|
|
MHT: 720,
|
|
|
|
|
MMT: 390,
|
|
|
|
|
MSD: 240,
|
|
|
|
|
MSK: 240,
|
|
|
|
|
MST: -420,
|
|
|
|
|
MUT: 240,
|
|
|
|
|
MVT: 300,
|
|
|
|
|
MYT: 480,
|
|
|
|
|
NCT: 660,
|
|
|
|
|
NDT: -90,
|
|
|
|
|
NFT: 690,
|
|
|
|
|
NOVST: 420,
|
|
|
|
|
NOVT: 360,
|
|
|
|
|
NPT: 345,
|
|
|
|
|
NST: -150,
|
|
|
|
|
NUT: -660,
|
|
|
|
|
NZDT: 780,
|
|
|
|
|
NZST: 720,
|
|
|
|
|
OMSST: 420,
|
|
|
|
|
OMST: 420,
|
|
|
|
|
PDT: -420,
|
|
|
|
|
PET: -300,
|
|
|
|
|
PETST: 720,
|
|
|
|
|
PETT: 720,
|
|
|
|
|
PGT: 600,
|
|
|
|
|
PHOT: 780,
|
|
|
|
|
PHT: 480,
|
|
|
|
|
PKT: 300,
|
|
|
|
|
PMDT: -120,
|
|
|
|
|
PMST: -180,
|
|
|
|
|
PONT: 660,
|
|
|
|
|
PST: -480,
|
|
|
|
|
PT: -480,
|
|
|
|
|
PWT: 540,
|
|
|
|
|
PYST: -180,
|
|
|
|
|
PYT: -240,
|
|
|
|
|
RET: 240,
|
|
|
|
|
SAMT: 240,
|
|
|
|
|
SAST: 120,
|
|
|
|
|
SBT: 660,
|
|
|
|
|
SCT: 240,
|
|
|
|
|
SGT: 480,
|
|
|
|
|
SRT: -180,
|
|
|
|
|
SST: -660,
|
|
|
|
|
TAHT: -600,
|
|
|
|
|
TFT: 300,
|
|
|
|
|
TJT: 300,
|
|
|
|
|
TKT: 780,
|
|
|
|
|
TLT: 540,
|
|
|
|
|
TMT: 300,
|
|
|
|
|
TVT: 720,
|
|
|
|
|
ULAT: 480,
|
|
|
|
|
UTC: 0,
|
|
|
|
|
UYST: -120,
|
|
|
|
|
UYT: -180,
|
|
|
|
|
UZT: 300,
|
|
|
|
|
VET: -210,
|
|
|
|
|
VLAST: 660,
|
|
|
|
|
VLAT: 660,
|
|
|
|
|
VUT: 660,
|
|
|
|
|
WAST: 120,
|
|
|
|
|
WAT: 60,
|
|
|
|
|
WEST: 60,
|
|
|
|
|
WESZ: 60,
|
|
|
|
|
WET: 0,
|
|
|
|
|
WEZ: 0,
|
|
|
|
|
WFT: 720,
|
|
|
|
|
WGST: -120,
|
|
|
|
|
WGT: -180,
|
|
|
|
|
WIB: 420,
|
|
|
|
|
WIT: 540,
|
|
|
|
|
WITA: 480,
|
|
|
|
|
WST: 780,
|
|
|
|
|
WT: 0,
|
|
|
|
|
YAKST: 600,
|
|
|
|
|
YAKT: 600,
|
|
|
|
|
YAPT: 600,
|
|
|
|
|
YEKST: 360,
|
|
|
|
|
YEKT: 360,
|
|
|
|
|
};
|
|
|
|
|
class ExtractTimezoneAbbrRefiner {
|
|
|
|
|
constructor(timezoneOverrides) {
|
|
|
|
|
this.timezone = Object.assign(Object.assign({}, DEFAULT_TIMEZONE_ABBR_MAP), timezoneOverrides);
|
|
|
|
|
}
|
|
|
|
|
refine(context, results) {
|
|
|
|
|
var _a;
|
|
|
|
|
const timezoneOverrides = (_a = context.option.timezones) !== null && _a !== void 0 ? _a : {};
|
|
|
|
|
results.forEach((result) => {
|
|
|
|
|
var _a, _b;
|
|
|
|
|
const suffix = context.text.substring(result.index + result.text.length);
|
|
|
|
|
const match = TIMEZONE_NAME_PATTERN.exec(suffix);
|
|
|
|
|
if (!match) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const timezoneAbbr = match[1].toUpperCase();
|
|
|
|
|
const extractedTimezoneOffset = (_b = (_a = timezoneOverrides[timezoneAbbr]) !== null && _a !== void 0 ? _a : this.timezone[timezoneAbbr]) !== null && _b !== void 0 ? _b : null;
|
|
|
|
|
if (extractedTimezoneOffset === null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
context.debug(() => {
|
|
|
|
|
console.log(`Extracting timezone: '${timezoneAbbr}' into : ${extractedTimezoneOffset}`);
|
|
|
|
|
});
|
|
|
|
|
const currentTimezoneOffset = result.start.get("timezoneOffset");
|
|
|
|
|
if (currentTimezoneOffset !== null && extractedTimezoneOffset != currentTimezoneOffset) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
result.text += match[0];
|
|
|
|
|
if (!result.start.isCertain("timezoneOffset")) {
|
|
|
|
|
result.start.assign("timezoneOffset", extractedTimezoneOffset);
|
|
|
|
|
}
|
|
|
|
|
if (result.end != null && !result.end.isCertain("timezoneOffset")) {
|
|
|
|
|
result.end.assign("timezoneOffset", extractedTimezoneOffset);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return results;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ExtractTimezoneAbbrRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ExtractTimezoneOffsetRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const TIMEZONE_OFFSET_PATTERN = new RegExp("^\\s*(?:(?:GMT|UTC)\\s?)?([+-])(\\d{1,2})(?::?(\\d{2}))?", "i");
|
|
|
|
|
const TIMEZONE_OFFSET_SIGN_GROUP = 1;
|
|
|
|
|
const TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 2;
|
|
|
|
|
const TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 3;
|
|
|
|
|
class ExtractTimezoneOffsetRefiner {
|
|
|
|
|
refine(context, results) {
|
|
|
|
|
results.forEach(function (result) {
|
|
|
|
|
if (result.start.isCertain("timezoneOffset")) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const suffix = context.text.substring(result.index + result.text.length);
|
|
|
|
|
const match = TIMEZONE_OFFSET_PATTERN.exec(suffix);
|
|
|
|
|
if (!match) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
context.debug(() => {
|
|
|
|
|
console.log(`Extracting timezone: '${match[0]}' into : ${result}`);
|
|
|
|
|
});
|
|
|
|
|
const hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]);
|
|
|
|
|
const minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP] || "0");
|
|
|
|
|
let timezoneOffset = hourOffset * 60 + minuteOffset;
|
|
|
|
|
if (match[TIMEZONE_OFFSET_SIGN_GROUP] === "-") {
|
|
|
|
|
timezoneOffset = -timezoneOffset;
|
|
|
|
|
}
|
|
|
|
|
if (result.end != null) {
|
|
|
|
|
result.end.assign("timezoneOffset", timezoneOffset);
|
|
|
|
|
}
|
|
|
|
|
result.start.assign("timezoneOffset", timezoneOffset);
|
|
|
|
|
result.text += match[0];
|
|
|
|
|
});
|
|
|
|
|
return results;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ExtractTimezoneOffsetRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var OverlapRemovalRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
class OverlapRemovalRefiner {
|
|
|
|
|
refine(context, results) {
|
|
|
|
|
if (results.length < 2) {
|
|
|
|
|
return results;
|
|
|
|
|
}
|
|
|
|
|
const filteredResults = [];
|
|
|
|
|
let prevResult = results[0];
|
|
|
|
|
for (let i = 1; i < results.length; i++) {
|
|
|
|
|
const result = results[i];
|
|
|
|
|
if (result.index < prevResult.index + prevResult.text.length) {
|
|
|
|
|
if (result.text.length > prevResult.text.length) {
|
|
|
|
|
prevResult = result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
filteredResults.push(prevResult);
|
|
|
|
|
prevResult = result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (prevResult != null) {
|
|
|
|
|
filteredResults.push(prevResult);
|
|
|
|
|
}
|
|
|
|
|
return filteredResults;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = OverlapRemovalRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ForwardDateRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
class ForwardDateRefiner {
|
|
|
|
|
refine(context, results) {
|
|
|
|
|
if (!context.option.forwardDate) {
|
|
|
|
|
return results;
|
|
|
|
|
}
|
|
|
|
|
results.forEach(function (result) {
|
|
|
|
|
let refMoment = dayjs_1.default(context.refDate);
|
|
|
|
|
if (result.start.isOnlyDayMonthComponent() && refMoment.isAfter(result.start.dayjs())) {
|
|
|
|
|
for (let i = 0; i < 3 && refMoment.isAfter(result.start.dayjs()); i++) {
|
|
|
|
|
result.start.imply("year", result.start.get("year") + 1);
|
|
|
|
|
context.debug(() => {
|
|
|
|
|
console.log(`Forward yearly adjusted for ${result} (${result.start})`);
|
|
|
|
|
});
|
|
|
|
|
if (result.end && !result.end.isCertain("year")) {
|
|
|
|
|
result.end.imply("year", result.end.get("year") + 1);
|
|
|
|
|
context.debug(() => {
|
|
|
|
|
console.log(`Forward yearly adjusted for ${result} (${result.end})`);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (result.start.isOnlyWeekdayComponent() && refMoment.isAfter(result.start.dayjs())) {
|
|
|
|
|
if (refMoment.day() > result.start.get("weekday")) {
|
|
|
|
|
refMoment = refMoment.day(result.start.get("weekday") + 7);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
refMoment = refMoment.day(result.start.get("weekday"));
|
|
|
|
|
}
|
|
|
|
|
result.start.imply("day", refMoment.date());
|
|
|
|
|
result.start.imply("month", refMoment.month() + 1);
|
|
|
|
|
result.start.imply("year", refMoment.year());
|
|
|
|
|
context.debug(() => {
|
|
|
|
|
console.log(`Forward weekly adjusted for ${result} (${result.start})`);
|
|
|
|
|
});
|
|
|
|
|
if (result.end && result.end.isOnlyWeekdayComponent()) {
|
|
|
|
|
if (refMoment.day() > result.end.get("weekday")) {
|
|
|
|
|
refMoment = refMoment.day(result.end.get("weekday") + 7);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
refMoment = refMoment.day(result.end.get("weekday"));
|
|
|
|
|
}
|
|
|
|
|
result.end.imply("day", refMoment.date());
|
|
|
|
|
result.end.imply("month", refMoment.month() + 1);
|
|
|
|
|
result.end.imply("year", refMoment.year());
|
|
|
|
|
context.debug(() => {
|
|
|
|
|
console.log(`Forward weekly adjusted for ${result} (${result.end})`);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return results;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ForwardDateRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var UnlikelyFormatFilter_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
class UnlikelyFormatFilter extends abstractRefiners.Filter {
|
|
|
|
|
constructor(strictMode) {
|
|
|
|
|
super();
|
|
|
|
|
this.strictMode = strictMode;
|
|
|
|
|
}
|
|
|
|
|
isValid(context, result) {
|
|
|
|
|
if (result.text.replace(" ", "").match(/^\d*(\.\d*)?$/)) {
|
|
|
|
|
context.debug(() => {
|
|
|
|
|
console.log(`Removing unlikely result '${result.text}'`);
|
|
|
|
|
});
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!result.start.isValidDate()) {
|
|
|
|
|
context.debug(() => {
|
|
|
|
|
console.log(`Removing invalid result: ${result} (${result.start})`);
|
|
|
|
|
});
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (result.end && !result.end.isValidDate()) {
|
|
|
|
|
context.debug(() => {
|
|
|
|
|
console.log(`Removing invalid result: ${result} (${result.end})`);
|
|
|
|
|
});
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (this.strictMode) {
|
|
|
|
|
return this.isStrictModeValid(context, result);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
isStrictModeValid(context, result) {
|
|
|
|
|
if (result.start.isOnlyWeekdayComponent()) {
|
|
|
|
|
context.debug(() => {
|
|
|
|
|
console.log(`(Strict) Removing weekday only component: ${result} (${result.end})`);
|
|
|
|
|
});
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = UnlikelyFormatFilter;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ISOFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})" +
|
|
|
|
|
"(?:T" +
|
|
|
|
|
"([0-9]{1,2}):([0-9]{1,2})" +
|
|
|
|
|
"(?:" +
|
|
|
|
|
":([0-9]{1,2})(?:\\.(\\d{1,4}))?" +
|
|
|
|
|
")?" +
|
|
|
|
|
"(?:" +
|
|
|
|
|
"Z|([+-]\\d{2}):?(\\d{2})?" +
|
|
|
|
|
")?" +
|
|
|
|
|
")?" +
|
|
|
|
|
"(?=\\W|$)", "i");
|
|
|
|
|
const YEAR_NUMBER_GROUP = 1;
|
|
|
|
|
const MONTH_NUMBER_GROUP = 2;
|
|
|
|
|
const DATE_NUMBER_GROUP = 3;
|
|
|
|
|
const HOUR_NUMBER_GROUP = 4;
|
|
|
|
|
const MINUTE_NUMBER_GROUP = 5;
|
|
|
|
|
const SECOND_NUMBER_GROUP = 6;
|
|
|
|
|
const MILLISECOND_NUMBER_GROUP = 7;
|
|
|
|
|
const TZD_HOUR_OFFSET_GROUP = 8;
|
|
|
|
|
const TZD_MINUTE_OFFSET_GROUP = 9;
|
|
|
|
|
class ISOFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const components = {};
|
|
|
|
|
components["year"] = parseInt(match[YEAR_NUMBER_GROUP]);
|
|
|
|
|
components["month"] = parseInt(match[MONTH_NUMBER_GROUP]);
|
|
|
|
|
components["day"] = parseInt(match[DATE_NUMBER_GROUP]);
|
|
|
|
|
if (match[HOUR_NUMBER_GROUP] != null) {
|
|
|
|
|
components["hour"] = parseInt(match[HOUR_NUMBER_GROUP]);
|
|
|
|
|
components["minute"] = parseInt(match[MINUTE_NUMBER_GROUP]);
|
|
|
|
|
if (match[SECOND_NUMBER_GROUP] != null) {
|
|
|
|
|
components["second"] = parseInt(match[SECOND_NUMBER_GROUP]);
|
|
|
|
|
}
|
|
|
|
|
if (match[MILLISECOND_NUMBER_GROUP] != null) {
|
|
|
|
|
components["millisecond"] = parseInt(match[MILLISECOND_NUMBER_GROUP]);
|
|
|
|
|
}
|
|
|
|
|
if (match[TZD_HOUR_OFFSET_GROUP] == null) {
|
|
|
|
|
components["timezoneOffset"] = 0;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]);
|
|
|
|
|
let minuteOffset = 0;
|
|
|
|
|
if (match[TZD_MINUTE_OFFSET_GROUP] != null) {
|
|
|
|
|
minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]);
|
|
|
|
|
}
|
|
|
|
|
let offset = hourOffset * 60;
|
|
|
|
|
if (offset < 0) {
|
|
|
|
|
offset -= minuteOffset;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
offset += minuteOffset;
|
|
|
|
|
}
|
|
|
|
|
components["timezoneOffset"] = offset;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ISOFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var MergeWeekdayComponentRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
class MergeWeekdayComponentRefiner extends abstractRefiners.MergingRefiner {
|
|
|
|
|
mergeResults(textBetween, currentResult, nextResult) {
|
|
|
|
|
const newResult = nextResult.clone();
|
|
|
|
|
newResult.index = currentResult.index;
|
|
|
|
|
newResult.text = currentResult.text + textBetween + newResult.text;
|
|
|
|
|
newResult.start.assign("weekday", currentResult.start.get("weekday"));
|
|
|
|
|
if (newResult.end) {
|
|
|
|
|
newResult.end.assign("weekday", currentResult.start.get("weekday"));
|
|
|
|
|
}
|
|
|
|
|
return newResult;
|
|
|
|
|
}
|
|
|
|
|
shouldMergeResults(textBetween, currentResult, nextResult) {
|
|
|
|
|
const weekdayThenNormalDate = currentResult.start.isOnlyWeekdayComponent() &&
|
|
|
|
|
!currentResult.start.isCertain("hour") &&
|
|
|
|
|
nextResult.start.isCertain("day");
|
|
|
|
|
return weekdayThenNormalDate && textBetween.match(/^,?\s*$/) != null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = MergeWeekdayComponentRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var configurations = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.includeCommonConfiguration = void 0;
|
|
|
|
|
const ExtractTimezoneAbbrRefiner_1$1 = __importDefault(ExtractTimezoneAbbrRefiner_1);
|
|
|
|
|
const ExtractTimezoneOffsetRefiner_1$1 = __importDefault(ExtractTimezoneOffsetRefiner_1);
|
|
|
|
|
const OverlapRemovalRefiner_1$1 = __importDefault(OverlapRemovalRefiner_1);
|
|
|
|
|
const ForwardDateRefiner_1$1 = __importDefault(ForwardDateRefiner_1);
|
|
|
|
|
const UnlikelyFormatFilter_1$1 = __importDefault(UnlikelyFormatFilter_1);
|
|
|
|
|
const ISOFormatParser_1$1 = __importDefault(ISOFormatParser_1);
|
|
|
|
|
const MergeWeekdayComponentRefiner_1$1 = __importDefault(MergeWeekdayComponentRefiner_1);
|
|
|
|
|
function includeCommonConfiguration(configuration, strictMode = false) {
|
|
|
|
|
configuration.parsers.unshift(new ISOFormatParser_1$1.default());
|
|
|
|
|
configuration.refiners.unshift(new MergeWeekdayComponentRefiner_1$1.default());
|
|
|
|
|
configuration.refiners.unshift(new ExtractTimezoneAbbrRefiner_1$1.default());
|
|
|
|
|
configuration.refiners.unshift(new ExtractTimezoneOffsetRefiner_1$1.default());
|
|
|
|
|
configuration.refiners.unshift(new OverlapRemovalRefiner_1$1.default());
|
|
|
|
|
configuration.refiners.push(new OverlapRemovalRefiner_1$1.default());
|
|
|
|
|
configuration.refiners.push(new ForwardDateRefiner_1$1.default());
|
|
|
|
|
configuration.refiners.push(new UnlikelyFormatFilter_1$1.default(strictMode));
|
|
|
|
|
return configuration;
|
|
|
|
|
}
|
|
|
|
|
exports.includeCommonConfiguration = includeCommonConfiguration;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var casualReferences = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.tonight = exports.tomorrow = exports.yesterday = exports.today = exports.now = void 0;
|
|
|
|
|
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function now(refDate) {
|
|
|
|
|
const targetDate = dayjs_1.default(refDate);
|
|
|
|
|
const component = new results.ParsingComponents(refDate, {});
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate);
|
|
|
|
|
dayjs.assignSimilarTime(component, targetDate);
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
exports.now = now;
|
|
|
|
|
function today(refDate) {
|
|
|
|
|
const targetDate = dayjs_1.default(refDate);
|
|
|
|
|
const component = new results.ParsingComponents(refDate, {});
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate);
|
|
|
|
|
dayjs.implySimilarTime(component, targetDate);
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
exports.today = today;
|
|
|
|
|
function yesterday(refDate) {
|
|
|
|
|
let targetDate = dayjs_1.default(refDate);
|
|
|
|
|
const component = new results.ParsingComponents(refDate, {});
|
|
|
|
|
targetDate = targetDate.add(-1, "day");
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate);
|
|
|
|
|
dayjs.implySimilarTime(component, targetDate);
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
exports.yesterday = yesterday;
|
|
|
|
|
function tomorrow(refDate) {
|
|
|
|
|
const targetDate = dayjs_1.default(refDate);
|
|
|
|
|
const component = new results.ParsingComponents(refDate, {});
|
|
|
|
|
dayjs.assignTheNextDay(component, targetDate);
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
exports.tomorrow = tomorrow;
|
|
|
|
|
function tonight(refDate, implyHour = 22) {
|
|
|
|
|
const targetDate = dayjs_1.default(refDate);
|
|
|
|
|
const component = new results.ParsingComponents(refDate, {});
|
|
|
|
|
component.imply("hour", implyHour);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate);
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
exports.tonight = tonight;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENCasualDateParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
|
|
|
}) : (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
o[k2] = m[k];
|
|
|
|
|
}));
|
|
|
|
|
var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
|
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
|
|
|
}) : function(o, v) {
|
|
|
|
|
o["default"] = v;
|
|
|
|
|
});
|
|
|
|
|
var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
|
|
|
|
|
if (mod && mod.__esModule) return mod;
|
|
|
|
|
var result = {};
|
|
|
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
|
|
|
__setModuleDefault(result, mod);
|
|
|
|
|
return result;
|
|
|
|
|
};
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const references = __importStar(casualReferences);
|
|
|
|
|
const PATTERN = /(now|today|tonight|tomorrow|tmr|yesterday|last\s*night)(?=\W|$)/i;
|
|
|
|
|
class ENCasualDateParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern(context) {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
let targetDate = dayjs_1.default(context.refDate);
|
|
|
|
|
const lowerText = match[0].toLowerCase();
|
|
|
|
|
const component = context.createParsingComponents();
|
|
|
|
|
switch (lowerText) {
|
|
|
|
|
case "now":
|
|
|
|
|
return references.now(context.refDate);
|
|
|
|
|
case "today":
|
|
|
|
|
return references.today(context.refDate);
|
|
|
|
|
case "yesterday":
|
|
|
|
|
return references.yesterday(context.refDate);
|
|
|
|
|
case "tomorrow":
|
|
|
|
|
case "tmr":
|
|
|
|
|
return references.tomorrow(context.refDate);
|
|
|
|
|
case "tonight":
|
|
|
|
|
return references.tonight(context.refDate);
|
|
|
|
|
default:
|
|
|
|
|
if (lowerText.match(/last\s*night/)) {
|
|
|
|
|
if (targetDate.hour() > 6) {
|
|
|
|
|
targetDate = targetDate.add(-1, "day");
|
|
|
|
|
}
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate);
|
|
|
|
|
component.imply("hour", 0);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENCasualDateParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENCasualTimeParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
|
|
|
|
|
const PATTERN = /(?:this)?\s*(morning|afternoon|evening|night|midnight|noon)(?=\W|$)/i;
|
|
|
|
|
class ENCasualTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const targetDate = dayjs_1.default(context.refDate);
|
|
|
|
|
const component = context.createParsingComponents();
|
|
|
|
|
switch (match[1].toLowerCase()) {
|
|
|
|
|
case "afternoon":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
component.imply("hour", 15);
|
|
|
|
|
break;
|
|
|
|
|
case "evening":
|
|
|
|
|
case "night":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
component.imply("hour", 20);
|
|
|
|
|
break;
|
|
|
|
|
case "midnight":
|
|
|
|
|
dayjs.assignTheNextDay(component, targetDate);
|
|
|
|
|
component.imply("hour", 0);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("second", 0);
|
|
|
|
|
break;
|
|
|
|
|
case "morning":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
component.imply("hour", 6);
|
|
|
|
|
break;
|
|
|
|
|
case "noon":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
component.imply("hour", 12);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENCasualTimeParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var weeks = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.toDayJSClosestWeekday = exports.toDayJSWeekday = void 0;
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
function toDayJSWeekday(refDate, offset, modifier) {
|
|
|
|
|
if (!modifier) {
|
|
|
|
|
return toDayJSClosestWeekday(refDate, offset);
|
|
|
|
|
}
|
|
|
|
|
let date = dayjs_1.default(refDate);
|
|
|
|
|
switch (modifier) {
|
|
|
|
|
case "this":
|
|
|
|
|
date = date.day(offset);
|
|
|
|
|
break;
|
|
|
|
|
case "next":
|
|
|
|
|
date = date.day(offset + 7);
|
|
|
|
|
break;
|
|
|
|
|
case "last":
|
|
|
|
|
date = date.day(offset - 7);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return date;
|
|
|
|
|
}
|
|
|
|
|
exports.toDayJSWeekday = toDayJSWeekday;
|
|
|
|
|
function toDayJSClosestWeekday(refDate, offset) {
|
|
|
|
|
let date = dayjs_1.default(refDate);
|
|
|
|
|
const refOffset = date.day();
|
|
|
|
|
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.toDayJSClosestWeekday = toDayJSClosestWeekday;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENWeekdayParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" +
|
|
|
|
|
"(?:on\\s*?)?" +
|
|
|
|
|
"(?:(this|last|past|next)\\s*)?" +
|
|
|
|
|
`(${pattern.matchAnyPattern(constants$5.WEEKDAY_DICTIONARY)})` +
|
|
|
|
|
"(?:\\s*(?:\\,|\\)|\\)))?" +
|
|
|
|
|
"(?:\\s*(this|last|past|next)\\s*week)?" +
|
|
|
|
|
"(?=\\W|$)", "i");
|
|
|
|
|
const PREFIX_GROUP = 1;
|
|
|
|
|
const WEEKDAY_GROUP = 2;
|
|
|
|
|
const POSTFIX_GROUP = 3;
|
|
|
|
|
class ENWeekdayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();
|
|
|
|
|
const offset = constants$5.WEEKDAY_DICTIONARY[dayOfWeek];
|
|
|
|
|
const prefix = match[PREFIX_GROUP];
|
|
|
|
|
const postfix = match[POSTFIX_GROUP];
|
|
|
|
|
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.toDayJSWeekday(context.refDate, offset, modifier);
|
|
|
|
|
return context
|
|
|
|
|
.createParsingComponents()
|
|
|
|
|
.assign("weekday", offset)
|
|
|
|
|
.imply("day", date.date())
|
|
|
|
|
.imply("month", date.month() + 1)
|
|
|
|
|
.imply("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENWeekdayParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENRelativeDateFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp(`(this|next|last|past)\\s*(${pattern.matchAnyPattern(constants$5.TIME_UNIT_DICTIONARY)})(?=\\s*)` + "(?=\\W|$)", "i");
|
|
|
|
|
const MODIFIER_WORD_GROUP = 1;
|
|
|
|
|
const RELATIVE_WORD_GROUP = 2;
|
|
|
|
|
class ENRelativeDateFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const modifier = match[MODIFIER_WORD_GROUP].toLowerCase();
|
|
|
|
|
const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase();
|
|
|
|
|
const timeunit = constants$5.TIME_UNIT_DICTIONARY[unitWord];
|
|
|
|
|
if (modifier == "next") {
|
|
|
|
|
const timeUnits = {};
|
|
|
|
|
timeUnits[timeunit] = 1;
|
|
|
|
|
return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
|
|
|
|
|
}
|
|
|
|
|
if (modifier == "last" || modifier == "past") {
|
|
|
|
|
const timeUnits = {};
|
|
|
|
|
timeUnits[timeunit] = -1;
|
|
|
|
|
return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
|
|
|
|
|
}
|
|
|
|
|
const components = context.createParsingComponents();
|
|
|
|
|
let date = dayjs_1.default(context.refDate);
|
|
|
|
|
if (unitWord.match(/week/i)) {
|
|
|
|
|
date = date.add(-date.get("d"), "d");
|
|
|
|
|
components.imply("day", date.date());
|
|
|
|
|
components.imply("month", date.month() + 1);
|
|
|
|
|
components.imply("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
else if (unitWord.match(/month/i)) {
|
|
|
|
|
date = date.add(-date.date() + 1, "d");
|
|
|
|
|
components.imply("day", date.date());
|
|
|
|
|
components.assign("year", date.year());
|
|
|
|
|
components.assign("month", date.month() + 1);
|
|
|
|
|
}
|
|
|
|
|
else if (unitWord.match(/year/i)) {
|
|
|
|
|
date = date.add(-date.date() + 1, "d");
|
|
|
|
|
date = date.add(-date.month(), "month");
|
|
|
|
|
components.imply("day", date.date());
|
|
|
|
|
components.imply("month", date.month() + 1);
|
|
|
|
|
components.assign("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENRelativeDateFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var chrono$1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.ParsingContext = exports.Chrono = void 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Chrono {
|
|
|
|
|
constructor(configuration) {
|
|
|
|
|
configuration = configuration || en.createCasualConfiguration();
|
|
|
|
|
this.parsers = [...configuration.parsers];
|
|
|
|
|
this.refiners = [...configuration.refiners];
|
|
|
|
|
}
|
|
|
|
|
clone() {
|
|
|
|
|
return new Chrono({
|
|
|
|
|
parsers: [...this.parsers],
|
|
|
|
|
refiners: [...this.refiners],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
parseDate(text, referenceDate, option) {
|
|
|
|
|
const results = this.parse(text, referenceDate, option);
|
|
|
|
|
return results.length > 0 ? results[0].start.date() : null;
|
|
|
|
|
}
|
|
|
|
|
parse(text, referenceDate, option) {
|
|
|
|
|
const context = new ParsingContext(text, referenceDate || new Date(), option || {});
|
|
|
|
|
let results = [];
|
|
|
|
|
this.parsers.forEach((parser) => {
|
|
|
|
|
const parsedResults = Chrono.executeParser(context, parser);
|
|
|
|
|
results = results.concat(parsedResults);
|
|
|
|
|
});
|
|
|
|
|
results.sort((a, b) => {
|
|
|
|
|
return a.index - b.index;
|
|
|
|
|
});
|
|
|
|
|
this.refiners.forEach(function (refiner) {
|
|
|
|
|
results = refiner.refine(context, results);
|
|
|
|
|
});
|
|
|
|
|
return results;
|
|
|
|
|
}
|
|
|
|
|
static executeParser(context, parser) {
|
|
|
|
|
const results$1 = [];
|
|
|
|
|
const pattern = parser.pattern(context);
|
|
|
|
|
const originalText = context.text;
|
|
|
|
|
let remainingText = context.text;
|
|
|
|
|
let match = pattern.exec(remainingText);
|
|
|
|
|
while (match) {
|
|
|
|
|
const index = match.index + originalText.length - remainingText.length;
|
|
|
|
|
match.index = index;
|
|
|
|
|
const result = parser.extract(context, match);
|
|
|
|
|
if (!result) {
|
|
|
|
|
remainingText = originalText.substring(match.index + 1);
|
|
|
|
|
match = pattern.exec(remainingText);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
let parsedResult = null;
|
|
|
|
|
if (result instanceof results.ParsingResult) {
|
|
|
|
|
parsedResult = result;
|
|
|
|
|
}
|
|
|
|
|
else if (result instanceof results.ParsingComponents) {
|
|
|
|
|
parsedResult = context.createParsingResult(match.index, match[0]);
|
|
|
|
|
parsedResult.start = result;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
parsedResult = context.createParsingResult(match.index, match[0], result);
|
|
|
|
|
}
|
|
|
|
|
context.debug(() => console.log(`${parser.constructor.name} extracted result ${parsedResult}`));
|
|
|
|
|
results$1.push(parsedResult);
|
|
|
|
|
remainingText = originalText.substring(index + parsedResult.text.length);
|
|
|
|
|
match = pattern.exec(remainingText);
|
|
|
|
|
}
|
|
|
|
|
return results$1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.Chrono = Chrono;
|
|
|
|
|
class ParsingContext {
|
|
|
|
|
constructor(text, refDate, option) {
|
|
|
|
|
this.text = text;
|
|
|
|
|
this.refDate = refDate;
|
|
|
|
|
this.option = option;
|
|
|
|
|
}
|
|
|
|
|
createParsingComponents(components) {
|
|
|
|
|
if (components instanceof results.ParsingComponents) {
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
return new results.ParsingComponents(this.refDate, components);
|
|
|
|
|
}
|
|
|
|
|
createParsingResult(index, textOrEndIndex, startComponents, endComponents) {
|
|
|
|
|
const text = typeof textOrEndIndex === "string" ? textOrEndIndex : this.text.substring(index, textOrEndIndex);
|
|
|
|
|
const start = startComponents ? this.createParsingComponents(startComponents) : null;
|
|
|
|
|
const end = endComponents ? this.createParsingComponents(endComponents) : null;
|
|
|
|
|
return new results.ParsingResult(this.refDate, index, text, start, end);
|
|
|
|
|
}
|
|
|
|
|
debug(block) {
|
|
|
|
|
if (this.option.debug) {
|
|
|
|
|
if (this.option.debug instanceof Function) {
|
|
|
|
|
this.option.debug(block);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const handler = this.option.debug;
|
|
|
|
|
handler.debug(block);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.ParsingContext = ParsingContext;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var SlashDateFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("([^\\d]|^)" +
|
|
|
|
|
"([0-3]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})" +
|
|
|
|
|
"(?:[\\/\\.\\-]([0-9]{4}|[0-9]{2}))?" +
|
|
|
|
|
"(\\W|$)", "i");
|
|
|
|
|
const OPENING_GROUP = 1;
|
|
|
|
|
const ENDING_GROUP = 5;
|
|
|
|
|
const FIRST_NUMBERS_GROUP = 2;
|
|
|
|
|
const SECOND_NUMBERS_GROUP = 3;
|
|
|
|
|
const YEAR_GROUP = 4;
|
|
|
|
|
class SlashDateFormatParser {
|
|
|
|
|
constructor(littleEndian) {
|
|
|
|
|
this.groupNumberMonth = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP;
|
|
|
|
|
this.groupNumberDay = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP;
|
|
|
|
|
}
|
|
|
|
|
pattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
extract(context, match) {
|
|
|
|
|
if (match[OPENING_GROUP] == "/" || match[ENDING_GROUP] == "/") {
|
|
|
|
|
match.index += match[0].length;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const index = match.index + match[OPENING_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*$/)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!match[YEAR_GROUP] && match[0].indexOf("/") < 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const result = context.createParsingResult(index, text);
|
|
|
|
|
let month = parseInt(match[this.groupNumberMonth]);
|
|
|
|
|
let day = parseInt(match[this.groupNumberDay]);
|
|
|
|
|
if (month < 1 || month > 12) {
|
|
|
|
|
if (month > 12) {
|
|
|
|
|
if (day >= 1 && day <= 12 && month <= 31) {
|
|
|
|
|
[day, month] = [month, day];
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (day < 1 || day > 31) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
result.start.assign("day", day);
|
|
|
|
|
result.start.assign("month", month);
|
|
|
|
|
if (match[YEAR_GROUP]) {
|
|
|
|
|
const rawYearNumber = parseInt(match[YEAR_GROUP]);
|
|
|
|
|
const year = years.findMostLikelyADYear(rawYearNumber);
|
|
|
|
|
result.start.assign("year", year);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const year = years.findYearClosestToRef(context.refDate, day, month);
|
|
|
|
|
result.start.imply("year", year);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = SlashDateFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ENTimeUnitCasualRelativeFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp(`(this|last|past|next|\\+|-)\\s*(${constants$5.TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
|
|
|
|
|
class ENTimeUnitCasualRelativeFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const prefix = match[1].toLowerCase();
|
|
|
|
|
let timeUnits = constants$5.parseTimeUnits(match[2]);
|
|
|
|
|
switch (prefix) {
|
|
|
|
|
case "last":
|
|
|
|
|
case "past":
|
|
|
|
|
case "-":
|
|
|
|
|
timeUnits = timeunits.reverseTimeUnits(timeUnits);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = ENTimeUnitCasualRelativeFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var en = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.GB = exports.strict = exports.casual = void 0;
|
|
|
|
|
const ENTimeUnitWithinFormatParser_1$1 = __importDefault(ENTimeUnitWithinFormatParser_1);
|
|
|
|
|
const ENMonthNameLittleEndianParser_1$1 = __importDefault(ENMonthNameLittleEndianParser_1);
|
|
|
|
|
const ENMonthNameMiddleEndianParser_1$1 = __importDefault(ENMonthNameMiddleEndianParser_1);
|
|
|
|
|
const ENMonthNameParser_1$1 = __importDefault(ENMonthNameParser_1);
|
|
|
|
|
const ENCasualYearMonthDayParser_1$1 = __importDefault(ENCasualYearMonthDayParser_1);
|
|
|
|
|
const ENSlashMonthFormatParser_1$1 = __importDefault(ENSlashMonthFormatParser_1);
|
|
|
|
|
const ENTimeExpressionParser_1$1 = __importDefault(ENTimeExpressionParser_1);
|
|
|
|
|
const ENTimeUnitAgoFormatParser_1$1 = __importDefault(ENTimeUnitAgoFormatParser_1);
|
|
|
|
|
const ENTimeUnitLaterFormatParser_1$1 = __importDefault(ENTimeUnitLaterFormatParser_1);
|
|
|
|
|
const ENMergeDateRangeRefiner_1$1 = __importDefault(ENMergeDateRangeRefiner_1);
|
|
|
|
|
const ENMergeDateTimeRefiner_1$1 = __importDefault(ENMergeDateTimeRefiner_1);
|
|
|
|
|
|
|
|
|
|
const ENCasualDateParser_1$1 = __importDefault(ENCasualDateParser_1);
|
|
|
|
|
const ENCasualTimeParser_1$1 = __importDefault(ENCasualTimeParser_1);
|
|
|
|
|
const ENWeekdayParser_1$1 = __importDefault(ENWeekdayParser_1);
|
|
|
|
|
const ENRelativeDateFormatParser_1$1 = __importDefault(ENRelativeDateFormatParser_1);
|
|
|
|
|
|
|
|
|
|
const SlashDateFormatParser_1$1 = __importDefault(SlashDateFormatParser_1);
|
|
|
|
|
const ENTimeUnitCasualRelativeFormatParser_1$1 = __importDefault(ENTimeUnitCasualRelativeFormatParser_1);
|
|
|
|
|
exports.casual = new chrono$1.Chrono(createCasualConfiguration(false));
|
|
|
|
|
exports.strict = new chrono$1.Chrono(createConfiguration(true, false));
|
|
|
|
|
exports.GB = new chrono$1.Chrono(createConfiguration(false, true));
|
|
|
|
|
function parse(text, ref, option) {
|
|
|
|
|
return exports.casual.parse(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parse = parse;
|
|
|
|
|
function parseDate(text, ref, option) {
|
|
|
|
|
return exports.casual.parseDate(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parseDate = parseDate;
|
|
|
|
|
function createCasualConfiguration(littleEndian = false) {
|
|
|
|
|
const option = createConfiguration(false, littleEndian);
|
|
|
|
|
option.parsers.unshift(new ENCasualDateParser_1$1.default());
|
|
|
|
|
option.parsers.unshift(new ENCasualTimeParser_1$1.default());
|
|
|
|
|
option.parsers.unshift(new ENMonthNameParser_1$1.default());
|
|
|
|
|
option.parsers.unshift(new ENRelativeDateFormatParser_1$1.default());
|
|
|
|
|
option.parsers.unshift(new ENTimeUnitCasualRelativeFormatParser_1$1.default());
|
|
|
|
|
return option;
|
|
|
|
|
}
|
|
|
|
|
exports.createCasualConfiguration = createCasualConfiguration;
|
|
|
|
|
function createConfiguration(strictMode = true, littleEndian = false) {
|
|
|
|
|
return configurations.includeCommonConfiguration({
|
|
|
|
|
parsers: [
|
|
|
|
|
new SlashDateFormatParser_1$1.default(littleEndian),
|
|
|
|
|
new ENTimeUnitWithinFormatParser_1$1.default(),
|
|
|
|
|
new ENMonthNameLittleEndianParser_1$1.default(),
|
|
|
|
|
new ENMonthNameMiddleEndianParser_1$1.default(),
|
|
|
|
|
new ENWeekdayParser_1$1.default(),
|
|
|
|
|
new ENCasualYearMonthDayParser_1$1.default(),
|
|
|
|
|
new ENSlashMonthFormatParser_1$1.default(),
|
|
|
|
|
new ENTimeExpressionParser_1$1.default(strictMode),
|
|
|
|
|
new ENTimeUnitAgoFormatParser_1$1.default(strictMode),
|
|
|
|
|
new ENTimeUnitLaterFormatParser_1$1.default(strictMode),
|
|
|
|
|
],
|
|
|
|
|
refiners: [new ENMergeDateTimeRefiner_1$1.default(), new ENMergeDateRangeRefiner_1$1.default()],
|
|
|
|
|
}, strictMode);
|
|
|
|
|
}
|
|
|
|
|
exports.createConfiguration = createConfiguration;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var DETimeExpressionParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DETimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser {
|
|
|
|
|
primaryPrefix() {
|
|
|
|
|
return "(?:(?:um|von)\\s*)?";
|
|
|
|
|
}
|
|
|
|
|
followingPhase() {
|
|
|
|
|
return "\\s*(?:\\-|\\–|\\~|\\〜|bis)\\s*";
|
|
|
|
|
}
|
|
|
|
|
primarySuffix() {
|
|
|
|
|
return "(?:\\s*uhr)?(?:\\s*(?:morgens|vormittags|nachmittags|abends|nachts))?(?=\\W|$)";
|
|
|
|
|
}
|
|
|
|
|
extractPrimaryTimeComponents(context, match) {
|
|
|
|
|
const components = super.extractPrimaryTimeComponents(context, match);
|
|
|
|
|
if (components) {
|
|
|
|
|
if (match[0].endsWith("morgens") || match[0].endsWith("vormittags")) {
|
|
|
|
|
components.assign("meridiem", dist.Meridiem.AM);
|
|
|
|
|
const hour = components.get("hour");
|
|
|
|
|
if (hour < 12) {
|
|
|
|
|
components.assign("hour", components.get("hour"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (match[0].endsWith("nachmittags") || match[0].endsWith("abends") || match[0].endsWith("nachts")) {
|
|
|
|
|
components.assign("meridiem", dist.Meridiem.PM);
|
|
|
|
|
const hour = components.get("hour");
|
|
|
|
|
if (hour < 12) {
|
|
|
|
|
components.assign("hour", components.get("hour") + 12);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = DETimeExpressionParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var constants$4 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exports.WEEKDAY_DICTIONARY = {
|
|
|
|
|
"sonntag": 0,
|
|
|
|
|
"so": 0,
|
|
|
|
|
"montag": 1,
|
|
|
|
|
"mo": 1,
|
|
|
|
|
"dienstag": 2,
|
|
|
|
|
"di": 2,
|
|
|
|
|
"mittwoch": 3,
|
|
|
|
|
"mi": 3,
|
|
|
|
|
"donnerstag": 4,
|
|
|
|
|
"do": 4,
|
|
|
|
|
"freitag": 5,
|
|
|
|
|
"fr": 5,
|
|
|
|
|
"samstag": 6,
|
|
|
|
|
"sa": 6,
|
|
|
|
|
};
|
|
|
|
|
exports.MONTH_DICTIONARY = {
|
|
|
|
|
"januar": 1,
|
|
|
|
|
"jan": 1,
|
|
|
|
|
"jan.": 1,
|
|
|
|
|
"februar": 2,
|
|
|
|
|
"feb": 2,
|
|
|
|
|
"feb.": 2,
|
|
|
|
|
"märz": 3,
|
|
|
|
|
"maerz": 3,
|
|
|
|
|
"mär": 3,
|
|
|
|
|
"mär.": 3,
|
|
|
|
|
"mrz": 3,
|
|
|
|
|
"mrz.": 3,
|
|
|
|
|
"april": 4,
|
|
|
|
|
"apr": 4,
|
|
|
|
|
"apr.": 4,
|
|
|
|
|
"mai": 5,
|
|
|
|
|
"juni": 6,
|
|
|
|
|
"jun": 6,
|
|
|
|
|
"jun.": 6,
|
|
|
|
|
"juli": 7,
|
|
|
|
|
"jul": 7,
|
|
|
|
|
"jul.": 7,
|
|
|
|
|
"august": 8,
|
|
|
|
|
"aug": 8,
|
|
|
|
|
"aug.": 8,
|
|
|
|
|
"september": 9,
|
|
|
|
|
"sep": 9,
|
|
|
|
|
"sep.": 9,
|
|
|
|
|
"sept": 9,
|
|
|
|
|
"sept.": 9,
|
|
|
|
|
"oktober": 10,
|
|
|
|
|
"okt": 10,
|
|
|
|
|
"okt.": 10,
|
|
|
|
|
"november": 11,
|
|
|
|
|
"nov": 11,
|
|
|
|
|
"nov.": 11,
|
|
|
|
|
"dezember": 12,
|
|
|
|
|
"dez": 12,
|
|
|
|
|
"dez.": 12,
|
|
|
|
|
};
|
|
|
|
|
exports.INTEGER_WORD_DICTIONARY = {
|
|
|
|
|
"eins": 1,
|
|
|
|
|
"zwei": 2,
|
|
|
|
|
"drei": 3,
|
|
|
|
|
"vier": 4,
|
|
|
|
|
"fünf": 5,
|
|
|
|
|
"fuenf": 5,
|
|
|
|
|
"sechs": 6,
|
|
|
|
|
"sieben": 7,
|
|
|
|
|
"acht": 8,
|
|
|
|
|
"neun": 9,
|
|
|
|
|
"zehn": 10,
|
|
|
|
|
"elf": 11,
|
|
|
|
|
"zwölf": 12,
|
|
|
|
|
"zwoelf": 12,
|
|
|
|
|
};
|
|
|
|
|
exports.TIME_UNIT_DICTIONARY = {
|
|
|
|
|
sec: "second",
|
|
|
|
|
second: "second",
|
|
|
|
|
seconds: "second",
|
|
|
|
|
min: "minute",
|
|
|
|
|
mins: "minute",
|
|
|
|
|
minute: "minute",
|
|
|
|
|
minutes: "minute",
|
|
|
|
|
h: "hour",
|
|
|
|
|
hr: "hour",
|
|
|
|
|
hrs: "hour",
|
|
|
|
|
hour: "hour",
|
|
|
|
|
hours: "hour",
|
|
|
|
|
day: "d",
|
|
|
|
|
days: "d",
|
|
|
|
|
week: "week",
|
|
|
|
|
weeks: "week",
|
|
|
|
|
month: "month",
|
|
|
|
|
months: "month",
|
|
|
|
|
y: "year",
|
|
|
|
|
yr: "year",
|
|
|
|
|
year: "year",
|
|
|
|
|
years: "year",
|
|
|
|
|
};
|
|
|
|
|
exports.NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`;
|
|
|
|
|
function parseNumberPattern(match) {
|
|
|
|
|
const num = match.toLowerCase();
|
|
|
|
|
if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) {
|
|
|
|
|
return exports.INTEGER_WORD_DICTIONARY[num];
|
|
|
|
|
}
|
|
|
|
|
else if (num === "a" || num === "an") {
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
else if (num.match(/few/)) {
|
|
|
|
|
return 3;
|
|
|
|
|
}
|
|
|
|
|
else if (num.match(/half/)) {
|
|
|
|
|
return 0.5;
|
|
|
|
|
}
|
|
|
|
|
else if (num.match(/couple/)) {
|
|
|
|
|
return 2;
|
|
|
|
|
}
|
|
|
|
|
else if (num.match(/several/)) {
|
|
|
|
|
return 7;
|
|
|
|
|
}
|
|
|
|
|
return parseFloat(num);
|
|
|
|
|
}
|
|
|
|
|
exports.parseNumberPattern = parseNumberPattern;
|
|
|
|
|
exports.YEAR_PATTERN = `(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*C(?:hr)?\\.?)?)`;
|
|
|
|
|
function parseYear(match) {
|
|
|
|
|
if (/v/i.test(match)) {
|
|
|
|
|
return -parseInt(match.replace(/[^0-9]+/gi, ""));
|
|
|
|
|
}
|
|
|
|
|
if (/n/i.test(match)) {
|
|
|
|
|
return parseInt(match.replace(/[^0-9]+/gi, ""));
|
|
|
|
|
}
|
|
|
|
|
const rawYearNumber = parseInt(match);
|
|
|
|
|
return years.findMostLikelyADYear(rawYearNumber);
|
|
|
|
|
}
|
|
|
|
|
exports.parseYear = parseYear;
|
|
|
|
|
const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`;
|
|
|
|
|
const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i");
|
|
|
|
|
exports.TIME_UNITS_PATTERN = pattern.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN);
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
exports.parseTimeUnits = parseTimeUnits;
|
|
|
|
|
function collectDateTimeFragment(fragments, match) {
|
|
|
|
|
const num = parseNumberPattern(match[1]);
|
|
|
|
|
const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()];
|
|
|
|
|
fragments[unit] = num;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var DEWeekdayParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" +
|
|
|
|
|
"(?:a[mn]\\s*?)?" +
|
|
|
|
|
"(?:(diese[mn]|letzte[mn]|n(?:ä|ae)chste[mn])\\s*)?" +
|
|
|
|
|
`(${pattern.matchAnyPattern(constants$4.WEEKDAY_DICTIONARY)})` +
|
|
|
|
|
"(?:\\s*(?:\\,|\\)|\\)))?" +
|
|
|
|
|
"(?:\\s*(diese|letzte|n(?:ä|ae)chste)\\s*woche)?" +
|
|
|
|
|
"(?=\\W|$)", "i");
|
|
|
|
|
const PREFIX_GROUP = 1;
|
|
|
|
|
const SUFFIX_GROUP = 3;
|
|
|
|
|
const WEEKDAY_GROUP = 2;
|
|
|
|
|
class DEWeekdayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();
|
|
|
|
|
const offset = constants$4.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(/letzte/)) {
|
|
|
|
|
modifier = "last";
|
|
|
|
|
}
|
|
|
|
|
else if (modifierWord.match(/chste/)) {
|
|
|
|
|
modifier = "next";
|
|
|
|
|
}
|
|
|
|
|
else if (modifierWord.match(/diese/)) {
|
|
|
|
|
modifier = "this";
|
|
|
|
|
}
|
|
|
|
|
const date = weeks.toDayJSWeekday(context.refDate, offset, modifier);
|
|
|
|
|
return context
|
|
|
|
|
.createParsingComponents()
|
|
|
|
|
.assign("weekday", offset)
|
|
|
|
|
.imply("day", date.date())
|
|
|
|
|
.imply("month", date.month() + 1)
|
|
|
|
|
.imply("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = DEWeekdayParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var DEMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1);
|
|
|
|
|
class DEMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default {
|
|
|
|
|
patternBetween() {
|
|
|
|
|
return /^\s*(bis(?:\s*(?:am|zum))?|-)\s*$/i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = DEMergeDateRangeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var DEMergeDateTimeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const AbstractMergeDateTimeRefiner_1 = __importDefault(AbstractMergeDateTimeRefiner);
|
|
|
|
|
class DEMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default {
|
|
|
|
|
patternBetween() {
|
|
|
|
|
return new RegExp("^\\s*(T|um|am|,|-)?\\s*$");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = DEMergeDateTimeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var DECasualTimeParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DECasualTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern(context) {
|
|
|
|
|
return /(diesen)?\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht)(?=\W|$)/i;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const targetDate = dayjs_1.default(context.refDate);
|
|
|
|
|
const timeKeywordPattern = match[2].toLowerCase();
|
|
|
|
|
const component = context.createParsingComponents();
|
|
|
|
|
dayjs.implySimilarTime(component, targetDate);
|
|
|
|
|
return DECasualTimeParser.extractTimeComponents(component, timeKeywordPattern);
|
|
|
|
|
}
|
|
|
|
|
static extractTimeComponents(component, timeKeywordPattern) {
|
|
|
|
|
switch (timeKeywordPattern) {
|
|
|
|
|
case "morgen":
|
|
|
|
|
component.imply("hour", 6);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("second", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
break;
|
|
|
|
|
case "vormittag":
|
|
|
|
|
component.imply("hour", 9);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("second", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
break;
|
|
|
|
|
case "mittag":
|
|
|
|
|
case "mittags":
|
|
|
|
|
component.imply("hour", 12);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("second", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
break;
|
|
|
|
|
case "nachmittag":
|
|
|
|
|
component.imply("hour", 15);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("second", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
break;
|
|
|
|
|
case "abend":
|
|
|
|
|
component.imply("hour", 18);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("second", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
break;
|
|
|
|
|
case "nacht":
|
|
|
|
|
component.imply("hour", 22);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("second", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
break;
|
|
|
|
|
case "mitternacht":
|
|
|
|
|
if (component.get("hour") > 1) {
|
|
|
|
|
component = timeunits.addImpliedTimeUnits(component, { "day": 1 });
|
|
|
|
|
}
|
|
|
|
|
component.imply("hour", 0);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("second", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = DECasualTimeParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var DECasualDateParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
|
|
|
}) : (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
o[k2] = m[k];
|
|
|
|
|
}));
|
|
|
|
|
var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
|
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
|
|
|
}) : function(o, v) {
|
|
|
|
|
o["default"] = v;
|
|
|
|
|
});
|
|
|
|
|
var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
|
|
|
|
|
if (mod && mod.__esModule) return mod;
|
|
|
|
|
var result = {};
|
|
|
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
|
|
|
__setModuleDefault(result, mod);
|
|
|
|
|
return result;
|
|
|
|
|
};
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const DECasualTimeParser_1$1 = __importDefault(DECasualTimeParser_1);
|
|
|
|
|
const references = __importStar(casualReferences);
|
|
|
|
|
const PATTERN = new RegExp(`(jetzt|heute|morgen|übermorgen|uebermorgen|gestern|vorgestern|letzte\\s*nacht)` +
|
|
|
|
|
`(?:\\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht))?` +
|
|
|
|
|
`(?=\\W|$)`, "i");
|
|
|
|
|
const DATE_GROUP = 1;
|
|
|
|
|
const TIME_GROUP = 2;
|
|
|
|
|
class DECasualDateParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern(context) {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
let targetDate = dayjs_1.default(context.refDate);
|
|
|
|
|
const dateKeyword = (match[DATE_GROUP] || "").toLowerCase();
|
|
|
|
|
const timeKeyword = (match[TIME_GROUP] || "").toLowerCase();
|
|
|
|
|
let component = context.createParsingComponents();
|
|
|
|
|
switch (dateKeyword) {
|
|
|
|
|
case "jetzt":
|
|
|
|
|
component = references.now(context.refDate);
|
|
|
|
|
break;
|
|
|
|
|
case "heute":
|
|
|
|
|
component = references.today(context.refDate);
|
|
|
|
|
break;
|
|
|
|
|
case "morgen":
|
|
|
|
|
dayjs.assignTheNextDay(component, targetDate);
|
|
|
|
|
break;
|
|
|
|
|
case "übermorgen":
|
|
|
|
|
case "uebermorgen":
|
|
|
|
|
targetDate = targetDate.add(1, "day");
|
|
|
|
|
dayjs.assignTheNextDay(component, targetDate);
|
|
|
|
|
break;
|
|
|
|
|
case "gestern":
|
|
|
|
|
targetDate = targetDate.add(-1, "day");
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate);
|
|
|
|
|
dayjs.implySimilarTime(component, targetDate);
|
|
|
|
|
break;
|
|
|
|
|
case "vorgestern":
|
|
|
|
|
targetDate = targetDate.add(-2, "day");
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate);
|
|
|
|
|
dayjs.implySimilarTime(component, targetDate);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
if (dateKeyword.match(/letzte\s*nacht/)) {
|
|
|
|
|
if (targetDate.hour() > 6) {
|
|
|
|
|
targetDate = targetDate.add(-1, "day");
|
|
|
|
|
}
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate);
|
|
|
|
|
component.imply("hour", 0);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (timeKeyword) {
|
|
|
|
|
component = DECasualTimeParser_1$1.default.extractTimeComponents(component, timeKeyword);
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = DECasualDateParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var DEMonthNameLittleEndianParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const constants_2 = constants$4;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("(?:am\\s*?)?" +
|
|
|
|
|
"(?:den\\s*?)?" +
|
|
|
|
|
`([0-9]{1,2})\\.` +
|
|
|
|
|
`(?:\\s*(?:bis(?:\\s*(?:am|zum))?|\\-|\\–|\\s)\\s*([0-9]{1,2})\\.?)?\\s*` +
|
|
|
|
|
`(${pattern.matchAnyPattern(constants$4.MONTH_DICTIONARY)})` +
|
|
|
|
|
`(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?` +
|
|
|
|
|
`(?=\\W|$)`, "i");
|
|
|
|
|
const DATE_GROUP = 1;
|
|
|
|
|
const DATE_TO_GROUP = 2;
|
|
|
|
|
const MONTH_NAME_GROUP = 3;
|
|
|
|
|
const YEAR_GROUP = 4;
|
|
|
|
|
class DEMonthNameLittleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const result = context.createParsingResult(match.index, match[0]);
|
|
|
|
|
const month = constants$4.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
|
|
|
|
|
const day = parseInt(match[DATE_GROUP]);
|
|
|
|
|
if (day > 31) {
|
|
|
|
|
match.index = match.index + match[DATE_GROUP].length;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
result.start.assign("month", month);
|
|
|
|
|
result.start.assign("day", day);
|
|
|
|
|
if (match[YEAR_GROUP]) {
|
|
|
|
|
const yearNumber = constants_2.parseYear(match[YEAR_GROUP]);
|
|
|
|
|
result.start.assign("year", yearNumber);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const year = years.findYearClosestToRef(context.refDate, day, month);
|
|
|
|
|
result.start.imply("year", year);
|
|
|
|
|
}
|
|
|
|
|
if (match[DATE_TO_GROUP]) {
|
|
|
|
|
const endDate = parseInt(match[DATE_TO_GROUP]);
|
|
|
|
|
result.end = result.start.clone();
|
|
|
|
|
result.end.assign("day", endDate);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = DEMonthNameLittleEndianParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var de = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const SlashDateFormatParser_1$1 = __importDefault(SlashDateFormatParser_1);
|
|
|
|
|
const ISOFormatParser_1$1 = __importDefault(ISOFormatParser_1);
|
|
|
|
|
const DETimeExpressionParser_1$1 = __importDefault(DETimeExpressionParser_1);
|
|
|
|
|
const DEWeekdayParser_1$1 = __importDefault(DEWeekdayParser_1);
|
|
|
|
|
const DEMergeDateRangeRefiner_1$1 = __importDefault(DEMergeDateRangeRefiner_1);
|
|
|
|
|
const DEMergeDateTimeRefiner_1$1 = __importDefault(DEMergeDateTimeRefiner_1);
|
|
|
|
|
const DECasualDateParser_1$1 = __importDefault(DECasualDateParser_1);
|
|
|
|
|
const DECasualTimeParser_1$1 = __importDefault(DECasualTimeParser_1);
|
|
|
|
|
const DEMonthNameLittleEndianParser_1$1 = __importDefault(DEMonthNameLittleEndianParser_1);
|
|
|
|
|
exports.casual = new chrono$1.Chrono(createCasualConfiguration());
|
|
|
|
|
exports.strict = new chrono$1.Chrono(createConfiguration(true));
|
|
|
|
|
function parse(text, ref, option) {
|
|
|
|
|
return exports.casual.parse(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parse = parse;
|
|
|
|
|
function parseDate(text, ref, option) {
|
|
|
|
|
return exports.casual.parseDate(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parseDate = parseDate;
|
|
|
|
|
function createCasualConfiguration(littleEndian = true) {
|
|
|
|
|
const option = createConfiguration(false, littleEndian);
|
|
|
|
|
option.parsers.unshift(new DECasualTimeParser_1$1.default());
|
|
|
|
|
option.parsers.unshift(new DECasualDateParser_1$1.default());
|
|
|
|
|
return option;
|
|
|
|
|
}
|
|
|
|
|
exports.createCasualConfiguration = createCasualConfiguration;
|
|
|
|
|
function createConfiguration(strictMode = true, littleEndian = true) {
|
|
|
|
|
return configurations.includeCommonConfiguration({
|
|
|
|
|
parsers: [
|
|
|
|
|
new ISOFormatParser_1$1.default(),
|
|
|
|
|
new SlashDateFormatParser_1$1.default(littleEndian),
|
|
|
|
|
new DETimeExpressionParser_1$1.default(),
|
|
|
|
|
new DEMonthNameLittleEndianParser_1$1.default(),
|
|
|
|
|
new DEWeekdayParser_1$1.default(),
|
|
|
|
|
],
|
|
|
|
|
refiners: [new DEMergeDateRangeRefiner_1$1.default(), new DEMergeDateTimeRefiner_1$1.default()],
|
|
|
|
|
}, strictMode);
|
|
|
|
|
}
|
|
|
|
|
exports.createConfiguration = createConfiguration;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var FRCasualDateParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
|
|
|
}) : (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
o[k2] = m[k];
|
|
|
|
|
}));
|
|
|
|
|
var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
|
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
|
|
|
}) : function(o, v) {
|
|
|
|
|
o["default"] = v;
|
|
|
|
|
});
|
|
|
|
|
var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
|
|
|
|
|
if (mod && mod.__esModule) return mod;
|
|
|
|
|
var result = {};
|
|
|
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
|
|
|
__setModuleDefault(result, mod);
|
|
|
|
|
return result;
|
|
|
|
|
};
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const references = __importStar(casualReferences);
|
|
|
|
|
class FRCasualDateParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern(context) {
|
|
|
|
|
return /(maintenant|aujourd'hui|demain|hier|cette\s*nuit|la\s*veille)(?=\W|$)/i;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
let targetDate = dayjs_1.default(context.refDate);
|
|
|
|
|
const lowerText = match[0].toLowerCase();
|
|
|
|
|
const component = context.createParsingComponents();
|
|
|
|
|
switch (lowerText) {
|
|
|
|
|
case "maintenant":
|
|
|
|
|
return references.now(context.refDate);
|
|
|
|
|
case "aujourd'hui":
|
|
|
|
|
return references.today(context.refDate);
|
|
|
|
|
case "hier":
|
|
|
|
|
return references.yesterday(context.refDate);
|
|
|
|
|
case "demain":
|
|
|
|
|
return references.tomorrow(context.refDate);
|
|
|
|
|
default:
|
|
|
|
|
if (lowerText.match(/cette\s*nuit/)) {
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate);
|
|
|
|
|
component.imply("hour", 22);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
}
|
|
|
|
|
else if (lowerText.match(/la\s*veille/)) {
|
|
|
|
|
targetDate = targetDate.add(-1, "day");
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate);
|
|
|
|
|
component.imply("hour", 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = FRCasualDateParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var FRCasualTimeParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FRCasualTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern(context) {
|
|
|
|
|
return /(cet?)?\s*(matin|soir|après-midi|aprem|a midi|à minuit)(?=\W|$)/i;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const suffixLower = match[2].toLowerCase();
|
|
|
|
|
const component = context.createParsingComponents();
|
|
|
|
|
switch (suffixLower) {
|
|
|
|
|
case "après-midi":
|
|
|
|
|
case "aprem":
|
|
|
|
|
component.imply("hour", 14);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
break;
|
|
|
|
|
case "soir":
|
|
|
|
|
component.imply("hour", 18);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
break;
|
|
|
|
|
case "matin":
|
|
|
|
|
component.imply("hour", 8);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
break;
|
|
|
|
|
case "a midi":
|
|
|
|
|
component.imply("hour", 12);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
break;
|
|
|
|
|
case "à minuit":
|
|
|
|
|
component.imply("hour", 0);
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = FRCasualTimeParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var FRTimeExpressionParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
class FRTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser {
|
|
|
|
|
primaryPrefix() {
|
|
|
|
|
return "(?:(?:[àa])\\s*)?";
|
|
|
|
|
}
|
|
|
|
|
followingPhase() {
|
|
|
|
|
return "\\s*(?:\\-|\\–|\\~|\\〜|[àa]|\\?)\\s*";
|
|
|
|
|
}
|
|
|
|
|
extractPrimaryTimeComponents(context, match) {
|
|
|
|
|
if (match[0].match(/^\s*\d{4}\s*$/)) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
return super.extractPrimaryTimeComponents(context, match);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = FRTimeExpressionParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var FRMergeDateTimeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const AbstractMergeDateTimeRefiner_1 = __importDefault(AbstractMergeDateTimeRefiner);
|
|
|
|
|
class FRMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default {
|
|
|
|
|
patternBetween() {
|
|
|
|
|
return new RegExp("^\\s*(T|à|a|vers|de|,|-)?\\s*$");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = FRMergeDateTimeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var FRMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1);
|
|
|
|
|
class FRMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default {
|
|
|
|
|
patternBetween() {
|
|
|
|
|
return /^\s*(à|a|-)\s*$/i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = FRMergeDateRangeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var constants$3 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0;
|
|
|
|
|
|
|
|
|
|
exports.WEEKDAY_DICTIONARY = {
|
|
|
|
|
"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 = {
|
|
|
|
|
"janvier": 1,
|
|
|
|
|
"jan": 1,
|
|
|
|
|
"jan.": 1,
|
|
|
|
|
"février": 2,
|
|
|
|
|
"fév": 2,
|
|
|
|
|
"fév.": 2,
|
|
|
|
|
"fevrier": 2,
|
|
|
|
|
"fev": 2,
|
|
|
|
|
"fev.": 2,
|
|
|
|
|
"mars": 3,
|
|
|
|
|
"mar": 3,
|
|
|
|
|
"mar.": 3,
|
|
|
|
|
"avril": 4,
|
|
|
|
|
"avr": 4,
|
|
|
|
|
"avr.": 4,
|
|
|
|
|
"mai": 5,
|
|
|
|
|
"juin": 6,
|
|
|
|
|
"jun": 6,
|
|
|
|
|
"juillet": 7,
|
|
|
|
|
"juil": 7,
|
|
|
|
|
"jul": 7,
|
|
|
|
|
"jul.": 7,
|
|
|
|
|
"août": 8,
|
|
|
|
|
"aout": 8,
|
|
|
|
|
"septembre": 9,
|
|
|
|
|
"sep": 9,
|
|
|
|
|
"sep.": 9,
|
|
|
|
|
"sept": 9,
|
|
|
|
|
"sept.": 9,
|
|
|
|
|
"octobre": 10,
|
|
|
|
|
"oct": 10,
|
|
|
|
|
"oct.": 10,
|
|
|
|
|
"novembre": 11,
|
|
|
|
|
"nov": 11,
|
|
|
|
|
"nov.": 11,
|
|
|
|
|
"décembre": 12,
|
|
|
|
|
"decembre": 12,
|
|
|
|
|
"dec": 12,
|
|
|
|
|
"dec.": 12,
|
|
|
|
|
};
|
|
|
|
|
exports.INTEGER_WORD_DICTIONARY = {
|
|
|
|
|
"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",
|
|
|
|
|
"trimestre": "quarter",
|
|
|
|
|
"trimestres": "quarter",
|
|
|
|
|
"ans": "year",
|
|
|
|
|
"année": "year",
|
|
|
|
|
"années": "year",
|
|
|
|
|
};
|
|
|
|
|
exports.NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|une?|quelques?|demi-?)`;
|
|
|
|
|
function parseNumberPattern(match) {
|
|
|
|
|
const num = match.toLowerCase();
|
|
|
|
|
if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) {
|
|
|
|
|
return exports.INTEGER_WORD_DICTIONARY[num];
|
|
|
|
|
}
|
|
|
|
|
else if (num === "une" || num === "un") {
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
else if (num.match(/quelques?/)) {
|
|
|
|
|
return 3;
|
|
|
|
|
}
|
|
|
|
|
else if (num.match(/demi-?/)) {
|
|
|
|
|
return 0.5;
|
|
|
|
|
}
|
|
|
|
|
return parseFloat(num);
|
|
|
|
|
}
|
|
|
|
|
exports.parseNumberPattern = parseNumberPattern;
|
|
|
|
|
exports.ORDINAL_NUMBER_PATTERN = `(?:[0-9]{1,2}(?:er)?)`;
|
|
|
|
|
function parseOrdinalNumberPattern(match) {
|
|
|
|
|
let num = match.toLowerCase();
|
|
|
|
|
num = num.replace(/(?:er)$/i, "");
|
|
|
|
|
return parseInt(num);
|
|
|
|
|
}
|
|
|
|
|
exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern;
|
|
|
|
|
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 (/AC/i.test(match)) {
|
|
|
|
|
match = match.replace(/BC/i, "");
|
|
|
|
|
return -parseInt(match);
|
|
|
|
|
}
|
|
|
|
|
if (/AD/i.test(match) || /C/i.test(match)) {
|
|
|
|
|
match = match.replace(/[^\d]+/i, "");
|
|
|
|
|
return parseInt(match);
|
|
|
|
|
}
|
|
|
|
|
let yearNumber = parseInt(match);
|
|
|
|
|
if (yearNumber < 100) {
|
|
|
|
|
if (yearNumber > 50) {
|
|
|
|
|
yearNumber = yearNumber + 1900;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
yearNumber = yearNumber + 2000;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return yearNumber;
|
|
|
|
|
}
|
|
|
|
|
exports.parseYear = parseYear;
|
|
|
|
|
const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`;
|
|
|
|
|
const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i");
|
|
|
|
|
exports.TIME_UNITS_PATTERN = pattern.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN);
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
exports.parseTimeUnits = parseTimeUnits;
|
|
|
|
|
function collectDateTimeFragment(fragments, match) {
|
|
|
|
|
const num = parseNumberPattern(match[1]);
|
|
|
|
|
const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()];
|
|
|
|
|
fragments[unit] = num;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var FRWeekdayParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" +
|
|
|
|
|
"(?:(?:ce)\\s*)?" +
|
|
|
|
|
`(${pattern.matchAnyPattern(constants$3.WEEKDAY_DICTIONARY)})` +
|
|
|
|
|
"(?:\\s*(?:\\,|\\)|\\)))?" +
|
|
|
|
|
"(?:\\s*(dernier|prochain)\\s*)?" +
|
|
|
|
|
"(?=\\W|\\d|$)", "i");
|
|
|
|
|
const WEEKDAY_GROUP = 1;
|
|
|
|
|
const POSTFIX_GROUP = 2;
|
|
|
|
|
class FRWeekdayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();
|
|
|
|
|
const offset = constants$3.WEEKDAY_DICTIONARY[dayOfWeek];
|
|
|
|
|
if (offset === undefined) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
let suffix = match[POSTFIX_GROUP];
|
|
|
|
|
suffix = suffix || "";
|
|
|
|
|
suffix = suffix.toLowerCase();
|
|
|
|
|
let modifier = null;
|
|
|
|
|
if (suffix == "dernier") {
|
|
|
|
|
modifier = "last";
|
|
|
|
|
}
|
|
|
|
|
else if (suffix == "prochain") {
|
|
|
|
|
modifier = "next";
|
|
|
|
|
}
|
|
|
|
|
const date = weeks.toDayJSWeekday(context.refDate, offset, modifier);
|
|
|
|
|
return context
|
|
|
|
|
.createParsingComponents()
|
|
|
|
|
.assign("weekday", offset)
|
|
|
|
|
.imply("day", date.date())
|
|
|
|
|
.imply("month", date.month() + 1)
|
|
|
|
|
.imply("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = FRWeekdayParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var FRSpecificTimeExpressionParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
const FIRST_REG_PATTERN = new RegExp("(^|\\s|T)" +
|
|
|
|
|
"(?:(?:[àa])\\s*)?" +
|
|
|
|
|
"(\\d{1,2})(?:h|:)?" +
|
|
|
|
|
"(?:(\\d{1,2})(?:m|:)?)?" +
|
|
|
|
|
"(?:(\\d{1,2})(?:s|:)?)?" +
|
|
|
|
|
"(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?" +
|
|
|
|
|
"(?=\\W|$)", "i");
|
|
|
|
|
const SECOND_REG_PATTERN = new RegExp("^\\s*(\\-|\\–|\\~|\\〜|[àa]|\\?)\\s*" +
|
|
|
|
|
"(\\d{1,2})(?:h|:)?" +
|
|
|
|
|
"(?:(\\d{1,2})(?:m|:)?)?" +
|
|
|
|
|
"(?:(\\d{1,2})(?:s|:)?)?" +
|
|
|
|
|
"(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?" +
|
|
|
|
|
"(?=\\W|$)", "i");
|
|
|
|
|
const HOUR_GROUP = 2;
|
|
|
|
|
const MINUTE_GROUP = 3;
|
|
|
|
|
const SECOND_GROUP = 4;
|
|
|
|
|
const AM_PM_HOUR_GROUP = 5;
|
|
|
|
|
class FRSpecificTimeExpressionParser {
|
|
|
|
|
pattern(context) {
|
|
|
|
|
return FIRST_REG_PATTERN;
|
|
|
|
|
}
|
|
|
|
|
extract(context, match) {
|
|
|
|
|
const result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length));
|
|
|
|
|
if (result.text.match(/^\d{4}$/)) {
|
|
|
|
|
match.index += match[0].length;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
result.start = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match);
|
|
|
|
|
if (!result.start) {
|
|
|
|
|
match.index += match[0].length;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const remainingText = context.text.substring(match.index + match[0].length);
|
|
|
|
|
const secondMatch = SECOND_REG_PATTERN.exec(remainingText);
|
|
|
|
|
if (secondMatch) {
|
|
|
|
|
result.end = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch);
|
|
|
|
|
if (result.end) {
|
|
|
|
|
result.text += secondMatch[0];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
static extractTimeComponent(extractingComponents, match) {
|
|
|
|
|
let hour = 0;
|
|
|
|
|
let minute = 0;
|
|
|
|
|
let meridiem = null;
|
|
|
|
|
hour = parseInt(match[HOUR_GROUP]);
|
|
|
|
|
if (match[MINUTE_GROUP] != null) {
|
|
|
|
|
minute = parseInt(match[MINUTE_GROUP]);
|
|
|
|
|
}
|
|
|
|
|
if (minute >= 60 || hour > 24) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (hour >= 12) {
|
|
|
|
|
meridiem = dist.Meridiem.PM;
|
|
|
|
|
}
|
|
|
|
|
if (match[AM_PM_HOUR_GROUP] != null) {
|
|
|
|
|
if (hour > 12)
|
|
|
|
|
return null;
|
|
|
|
|
const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();
|
|
|
|
|
if (ampm == "a") {
|
|
|
|
|
meridiem = dist.Meridiem.AM;
|
|
|
|
|
if (hour == 12) {
|
|
|
|
|
hour = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (ampm == "p") {
|
|
|
|
|
meridiem = dist.Meridiem.PM;
|
|
|
|
|
if (hour != 12) {
|
|
|
|
|
hour += 12;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
extractingComponents.assign("hour", hour);
|
|
|
|
|
extractingComponents.assign("minute", minute);
|
|
|
|
|
if (meridiem !== null) {
|
|
|
|
|
extractingComponents.assign("meridiem", meridiem);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (hour < 12) {
|
|
|
|
|
extractingComponents.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
extractingComponents.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (match[SECOND_GROUP] != null) {
|
|
|
|
|
const second = parseInt(match[SECOND_GROUP]);
|
|
|
|
|
if (second >= 60)
|
|
|
|
|
return null;
|
|
|
|
|
extractingComponents.assign("second", second);
|
|
|
|
|
}
|
|
|
|
|
return extractingComponents;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = FRSpecificTimeExpressionParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var FRMonthNameLittleEndianParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const constants_2 = constants$3;
|
|
|
|
|
const constants_3 = constants$3;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("(?:on\\s*?)?" +
|
|
|
|
|
`(${constants_3.ORDINAL_NUMBER_PATTERN})` +
|
|
|
|
|
`(?:\\s*(?:au|\\-|\\–|jusqu'au?|\\s)\\s*(${constants_3.ORDINAL_NUMBER_PATTERN}))?` +
|
|
|
|
|
`(?:-|/|\\s*(?:de)?\\s*)` +
|
|
|
|
|
`(${pattern.matchAnyPattern(constants$3.MONTH_DICTIONARY)})` +
|
|
|
|
|
`(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?` +
|
|
|
|
|
`(?=\\W|$)`, "i");
|
|
|
|
|
const DATE_GROUP = 1;
|
|
|
|
|
const DATE_TO_GROUP = 2;
|
|
|
|
|
const MONTH_NAME_GROUP = 3;
|
|
|
|
|
const YEAR_GROUP = 4;
|
|
|
|
|
class FRMonthNameLittleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const result = context.createParsingResult(match.index, match[0]);
|
|
|
|
|
const month = constants$3.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
|
|
|
|
|
const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]);
|
|
|
|
|
if (day > 31) {
|
|
|
|
|
match.index = match.index + match[DATE_GROUP].length;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
result.start.assign("month", month);
|
|
|
|
|
result.start.assign("day", day);
|
|
|
|
|
if (match[YEAR_GROUP]) {
|
|
|
|
|
const yearNumber = constants_2.parseYear(match[YEAR_GROUP]);
|
|
|
|
|
result.start.assign("year", yearNumber);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const year = years.findYearClosestToRef(context.refDate, day, month);
|
|
|
|
|
result.start.imply("year", year);
|
|
|
|
|
}
|
|
|
|
|
if (match[DATE_TO_GROUP]) {
|
|
|
|
|
const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]);
|
|
|
|
|
result.end = result.start.clone();
|
|
|
|
|
result.end.assign("day", endDate);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = FRMonthNameLittleEndianParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var FRTimeUnitAgoFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FRTimeUnitAgoFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
constructor() {
|
|
|
|
|
super();
|
|
|
|
|
}
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return new RegExp(`il y a\\s*(${constants$3.TIME_UNITS_PATTERN})(?=(?:\\W|$))`, "i");
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const timeUnits = constants$3.parseTimeUnits(match[1]);
|
|
|
|
|
const outputTimeUnits = timeunits.reverseTimeUnits(timeUnits);
|
|
|
|
|
return results.ParsingComponents.createRelativeFromRefDate(context.refDate, outputTimeUnits);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = FRTimeUnitAgoFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var FRTimeUnitWithinFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FRTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return new RegExp(`(?:dans|en|pour|pendant)\\s*(${constants$3.TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const timeUnits = constants$3.parseTimeUnits(match[1]);
|
|
|
|
|
return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = FRTimeUnitWithinFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var FRTimeUnitRelativeFormatParser = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FRTimeUnitAgoFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
constructor() {
|
|
|
|
|
super();
|
|
|
|
|
}
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return new RegExp(`(?:les?|la|l'|du|des?)\\s*` +
|
|
|
|
|
`(${constants$3.NUMBER_PATTERN})?` +
|
|
|
|
|
`(?:\\s*(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?))?` +
|
|
|
|
|
`\\s*(${pattern.matchAnyPattern(constants$3.TIME_UNIT_DICTIONARY)})` +
|
|
|
|
|
`(?:\\s*(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?))?`, "i");
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const num = match[1] ? constants$3.parseNumberPattern(match[1]) : 1;
|
|
|
|
|
const unit = constants$3.TIME_UNIT_DICTIONARY[match[3].toLowerCase()];
|
|
|
|
|
let timeUnits = {};
|
|
|
|
|
timeUnits[unit] = num;
|
|
|
|
|
let modifier = match[2] || match[4] || "";
|
|
|
|
|
modifier = modifier.toLowerCase();
|
|
|
|
|
if (!modifier) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (/derni[eè]re?s?/.test(modifier) || /pass[ée]e?s?/.test(modifier) || /pr[ée]c[ée]dents?/.test(modifier)) {
|
|
|
|
|
timeUnits = timeunits.reverseTimeUnits(timeUnits);
|
|
|
|
|
}
|
|
|
|
|
return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = FRTimeUnitAgoFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var fr = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const FRCasualDateParser_1$1 = __importDefault(FRCasualDateParser_1);
|
|
|
|
|
const FRCasualTimeParser_1$1 = __importDefault(FRCasualTimeParser_1);
|
|
|
|
|
const SlashDateFormatParser_1$1 = __importDefault(SlashDateFormatParser_1);
|
|
|
|
|
const FRTimeExpressionParser_1$1 = __importDefault(FRTimeExpressionParser_1);
|
|
|
|
|
const FRMergeDateTimeRefiner_1$1 = __importDefault(FRMergeDateTimeRefiner_1);
|
|
|
|
|
const FRMergeDateRangeRefiner_1$1 = __importDefault(FRMergeDateRangeRefiner_1);
|
|
|
|
|
const FRWeekdayParser_1$1 = __importDefault(FRWeekdayParser_1);
|
|
|
|
|
const FRSpecificTimeExpressionParser_1$1 = __importDefault(FRSpecificTimeExpressionParser_1);
|
|
|
|
|
const FRMonthNameLittleEndianParser_1$1 = __importDefault(FRMonthNameLittleEndianParser_1);
|
|
|
|
|
const FRTimeUnitAgoFormatParser_1$1 = __importDefault(FRTimeUnitAgoFormatParser_1);
|
|
|
|
|
const FRTimeUnitWithinFormatParser_1$1 = __importDefault(FRTimeUnitWithinFormatParser_1);
|
|
|
|
|
const FRTimeUnitRelativeFormatParser_1 = __importDefault(FRTimeUnitRelativeFormatParser);
|
|
|
|
|
exports.casual = new chrono$1.Chrono(createCasualConfiguration());
|
|
|
|
|
exports.strict = new chrono$1.Chrono(createConfiguration(true));
|
|
|
|
|
function parse(text, ref, option) {
|
|
|
|
|
return exports.casual.parse(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parse = parse;
|
|
|
|
|
function parseDate(text, ref, option) {
|
|
|
|
|
return exports.casual.parseDate(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parseDate = parseDate;
|
|
|
|
|
function createCasualConfiguration(littleEndian = true) {
|
|
|
|
|
const option = createConfiguration(false, littleEndian);
|
|
|
|
|
option.parsers.unshift(new FRCasualDateParser_1$1.default());
|
|
|
|
|
option.parsers.unshift(new FRCasualTimeParser_1$1.default());
|
|
|
|
|
option.parsers.unshift(new FRTimeUnitRelativeFormatParser_1.default());
|
|
|
|
|
return option;
|
|
|
|
|
}
|
|
|
|
|
exports.createCasualConfiguration = createCasualConfiguration;
|
|
|
|
|
function createConfiguration(strictMode = true, littleEndian = true) {
|
|
|
|
|
return configurations.includeCommonConfiguration({
|
|
|
|
|
parsers: [
|
|
|
|
|
new SlashDateFormatParser_1$1.default(littleEndian),
|
|
|
|
|
new FRMonthNameLittleEndianParser_1$1.default(),
|
|
|
|
|
new FRTimeExpressionParser_1$1.default(),
|
|
|
|
|
new FRSpecificTimeExpressionParser_1$1.default(),
|
|
|
|
|
new FRTimeUnitAgoFormatParser_1$1.default(),
|
|
|
|
|
new FRTimeUnitWithinFormatParser_1$1.default(),
|
|
|
|
|
new FRWeekdayParser_1$1.default(),
|
|
|
|
|
],
|
|
|
|
|
refiners: [new FRMergeDateTimeRefiner_1$1.default(), new FRMergeDateRangeRefiner_1$1.default()],
|
|
|
|
|
}, strictMode);
|
|
|
|
|
}
|
|
|
|
|
exports.createConfiguration = createConfiguration;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var constants$2 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.toHankaku = void 0;
|
|
|
|
|
function toHankaku(text) {
|
|
|
|
|
return String(text)
|
|
|
|
|
.replace(/\u2019/g, "\u0027")
|
|
|
|
|
.replace(/\u201D/g, "\u0022")
|
|
|
|
|
.replace(/\u3000/g, "\u0020")
|
|
|
|
|
.replace(/\uFFE5/g, "\u00A5")
|
|
|
|
|
.replace(/[\uFF01\uFF03-\uFF06\uFF08\uFF09\uFF0C-\uFF19\uFF1C-\uFF1F\uFF21-\uFF3B\uFF3D\uFF3F\uFF41-\uFF5B\uFF5D\uFF5E]/g, alphaNum);
|
|
|
|
|
}
|
|
|
|
|
exports.toHankaku = toHankaku;
|
|
|
|
|
function alphaNum(token) {
|
|
|
|
|
return String.fromCharCode(token.charCodeAt(0) - 65248);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var JPStandardParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
const PATTERN = /(?:(?:([同今本])|((昭和|平成|令和)?([0-90-9]{1,4}|元)))年\s*)?([0-90-9]{1,2})月\s*([0-90-9]{1,2})日/i;
|
|
|
|
|
const SPECIAL_YEAR_GROUP = 1;
|
|
|
|
|
const TYPICAL_YEAR_GROUP = 2;
|
|
|
|
|
const ERA_GROUP = 3;
|
|
|
|
|
const YEAR_NUMBER_GROUP = 4;
|
|
|
|
|
const MONTH_GROUP = 5;
|
|
|
|
|
const DAY_GROUP = 6;
|
|
|
|
|
class JPStandardParser {
|
|
|
|
|
pattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
extract(context, match) {
|
|
|
|
|
const month = parseInt(constants$2.toHankaku(match[MONTH_GROUP]));
|
|
|
|
|
const day = parseInt(constants$2.toHankaku(match[DAY_GROUP]));
|
|
|
|
|
const components = context.createParsingComponents({
|
|
|
|
|
day: day,
|
|
|
|
|
month: month,
|
|
|
|
|
});
|
|
|
|
|
if (match[SPECIAL_YEAR_GROUP] && match[SPECIAL_YEAR_GROUP].match("同|今|本")) {
|
|
|
|
|
const moment = dayjs_1.default(context.refDate);
|
|
|
|
|
components.assign("year", moment.year());
|
|
|
|
|
}
|
|
|
|
|
if (match[TYPICAL_YEAR_GROUP]) {
|
|
|
|
|
const yearNumText = match[YEAR_NUMBER_GROUP];
|
|
|
|
|
let year = yearNumText == "元" ? 1 : parseInt(constants$2.toHankaku(yearNumText));
|
|
|
|
|
if (match[ERA_GROUP] == "令和") {
|
|
|
|
|
year += 2018;
|
|
|
|
|
}
|
|
|
|
|
else if (match[ERA_GROUP] == "平成") {
|
|
|
|
|
year += 1988;
|
|
|
|
|
}
|
|
|
|
|
else if (match[ERA_GROUP] == "昭和") {
|
|
|
|
|
year += 1925;
|
|
|
|
|
}
|
|
|
|
|
components.assign("year", year);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const year = years.findYearClosestToRef(context.refDate, day, month);
|
|
|
|
|
components.imply("year", year);
|
|
|
|
|
}
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = JPStandardParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var JPMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1);
|
|
|
|
|
class JPMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default {
|
|
|
|
|
patternBetween() {
|
|
|
|
|
return /^\s*(から|ー|-)\s*$/i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = JPMergeDateRangeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var JPCasualDateParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
|
|
|
}) : (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
o[k2] = m[k];
|
|
|
|
|
}));
|
|
|
|
|
var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
|
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
|
|
|
}) : function(o, v) {
|
|
|
|
|
o["default"] = v;
|
|
|
|
|
});
|
|
|
|
|
var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
|
|
|
|
|
if (mod && mod.__esModule) return mod;
|
|
|
|
|
var result = {};
|
|
|
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
|
|
|
__setModuleDefault(result, mod);
|
|
|
|
|
return result;
|
|
|
|
|
};
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
|
|
|
|
|
const references = __importStar(casualReferences);
|
|
|
|
|
const PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i;
|
|
|
|
|
class JPCasualDateParser {
|
|
|
|
|
pattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
extract(context, match) {
|
|
|
|
|
const text = match[0];
|
|
|
|
|
const date = dayjs_1.default(context.refDate);
|
|
|
|
|
const components = context.createParsingComponents();
|
|
|
|
|
switch (text) {
|
|
|
|
|
case "昨日":
|
|
|
|
|
return references.yesterday(context.refDate);
|
|
|
|
|
case "明日":
|
|
|
|
|
return references.tomorrow(context.refDate);
|
|
|
|
|
case "今日":
|
|
|
|
|
case "当日":
|
|
|
|
|
return references.today(context.refDate);
|
|
|
|
|
}
|
|
|
|
|
if (text == "今夜" || text == "今夕" || text == "今晩") {
|
|
|
|
|
components.imply("hour", 22);
|
|
|
|
|
components.assign("meridiem", dist.Meridiem.PM);
|
|
|
|
|
}
|
|
|
|
|
else if (text.match("今朝")) {
|
|
|
|
|
components.imply("hour", 6);
|
|
|
|
|
components.assign("meridiem", dist.Meridiem.AM);
|
|
|
|
|
}
|
|
|
|
|
components.assign("day", date.date());
|
|
|
|
|
components.assign("month", date.month() + 1);
|
|
|
|
|
components.assign("year", date.year());
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = JPCasualDateParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var ja = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0;
|
|
|
|
|
const JPStandardParser_1$1 = __importDefault(JPStandardParser_1);
|
|
|
|
|
const JPMergeDateRangeRefiner_1$1 = __importDefault(JPMergeDateRangeRefiner_1);
|
|
|
|
|
const JPCasualDateParser_1$1 = __importDefault(JPCasualDateParser_1);
|
|
|
|
|
|
|
|
|
|
exports.casual = new chrono$1.Chrono(createCasualConfiguration());
|
|
|
|
|
exports.strict = new chrono$1.Chrono(createConfiguration());
|
|
|
|
|
function parse(text, ref, option) {
|
|
|
|
|
return exports.casual.parse(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parse = parse;
|
|
|
|
|
function parseDate(text, ref, option) {
|
|
|
|
|
return exports.casual.parseDate(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parseDate = parseDate;
|
|
|
|
|
function createCasualConfiguration() {
|
|
|
|
|
const option = createConfiguration();
|
|
|
|
|
option.parsers.unshift(new JPCasualDateParser_1$1.default());
|
|
|
|
|
return option;
|
|
|
|
|
}
|
|
|
|
|
exports.createCasualConfiguration = createCasualConfiguration;
|
|
|
|
|
function createConfiguration() {
|
|
|
|
|
return {
|
|
|
|
|
parsers: [new JPStandardParser_1$1.default()],
|
|
|
|
|
refiners: [new JPMergeDateRangeRefiner_1$1.default()],
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
exports.createConfiguration = createConfiguration;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var constants$1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.parseYear = exports.YEAR_PATTERN = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0;
|
|
|
|
|
exports.WEEKDAY_DICTIONARY = {
|
|
|
|
|
"domingo": 0,
|
|
|
|
|
"dom": 0,
|
|
|
|
|
"segunda": 1,
|
|
|
|
|
"segunda-feira": 1,
|
|
|
|
|
"seg": 1,
|
|
|
|
|
"terça": 2,
|
|
|
|
|
"terça-feira": 2,
|
|
|
|
|
"ter": 2,
|
|
|
|
|
"quarta": 3,
|
|
|
|
|
"quarta-feira": 3,
|
|
|
|
|
"qua": 3,
|
|
|
|
|
"quinta": 4,
|
|
|
|
|
"quinta-feira": 4,
|
|
|
|
|
"qui": 4,
|
|
|
|
|
"sexta": 5,
|
|
|
|
|
"sexta-feira": 5,
|
|
|
|
|
"sex": 5,
|
|
|
|
|
"sábado": 6,
|
|
|
|
|
"sabado": 6,
|
|
|
|
|
"sab": 6,
|
|
|
|
|
};
|
|
|
|
|
exports.MONTH_DICTIONARY = {
|
|
|
|
|
"janeiro": 1,
|
|
|
|
|
"jan": 1,
|
|
|
|
|
"jan.": 1,
|
|
|
|
|
"fevereiro": 2,
|
|
|
|
|
"fev": 2,
|
|
|
|
|
"fev.": 2,
|
|
|
|
|
"março": 3,
|
|
|
|
|
"mar": 3,
|
|
|
|
|
"mar.": 3,
|
|
|
|
|
"abril": 4,
|
|
|
|
|
"abr": 4,
|
|
|
|
|
"abr.": 4,
|
|
|
|
|
"maio": 5,
|
|
|
|
|
"mai": 5,
|
|
|
|
|
"mai.": 5,
|
|
|
|
|
"junho": 6,
|
|
|
|
|
"jun": 6,
|
|
|
|
|
"jun.": 6,
|
|
|
|
|
"julho": 7,
|
|
|
|
|
"jul": 7,
|
|
|
|
|
"jul.": 7,
|
|
|
|
|
"agosto": 8,
|
|
|
|
|
"ago": 8,
|
|
|
|
|
"ago.": 8,
|
|
|
|
|
"setembro": 9,
|
|
|
|
|
"set": 9,
|
|
|
|
|
"set.": 9,
|
|
|
|
|
"outubro": 10,
|
|
|
|
|
"out": 10,
|
|
|
|
|
"out.": 10,
|
|
|
|
|
"novembro": 11,
|
|
|
|
|
"nov": 11,
|
|
|
|
|
"nov.": 11,
|
|
|
|
|
"dezembro": 12,
|
|
|
|
|
"dez": 12,
|
|
|
|
|
"dez.": 12,
|
|
|
|
|
};
|
|
|
|
|
exports.YEAR_PATTERN = "[0-9]{1,4}(?![^\\s]\\d)(?:\\s*[a|d]\\.?\\s*c\\.?|\\s*a\\.?\\s*d\\.?)?";
|
|
|
|
|
function parseYear(match) {
|
|
|
|
|
if (match.match(/^[0-9]{1,4}$/)) {
|
|
|
|
|
let yearNumber = parseInt(match);
|
|
|
|
|
if (yearNumber < 100) {
|
|
|
|
|
if (yearNumber > 50) {
|
|
|
|
|
yearNumber = yearNumber + 1900;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
yearNumber = yearNumber + 2000;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return yearNumber;
|
|
|
|
|
}
|
|
|
|
|
if (match.match(/a\.?\s*c\.?/i)) {
|
|
|
|
|
match = match.replace(/a\.?\s*c\.?/i, "");
|
|
|
|
|
return -parseInt(match);
|
|
|
|
|
}
|
|
|
|
|
return parseInt(match);
|
|
|
|
|
}
|
|
|
|
|
exports.parseYear = parseYear;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var PTWeekdayParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" +
|
|
|
|
|
"(?:(este|esta|passado|pr[oó]ximo)\\s*)?" +
|
|
|
|
|
`(${pattern.matchAnyPattern(constants$1.WEEKDAY_DICTIONARY)})` +
|
|
|
|
|
"(?:\\s*(?:\\,|\\)|\\)))?" +
|
|
|
|
|
"(?:\\s*(este|esta|passado|pr[óo]ximo)\\s*semana)?" +
|
|
|
|
|
"(?=\\W|\\d|$)", "i");
|
|
|
|
|
const PREFIX_GROUP = 1;
|
|
|
|
|
const WEEKDAY_GROUP = 2;
|
|
|
|
|
const POSTFIX_GROUP = 3;
|
|
|
|
|
class PTWeekdayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();
|
|
|
|
|
const offset = constants$1.WEEKDAY_DICTIONARY[dayOfWeek];
|
|
|
|
|
if (offset === undefined) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const prefix = match[PREFIX_GROUP];
|
|
|
|
|
const postfix = match[POSTFIX_GROUP];
|
|
|
|
|
let norm = prefix || postfix || "";
|
|
|
|
|
norm = norm.toLowerCase();
|
|
|
|
|
let modifier = null;
|
|
|
|
|
if (norm == "passado") {
|
|
|
|
|
modifier = "this";
|
|
|
|
|
}
|
|
|
|
|
else if (norm == "próximo" || norm == "proximo") {
|
|
|
|
|
modifier = "next";
|
|
|
|
|
}
|
|
|
|
|
else if (norm == "este") {
|
|
|
|
|
modifier = "this";
|
|
|
|
|
}
|
|
|
|
|
const date = weeks.toDayJSWeekday(context.refDate, offset, modifier);
|
|
|
|
|
return context
|
|
|
|
|
.createParsingComponents()
|
|
|
|
|
.assign("weekday", offset)
|
|
|
|
|
.imply("day", date.date())
|
|
|
|
|
.imply("month", date.month() + 1)
|
|
|
|
|
.imply("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = PTWeekdayParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var PTTimeExpressionParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
class PTTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser {
|
|
|
|
|
primaryPrefix() {
|
|
|
|
|
return "(?:(?:ao?|às?|das|da|de|do)\\s*)?";
|
|
|
|
|
}
|
|
|
|
|
followingPhase() {
|
|
|
|
|
return "\\s*(?:\\-|\\–|\\~|\\〜|a(?:o)?|\\?)\\s*";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = PTTimeExpressionParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var PTMergeDateTimeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const AbstractMergeDateTimeRefiner_1 = __importDefault(AbstractMergeDateTimeRefiner);
|
|
|
|
|
class PTMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default {
|
|
|
|
|
patternBetween() {
|
|
|
|
|
return new RegExp("^\\s*(?:,|à)?\\s*$");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = PTMergeDateTimeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var PTMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1);
|
|
|
|
|
class PTMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default {
|
|
|
|
|
patternBetween() {
|
|
|
|
|
return /^\s*(?:-)\s*$/i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = PTMergeDateRangeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var PTMonthNameLittleEndianParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const constants_2 = constants$1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp(`([0-9]{1,2})(?:º|ª|°)?` +
|
|
|
|
|
"(?:\\s*(?:desde|de|\\-|\\–|ao?|\\s)\\s*([0-9]{1,2})(?:º|ª|°)?)?\\s*(?:de)?\\s*" +
|
|
|
|
|
`(?:-|/|\\s*(?:de|,)?\\s*)` +
|
|
|
|
|
`(${pattern.matchAnyPattern(constants$1.MONTH_DICTIONARY)})` +
|
|
|
|
|
`(?:\\s*(?:de|,)?\\s*(${constants_2.YEAR_PATTERN}))?` +
|
|
|
|
|
`(?=\\W|$)`, "i");
|
|
|
|
|
const DATE_GROUP = 1;
|
|
|
|
|
const DATE_TO_GROUP = 2;
|
|
|
|
|
const MONTH_NAME_GROUP = 3;
|
|
|
|
|
const YEAR_GROUP = 4;
|
|
|
|
|
class PTMonthNameLittleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const result = context.createParsingResult(match.index, match[0]);
|
|
|
|
|
const month = constants$1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
|
|
|
|
|
const day = parseInt(match[DATE_GROUP]);
|
|
|
|
|
if (day > 31) {
|
|
|
|
|
match.index = match.index + match[DATE_GROUP].length;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
result.start.assign("month", month);
|
|
|
|
|
result.start.assign("day", day);
|
|
|
|
|
if (match[YEAR_GROUP]) {
|
|
|
|
|
const yearNumber = constants_2.parseYear(match[YEAR_GROUP]);
|
|
|
|
|
result.start.assign("year", yearNumber);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const year = years.findYearClosestToRef(context.refDate, day, month);
|
|
|
|
|
result.start.imply("year", year);
|
|
|
|
|
}
|
|
|
|
|
if (match[DATE_TO_GROUP]) {
|
|
|
|
|
const endDate = parseInt(match[DATE_TO_GROUP]);
|
|
|
|
|
result.end = result.start.clone();
|
|
|
|
|
result.end.assign("day", endDate);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = PTMonthNameLittleEndianParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var PTCasualDateParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
|
|
|
}) : (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
o[k2] = m[k];
|
|
|
|
|
}));
|
|
|
|
|
var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
|
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
|
|
|
}) : function(o, v) {
|
|
|
|
|
o["default"] = v;
|
|
|
|
|
});
|
|
|
|
|
var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
|
|
|
|
|
if (mod && mod.__esModule) return mod;
|
|
|
|
|
var result = {};
|
|
|
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
|
|
|
__setModuleDefault(result, mod);
|
|
|
|
|
return result;
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
const references = __importStar(casualReferences);
|
|
|
|
|
class PTCasualDateParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern(context) {
|
|
|
|
|
return /(agora|hoje|amanha|amanhã|ontem)(?=\W|$)/i;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const lowerText = match[0].toLowerCase();
|
|
|
|
|
const component = context.createParsingComponents();
|
|
|
|
|
switch (lowerText) {
|
|
|
|
|
case "agora":
|
|
|
|
|
return references.now(context.refDate);
|
|
|
|
|
case "hoje":
|
|
|
|
|
return references.today(context.refDate);
|
|
|
|
|
case "amanha":
|
|
|
|
|
case "amanhã":
|
|
|
|
|
return references.tomorrow(context.refDate);
|
|
|
|
|
case "ontem":
|
|
|
|
|
return references.yesterday(context.refDate);
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = PTCasualDateParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var PTCasualTimeParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const dayjs_2 = __importDefault(dayjs_min);
|
|
|
|
|
class PTCasualTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return /(?:esta\s*)?(manha|manhã|tarde|meia-noite|meio-dia|noite)(?=\W|$)/i;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const targetDate = dayjs_2.default(context.refDate);
|
|
|
|
|
const component = context.createParsingComponents();
|
|
|
|
|
switch (match[1].toLowerCase()) {
|
|
|
|
|
case "tarde":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
component.imply("hour", 15);
|
|
|
|
|
break;
|
|
|
|
|
case "noite":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
component.imply("hour", 22);
|
|
|
|
|
break;
|
|
|
|
|
case "manha":
|
|
|
|
|
case "manhã":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
component.imply("hour", 6);
|
|
|
|
|
break;
|
|
|
|
|
case "meia-noite":
|
|
|
|
|
dayjs.assignTheNextDay(component, targetDate);
|
|
|
|
|
component.imply("hour", 0);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("second", 0);
|
|
|
|
|
break;
|
|
|
|
|
case "meio-dia":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
component.imply("hour", 12);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = PTCasualTimeParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var pt = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const SlashDateFormatParser_1$1 = __importDefault(SlashDateFormatParser_1);
|
|
|
|
|
const PTWeekdayParser_1$1 = __importDefault(PTWeekdayParser_1);
|
|
|
|
|
const PTTimeExpressionParser_1$1 = __importDefault(PTTimeExpressionParser_1);
|
|
|
|
|
const PTMergeDateTimeRefiner_1$1 = __importDefault(PTMergeDateTimeRefiner_1);
|
|
|
|
|
const PTMergeDateRangeRefiner_1$1 = __importDefault(PTMergeDateRangeRefiner_1);
|
|
|
|
|
const PTMonthNameLittleEndianParser_1$1 = __importDefault(PTMonthNameLittleEndianParser_1);
|
|
|
|
|
const PTCasualDateParser_1$1 = __importDefault(PTCasualDateParser_1);
|
|
|
|
|
const PTCasualTimeParser_1$1 = __importDefault(PTCasualTimeParser_1);
|
|
|
|
|
exports.casual = new chrono$1.Chrono(createCasualConfiguration());
|
|
|
|
|
exports.strict = new chrono$1.Chrono(createConfiguration(true));
|
|
|
|
|
function parse(text, ref, option) {
|
|
|
|
|
return exports.casual.parse(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parse = parse;
|
|
|
|
|
function parseDate(text, ref, option) {
|
|
|
|
|
return exports.casual.parseDate(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parseDate = parseDate;
|
|
|
|
|
function createCasualConfiguration(littleEndian = true) {
|
|
|
|
|
const option = createConfiguration(false, littleEndian);
|
|
|
|
|
option.parsers.push(new PTCasualDateParser_1$1.default());
|
|
|
|
|
option.parsers.push(new PTCasualTimeParser_1$1.default());
|
|
|
|
|
return option;
|
|
|
|
|
}
|
|
|
|
|
exports.createCasualConfiguration = createCasualConfiguration;
|
|
|
|
|
function createConfiguration(strictMode = true, littleEndian = true) {
|
|
|
|
|
return configurations.includeCommonConfiguration({
|
|
|
|
|
parsers: [
|
|
|
|
|
new SlashDateFormatParser_1$1.default(littleEndian),
|
|
|
|
|
new PTWeekdayParser_1$1.default(),
|
|
|
|
|
new PTTimeExpressionParser_1$1.default(),
|
|
|
|
|
new PTMonthNameLittleEndianParser_1$1.default(),
|
|
|
|
|
],
|
|
|
|
|
refiners: [new PTMergeDateTimeRefiner_1$1.default(), new PTMergeDateRangeRefiner_1$1.default()],
|
|
|
|
|
}, strictMode);
|
|
|
|
|
}
|
|
|
|
|
exports.createConfiguration = createConfiguration;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLMergeDateRangeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const AbstractMergeDateRangeRefiner_1$1 = __importDefault(AbstractMergeDateRangeRefiner_1);
|
|
|
|
|
class NLMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1$1.default {
|
|
|
|
|
patternBetween() {
|
|
|
|
|
return /^\s*(tot|-)\s*$/i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLMergeDateRangeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLMergeDateTimeRefiner_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const AbstractMergeDateTimeRefiner_1 = __importDefault(AbstractMergeDateTimeRefiner);
|
|
|
|
|
class NLMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default {
|
|
|
|
|
patternBetween() {
|
|
|
|
|
return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLMergeDateTimeRefiner;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLCasualDateParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
|
|
|
}) : (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
o[k2] = m[k];
|
|
|
|
|
}));
|
|
|
|
|
var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
|
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
|
|
|
}) : function(o, v) {
|
|
|
|
|
o["default"] = v;
|
|
|
|
|
});
|
|
|
|
|
var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
|
|
|
|
|
if (mod && mod.__esModule) return mod;
|
|
|
|
|
var result = {};
|
|
|
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
|
|
|
__setModuleDefault(result, mod);
|
|
|
|
|
return result;
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
const references = __importStar(casualReferences);
|
|
|
|
|
class NLCasualDateParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern(context) {
|
|
|
|
|
return /(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const lowerText = match[0].toLowerCase();
|
|
|
|
|
const component = context.createParsingComponents();
|
|
|
|
|
switch (lowerText) {
|
|
|
|
|
case "nu":
|
|
|
|
|
return references.now(context.refDate);
|
|
|
|
|
case "vandaag":
|
|
|
|
|
return references.today(context.refDate);
|
|
|
|
|
case "morgen":
|
|
|
|
|
case "morgend":
|
|
|
|
|
return references.tomorrow(context.refDate);
|
|
|
|
|
case "gisteren":
|
|
|
|
|
return references.yesterday(context.refDate);
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLCasualDateParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLCasualTimeParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const dayjs_1 = __importDefault(dayjs_min);
|
|
|
|
|
|
|
|
|
|
const DAY_GROUP = 1;
|
|
|
|
|
const MOMENT_GROUP = 2;
|
|
|
|
|
class NLCasualTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return /(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const targetDate = dayjs_1.default(context.refDate);
|
|
|
|
|
const component = context.createParsingComponents();
|
|
|
|
|
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":
|
|
|
|
|
case "'s namiddags":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
component.imply("hour", 15);
|
|
|
|
|
break;
|
|
|
|
|
case "avond":
|
|
|
|
|
case "'s avonds'":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
component.imply("hour", 20);
|
|
|
|
|
break;
|
|
|
|
|
case "middernacht":
|
|
|
|
|
dayjs.assignTheNextDay(component, targetDate);
|
|
|
|
|
component.imply("hour", 0);
|
|
|
|
|
component.imply("minute", 0);
|
|
|
|
|
component.imply("second", 0);
|
|
|
|
|
break;
|
|
|
|
|
case "ochtend":
|
|
|
|
|
case "'s ochtends":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
component.imply("hour", 6);
|
|
|
|
|
break;
|
|
|
|
|
case "middag":
|
|
|
|
|
case "'s middags":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
component.imply("hour", 12);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLCasualTimeParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var constants = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exports.WEEKDAY_DICTIONARY = {
|
|
|
|
|
zondag: 0,
|
|
|
|
|
zon: 0,
|
|
|
|
|
"zon.": 0,
|
|
|
|
|
zo: 0,
|
|
|
|
|
"zo.": 0,
|
|
|
|
|
maandag: 1,
|
|
|
|
|
ma: 1,
|
|
|
|
|
"ma.": 1,
|
|
|
|
|
dinsdag: 2,
|
|
|
|
|
din: 2,
|
|
|
|
|
"din.": 2,
|
|
|
|
|
di: 2,
|
|
|
|
|
"di.": 2,
|
|
|
|
|
woensdag: 3,
|
|
|
|
|
woe: 3,
|
|
|
|
|
"woe.": 3,
|
|
|
|
|
wo: 3,
|
|
|
|
|
"wo.": 3,
|
|
|
|
|
donderdag: 4,
|
|
|
|
|
dond: 4,
|
|
|
|
|
"dond.": 4,
|
|
|
|
|
do: 4,
|
|
|
|
|
"do.": 4,
|
|
|
|
|
vrijdag: 5,
|
|
|
|
|
vrij: 5,
|
|
|
|
|
"vrij.": 5,
|
|
|
|
|
vr: 5,
|
|
|
|
|
"vr.": 5,
|
|
|
|
|
zaterdag: 6,
|
|
|
|
|
zat: 6,
|
|
|
|
|
"zat.": 6,
|
|
|
|
|
"za": 6,
|
|
|
|
|
"za.": 6,
|
|
|
|
|
};
|
|
|
|
|
exports.MONTH_DICTIONARY = {
|
|
|
|
|
januari: 1,
|
|
|
|
|
jan: 1,
|
|
|
|
|
"jan.": 1,
|
|
|
|
|
februari: 2,
|
|
|
|
|
feb: 2,
|
|
|
|
|
"feb.": 2,
|
|
|
|
|
maart: 3,
|
|
|
|
|
mar: 3,
|
|
|
|
|
"mar.": 3,
|
|
|
|
|
april: 4,
|
|
|
|
|
apr: 4,
|
|
|
|
|
"apr.": 4,
|
|
|
|
|
mei: 5,
|
|
|
|
|
juni: 6,
|
|
|
|
|
jun: 6,
|
|
|
|
|
"jun.": 6,
|
|
|
|
|
juli: 7,
|
|
|
|
|
jul: 7,
|
|
|
|
|
"jul.": 7,
|
|
|
|
|
augustus: 8,
|
|
|
|
|
aug: 8,
|
|
|
|
|
"aug.": 8,
|
|
|
|
|
september: 9,
|
|
|
|
|
sep: 9,
|
|
|
|
|
"sep.": 9,
|
|
|
|
|
sept: 9,
|
|
|
|
|
"sept.": 9,
|
|
|
|
|
oktober: 10,
|
|
|
|
|
okt: 10,
|
|
|
|
|
"okt.": 10,
|
|
|
|
|
november: 11,
|
|
|
|
|
nov: 11,
|
|
|
|
|
"nov.": 11,
|
|
|
|
|
december: 12,
|
|
|
|
|
dec: 12,
|
|
|
|
|
"dec.": 12,
|
|
|
|
|
};
|
|
|
|
|
exports.INTEGER_WORD_DICTIONARY = {
|
|
|
|
|
een: 1,
|
|
|
|
|
twee: 2,
|
|
|
|
|
drie: 3,
|
|
|
|
|
vier: 4,
|
|
|
|
|
vijf: 5,
|
|
|
|
|
zes: 6,
|
|
|
|
|
zeven: 7,
|
|
|
|
|
acht: 8,
|
|
|
|
|
negen: 9,
|
|
|
|
|
tien: 10,
|
|
|
|
|
elf: 11,
|
|
|
|
|
twaalf: 12,
|
|
|
|
|
};
|
|
|
|
|
exports.ORDINAL_WORD_DICTIONARY = {
|
|
|
|
|
eerste: 1,
|
|
|
|
|
tweede: 2,
|
|
|
|
|
derde: 3,
|
|
|
|
|
vierde: 4,
|
|
|
|
|
vijfde: 5,
|
|
|
|
|
zesde: 6,
|
|
|
|
|
zevende: 7,
|
|
|
|
|
achtste: 8,
|
|
|
|
|
negende: 9,
|
|
|
|
|
tiende: 10,
|
|
|
|
|
elfde: 11,
|
|
|
|
|
twaalfde: 12,
|
|
|
|
|
dertiende: 13,
|
|
|
|
|
veertiende: 14,
|
|
|
|
|
vijftiende: 15,
|
|
|
|
|
zestiende: 16,
|
|
|
|
|
zeventiende: 17,
|
|
|
|
|
achttiende: 18,
|
|
|
|
|
negentiende: 19,
|
|
|
|
|
twintigste: 20,
|
|
|
|
|
"eenentwintigste": 21,
|
|
|
|
|
"tweeëntwintigste": 22,
|
|
|
|
|
"drieentwintigste": 23,
|
|
|
|
|
"vierentwintigste": 24,
|
|
|
|
|
"vijfentwintigste": 25,
|
|
|
|
|
"zesentwintigste": 26,
|
|
|
|
|
"zevenentwintigste": 27,
|
|
|
|
|
"achtentwintig": 28,
|
|
|
|
|
"negenentwintig": 29,
|
|
|
|
|
"dertigste": 30,
|
|
|
|
|
"eenendertigste": 31,
|
|
|
|
|
};
|
|
|
|
|
exports.TIME_UNIT_DICTIONARY = {
|
|
|
|
|
sec: "second",
|
|
|
|
|
second: "second",
|
|
|
|
|
seconden: "second",
|
|
|
|
|
min: "minute",
|
|
|
|
|
mins: "minute",
|
|
|
|
|
minute: "minute",
|
|
|
|
|
minuten: "minute",
|
|
|
|
|
h: "hour",
|
|
|
|
|
hr: "hour",
|
|
|
|
|
hrs: "hour",
|
|
|
|
|
uur: "hour",
|
|
|
|
|
uren: "hour",
|
|
|
|
|
dag: "d",
|
|
|
|
|
dagen: "d",
|
|
|
|
|
week: "week",
|
|
|
|
|
weken: "week",
|
|
|
|
|
maand: "month",
|
|
|
|
|
maanden: "month",
|
|
|
|
|
jaar: "year",
|
|
|
|
|
jr: "year",
|
|
|
|
|
jaren: "year",
|
|
|
|
|
};
|
|
|
|
|
exports.NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|een?|halve?)`;
|
|
|
|
|
function parseNumberPattern(match) {
|
|
|
|
|
const num = match.toLowerCase();
|
|
|
|
|
if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) {
|
|
|
|
|
return exports.INTEGER_WORD_DICTIONARY[num];
|
|
|
|
|
}
|
|
|
|
|
else if (num === "een") {
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
else if (num.match(/halve?/)) {
|
|
|
|
|
return 0.5;
|
|
|
|
|
}
|
|
|
|
|
return parseFloat(num);
|
|
|
|
|
}
|
|
|
|
|
exports.parseNumberPattern = parseNumberPattern;
|
|
|
|
|
exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:ste|de)?)`;
|
|
|
|
|
function parseOrdinalNumberPattern(match) {
|
|
|
|
|
let num = match.toLowerCase();
|
|
|
|
|
if (exports.ORDINAL_WORD_DICTIONARY[num] !== undefined) {
|
|
|
|
|
return exports.ORDINAL_WORD_DICTIONARY[num];
|
|
|
|
|
}
|
|
|
|
|
num = num.replace(/(?:ste|de)$/i, "");
|
|
|
|
|
return parseInt(num);
|
|
|
|
|
}
|
|
|
|
|
exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern;
|
|
|
|
|
exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:voor Christus|na Christus)|[1-2][0-9]{3}|[5-9][0-9])`;
|
|
|
|
|
function parseYear(match) {
|
|
|
|
|
if (/voor Christus/i.test(match)) {
|
|
|
|
|
match = match.replace(/voor Christus/i, "");
|
|
|
|
|
return -parseInt(match);
|
|
|
|
|
}
|
|
|
|
|
if (/na Christus/i.test(match)) {
|
|
|
|
|
match = match.replace(/na Christus/i, "");
|
|
|
|
|
return parseInt(match);
|
|
|
|
|
}
|
|
|
|
|
const rawYearNumber = parseInt(match);
|
|
|
|
|
return years.findMostLikelyADYear(rawYearNumber);
|
|
|
|
|
}
|
|
|
|
|
exports.parseYear = parseYear;
|
|
|
|
|
const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`;
|
|
|
|
|
const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i");
|
|
|
|
|
exports.TIME_UNITS_PATTERN = pattern.repeatedTimeunitPattern(`(?:(?:binnen|in)\\s*)?`, SINGLE_TIME_UNIT_PATTERN);
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
exports.parseTimeUnits = parseTimeUnits;
|
|
|
|
|
function collectDateTimeFragment(fragments, match) {
|
|
|
|
|
const num = parseNumberPattern(match[1]);
|
|
|
|
|
const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()];
|
|
|
|
|
fragments[unit] = num;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLTimeUnitWithinFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NLTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return new RegExp(`(?:binnen|in|binnen de|voor)\\s*` + "(" + constants.TIME_UNITS_PATTERN + ")" + `(?=\\W|$)`, "i");
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const timeUnits = constants.parseTimeUnits(match[1]);
|
|
|
|
|
return results.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLTimeUnitWithinFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLWeekdayParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\()\\s*)?" +
|
|
|
|
|
"(?:op\\s*?)?" +
|
|
|
|
|
"(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?" +
|
|
|
|
|
`(${pattern.matchAnyPattern(constants.WEEKDAY_DICTIONARY)})` +
|
|
|
|
|
"(?=\\W|$)", "i");
|
|
|
|
|
const PREFIX_GROUP = 1;
|
|
|
|
|
const WEEKDAY_GROUP = 2;
|
|
|
|
|
const POSTFIX_GROUP = 3;
|
|
|
|
|
class NLWeekdayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();
|
|
|
|
|
const offset = constants.WEEKDAY_DICTIONARY[dayOfWeek];
|
|
|
|
|
const prefix = match[PREFIX_GROUP];
|
|
|
|
|
const postfix = match[POSTFIX_GROUP];
|
|
|
|
|
let modifierWord = prefix || postfix;
|
|
|
|
|
modifierWord = modifierWord || "";
|
|
|
|
|
modifierWord = modifierWord.toLowerCase();
|
|
|
|
|
let modifier = null;
|
|
|
|
|
if (modifierWord == "vorige") {
|
|
|
|
|
modifier = "last";
|
|
|
|
|
}
|
|
|
|
|
else if (modifierWord == "volgende") {
|
|
|
|
|
modifier = "next";
|
|
|
|
|
}
|
|
|
|
|
else if (modifierWord == "deze") {
|
|
|
|
|
modifier = "this";
|
|
|
|
|
}
|
|
|
|
|
const date = weeks.toDayJSWeekday(context.refDate, offset, modifier);
|
|
|
|
|
return context
|
|
|
|
|
.createParsingComponents()
|
|
|
|
|
.assign("weekday", offset)
|
|
|
|
|
.imply("day", date.date())
|
|
|
|
|
.imply("month", date.month() + 1)
|
|
|
|
|
.imply("year", date.year());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLWeekdayParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLMonthNameMiddleEndianParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const constants_2 = constants;
|
|
|
|
|
const constants_3 = constants;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.matchAnyPattern(constants.MONTH_DICTIONARY) +
|
|
|
|
|
")" +
|
|
|
|
|
"(?:" +
|
|
|
|
|
"(?:-|/|,?\\s*)" +
|
|
|
|
|
`(${constants_3.YEAR_PATTERN}(?![^\\s]\\d))` +
|
|
|
|
|
")?" +
|
|
|
|
|
"(?=\\W|$)", "i");
|
|
|
|
|
const MONTH_NAME_GROUP = 3;
|
|
|
|
|
const DATE_GROUP = 1;
|
|
|
|
|
const DATE_TO_GROUP = 2;
|
|
|
|
|
const YEAR_GROUP = 4;
|
|
|
|
|
class NLMonthNameMiddleEndianParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const month = constants.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
|
|
|
|
|
const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]);
|
|
|
|
|
if (day > 31) {
|
|
|
|
|
match.index = match.index + match[DATE_GROUP].length;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const components = context.createParsingComponents({
|
|
|
|
|
day: day,
|
|
|
|
|
month: month,
|
|
|
|
|
});
|
|
|
|
|
if (match[YEAR_GROUP]) {
|
|
|
|
|
const year = constants_3.parseYear(match[YEAR_GROUP]);
|
|
|
|
|
components.assign("year", year);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const year = years.findYearClosestToRef(context.refDate, day, month);
|
|
|
|
|
components.imply("year", year);
|
|
|
|
|
}
|
|
|
|
|
if (!match[DATE_TO_GROUP]) {
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]);
|
|
|
|
|
const result = context.createParsingResult(match.index, match[0]);
|
|
|
|
|
result.start = components;
|
|
|
|
|
result.end = components.clone();
|
|
|
|
|
result.end.assign("day", endDate);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLMonthNameMiddleEndianParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLMonthNameParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const constants_2 = constants;
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp(`(${pattern.matchAnyPattern(constants.MONTH_DICTIONARY)})` +
|
|
|
|
|
`\\s*` +
|
|
|
|
|
`(?:` +
|
|
|
|
|
`[,-]?\\s*(${constants_2.YEAR_PATTERN})?` +
|
|
|
|
|
")?" +
|
|
|
|
|
"(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)", "i");
|
|
|
|
|
const MONTH_NAME_GROUP = 1;
|
|
|
|
|
const YEAR_GROUP = 2;
|
|
|
|
|
class NLMonthNameParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const components = context.createParsingComponents();
|
|
|
|
|
components.imply("day", 1);
|
|
|
|
|
const monthName = match[MONTH_NAME_GROUP];
|
|
|
|
|
const month = constants.MONTH_DICTIONARY[monthName.toLowerCase()];
|
|
|
|
|
components.assign("month", month);
|
|
|
|
|
if (match[YEAR_GROUP]) {
|
|
|
|
|
const year = constants_2.parseYear(match[YEAR_GROUP]);
|
|
|
|
|
components.assign("year", year);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const year = years.findYearClosestToRef(context.refDate, 1, month);
|
|
|
|
|
components.imply("year", year);
|
|
|
|
|
}
|
|
|
|
|
return components;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLMonthNameParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLSlashMonthFormatParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})" + "", "i");
|
|
|
|
|
const MONTH_GROUP = 1;
|
|
|
|
|
const YEAR_GROUP = 2;
|
|
|
|
|
class NLSlashMonthFormatParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const year = parseInt(match[YEAR_GROUP]);
|
|
|
|
|
const month = parseInt(match[MONTH_GROUP]);
|
|
|
|
|
return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLSlashMonthFormatParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLTimeExpressionParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
class NLTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser {
|
|
|
|
|
primaryPrefix() {
|
|
|
|
|
return "(?:(?:om)\\s*)?";
|
|
|
|
|
}
|
|
|
|
|
followingPhase() {
|
|
|
|
|
return "\\s*(?:\\-|\\–|\\~|\\〜|om|\\?)\\s*";
|
|
|
|
|
}
|
|
|
|
|
extractPrimaryTimeComponents(context, match) {
|
|
|
|
|
if (match[0].match(/^\s*\d{4}\s*$/)) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
return super.extractPrimaryTimeComponents(context, match);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLTimeExpressionParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLCasualYearMonthDayParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s]` +
|
|
|
|
|
`(?:(${pattern.matchAnyPattern(constants.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]` +
|
|
|
|
|
`([0-9]{1,2})` +
|
|
|
|
|
"(?=\\W|$)", "i");
|
|
|
|
|
const YEAR_NUMBER_GROUP = 1;
|
|
|
|
|
const MONTH_NAME_GROUP = 2;
|
|
|
|
|
const MONTH_NUMBER_GROUP = 3;
|
|
|
|
|
const DATE_NUMBER_GROUP = 4;
|
|
|
|
|
class NLCasualYearMonthDayParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern() {
|
|
|
|
|
return PATTERN;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const month = match[MONTH_NUMBER_GROUP]
|
|
|
|
|
? parseInt(match[MONTH_NUMBER_GROUP])
|
|
|
|
|
: constants.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
|
|
|
|
|
if (month < 1 || month > 12) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
const year = parseInt(match[YEAR_NUMBER_GROUP]);
|
|
|
|
|
const day = parseInt(match[DATE_NUMBER_GROUP]);
|
|
|
|
|
return {
|
|
|
|
|
day: day,
|
|
|
|
|
month: month,
|
|
|
|
|
year: year,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLCasualYearMonthDayParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var NLCasualDateTimeParser_1 = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const dayjs_2 = __importDefault(dayjs_min);
|
|
|
|
|
const DATE_GROUP = 1;
|
|
|
|
|
const TIME_OF_DAY_GROUP = 2;
|
|
|
|
|
class NLCasualDateTimeParser extends AbstractParserWithWordBoundary.AbstractParserWithWordBoundaryChecking {
|
|
|
|
|
innerPattern(context) {
|
|
|
|
|
return /(gisteren|morgen|van)(ochtend|middag|namiddag|avond|nacht)(?=\W|$)/i;
|
|
|
|
|
}
|
|
|
|
|
innerExtract(context, match) {
|
|
|
|
|
const dateText = match[DATE_GROUP].toLowerCase();
|
|
|
|
|
const timeText = match[TIME_OF_DAY_GROUP].toLowerCase();
|
|
|
|
|
const component = context.createParsingComponents();
|
|
|
|
|
const targetDate = dayjs_2.default(context.refDate);
|
|
|
|
|
switch (dateText) {
|
|
|
|
|
case "gisteren":
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate.add(-1, "day"));
|
|
|
|
|
break;
|
|
|
|
|
case "van":
|
|
|
|
|
dayjs.assignSimilarDate(component, targetDate);
|
|
|
|
|
break;
|
|
|
|
|
case "morgen":
|
|
|
|
|
dayjs.assignTheNextDay(component, targetDate);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
switch (timeText) {
|
|
|
|
|
case "ochtend":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
component.imply("hour", 6);
|
|
|
|
|
break;
|
|
|
|
|
case "middag":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.AM);
|
|
|
|
|
component.imply("hour", 12);
|
|
|
|
|
break;
|
|
|
|
|
case "namiddag":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
component.imply("hour", 15);
|
|
|
|
|
break;
|
|
|
|
|
case "avond":
|
|
|
|
|
component.imply("meridiem", dist.Meridiem.PM);
|
|
|
|
|
component.imply("hour", 20);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return component;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.default = NLCasualDateTimeParser;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var nl = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const NLMergeDateRangeRefiner_1$1 = __importDefault(NLMergeDateRangeRefiner_1);
|
|
|
|
|
const NLMergeDateTimeRefiner_1$1 = __importDefault(NLMergeDateTimeRefiner_1);
|
|
|
|
|
const NLCasualDateParser_1$1 = __importDefault(NLCasualDateParser_1);
|
|
|
|
|
const NLCasualTimeParser_1$1 = __importDefault(NLCasualTimeParser_1);
|
|
|
|
|
const SlashDateFormatParser_1$1 = __importDefault(SlashDateFormatParser_1);
|
|
|
|
|
const NLTimeUnitWithinFormatParser_1$1 = __importDefault(NLTimeUnitWithinFormatParser_1);
|
|
|
|
|
const NLWeekdayParser_1$1 = __importDefault(NLWeekdayParser_1);
|
|
|
|
|
const NLMonthNameMiddleEndianParser_1$1 = __importDefault(NLMonthNameMiddleEndianParser_1);
|
|
|
|
|
const NLMonthNameParser_1$1 = __importDefault(NLMonthNameParser_1);
|
|
|
|
|
const NLSlashMonthFormatParser_1$1 = __importDefault(NLSlashMonthFormatParser_1);
|
|
|
|
|
const NLTimeExpressionParser_1$1 = __importDefault(NLTimeExpressionParser_1);
|
|
|
|
|
const NLCasualYearMonthDayParser_1$1 = __importDefault(NLCasualYearMonthDayParser_1);
|
|
|
|
|
const NLCasualDateTimeParser_1$1 = __importDefault(NLCasualDateTimeParser_1);
|
|
|
|
|
exports.casual = new chrono$1.Chrono(createCasualConfiguration());
|
|
|
|
|
exports.strict = new chrono$1.Chrono(createConfiguration(true));
|
|
|
|
|
function parse(text, ref, option) {
|
|
|
|
|
return exports.casual.parse(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parse = parse;
|
|
|
|
|
function parseDate(text, ref, option) {
|
|
|
|
|
return exports.casual.parseDate(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parseDate = parseDate;
|
|
|
|
|
function createCasualConfiguration(littleEndian = true) {
|
|
|
|
|
const option = createConfiguration(false, littleEndian);
|
|
|
|
|
option.parsers.unshift(new NLCasualDateParser_1$1.default());
|
|
|
|
|
option.parsers.unshift(new NLCasualTimeParser_1$1.default());
|
|
|
|
|
option.parsers.unshift(new NLCasualDateTimeParser_1$1.default());
|
|
|
|
|
return option;
|
|
|
|
|
}
|
|
|
|
|
exports.createCasualConfiguration = createCasualConfiguration;
|
|
|
|
|
function createConfiguration(strictMode = true, littleEndian = true) {
|
|
|
|
|
return configurations.includeCommonConfiguration({
|
|
|
|
|
parsers: [
|
|
|
|
|
new SlashDateFormatParser_1$1.default(littleEndian),
|
|
|
|
|
new NLMonthNameMiddleEndianParser_1$1.default(),
|
|
|
|
|
new NLMonthNameParser_1$1.default(),
|
|
|
|
|
new NLTimeExpressionParser_1$1.default(),
|
|
|
|
|
new NLTimeUnitWithinFormatParser_1$1.default(),
|
|
|
|
|
new NLSlashMonthFormatParser_1$1.default(),
|
|
|
|
|
new NLWeekdayParser_1$1.default(),
|
|
|
|
|
new NLCasualYearMonthDayParser_1$1.default(),
|
|
|
|
|
],
|
|
|
|
|
refiners: [new NLMergeDateTimeRefiner_1$1.default(), new NLMergeDateRangeRefiner_1$1.default()],
|
|
|
|
|
}, strictMode);
|
|
|
|
|
}
|
|
|
|
|
exports.createConfiguration = createConfiguration;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var dist = createCommonjsModule(function (module, exports) {
|
|
|
|
|
var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
|
|
|
}) : (function(o, m, k, k2) {
|
|
|
|
|
if (k2 === undefined) k2 = k;
|
|
|
|
|
o[k2] = m[k];
|
|
|
|
|
}));
|
|
|
|
|
var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
|
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
|
|
|
}) : function(o, v) {
|
|
|
|
|
o["default"] = v;
|
|
|
|
|
});
|
|
|
|
|
var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
|
|
|
|
|
if (mod && mod.__esModule) return mod;
|
|
|
|
|
var result = {};
|
|
|
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
|
|
|
__setModuleDefault(result, mod);
|
|
|
|
|
return result;
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
exports.parseDate = exports.parse = exports.casual = exports.strict = exports.nl = exports.pt = exports.ja = exports.fr = exports.de = exports.Meridiem = exports.Chrono = exports.en = void 0;
|
|
|
|
|
const en$1 = __importStar(en);
|
|
|
|
|
exports.en = en$1;
|
|
|
|
|
|
|
|
|
|
Object.defineProperty(exports, "Chrono", { enumerable: true, get: function () { return chrono$1.Chrono; } });
|
|
|
|
|
(function (Meridiem) {
|
|
|
|
|
Meridiem[Meridiem["AM"] = 0] = "AM";
|
|
|
|
|
Meridiem[Meridiem["PM"] = 1] = "PM";
|
|
|
|
|
})(exports.Meridiem || (exports.Meridiem = {}));
|
|
|
|
|
const de$1 = __importStar(de);
|
|
|
|
|
exports.de = de$1;
|
|
|
|
|
const fr$1 = __importStar(fr);
|
|
|
|
|
exports.fr = fr$1;
|
|
|
|
|
const ja$1 = __importStar(ja);
|
|
|
|
|
exports.ja = ja$1;
|
|
|
|
|
const pt$1 = __importStar(pt);
|
|
|
|
|
exports.pt = pt$1;
|
|
|
|
|
const nl$1 = __importStar(nl);
|
|
|
|
|
exports.nl = nl$1;
|
|
|
|
|
exports.strict = en$1.strict;
|
|
|
|
|
exports.casual = en$1.casual;
|
|
|
|
|
function parse(text, ref, option) {
|
|
|
|
|
return exports.casual.parse(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parse = parse;
|
|
|
|
|
function parseDate(text, ref, option) {
|
|
|
|
|
return exports.casual.parseDate(text, ref, option);
|
|
|
|
|
}
|
|
|
|
|
exports.parseDate = parseDate;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var chrono = /*@__PURE__*/getDefaultExportFromCjs(dist);
|
|
|
|
|
|
|
|
|
|
var getLastDayOfMonth = function (y, m) {
|
|
|
|
|
return new Date(y, m, 0).getDate();
|
|
|
|
|
};
|
|
|
|
|
function getLocalizedChrono() {
|
|
|
|
|
var locale = window.moment.locale();
|
|
|
|
|
switch (locale) {
|
|
|
|
|
case "en-gb":
|
|
|
|
|
return new dist.Chrono(chrono.en.createCasualConfiguration(true));
|
|
|
|
|
default:
|
|
|
|
|
return new dist.Chrono(chrono.en.createCasualConfiguration(false));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function getConfiguredChrono() {
|
|
|
|
|
var localizedChrono = getLocalizedChrono();
|
|
|
|
|
localizedChrono.parsers.push({
|
|
|
|
|
pattern: function () {
|
|
|
|
|
return /\bChristmas\b/i;
|
|
|
|
|
},
|
|
|
|
|
extract: function () {
|
|
|
|
|
return {
|
|
|
|
|
day: 25,
|
|
|
|
|
month: 12,
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
return localizedChrono;
|
|
|
|
|
}
|
|
|
|
|
var NLDParser = /** @class */ (function () {
|
|
|
|
|
function NLDParser() {
|
|
|
|
|
this.chrono = getConfiguredChrono();
|
|
|
|
|
}
|
|
|
|
|
NLDParser.prototype.getParsedDate = function (selectedText, weekStart) {
|
|
|
|
|
var parser = this.chrono;
|
|
|
|
|
var nextDateMatch = selectedText.match(/next\s([\w]+)/i);
|
|
|
|
|
var lastDayOfMatch = selectedText.match(/(last day of|end of)\s*([^\n\r]*)/i);
|
|
|
|
|
var midOf = selectedText.match(/mid\s([\w]+)/i);
|
|
|
|
|
if (nextDateMatch && nextDateMatch[1] === "week") {
|
|
|
|
|
return parser.parseDate("next " + weekStart, new Date(), {
|
|
|
|
|
forwardDate: true,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (nextDateMatch && nextDateMatch[1] === "month") {
|
|
|
|
|
var thisMonth = parser.parseDate("this month", new Date(), {
|
|
|
|
|
forwardDate: true,
|
|
|
|
|
});
|
|
|
|
|
return parser.parseDate(selectedText, thisMonth, {
|
|
|
|
|
forwardDate: true,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (nextDateMatch && nextDateMatch[1] === "year") {
|
|
|
|
|
var thisYear = parser.parseDate("this year", new Date(), {
|
|
|
|
|
forwardDate: true,
|
|
|
|
|
});
|
|
|
|
|
return parser.parseDate(selectedText, thisYear, {
|
|
|
|
|
forwardDate: true,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (lastDayOfMatch) {
|
|
|
|
|
var tempDate = parser.parse(lastDayOfMatch[2]);
|
|
|
|
|
var year = tempDate[0].start.get("year");
|
|
|
|
|
var month = tempDate[0].start.get("month");
|
|
|
|
|
var lastDay = getLastDayOfMonth(year, month);
|
|
|
|
|
return parser.parseDate(year + "-" + month + "-" + lastDay, new Date(), {
|
|
|
|
|
forwardDate: true,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (midOf) {
|
|
|
|
|
return parser.parseDate(midOf[1] + " 15th", new Date(), {
|
|
|
|
|
forwardDate: true,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
return parser.parseDate(selectedText, new Date());
|
|
|
|
|
};
|
|
|
|
|
return NLDParser;
|
|
|
|
|
}());
|
|
|
|
|
|
|
|
|
|
var DEFAULT_SETTINGS = {
|
|
|
|
|
autosuggestToggleLink: true,
|
|
|
|
|
autocompleteTriggerPhrase: "@",
|
|
|
|
|
isAutosuggestEnabled: true,
|
|
|
|
|
format: "YYYY-MM-DD",
|
|
|
|
|
timeFormat: "HH:mm",
|
|
|
|
|
separator: " ",
|
|
|
|
|
weekStart: "Monday",
|
|
|
|
|
modalToggleTime: false,
|
|
|
|
|
modalToggleLink: false,
|
|
|
|
|
modalMomentFormat: "YYYY-MM-DD HH:mm",
|
|
|
|
|
};
|
|
|
|
|
var NLDSettingsTab = /** @class */ (function (_super) {
|
|
|
|
|
__extends(NLDSettingsTab, _super);
|
|
|
|
|
function NLDSettingsTab(app, plugin) {
|
|
|
|
|
var _this = _super.call(this, app, plugin) || this;
|
|
|
|
|
_this.plugin = plugin;
|
|
|
|
|
return _this;
|
|
|
|
|
}
|
|
|
|
|
NLDSettingsTab.prototype.display = function () {
|
|
|
|
|
var _this = this;
|
|
|
|
|
var containerEl = this.containerEl;
|
|
|
|
|
containerEl.empty();
|
|
|
|
|
containerEl.createEl("h2", {
|
|
|
|
|
text: "Nldates settings",
|
|
|
|
|
});
|
|
|
|
|
containerEl.createEl("h3", {
|
|
|
|
|
text: "Parser settings",
|
|
|
|
|
});
|
|
|
|
|
new obsidian.Setting(containerEl)
|
|
|
|
|
.setName("Date format")
|
|
|
|
|
.setDesc("Output format for parsed dates")
|
|
|
|
|
.addMomentFormat(function (text) {
|
|
|
|
|
return text
|
|
|
|
|
.setDefaultFormat("YYYY-MM-DD")
|
|
|
|
|
.setValue(_this.plugin.settings.format)
|
|
|
|
|
.onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
|
|
|
|
|
return __generator(this, function (_a) {
|
|
|
|
|
switch (_a.label) {
|
|
|
|
|
case 0:
|
|
|
|
|
this.plugin.settings.format = value || "YYYY-MM-DD";
|
|
|
|
|
return [4 /*yield*/, this.plugin.saveSettings()];
|
|
|
|
|
case 1:
|
|
|
|
|
_a.sent();
|
|
|
|
|
return [2 /*return*/];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}); });
|
|
|
|
|
});
|
|
|
|
|
new obsidian.Setting(containerEl)
|
|
|
|
|
.setName("Week starts on")
|
|
|
|
|
.setDesc("Which day to consider as the start of the week")
|
|
|
|
|
.addDropdown(function (day) {
|
|
|
|
|
return day
|
|
|
|
|
.addOption("Monday", "Monday")
|
|
|
|
|
.addOption("Sunday", "Sunday")
|
|
|
|
|
.setValue(_this.plugin.settings.weekStart)
|
|
|
|
|
.onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
|
|
|
|
|
return __generator(this, function (_a) {
|
|
|
|
|
switch (_a.label) {
|
|
|
|
|
case 0:
|
|
|
|
|
this.plugin.settings.weekStart = value;
|
|
|
|
|
return [4 /*yield*/, this.plugin.saveSettings()];
|
|
|
|
|
case 1:
|
|
|
|
|
_a.sent();
|
|
|
|
|
return [2 /*return*/];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}); });
|
|
|
|
|
});
|
|
|
|
|
containerEl.createEl("h3", {
|
|
|
|
|
text: "Hotkey formatting settings",
|
|
|
|
|
});
|
|
|
|
|
new obsidian.Setting(containerEl)
|
|
|
|
|
.setName("Time format")
|
|
|
|
|
.setDesc("Format for the hotkeys that include the current time")
|
|
|
|
|
.addMomentFormat(function (text) {
|
|
|
|
|
return text
|
|
|
|
|
.setDefaultFormat("HH:mm")
|
|
|
|
|
.setValue(_this.plugin.settings.timeFormat)
|
|
|
|
|
.onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
|
|
|
|
|
return __generator(this, function (_a) {
|
|
|
|
|
switch (_a.label) {
|
|
|
|
|
case 0:
|
|
|
|
|
this.plugin.settings.timeFormat = value || "HH:mm";
|
|
|
|
|
return [4 /*yield*/, this.plugin.saveSettings()];
|
|
|
|
|
case 1:
|
|
|
|
|
_a.sent();
|
|
|
|
|
return [2 /*return*/];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}); });
|
|
|
|
|
});
|
|
|
|
|
new obsidian.Setting(containerEl)
|
|
|
|
|
.setName("Separator")
|
|
|
|
|
.setDesc("Separator between date and time for entries that have both")
|
|
|
|
|
.addText(function (text) {
|
|
|
|
|
return text
|
|
|
|
|
.setPlaceholder("Separator is empty")
|
|
|
|
|
.setValue(_this.plugin.settings.separator)
|
|
|
|
|
.onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
|
|
|
|
|
return __generator(this, function (_a) {
|
|
|
|
|
switch (_a.label) {
|
|
|
|
|
case 0:
|
|
|
|
|
this.plugin.settings.separator = value;
|
|
|
|
|
return [4 /*yield*/, this.plugin.saveSettings()];
|
|
|
|
|
case 1:
|
|
|
|
|
_a.sent();
|
|
|
|
|
return [2 /*return*/];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}); });
|
|
|
|
|
});
|
|
|
|
|
containerEl.createEl("h3", {
|
|
|
|
|
text: "Date Autosuggest",
|
|
|
|
|
});
|
|
|
|
|
new obsidian.Setting(containerEl)
|
|
|
|
|
.setName("Enable date autosuggest")
|
|
|
|
|
.setDesc("Input dates with natural language. Open the suggest menu with " + this.plugin.settings.autocompleteTriggerPhrase)
|
|
|
|
|
.addToggle(function (toggle) {
|
|
|
|
|
return toggle
|
|
|
|
|
.setValue(_this.plugin.settings.isAutosuggestEnabled)
|
|
|
|
|
.onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
|
|
|
|
|
return __generator(this, function (_a) {
|
|
|
|
|
switch (_a.label) {
|
|
|
|
|
case 0:
|
|
|
|
|
this.plugin.settings.isAutosuggestEnabled = value;
|
|
|
|
|
return [4 /*yield*/, this.plugin.saveSettings()];
|
|
|
|
|
case 1:
|
|
|
|
|
_a.sent();
|
|
|
|
|
return [2 /*return*/];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}); });
|
|
|
|
|
});
|
|
|
|
|
new obsidian.Setting(containerEl)
|
|
|
|
|
.setName("Add dates as link?")
|
|
|
|
|
.setDesc("If enabled, dates created via autosuggest will be wrapped in [[wikilinks]]")
|
|
|
|
|
.addToggle(function (toggle) {
|
|
|
|
|
return toggle
|
|
|
|
|
.setValue(_this.plugin.settings.autosuggestToggleLink)
|
|
|
|
|
.onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
|
|
|
|
|
return __generator(this, function (_a) {
|
|
|
|
|
switch (_a.label) {
|
|
|
|
|
case 0:
|
|
|
|
|
this.plugin.settings.autosuggestToggleLink = value;
|
|
|
|
|
return [4 /*yield*/, this.plugin.saveSettings()];
|
|
|
|
|
case 1:
|
|
|
|
|
_a.sent();
|
|
|
|
|
return [2 /*return*/];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}); });
|
|
|
|
|
});
|
|
|
|
|
new obsidian.Setting(containerEl)
|
|
|
|
|
.setName("Trigger phrase")
|
|
|
|
|
.setDesc("Character(s) that will cause the date autosuggest to open")
|
|
|
|
|
.addMomentFormat(function (text) {
|
|
|
|
|
return text
|
|
|
|
|
.setPlaceholder(DEFAULT_SETTINGS.autocompleteTriggerPhrase)
|
|
|
|
|
.setValue(_this.plugin.settings.autocompleteTriggerPhrase || "@")
|
|
|
|
|
.onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
|
|
|
|
|
return __generator(this, function (_a) {
|
|
|
|
|
switch (_a.label) {
|
|
|
|
|
case 0:
|
|
|
|
|
this.plugin.settings.autocompleteTriggerPhrase = value.trim();
|
|
|
|
|
return [4 /*yield*/, this.plugin.saveSettings()];
|
|
|
|
|
case 1:
|
|
|
|
|
_a.sent();
|
|
|
|
|
return [2 /*return*/];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}); });
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
return NLDSettingsTab;
|
|
|
|
|
}(obsidian.PluginSettingTab));
|
|
|
|
|
|
|
|
|
|
var wrapAround = function (value, size) {
|
|
|
|
|
return ((value % size) + size) % size;
|
|
|
|
|
};
|
|
|
|
|
var Suggest = /** @class */ (function () {
|
|
|
|
|
function Suggest(owner, containerEl, scope) {
|
|
|
|
|
var _this = this;
|
|
|
|
|
this.owner = owner;
|
|
|
|
|
this.containerEl = containerEl;
|
|
|
|
|
containerEl.on("click", ".suggestion-item", this.onSuggestionClick.bind(this));
|
|
|
|
|
containerEl.on("mousemove", ".suggestion-item", this.onSuggestionMouseover.bind(this));
|
|
|
|
|
scope.register([], "ArrowUp", function (event) {
|
|
|
|
|
if (!event.isComposing) {
|
|
|
|
|
_this.setSelectedItem(_this.selectedItem - 1, true);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
scope.register([], "ArrowDown", function (event) {
|
|
|
|
|
if (!event.isComposing) {
|
|
|
|
|
_this.setSelectedItem(_this.selectedItem + 1, true);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
var selectItem = function (event) {
|
|
|
|
|
if (!event.isComposing) {
|
|
|
|
|
_this.useSelectedItem(event);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
scope.register([], "Enter", selectItem);
|
|
|
|
|
scope.register(["Shift"], "Enter", selectItem);
|
|
|
|
|
}
|
|
|
|
|
Suggest.prototype.onSuggestionClick = function (event, el) {
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
var item = this.suggestions.indexOf(el);
|
|
|
|
|
this.setSelectedItem(item, false);
|
|
|
|
|
this.useSelectedItem(event);
|
|
|
|
|
};
|
|
|
|
|
Suggest.prototype.onSuggestionMouseover = function (_event, el) {
|
|
|
|
|
var item = this.suggestions.indexOf(el);
|
|
|
|
|
this.setSelectedItem(item, false);
|
|
|
|
|
};
|
|
|
|
|
Suggest.prototype.setSuggestions = function (values) {
|
|
|
|
|
var _this = this;
|
|
|
|
|
this.containerEl.empty();
|
|
|
|
|
var suggestionEls = [];
|
|
|
|
|
values.forEach(function (value) {
|
|
|
|
|
var suggestionEl = _this.containerEl.createDiv("suggestion-item");
|
|
|
|
|
_this.owner.renderSuggestion(value, suggestionEl);
|
|
|
|
|
suggestionEls.push(suggestionEl);
|
|
|
|
|
});
|
|
|
|
|
this.values = values;
|
|
|
|
|
this.suggestions = suggestionEls;
|
|
|
|
|
this.setSelectedItem(0, false);
|
|
|
|
|
};
|
|
|
|
|
Suggest.prototype.useSelectedItem = function (event) {
|
|
|
|
|
var currentValue = this.values[this.selectedItem];
|
|
|
|
|
if (currentValue) {
|
|
|
|
|
this.owner.selectSuggestion(currentValue, event);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
Suggest.prototype.setSelectedItem = function (selectedIndex, scrollIntoView) {
|
|
|
|
|
var normalizedIndex = wrapAround(selectedIndex, this.suggestions.length);
|
|
|
|
|
var prevSelectedSuggestion = this.suggestions[this.selectedItem];
|
|
|
|
|
var selectedSuggestion = this.suggestions[normalizedIndex];
|
|
|
|
|
prevSelectedSuggestion === null || prevSelectedSuggestion === void 0 ? void 0 : prevSelectedSuggestion.removeClass("is-selected");
|
|
|
|
|
selectedSuggestion === null || selectedSuggestion === void 0 ? void 0 : selectedSuggestion.addClass("is-selected");
|
|
|
|
|
this.selectedItem = normalizedIndex;
|
|
|
|
|
if (scrollIntoView) {
|
|
|
|
|
selectedSuggestion.scrollIntoView(false);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
return Suggest;
|
|
|
|
|
}());
|
|
|
|
|
|
|
|
|
|
function checkForInputPhrase(cmEditor, pos, phrase) {
|
|
|
|
|
var from = {
|
|
|
|
|
line: pos.line,
|
|
|
|
|
ch: pos.ch - phrase.length,
|
|
|
|
|
};
|
|
|
|
|
return cmEditor.getRange(from, pos) === phrase;
|
|
|
|
|
}
|
|
|
|
|
function isCursorBeforePos(pos, cursor) {
|
|
|
|
|
if (pos.line === cursor.line) {
|
|
|
|
|
return cursor.ch < pos.ch;
|
|
|
|
|
}
|
|
|
|
|
return cursor.line < pos.line;
|
|
|
|
|
}
|
|
|
|
|
var CodeMirrorSuggest = /** @class */ (function () {
|
|
|
|
|
function CodeMirrorSuggest(app, triggerPhrase) {
|
|
|
|
|
this.triggerPhrase = triggerPhrase;
|
|
|
|
|
this.app = app;
|
|
|
|
|
this.scope = new obsidian.Scope();
|
|
|
|
|
this.suggestEl = createDiv("suggestion-container");
|
|
|
|
|
var suggestion = this.suggestEl.createDiv("suggestion");
|
|
|
|
|
this.instructionsEl = this.suggestEl.createDiv("prompt-instructions");
|
|
|
|
|
this.suggest = new Suggest(this, suggestion, this.scope);
|
|
|
|
|
this.scope.register([], "Escape", this.close.bind(this));
|
|
|
|
|
}
|
|
|
|
|
CodeMirrorSuggest.prototype.setInstructions = function (createInstructionsFn) {
|
|
|
|
|
this.instructionsEl.empty();
|
|
|
|
|
createInstructionsFn(this.instructionsEl);
|
|
|
|
|
};
|
|
|
|
|
CodeMirrorSuggest.prototype.update = function (cmEditor, changeObj) {
|
|
|
|
|
var _a;
|
|
|
|
|
if (this.cmEditor !== cmEditor) {
|
|
|
|
|
(_a = this.suggestEl) === null || _a === void 0 ? void 0 : _a.detach();
|
|
|
|
|
}
|
|
|
|
|
this.cmEditor = cmEditor;
|
|
|
|
|
var cursorPos = cmEditor.getCursor();
|
|
|
|
|
// autosuggest is open
|
|
|
|
|
if (this.suggestEl.parentNode) {
|
|
|
|
|
if (isCursorBeforePos(this.startPos, cursorPos)) {
|
|
|
|
|
this.close();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
this.attachAtCursor();
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (changeObj.text.length === 1 && // ignore multi-cursors
|
|
|
|
|
checkForInputPhrase(this.cmEditor, cursorPos, this.triggerPhrase) &&
|
|
|
|
|
!document.querySelector(".suggestion-container") // don't trigger multiple autosuggests
|
|
|
|
|
) {
|
|
|
|
|
this.startPos = cursorPos;
|
|
|
|
|
this.open();
|
|
|
|
|
this.attachAtCursor();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
};
|
|
|
|
|
CodeMirrorSuggest.prototype.getStartPos = function () {
|
|
|
|
|
return {
|
|
|
|
|
line: this.startPos.line,
|
|
|
|
|
ch: this.startPos.ch - this.triggerPhrase.length,
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
CodeMirrorSuggest.prototype.getInputStr = function () {
|
|
|
|
|
// return string from / to cursor
|
|
|
|
|
var cursor = this.cmEditor.getCursor();
|
|
|
|
|
var line = this.cmEditor.getLine(cursor.line);
|
|
|
|
|
return line.substring(this.startPos.ch, cursor.ch);
|
|
|
|
|
};
|
|
|
|
|
CodeMirrorSuggest.prototype.attachAtCursor = function () {
|
|
|
|
|
var inputStr = this.getInputStr();
|
|
|
|
|
var suggestions = this.getSuggestions(inputStr);
|
|
|
|
|
this.suggest.setSuggestions(suggestions);
|
|
|
|
|
this.cmEditor.addWidget(this.cmEditor.getCursor(), this.suggestEl, true);
|
|
|
|
|
};
|
|
|
|
|
CodeMirrorSuggest.prototype.open = function () {
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
this.app.keymap.pushScope(this.scope);
|
|
|
|
|
};
|
|
|
|
|
CodeMirrorSuggest.prototype.close = function () {
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
this.app.keymap.popScope(this.scope);
|
|
|
|
|
this.startPos = null;
|
|
|
|
|
this.suggest.setSuggestions([]);
|
|
|
|
|
this.suggestEl.detach();
|
|
|
|
|
};
|
|
|
|
|
return CodeMirrorSuggest;
|
|
|
|
|
}());
|
|
|
|
|
|
|
|
|
|
var DateSuggest = /** @class */ (function (_super) {
|
|
|
|
|
__extends(DateSuggest, _super);
|
|
|
|
|
function DateSuggest(app, plugin) {
|
|
|
|
|
var _this = _super.call(this, app, plugin.settings.autocompleteTriggerPhrase) || this;
|
|
|
|
|
_this.plugin = plugin;
|
|
|
|
|
_this.updateInstructions();
|
|
|
|
|
return _this;
|
|
|
|
|
}
|
|
|
|
|
DateSuggest.prototype.open = function () {
|
|
|
|
|
_super.prototype.open.call(this);
|
|
|
|
|
// update the instructions since they are settings-dependent
|
|
|
|
|
this.updateInstructions();
|
|
|
|
|
};
|
|
|
|
|
DateSuggest.prototype.updateInstructions = function () {
|
|
|
|
|
if (!this.plugin.settings.autosuggestToggleLink) {
|
|
|
|
|
// Instructions only apply for links
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.setInstructions(function (containerEl) {
|
|
|
|
|
containerEl.createDiv("prompt-instructions", function (instructions) {
|
|
|
|
|
instructions.createDiv("prompt-instruction", function (instruction) {
|
|
|
|
|
instruction.createSpan({
|
|
|
|
|
cls: "prompt-instruction-command",
|
|
|
|
|
text: "Shift",
|
|
|
|
|
});
|
|
|
|
|
instruction.createSpan({
|
|
|
|
|
text: "Keep text as alias",
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
DateSuggest.prototype.getSuggestions = function (inputStr) {
|
|
|
|
|
// handle no matches
|
|
|
|
|
var suggestions = this.getDateSuggestions(inputStr);
|
|
|
|
|
if (suggestions.length) {
|
|
|
|
|
return suggestions;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
return [{ label: inputStr }];
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
DateSuggest.prototype.getDateSuggestions = function (inputStr) {
|
|
|
|
|
if (inputStr.match(/(next|last|this)/i)) {
|
|
|
|
|
var reference_1 = inputStr.match(/(next|last|this)/i)[1];
|
|
|
|
|
return [
|
|
|
|
|
"week",
|
|
|
|
|
"month",
|
|
|
|
|
"year",
|
|
|
|
|
"Sunday",
|
|
|
|
|
"Monday",
|
|
|
|
|
"Tuesday",
|
|
|
|
|
"Wednesday",
|
|
|
|
|
"Thursday",
|
|
|
|
|
"Friday",
|
|
|
|
|
"Saturday",
|
|
|
|
|
]
|
|
|
|
|
.map(function (val) { return ({ label: reference_1 + " " + val }); })
|
|
|
|
|
.filter(function (items) { return items.label.toLowerCase().startsWith(inputStr); });
|
|
|
|
|
}
|
|
|
|
|
var relativeDate = inputStr.match(/^in ([+-]?\d+)/i) || inputStr.match(/^([+-]?\d+)/i);
|
|
|
|
|
if (relativeDate) {
|
|
|
|
|
var timeDelta = relativeDate[1];
|
|
|
|
|
return [
|
|
|
|
|
{ label: "in " + timeDelta + " minutes" },
|
|
|
|
|
{ label: "in " + timeDelta + " hours" },
|
|
|
|
|
{ label: "in " + timeDelta + " days" },
|
|
|
|
|
{ label: "in " + timeDelta + " weeks" },
|
|
|
|
|
{ label: "in " + timeDelta + " months" },
|
|
|
|
|
{ label: timeDelta + " days ago" },
|
|
|
|
|
{ label: timeDelta + " weeks ago" },
|
|
|
|
|
{ label: timeDelta + " months ago" },
|
|
|
|
|
].filter(function (items) { return items.label.toLowerCase().startsWith(inputStr); });
|
|
|
|
|
}
|
|
|
|
|
return [
|
|
|
|
|
{ label: "Today" },
|
|
|
|
|
{ label: "Yesterday" },
|
|
|
|
|
{ label: "Tomorrow" },
|
|
|
|
|
].filter(function (items) { return items.label.toLowerCase().startsWith(inputStr); });
|
|
|
|
|
};
|
|
|
|
|
DateSuggest.prototype.renderSuggestion = function (suggestion, el) {
|
|
|
|
|
el.setText(suggestion.label);
|
|
|
|
|
};
|
|
|
|
|
DateSuggest.prototype.selectSuggestion = function (suggestion, event) {
|
|
|
|
|
var includeAlias = event.shiftKey;
|
|
|
|
|
var head = this.getStartPos();
|
|
|
|
|
var anchor = this.cmEditor.getCursor();
|
|
|
|
|
var dateStr = this.plugin.parseDate(suggestion.label).formattedString;
|
|
|
|
|
if (this.plugin.settings.autosuggestToggleLink) {
|
|
|
|
|
if (includeAlias) {
|
|
|
|
|
dateStr = "[[" + dateStr + "|" + suggestion.label + "]]";
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
dateStr = "[[" + dateStr + "]]";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this.cmEditor.replaceRange(dateStr, head, anchor);
|
|
|
|
|
this.close();
|
|
|
|
|
};
|
|
|
|
|
return DateSuggest;
|
|
|
|
|
}(CodeMirrorSuggest));
|
|
|
|
|
|
|
|
|
|
var NaturalLanguageDates = /** @class */ (function (_super) {
|
|
|
|
|
__extends(NaturalLanguageDates, _super);
|
|
|
|
|
function NaturalLanguageDates() {
|
|
|
|
|
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
|
|
|
_this.autosuggestHandler = function (cmEditor, changeObj) {
|
|
|
|
|
var _a;
|
|
|
|
|
return (_a = _this.autosuggest) === null || _a === void 0 ? void 0 : _a.update(cmEditor, changeObj);
|
|
|
|
|
};
|
|
|
|
|
return _this;
|
|
|
|
|
}
|
|
|
|
|
NaturalLanguageDates.prototype.onload = function () {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
|
|
|
var _this = this;
|
|
|
|
|
return __generator(this, function (_a) {
|
|
|
|
|
switch (_a.label) {
|
|
|
|
|
case 0:
|
|
|
|
|
console.log("Loading natural language date parser plugin");
|
|
|
|
|
return [4 /*yield*/, this.loadSettings()];
|
|
|
|
|
case 1:
|
|
|
|
|
_a.sent();
|
|
|
|
|
this.addCommand({
|
|
|
|
|
id: "nlp-dates",
|
|
|
|
|
name: "Parse natural language date",
|
|
|
|
|
callback: function () { return _this.onTrigger("replace"); },
|
|
|
|
|
hotkeys: [],
|
|
|
|
|
});
|
|
|
|
|
this.addCommand({
|
|
|
|
|
id: "nlp-dates-link",
|
|
|
|
|
name: "Parse natural language date (as link)",
|
|
|
|
|
callback: function () { return _this.onTrigger("link"); },
|
|
|
|
|
hotkeys: [],
|
|
|
|
|
});
|
|
|
|
|
this.addCommand({
|
|
|
|
|
id: "nlp-date-clean",
|
|
|
|
|
name: "Parse natural language date (as plain text)",
|
|
|
|
|
callback: function () { return _this.onTrigger("clean"); },
|
|
|
|
|
hotkeys: [],
|
|
|
|
|
});
|
|
|
|
|
this.addCommand({
|
|
|
|
|
id: "nlp-parse-time",
|
|
|
|
|
name: "Parse natural language time",
|
|
|
|
|
callback: function () { return _this.onTrigger("time"); },
|
|
|
|
|
hotkeys: [],
|
|
|
|
|
});
|
|
|
|
|
this.addCommand({
|
|
|
|
|
id: "nlp-now",
|
|
|
|
|
name: "Insert the current date and time",
|
|
|
|
|
callback: function () { return _this.getNowCommand(); },
|
|
|
|
|
hotkeys: [],
|
|
|
|
|
});
|
|
|
|
|
this.addCommand({
|
|
|
|
|
id: "nlp-today",
|
|
|
|
|
name: "Insert the current date",
|
|
|
|
|
callback: function () { return _this.getDateCommand(); },
|
|
|
|
|
hotkeys: [],
|
|
|
|
|
});
|
|
|
|
|
this.addCommand({
|
|
|
|
|
id: "nlp-time",
|
|
|
|
|
name: "Insert the current time",
|
|
|
|
|
callback: function () { return _this.getTimeCommand(); },
|
|
|
|
|
hotkeys: [],
|
|
|
|
|
});
|
|
|
|
|
this.addCommand({
|
|
|
|
|
id: "nlp-picker",
|
|
|
|
|
name: "Date picker",
|
|
|
|
|
checkCallback: function (checking) {
|
|
|
|
|
if (checking) {
|
|
|
|
|
return !!_this.app.workspace.activeLeaf;
|
|
|
|
|
}
|
|
|
|
|
new DatePickerModal(_this.app, _this).open();
|
|
|
|
|
},
|
|
|
|
|
hotkeys: [],
|
|
|
|
|
});
|
|
|
|
|
this.addSettingTab(new NLDSettingsTab(this.app, this));
|
|
|
|
|
this.registerObsidianProtocolHandler("nldates", this.actionHandler.bind(this));
|
|
|
|
|
this.tryToSetupAutosuggest();
|
|
|
|
|
this.app.workspace.onLayoutReady(function () {
|
|
|
|
|
// initialize the parser when layout is ready so that the correct locale is used
|
|
|
|
|
_this.parser = new NLDParser();
|
|
|
|
|
});
|
|
|
|
|
return [2 /*return*/];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.onunload = function () {
|
|
|
|
|
console.log("Unloading natural language date parser plugin");
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.tryToSetupAutosuggest = function () {
|
|
|
|
|
var _this = this;
|
|
|
|
|
if (this.settings.autocompleteTriggerPhrase &&
|
|
|
|
|
this.settings.isAutosuggestEnabled) {
|
|
|
|
|
this.autosuggest = new DateSuggest(this.app, this);
|
|
|
|
|
this.registerCodeMirror(function (cm) {
|
|
|
|
|
cm.on("change", _this.autosuggestHandler);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
this.autosuggest = null;
|
|
|
|
|
this.registerCodeMirror(function (cm) {
|
|
|
|
|
cm.off("change", _this.autosuggestHandler);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.loadSettings = function () {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
|
|
|
var _a, _b, _c, _d;
|
|
|
|
|
return __generator(this, function (_e) {
|
|
|
|
|
switch (_e.label) {
|
|
|
|
|
case 0:
|
|
|
|
|
_a = this;
|
|
|
|
|
_c = (_b = Object).assign;
|
|
|
|
|
_d = [DEFAULT_SETTINGS];
|
|
|
|
|
return [4 /*yield*/, this.loadData()];
|
|
|
|
|
case 1:
|
|
|
|
|
_a.settings = _c.apply(_b, _d.concat([_e.sent()]));
|
|
|
|
|
return [2 /*return*/];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.saveSettings = function () {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
|
|
|
return __generator(this, function (_a) {
|
|
|
|
|
switch (_a.label) {
|
|
|
|
|
case 0:
|
|
|
|
|
// rebuild autosuggest in case trigger phrase changed, or it was disabled
|
|
|
|
|
this.tryToSetupAutosuggest();
|
|
|
|
|
return [4 /*yield*/, this.saveData(this.settings)];
|
|
|
|
|
case 1:
|
|
|
|
|
_a.sent();
|
|
|
|
|
return [2 /*return*/];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.getSelectedText = function (editor) {
|
|
|
|
|
if (editor.somethingSelected()) {
|
|
|
|
|
return editor.getSelection();
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
var wordBoundaries = this.getWordBoundaries(editor);
|
|
|
|
|
editor.getDoc().setSelection(wordBoundaries.from, wordBoundaries.to);
|
|
|
|
|
return editor.getSelection();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.getWordBoundaries = function (editor) {
|
|
|
|
|
var cursor = editor.getCursor();
|
|
|
|
|
var line = cursor.line;
|
|
|
|
|
var word = editor.findWordAt({
|
|
|
|
|
line: line,
|
|
|
|
|
ch: cursor.ch,
|
|
|
|
|
});
|
|
|
|
|
var wordStart = word.anchor.ch;
|
|
|
|
|
var wordEnd = word.head.ch;
|
|
|
|
|
return {
|
|
|
|
|
from: {
|
|
|
|
|
line: line,
|
|
|
|
|
ch: wordStart,
|
|
|
|
|
},
|
|
|
|
|
to: {
|
|
|
|
|
line: line,
|
|
|
|
|
ch: wordEnd,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.getMoment = function (date) {
|
|
|
|
|
return window.moment(date);
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.getFormattedDate = function (date) {
|
|
|
|
|
var formattedDate = this.getMoment(date).format(this.settings.format);
|
|
|
|
|
return formattedDate;
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.getFormattedTime = function (date) {
|
|
|
|
|
var formattedTime = this.getMoment(date).format(this.settings.timeFormat);
|
|
|
|
|
return formattedTime;
|
|
|
|
|
};
|
|
|
|
|
/*
|
|
|
|
|
@param dateString: A string that contains a date in natural language, e.g. today, tomorrow, next week
|
|
|
|
|
@returns NLDResult: An object containing the date, a cloned Moment and the formatted string.
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
NaturalLanguageDates.prototype.parseDate = function (dateString) {
|
|
|
|
|
var date = this.parser.getParsedDate(dateString, this.settings.weekStart);
|
|
|
|
|
var formattedString = this.getFormattedDate(date);
|
|
|
|
|
if (formattedString === "Invalid date") {
|
|
|
|
|
console.debug("Input date " + dateString + " can't be parsed by nldates");
|
|
|
|
|
}
|
|
|
|
|
return {
|
|
|
|
|
formattedString: formattedString,
|
|
|
|
|
date: date,
|
|
|
|
|
moment: this.getMoment(date),
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.parseTime = function (dateString) {
|
|
|
|
|
var date = this.parser.getParsedDate(dateString, this.settings.weekStart);
|
|
|
|
|
var formattedString = this.getFormattedTime(date);
|
|
|
|
|
if (formattedString === "Invalid date") {
|
|
|
|
|
console.debug("Input date " + dateString + " can't be parsed by nldates");
|
|
|
|
|
}
|
|
|
|
|
return {
|
|
|
|
|
formattedString: formattedString,
|
|
|
|
|
date: date,
|
|
|
|
|
moment: this.getMoment(date),
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.parseTruthy = function (flag) {
|
|
|
|
|
return ["y", "yes", "1", "t", "true"].indexOf(flag.toLowerCase()) >= 0;
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.onTrigger = function (mode) {
|
|
|
|
|
var activeView = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
|
|
|
if (!activeView) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var editor = activeView.sourceMode.cmEditor;
|
|
|
|
|
var cursor = editor.getCursor();
|
|
|
|
|
var selectedText = this.getSelectedText(editor);
|
|
|
|
|
var date = this.parseDate(selectedText);
|
|
|
|
|
if (!date.moment.isValid()) {
|
|
|
|
|
editor.setCursor({
|
|
|
|
|
line: cursor.line,
|
|
|
|
|
ch: cursor.ch,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
//mode == "replace"
|
|
|
|
|
var newStr = "[[" + date.formattedString + "]]";
|
|
|
|
|
if (mode == "link") {
|
|
|
|
|
newStr = "[" + selectedText + "](" + date.formattedString + ")";
|
|
|
|
|
}
|
|
|
|
|
else if (mode == "clean") {
|
|
|
|
|
newStr = "" + date.formattedString;
|
|
|
|
|
}
|
|
|
|
|
else if (mode == "time") {
|
|
|
|
|
var time = this.parseTime(selectedText);
|
|
|
|
|
newStr = "" + time.formattedString;
|
|
|
|
|
}
|
|
|
|
|
editor.replaceSelection(newStr);
|
|
|
|
|
this.adjustCursor(editor, cursor, newStr, selectedText);
|
|
|
|
|
editor.focus();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.adjustCursor = function (editor, cursor, newStr, oldStr) {
|
|
|
|
|
var cursorOffset = newStr.length - oldStr.length;
|
|
|
|
|
editor.setCursor({
|
|
|
|
|
line: cursor.line,
|
|
|
|
|
ch: cursor.ch + cursorOffset,
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.getNowCommand = function () {
|
|
|
|
|
var activeView = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
|
|
|
if (!activeView) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var editor = activeView.sourceMode.cmEditor;
|
|
|
|
|
editor.replaceSelection(this.getMoment(new Date()).format("" + this.settings.format + this.settings.separator + this.settings.timeFormat));
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.getDateCommand = function () {
|
|
|
|
|
var activeView = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
|
|
|
if (!activeView) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var editor = activeView.sourceMode.cmEditor;
|
|
|
|
|
editor.replaceSelection(this.getMoment(new Date()).format(this.settings.format));
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.getTimeCommand = function () {
|
|
|
|
|
var activeView = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
|
|
|
if (!activeView) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var editor = activeView.sourceMode.cmEditor;
|
|
|
|
|
editor.replaceSelection(this.getMoment(new Date()).format(this.settings.timeFormat));
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.insertDateString = function (dateString, editor, _cursor) {
|
|
|
|
|
editor.replaceSelection(dateString);
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.actionHandler = function (params) {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
|
|
|
var workspace, date, newPane, dailyNote, leaf;
|
|
|
|
|
return __generator(this, function (_a) {
|
|
|
|
|
switch (_a.label) {
|
|
|
|
|
case 0:
|
|
|
|
|
workspace = this.app.workspace;
|
|
|
|
|
date = this.parseDate(params.day);
|
|
|
|
|
newPane = this.parseTruthy(params.newPane || "yes");
|
|
|
|
|
if (!date.moment.isValid()) return [3 /*break*/, 3];
|
|
|
|
|
return [4 /*yield*/, this.getDailyNote(date.moment)];
|
|
|
|
|
case 1:
|
|
|
|
|
dailyNote = _a.sent();
|
|
|
|
|
leaf = workspace.activeLeaf;
|
|
|
|
|
if (newPane) {
|
|
|
|
|
leaf = workspace.splitActiveLeaf();
|
|
|
|
|
}
|
|
|
|
|
return [4 /*yield*/, leaf.openFile(dailyNote)];
|
|
|
|
|
case 2:
|
|
|
|
|
_a.sent();
|
|
|
|
|
workspace.setActiveLeaf(leaf);
|
|
|
|
|
_a.label = 3;
|
|
|
|
|
case 3: return [2 /*return*/];
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
NaturalLanguageDates.prototype.getDailyNote = function (date) {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
|
|
|
var desiredNote;
|
|
|
|
|
return __generator(this, function (_a) {
|
|
|
|
|
desiredNote = main.getDailyNote(date, main.getAllDailyNotes());
|
|
|
|
|
if (desiredNote) {
|
|
|
|
|
return [2 /*return*/, Promise.resolve(desiredNote)];
|
|
|
|
|
}
|
|
|
|
|
return [2 /*return*/, main.createDailyNote(date)];
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
return NaturalLanguageDates;
|
|
|
|
|
}(obsidian.Plugin));
|
|
|
|
|
|
|
|
|
|
module.exports = NaturalLanguageDates;
|
|
|
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9vYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UvZGlzdC9tYWluLmpzIiwic3JjL21vZGFscy9kYXRlLXBpY2tlci50cyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L3V0aWxzL3BhdHRlcm4uanMiLCJub2RlX21vZHVsZXMvZGF5anMvZGF5anMubWluLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY2FsY3VsYXRpb24veWVhcnMuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL2NvbnN0YW50cy5qcyIsIm5vZGVfbW9kdWxlcy9kYXlqcy9wbHVnaW4vcXVhcnRlck9mWWVhci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L3V0aWxzL2RheWpzLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvcmVzdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeS5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vcGFyc2Vycy9FTlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOU2xhc2hNb250aEZvcm1hdFBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5UaW1lRXhwcmVzc2lvblBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L3V0aWxzL3RpbWV1bml0cy5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vcGFyc2Vycy9FTlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOVGltZVVuaXRMYXRlckZvcm1hdFBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9hYnN0cmFjdFJlZmluZXJzLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3JlZmluZXJzL0Fic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9yZWZpbmVycy9FTk1lcmdlRGF0ZVJhbmdlUmVmaW5lci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NhbGN1bGF0aW9uL21lcmdpbmdDYWxjdWxhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9yZWZpbmVycy9FTk1lcmdlRGF0ZVRpbWVSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3JlZmluZXJzL0V4dHJhY3RUaW1lem9uZUFiYnJSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3JlZmluZXJzL0V4dHJhY3RUaW1lem9uZU9mZnNldFJlZmluZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jb21tb24vcmVmaW5lcnMvT3ZlcmxhcFJlbW92YWxSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3JlZmluZXJzL0ZvcndhcmREYXRlUmVmaW5lci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9yZWZpbmVycy9Vbmxpa2VseUZvcm1hdEZpbHRlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9wYXJzZXJzL0lTT0Zvcm1hdFBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9yZWZpbmVycy9NZXJnZVdlZWtkYXlDb21wb25lbnRSZWZpbmVyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29uZmlndXJhdGlvbnMuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jb21tb24vY2FzdWFsUmVmZXJlbmNlcy5qcyIsIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vcGFyc2Vycy9FTkNhc3VhbERhdGVQYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5DYXN1YWxUaW1lUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY2FsY3VsYXRpb24vd2Vla3MuanMiLCJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5XZWVrZGF5UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOUmVsYXRpdmVEYXRlRm9ybWF0UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY2hyb25vLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3BhcnNlcnMvU2xhc2hEYXRlRm9ybWF0UGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOVGltZVVuaXRDYXN1YWx
|