Files
atm-curs-dl/gen/strategii/substituie.py
Claude Agent e9ae7e4695 buy_doji: pullback, bull reversal si buy momentum explicate; Surse scos
Cererile userului pe capitol:
- pullback definit in glosar, cu contra-exemplu, si legat de momentul
  intrarii (confirmarea de dupa doji-ul care termina pullback-ul);
- bull reversal / bear reversal si buy momentum erau folositi fara
  explicatie: definiti din material (07_determinare_trend, filtrele de
  scaner, 10_buysell_momentum_trigger) si explicati inline la prima
  folosire;
- blocul "Surse" scos; propozitia-contract mutata sus, ca "Cum citesti
  capitolul". Trimiterile catre celelalte capitole raman inline.

substituie.py devine repetabil: SVG-ul pus ramane intre ancorele
<!-- DIAGRAMA: cheie --> ... <!-- /DIAGRAMA: cheie -->, deci o diagrama
regenerata se poate reinsera. Pana acum marcajul se consuma la prima
rulare si regenerarile nu mai ajungeau in .md. Ancorele sunt puse in
toate cele 49 de diagrame din 17_STRATEGII.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
2026-09-20 11:32:21 +00:00

67 lines
2.4 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
CAPITOLE = sorted((ROOT / "summaries" / "17_STRATEGII").glob("[0A][1-8]_*.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())