Diagramele capitolului 10 sunt gata (un singur generator pentru toate, aceeasi serie, deci o cifra schimbata cade peste tot). Textul capitolului nu e scris - agentul a atins pragul de context acolo. Doua bug-uri in unelte, gasite de el: - substituie.py avea glob-ul [0A][1-8]_*.md, deci sarea tacut peste capitolele cu doua cifre (09, 10). Capitolul parea doar sa n-aiba marcaje. - eticheta_libera presupunea text centrat cand eticheta n-are text-anchor. In SVG, fara anchor inseamna aliniat la stanga, deci etichetele de Level cu label_at=left erau modelate cu jumatate de latime prea mult la stanga si dadeau alarme false. L-a costat trei iteratii. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
70 lines
2.6 KiB
Python
70 lines
2.6 KiB
Python
"""Înlocuiește marcajele <!-- DIAGRAMA: cheie --> din strategii/*.md cu SVG-ul lui.
|
|
|
|
Substituția o face scriptul ăsta, nu agenții: la 37 de diagrame, dacă fiecare
|
|
agent ar scrie în .md-ul capitolului, șapte agenți ar edita același fișier.
|
|
|
|
Cheia din marcaj se caută ca gen/strategii/<slug>_<cheie>.svg, unde slug-ul
|
|
vine din numele capitolului (01_buy_doji.md -> buy_doji).
|
|
|
|
Substituția e REPETABILĂ: SVG-ul pus rămâne între ancorele
|
|
<!-- DIAGRAMA: cheie --> ... <!-- /DIAGRAMA: cheie -->, iar o rulare
|
|
următoare înlocuiește conținutul dintre ele cu SVG-ul regenerat. Rulează
|
|
scriptul după fiecare regenerare de diagramă.
|
|
|
|
python3 gen/strategii/substituie.py # scrie
|
|
python3 gen/strategii/substituie.py --check # doar raportează, nu scrie
|
|
"""
|
|
import re
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent.parent
|
|
_S = ROOT / "summaries" / "17_STRATEGII"
|
|
# numerele au ajuns la doua cifre (09, 10): un glob pe [0A][1-8] le sarea, si
|
|
# sarea tacut — capitolul parea doar sa n-aiba marcaje.
|
|
CAPITOLE = sorted({*_S.glob("[0-9][0-9]_*.md"), *_S.glob("A[0-9]_*.md")})
|
|
# fie marcajul gol (prima punere), fie blocul deja ancorat (repunere)
|
|
MARCAJ = re.compile(
|
|
r"^[ \t]*<!-- DIAGRAMA: ([a-z0-9_]+) -->[ \t]*$"
|
|
r"(?:\n.*?\n[ \t]*<!-- /DIAGRAMA: \1 -->[ \t]*$)?",
|
|
re.M | re.S)
|
|
|
|
|
|
def slug(cale: Path) -> str:
|
|
"""01_buy_doji.md -> buy_doji; A3_intrarea.md -> intrarea"""
|
|
return cale.stem.split("_", 1)[1]
|
|
|
|
|
|
def main() -> int:
|
|
check = "--check" in sys.argv
|
|
puse = lipsa = 0
|
|
for cap in CAPITOLE:
|
|
text = cap.read_text()
|
|
s = slug(cap)
|
|
|
|
def inlocuieste(m: re.Match) -> str:
|
|
nonlocal puse, lipsa
|
|
# unii agenți au pus slug-ul în cheie (mp2_exemplu), alții nu (exemplu)
|
|
gen = ROOT / "gen" / "strategii"
|
|
svg = next((c for c in (gen / f"{s}_{m.group(1)}.svg",
|
|
gen / f"{m.group(1)}.svg") if c.exists()),
|
|
gen / f"{s}_{m.group(1)}.svg")
|
|
if not svg.exists():
|
|
lipsa += 1
|
|
print(f"LIPSĂ {cap.name}: {svg.name}")
|
|
return m.group(0)
|
|
puse += 1
|
|
cheie = m.group(1)
|
|
return (f"<!-- DIAGRAMA: {cheie} -->\n{svg.read_text().strip()}\n"
|
|
f"<!-- /DIAGRAMA: {cheie} -->")
|
|
|
|
nou = MARCAJ.sub(inlocuieste, text)
|
|
if nou != text and not check:
|
|
cap.write_text(nou)
|
|
print(f"{puse} diagrame puse, {lipsa} lipsă")
|
|
return 1 if lipsa else 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|