From 2a25f1c34e8b552113a4c7c51fba84bdb4ab1bf2 Mon Sep 17 00:00:00 2001 From: Pierre Martin Date: Tue, 30 Jun 2026 01:18:29 +0200 Subject: [PATCH] docs: record iCalendar parser decisions (T1) Co-Authored-By: Claude Opus 4.8 --- docs/DECISIONS.md | 26 ++++++++++++++++++++++++++ docs/RECHERCHE.md | 5 +++++ 2 files changed, 31 insertions(+) diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 96bc8d2..e7cb2ea 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -39,6 +39,32 @@ navigateur). L'extension facilite le geste (affiche l'image à glisser) mais ne l'automatise pas. L'affiche vient souvent de la newsletter Brevo, hors calendrier. +## 2026-06-30 — Parseur iCalendar (T1) : contrat `Event` figé + ical.js vendoré + +Le flux brut est transformé en `Event[]` par une fonction pure +`parserEvenements(flux, aujourdhui)` (`extension/evenements.js`), via **ical.js +v2.2.1 vendoré** (approche 3 du brainstorm : pas de build, dépendance en `.js`). + +**Contrat `Event` figé** (ne pas rouvrir sans accord) : +`{ uid, titre, description, lieu, debut: Date, fin: Date, categories: string[], +journeeEntiere: boolean }`. Champs texte coercés en `""` si absents (l'aval +suppose des chaînes). Le défaut « café » du lieu est appliqué **en aval**, pas +ici. + +**Décisions tranchées :** +- **`uid` seul, pas de `href`/`ETag`.** Le transport actuel (`?export`) renvoie + un ICS concaténé sans `href`/`ETag` par événement. L'`UID` est la clé stable ; + T2 résoudra l'adressage CalDAV par UID au moment du PUT. Le contrat n'est pas + alourdi. +- **`journeeEntiere` dès T1** (drapeau porté, comportement « heure exigée » + différé à T3). +- **Cas limites traités « au plus simple », différés à T3** : pas d'expansion + RRULE (récurrents pris au DTSTART maître + filtre futur → un récurrent au + maître **passé** disparaît, **trou assumé et documenté**), exceptions + d'occurrence (`RECURRENCE-ID`) ignorées, journées entières au minuit local. +- **Tri & message « 0 événement futur » hors parseur** : le parseur renvoie les + événements **dans l'ordre du flux**, non triés (responsabilité de la liste). + ## 2026-06-29 — Pré-remplissage par content script, pas par URL Gravity Forms n'accepte `?input_X=` que si chaque champ est configuré diff --git a/docs/RECHERCHE.md b/docs/RECHERCHE.md index e4f1213..b41652d 100644 --- a/docs/RECHERCHE.md +++ b/docs/RECHERCHE.md @@ -26,6 +26,11 @@ Document de référence pour l'implémentation. Toutes les valeurs ci-dessous so > Recommandation parsing : `ical.js` (Mozilla) plutôt que regex maison — gère RRULE, TZID, VALUE=DATE. +> **T1 — parseur** : `ical.js` **v2.2.1** vendoré (build ESM `dist/ical.js`) dans +> `extension/vendor/ical.js`. ⚠️ Les `VTIMEZONE` embarqués dans le flux doivent +> être enregistrés (`ICAL.TimezoneService.register`) **avant** `toJSDate()`, +> sinon l'offset est faux pour les TZID non standards (ex. `Africa/Lagos`). + --- ## 2. Cible : formulaire mairie (Gravity Forms, form id = 6)