@golemio/parkings
Version:
Golemio Parkings Module
84 lines • 3.96 kB
JavaScript
"use strict";
/**
* Parsing strings based on https://wiki.openstreetmap.org/wiki/Key:opening_hours#Implementation
* Minimal implementation:
* - "24/7"
* - "09:00-22:00"
* - "Mo-Sa 09:00-19:00; Su 10:00-18:00"
* - "Mo-Fr 07:00-01:00"
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.OpeningHoursParser = void 0;
const DaysInWeekEnum_1 = require("../constants/periods/DaysInWeekEnum");
const PhTypesEnum_1 = require("../constants/periods/PhTypesEnum");
class OpeningHoursParser {
constructor() {
this.TWENTY_FOUR_SEVEN = "24/7";
this.OSM_BASIC_FORMAT_REGEX =
// eslint-disable-next-line max-len
/(?<element>(?<days>(Mo|Tu|We|Th|Fr|Sa|Su)([-,]?(Mo|Tu|We|Th|Fr|Sa|Su))*)*[ ]?(?<timeSpan>\d{2}:\d{2}-\d{2}:\d{2},?){1,})(; )?/gs;
this.OSM_FORMAT_REGEX =
// eslint-disable-next-line max-len
/^((?<element>(?<days>(Mo|Tu|We|Th|Fr|Sa|Su)([-,]?(Mo|Tu|We|Th|Fr|Sa|Su))*)*[ ]?(?<timeSpan>\d{2}:\d{2}-\d{2}:\d{2},?){1,})(; )?)+$/;
this.generatePeriods = (weekDays, startTime, endTime, ph) => {
const result = [];
for (const day of weekDays) {
for (const phType of ph) {
if (startTime < endTime) {
result.push({ day_in_week: day.toString(), start: startTime, end: endTime, ph: phType });
}
else {
result.push({ day_in_week: day.toString(), start: startTime, end: "23:59", ph: phType });
result.push({ day_in_week: this.getNextDay(day), start: "00:00", end: endTime, ph: phType });
}
}
}
return result;
};
this.getNextDay = (day) => {
const index = this.daysInWeek.indexOf(day);
return this.daysInWeek[(index + 1) % 7];
};
this.daysInWeek = Object.values(DaysInWeekEnum_1.DaysInWeekEnum);
}
parse(openingHours) {
const periods = [];
if (!openingHours) {
return null;
}
if (openingHours === this.TWENTY_FOUR_SEVEN) {
return this.generatePeriods(Object.values(DaysInWeekEnum_1.DaysInWeekEnum), "00:00", "23:59", Object.values(PhTypesEnum_1.PhTypes));
}
if (this.OSM_FORMAT_REGEX.test(openingHours) === false) {
return null;
}
const result = openingHours.matchAll(this.OSM_BASIC_FORMAT_REGEX);
for (const match of result) {
const isDayRange = match.groups?.days?.includes("-");
if (isDayRange) {
const days = match.groups?.days?.split("-");
const startDay = days[0];
const endDay = days[1];
//get all other days in between startDay and endDay
const startDayIndex = this.daysInWeek.indexOf(startDay);
const endDayIndex = this.daysInWeek.indexOf(endDay);
const daysInBetween = this.daysInWeek.slice(startDayIndex, endDayIndex + 1);
const timeSpan = match.groups?.timeSpan.split("-");
const startTime = timeSpan[0];
const endTime = timeSpan[1];
periods.push(...this.generatePeriods(daysInBetween, startTime, endTime, Object.values(PhTypesEnum_1.PhTypes)));
}
else {
// single day or multiple days
const days = match.groups?.days?.split(",") ?? Object.values(DaysInWeekEnum_1.DaysInWeekEnum);
const timeSpan = match.groups?.timeSpan.split("-");
const startTime = timeSpan[0];
const endTime = timeSpan[1];
periods.push(...this.generatePeriods(days, startTime, endTime, Object.values(PhTypesEnum_1.PhTypes)));
}
}
return periods;
}
}
exports.OpeningHoursParser = OpeningHoursParser;
//# sourceMappingURL=OpeningHoursParser.js.map