Mappa figure-pagine: link mancanti, Fig. 41 in dpp-1, sezione 'Pagine che la usano' nelle note e controlli 9-10 in lint

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5.5 committed 2026-10-20 13:59:21 +02:00
1 parent aa9b943450
commit eb672dfcd8
105 files changed
+361 -20

No files matched your search

+22
View File
@@ -9,6 +9,26 @@ out = root / "wiki/figures"
out.mkdir(parents=True, exist_ok=True)
# --- pagine della wiki che usano ciascuna figura (link [[fig-...]] o embed del file), per la navigazione inversa ---
import re as _re0
_file2id = {pn["file"][:-4]: f["id"] for k in ("figures",) for f in cat[k] for pn in f["panels"]}
_file2id.update({pn["file"][:-4]: f["id"] for f in cat.get("riassunto", {}).get("figures", []) for pn in f["panels"]})
used_by = {}
for _p in sorted((root / "wiki").rglob("*.md")):
if "figures" in _p.parts or _p.name in ("figure-indice.md", "bibliografia.md"):
continue
_t = _p.read_text(encoding="utf8").split("---", 2)[-1]
_ids = set(_re0.findall(r"\[\[((?:ris-)?fig-[\w-]+)", _t))
_ids |= {_file2id[h] for h in _re0.findall(r"!\[\[immagini/([0-9a-f]{64})", _t) if h in _file2id}
for _i in _ids:
used_by.setdefault(_i, set()).add(_p.stem)
def usage(fid):
pages = sorted(used_by.get(fid, ()))
return ["## Pagine che la usano", " · ".join(f"[[{x}]]" for x in pages) if pages else "nessuna", ""]
def q(s):
return json.dumps(str(s), ensure_ascii=False)
@@ -65,6 +85,7 @@ for f in cat["figures"]:
body += ["## Da verificare", qual["review_notes"], ""]
if v.get("issues"):
body += ["Esito revisione indipendente: " + "; ".join(v["issues"]), ""]
body += usage(f["id"])
body += ["## Collegamenti", "- [[tesi]]", ""]
(out / f"{f['id']}.md").write_text("\n".join(fm + body), encoding="utf8")
@@ -112,6 +133,7 @@ for f in ris:
body += [f"- [[{e['id']}]] — {e['relation']} (verifica: {e['verified']})" for e in f["thesis_equivalents"]] + [""]
if qual.get("review_notes"):
body += ["## Da verificare", qual["review_notes"], ""]
body += usage(f["id"])
body += ["## Collegamenti", "- [[riassunto-tesi]] · [[riassunto-vs-tesi]]", ""]
(out / f"{f['id']}.md").write_text("\n".join(fm + body), encoding="utf8")
+35
View File
@@ -87,3 +87,38 @@ for p in pages:
cat = json.loads((root / "raw/immagini.json").read_text(encoding="utf8"))
c = Counter(x for f in cat["figures"] for x in f.get("concepts", []))
print("8 slug in >=2 figure:", [(k, v) for k, v in c.most_common() if v >= 2])
# 9 figure citate per numero ("Fig. N") senza wikilink [[fig-...]] né embed del file nella stessa pagina
# (escluse le pagine analyses/ e riassunto-tesi, che usano numerazioni di altri documenti o citano per ragioni diverse)
n2f = {f["number"]: f for f in cat["figures"] if f["number"]}
FIGLINK = re.compile(r"\[\[((?:ris-)?fig-[\w-]+)")
EMB = re.compile(r"!\[\[immagini/([0-9a-f]{64})")
nav = {"tesi", "campioni", "dati", "glossario", "overview", "tabelle-indice", "percorso-sintetico", "riassunto-tesi"}
for p in pages:
if "analyses" in p.parts or p.stem == "riassunto-tesi":
continue
body = re.sub(r"^---\n.*?\n---\n", "", p.read_text(encoding="utf8"), flags=re.S)
ids, hs = set(FIGLINK.findall(body)), set(EMB.findall(body))
miss = set()
for m in re.finditer(r"Figg?\.\s*(\d+)(?:\s*[-–]\s*(\d+))?", re.sub(r"\[\[[^\]]*\]\]", "", body)):
for n in range(int(m.group(1)), int(m.group(2) or m.group(1)) + 1):
f = n2f.get(n)
if f and f["id"] not in ids and not {x["file"][:-4] for x in f["panels"]} & hs:
miss.add(n)
if miss:
print("9 figure citate senza link né embed:", p.name, sorted(miss))
# 10 figure mai collegate da una pagina tematica (solo da navigazione o da analisi)
topical = set()
for p in pages:
if p.stem in nav or "analyses" in p.parts:
continue
t = p.read_text(encoding="utf8")
topical |= set(FIGLINK.findall(t))
topical |= {x for x in (pn["file"][:-4] for f in cat["figures"] + cat.get("riassunto", {}).get("figures", []) for pn in f["panels"]) if x in set(EMB.findall(t))}
ids_all = {f["id"] for f in cat["figures"]} | {f["id"] for f in cat.get("riassunto", {}).get("figures", [])}
file2id = {pn["file"][:-4]: f["id"] for f in cat["figures"] + cat.get("riassunto", {}).get("figures", []) for pn in f["panels"]}
topical_ids = {file2id.get(x, x) for x in topical}
orph = sorted(i for i in ids_all - topical_ids if not i.startswith("ris-fig"))
if orph:
print("10 figure della tesi senza pagina tematica:", orph)