etichete: cele trei care mint, si doua bug-uri de infrastructura

Cele trei, toate verificate pe ecran dupa reparatie: "minimul din care a
pornit miscarea 99.80" intra sub o candela si se citea "99.8" (m2d_directie);
"2 saptamani" era acoperita de caseta de citat si se citea "2 saptaman"
(atmi_orizont); cele doua stopuri de la buy_doji_stop stateau la 12 px cu
liniile incrucisate peste etichete, iar diagrama e tocmai despre diferenta
dintre ele - acum fiecare sta la capatul propriei linii.

Doua bug-uri gasite pe drum, mai grave decat ce reparam:

1. render_html trecea SVG-urile prin markdown. In mp2_pivoti_excel cele doua
   asteriscuri din formulele Excel (=2*E2-C2) deveneau un <em> pus peste
   </text>, iar parserul browserului arunca restul SVG-ului: jumatate de tabel
   lipsea din pagina, fara niciun semn in .md sau in audit. Acum SVG-urile sunt
   scoase din calea lui markdown si puse inapoi dupa, cu assert ca nu ramane
   niciun marcaj.
2. eticheta_libera nu citea <g transform>, deci la diagramele cu panouri
   compara coordonate din sisteme diferite si rata suprapuneri reale. Acum
   aplatizeaza translate/scale pe <g>-uri imbricate. Prima diagrama pe care a
   prins-o dupa reparatie e chiar una deja comisa, din capitolul 10.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
This commit is contained in:
Claude Agent
2026-10-02 05:59:11 +00:00
parent 1b57878118
commit 29dc93dfad
15 changed files with 469 additions and 289 deletions

View File

@@ -146,10 +146,32 @@ def link_md_to_html(md_path: Path, body: str) -> str:
return re.sub(r'href="(?!https?:)([^":]+?)\.md(#[^"]*)?"', sub, body)
def stash_svgs(text: str) -> tuple[str, list[str]]:
"""Scoate <svg>...</svg> din calea lui markdown și lasă un marcaj în loc.
Fără asta, markdown vede caracterele lui înăuntrul desenului: în
`mp2_pivoti_excel` cele două `*` din formulele Excel (`=2*E2-C2` …
`=2*E3-B3`) deveneau un `<em>` pus peste `</text>`, iar parserul
browserului arunca tot restul SVG-ului — jumătate de tabel lipsea din
pagină, fără niciun semn în .md sau în audit (02.10.2026).
"""
pastrate: list[str] = []
def scoate(m: re.Match) -> str:
pastrate.append(m.group(0))
return f"<!--SVG{len(pastrate) - 1}-->"
return re.sub(r"<svg .*?</svg>", scoate, text, flags=re.S), pastrate
def render_file(md_path: Path) -> tuple[Path, str]:
text = md_path.read_text(encoding="utf-8")
check_svgs(md_path, text)
body = markdown.markdown(text, extensions=["extra", "toc"])
fara_svg, svgs = stash_svgs(text)
body = markdown.markdown(fara_svg, extensions=["extra", "toc"])
body = re.sub(r"(?:<p>\s*)?<!--SVG(\d+)-->(?:\s*</p>)?",
lambda m: svgs[int(m.group(1))], body)
assert "<!--SVG" not in body, f"{md_path}: marcaj de SVG rămas în pagină"
body = link_md_to_html(md_path, body)
title = text.splitlines()[0].lstrip("# ").strip() if text else md_path.stem
top, bottom = nav_html(md_path, title)