Interface locale : rtg interface (voyages, sources, journées, récit, génération)

Serveur web local sans dépendance nouvelle (http.server, Jinja2, htmx et
Leaflet fournis). Écrans : Mes voyages, nouveau voyage, un voyage (journées
avec carte, rattachement des traces sans heures à un jour avec suggestion
d'après les photos, sources avec choix de dossier, infos et récit,
génération avec avancement et arrêt), réglages du site et vérification
des outils.

Chaîne : jours imposés ([dates_traces] dans voyage.toml), arrêt propre de
la compression, suivi des étapes, état structuré (site.tableau_etat),
titre du voyage repris de voyage.toml sur l'accueil.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mf2kATMtqVABHSYdxJMnim
This commit is contained in:
FabriceandClaude Opus 5.5 committed 2026-10-09 14:07:47 +00:00
1 parent 608334b9d8
commit 06153a227e
37 files changed
+2618 -57

No files matched your search

+41 -2
View File
@@ -37,6 +37,7 @@ DEFAUTS = {
"moto": "",
"sources": {"traces": ["routes"], "videos": ["rushs"], "photos": ["photos"]},
"exclusions": {"fichiers": []},
"dates_traces": {}, # trace sans heures → jour imposé (AAAA-MM-JJ)
}
# Qualité « humaine » → paramètres d'encodeur. « equilibree » = réglages
@@ -130,18 +131,56 @@ def _toml_valeur(v):
return f'"{s}"'
def _toml_cle(k):
return k if re.fullmatch(r"[A-Za-z0-9_-]+", k) else _toml_valeur(k)
def ecrire_toml(chemin, donnees, entete=""):
"""Écrit un TOML simple (valeurs, listes, une profondeur de tables)."""
lignes = [f"# {l}" for l in entete.splitlines()] + ([""] if entete else [])
for k, v in donnees.items():
if not isinstance(v, dict):
lignes.append(f"{k} = {_toml_valeur(v)}")
lignes.append(f"{_toml_cle(k)} = {_toml_valeur(v)}")
for k, v in donnees.items():
if isinstance(v, dict):
lignes += ["", f"[{k}]"] + [f"{kk} = {_toml_valeur(vv)}" for kk, vv in v.items()]
lignes += ["", f"[{_toml_cle(k)}]"] + [f"{_toml_cle(kk)} = {_toml_valeur(vv)}"
for kk, vv in v.items()]
with open(chemin, "w", encoding="utf-8") as f:
f.write("\n".join(lignes) + "\n")
def modifier_toml(chemin, changements, entete=""):
"""Applique `changements` à un fichier TOML existant (ou nouveau) et le
réécrit. Une valeur None retire la clé ; une table est fusionnée sur un
niveau. Le commentaire d'en-tête est conservé, les autres sont perdus."""
donnees = lire_toml(chemin)
if os.path.exists(chemin):
with open(chemin, encoding="utf-8") as f:
tete = []
for l in f:
if not l.startswith("#"):
break
tete.append(l[1:].strip())
entete = "\n".join(tete) or entete
for k, v in changements.items():
if v is None:
donnees.pop(k, None)
elif isinstance(v, dict):
table = dict(donnees.get(k, {}))
for kk, vv in v.items():
if vv is None:
table.pop(kk, None)
else:
table[kk] = vv
if table:
donnees[k] = table
else:
donnees.pop(k, None)
else:
donnees[k] = v
ecrire_toml(chemin, donnees, entete)
return donnees
def nom_lisible(nom):
return re.sub(r"[-_]+", " ", nom).strip()