"""Test de conversion complet : 2 cours × (14 chapitres + 2 annexes) ; math KaTeX ; TikZ.""" import collections import json import os import subprocess import sys sys.path.insert(0, os.path.dirname(__file__)) from latex2html import Ctx, convert_chapter # noqa: E402 from bib import parse_bib # noqa: E402 import tikz # noqa: E402 ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) COURSES = { "imm1003": "IMM1003-20_Elements_evaluation_immobiliere/IMM1003_Notes_de_cours/sources", "imm1033": "IMM1033-20_Methodes_du_cout/IMM1033_Notes_de_cours/sources", } do_tikz = "--tikz" in sys.argv all_tikz = [] for code, rel in COURSES.items(): src = os.path.join(ROOT, rel) bib = parse_bib(open(os.path.join(src, "references.bib"), encoding="utf-8").read()) ctx = Ctx(code.upper(), bib) results = [] for i in range(1, 15): key = f"ch{i:02d}" tex = open(os.path.join(src, "chapters", key + ".tex"), encoding="utf-8").read() r = convert_chapter(ctx, key, str(i), f"/seance/{i:02d}/", tex) results.append(r) for key, num, url in (("annexe-formulaire", "A", "/aide-memoire/"), ("annexe-glossaire", "B", "/glossaire/")): tex = open(os.path.join(src, "chapters", key + ".tex"), encoding="utf-8").read() results.append(convert_chapter(ctx, key, num, url, tex)) print(f"=== {code}: {len(results)} fichiers ; math={len(ctx.math)} tikz={len(ctx.tikz)} labels={len(ctx.labels)} " f"def={len(ctx.definitions)} form={len(ctx.formulas)} ex={len(ctx.examples)} exo={len(ctx.exercises)}") for r in results: print(f" {r.key:18s} {r.num:>2s} {r.title_text[:60]:60s} {r.counts}") warn = collections.Counter(w for w in ctx.warnings) print(" --- avertissements (dédupliqués) :", len(warn)) for w, c in warn.most_common(60): print(f" {c:3d} × {w}") # renvois import re unresolved = set() for r in results: for m in re.finditer(r"@@REF\{([^}]*)\}@@", r.html): if m.group(1) not in ctx.labels: unresolved.add(m.group(1)) print(" --- renvois non résolus :", sorted(unresolved)) # math items = [{"mode": m, "tex": t} for m, t in ctx.math] p = subprocess.run(["node", os.path.join(os.path.dirname(__file__), "render_math.mjs")], input=json.dumps(items).encode(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) if p.returncode != 0: print(" node erreur:", p.stderr.decode()[:500]) else: out = json.loads(p.stdout.decode()) errs = [(items[i]["tex"], o["error"]) for i, o in enumerate(out) if o["error"]] print(f" --- KaTeX : {len(out)} formules, {len(errs)} erreurs") for tex, e in errs[:40]: print(" ERR:", e[:100], "||", tex[:120].replace("\n", " ")) all_tikz.extend(ctx.tikz) # dump html pour inspection os.makedirs("/tmp/uqo-test", exist_ok=True) for r in results: open(f"/tmp/uqo-test/{code}-{r.key}.html", "w").write(r.html) if do_tikz: res = tikz.render_all(all_tikz, os.path.join(os.path.dirname(__file__), "..", "cache", "tikz"), workers=6, log_dir="/tmp/uqo-test/tikz-logs") bad = [r for r in res if not r["ok"]] print(f"=== TikZ : {len(res)} figures, {len(bad)} échecs") for r in bad[:20]: print(" ", r["hash"], r["err"][:300])