chrono-node
Version:
A natural language date parser in Javascript
50 lines • 2.24 kB
JavaScript
import { toTimezoneOffset } from "../../timezone.js";
const TIMEZONE_NAME_PATTERN = new RegExp("^\\s*,?\\s*\\(?([A-Z]{2,4})\\)?(?=\\W|$)", "i");
export default class ExtractTimezoneAbbrRefiner {
constructor(timezoneOverrides) {
this.timezoneOverrides = timezoneOverrides;
}
refine(context, results) {
const timezoneOverrides = context.option.timezones ?? {};
results.forEach((result) => {
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 refDate = result.start.date() ?? result.refDate ?? new Date();
const tzOverrides = { ...this.timezoneOverrides, ...timezoneOverrides };
const extractedTimezoneOffset = toTimezoneOffset(timezoneAbbr, refDate, tzOverrides);
if (extractedTimezoneOffset == null) {
return;
}
context.debug(() => {
console.log(`Extracting timezone: '${timezoneAbbr}' into: ${extractedTimezoneOffset} for: ${result.start}`);
});
const currentTimezoneOffset = result.start.get("timezoneOffset");
if (currentTimezoneOffset !== null && extractedTimezoneOffset != currentTimezoneOffset) {
if (result.start.isCertain("timezoneOffset")) {
return;
}
if (timezoneAbbr != match[1]) {
return;
}
}
if (result.start.isOnlyDate()) {
if (timezoneAbbr != match[1]) {
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;
}
}
//# sourceMappingURL=ExtractTimezoneAbbrRefiner.js.map