docs: record the publication derivation, pagination and pure/impure seam
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
9c7099f224
commit
346ae78a9a
@@ -181,3 +181,40 @@ sont le vrai risque, invisible sous `TZ=Europe/Paris`) ; `formulaire-mairie.js`
|
||||
est fin, impur et **non testé unitairement** — aucun harnais DOM dans le repo, et
|
||||
happy-dom n'émulerait de toute façon pas Gravity Forms. C'est le test humain qui
|
||||
tranche.
|
||||
|
||||
## 2026-07-17 — [T2] Publication mairie : dérivée, paginée, seam pur/impur
|
||||
|
||||
Le statut *publié* est **dérivé** de l'agenda public de la mairie (pas de tag),
|
||||
en retrouvant l'événement Nextcloud par **date locale de Cugnaux + titre
|
||||
normalisé**. Il donne aussi le **lien direct** (lu dans la carte).
|
||||
|
||||
**Corrections factuelles vérifiées en phase plan :**
|
||||
|
||||
- **L'agenda est PAGINÉ** : `.../agenda/page/N/?f=1&…`. Un seul fetch « période »
|
||||
ne suffit pas → on boucle jusqu'à une page vide (plafond de sécurité anti-boucle).
|
||||
- **Le slug porte des suffixes WordPress** (« Atelier dessin » →
|
||||
`/agenda/atelier-dessin-2/`) : on matche sur **date + titre**, jamais sur le
|
||||
slug. Le lien est **lu** dans la carte, jamais reconstruit.
|
||||
- `<time datetime="YYYY-MM-DD">` est une **date nue** (pas d'heure) → comparer à
|
||||
la date locale de Cugnaux du `debut`, jamais à une conversion de fuseau.
|
||||
Journée entière = date flottante → composantes locales (comme `presentation.js`).
|
||||
|
||||
**Seam extraction impure / matching pur** (même logique que
|
||||
`formulaire-valeurs.js` vs `formulaire-mairie.js`) : `DOMParser` est **absent de
|
||||
Bun**, donc `extraireCartes(html)` (`agenda-mairie.js`) est impur et **non testé
|
||||
unitairement** (test humain sur l'agenda réel) ; le **matching** (`publication.js`)
|
||||
et la boucle de pagination (via impls injectées) sont purs et **testés à fond** —
|
||||
c'est le vrai risque produit.
|
||||
|
||||
**Biais PRÉCISION v1** : match STRICT (date identique + titre normalisé
|
||||
identique). Titre proche mais non strictement identique le même jour → on
|
||||
**n'affirme pas** « publié » (faux négatif bénin ; le formulaire modéré rattrape
|
||||
un doublon éventuel). Dans le doute — agenda injoignable, HTTP ≠ 200, DOMParser
|
||||
qui lève, structure HTML changée — la liste s'affiche **sans badge** (dégradation
|
||||
gracieuse, jamais d'exception, aucun faux positif). Deux cartes de même clé
|
||||
(même jour + même titre normalisé, rare) : la **dernière indexée** l'emporte.
|
||||
|
||||
**Périmètre v1 = badge « publié » + lien uniquement.** L'annotation est
|
||||
**additive** : la liste est rendue immédiatement, l'agenda ne la bloque jamais.
|
||||
Fetch de l'agenda **sans** `credentials` (public). Aucune modification de
|
||||
`manifest.json` (`host_permissions` couvre déjà `ville-cugnaux.fr`).
|
||||
|
||||
+5
-2
@@ -120,9 +120,12 @@ URL filtrée par mois :
|
||||
|
||||
### Structure HTML d'un résultat (confirmée)
|
||||
|
||||
Chaque événement publié = `<div class="card card-thumbnail card-event ...">` contenant :
|
||||
Chaque événement publié = `<article class="card card-thumbnail card-event ...">`
|
||||
contenant (balise `<article>`, PAS `<div>` : vérifié sur l'agenda réel le
|
||||
2026-07-17 — matcher sur la classe `.card-event`, agnostique de balise) :
|
||||
- **Date** : `<time datetime="YYYY-MM-DD">` (ancre de match la plus fiable)
|
||||
- **Lien direct** : `<a href="https://www.ville-cugnaux.fr/agenda/<slug>/">` — c'est le lien à afficher dans l'extension
|
||||
- **Lien direct** : `<a href="/agenda/<slug>/">` — parfois **relatif**, à
|
||||
résoudre contre l'agenda avant affichage ; c'est le lien à afficher dans l'extension
|
||||
- **Titre** : `.card-title > a`
|
||||
- **Thème** : classe `event_theme-<slug>`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user