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:
1 parent
608334b9d8
commit
06153a227e
37 files changed
+2618
-57
No files matched your search
+41
-2
@@ -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()
|
||||
Reference in new issue
Block a user