UNPKG

@gouvfr-anct/timetable-to-osm-opening-hours

Version:

📚 Bibliothèque pour la transformation d'une série de plages horaires représentant un format emploi du temps vers le standard OSM pour les horaires d'ouverture.

72 lines (71 loc) • 4.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fromTimetableOsmOpeningHours = void 0; /* eslint-disable-next-line @typescript-eslint/sort-type-union-intersection-members */ const utilities_1 = require("../utilities"); const daysBetween = (startDayIndex, endDayIndex) => utilities_1.OSM_DAYS_OF_WEEK.filter((_, index) => index > startDayIndex && index < endDayIndex); const ofDay = (previousLastDay) => (day) => day === previousLastDay; const daysOffHours = (days) => ({ days, osmHours: 'off' }); const openingHoursDaysOffIfAny = (newDaysOff) => newDaysOff.length > 0 ? [daysOffHours(newDaysOff)] : []; const workingDays = (currentOpeningHour) => (day) => !currentOpeningHour.days.includes(day); const daysOffToAdd = (currentOpeningHours) => daysBetween(utilities_1.OSM_DAYS_OF_WEEK.findIndex(ofDay(currentOpeningHours.days[0])), utilities_1.OSM_DAYS_OF_WEEK.findIndex(ofDay(currentOpeningHours.days.slice(-1)[0]))).filter(workingDays(currentOpeningHours)); const isDaysRange = (days) => days.length > 2; const getDaysOff = (currentOpeningHour, previousOpeningHoursDaysOff) => { if (isDaysRange(currentOpeningHour.days)) { return openingHoursDaysOffIfAny([ ...(previousOpeningHoursDaysOff?.days.filter(workingDays(currentOpeningHour)) ?? []), ...daysOffToAdd(currentOpeningHour) ]); } if (previousOpeningHoursDaysOff != null) { return openingHoursDaysOffIfAny(previousOpeningHoursDaysOff.days.filter(workingDays(currentOpeningHour))); } return []; }; const withoutDaysOff = (group) => group.osmHours !== 'off'; const withDaysOff = (group) => group.osmHours === 'off'; const appendOffHours = (openingHoursGroupDaysByHours, currentOpeningHours) => [ ...openingHoursGroupDaysByHours.filter(withoutDaysOff), currentOpeningHours, ...getDaysOff(currentOpeningHours, openingHoursGroupDaysByHours.find(withDaysOff)) ]; const appendToExistingOpeningHoursGroup = (existingOpeningHoursGroup, currentOpeningHours) => [ { days: [...existingOpeningHoursGroup.days, currentOpeningHours.day], osmHours: currentOpeningHours.osmHours } ]; const newOpeningHoursGroup = (currentOpeningHours) => [ { days: [currentOpeningHours.day], osmHours: currentOpeningHours.osmHours } ]; const updateOpeningHoursGroupDaysByHours = (currentOpeningHours, existingOpeningHoursGroup) => existingOpeningHoursGroup == null ? newOpeningHoursGroup(currentOpeningHours) : appendToExistingOpeningHoursGroup(existingOpeningHoursGroup, currentOpeningHours); const updatingOpeningHoursGroups = (currentOpeningHour) => (openingHours) => openingHours.osmHours !== currentOpeningHour.osmHours && !openingHours.osmHours.includes('off'); const existingOpeningHoursGroupFor = (currentOpeningHours) => (openingHours) => openingHours.osmHours === currentOpeningHours.osmHours; const formatDays = (days) => isDaysRange(days) ? [days[0], days[days.length - 1]].join('-') : days.join(','); const toOSMOpeningHoursStrings = (osmOpeningHours, openingHours) => [ ...osmOpeningHours, `${formatDays(openingHours.days)} ${openingHours.osmHours}` ]; const byDayOfWeek = (osmOpeningHours1, osmOpeningHours2) => utilities_1.OSM_DAYS_OF_WEEK.findIndex(ofDay(osmOpeningHours1.days[0])) - utilities_1.OSM_DAYS_OF_WEEK.findIndex(ofDay(osmOpeningHours2.days[0])); const byRange = (osmOpeningHours1, osmOpeningHours2) => osmOpeningHours2.days.length - osmOpeningHours1.days.length; const groupOpeningHoursDaysByHours = (openingHoursGroupDaysByHours, currentOpeningHours) => [ ...openingHoursGroupDaysByHours.filter(updatingOpeningHoursGroups(currentOpeningHours)), ...updateOpeningHoursGroupDaysByHours(currentOpeningHours, openingHoursGroupDaysByHours.find(existingOpeningHoursGroupFor(currentOpeningHours))) ]; const fromTimetableOsmOpeningHours = (horaires) => horaires .reduce(groupOpeningHoursDaysByHours, []) .sort(byDayOfWeek) .sort(byRange) .reduce(appendOffHours, []) .reduce(toOSMOpeningHoursStrings, []) .join('; ') .replace('Mo-Su ', ''); exports.fromTimetableOsmOpeningHours = fromTimetableOsmOpeningHours;