UNPKG

@golemio/parkings

Version:
84 lines 3.96 kB
"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