"""Cele trei scheme din summaries/06_MODUL_5/06_workshop_5_copilul_interior.md.
Workshop de psihologie: nu există preț, deci nu există candele. Schemele sunt
doar structuri (lanțul de decizie, maparea rană -> mască -> greșeală de
execuție, axa de vârstă a etapelor). Se generează de aici ca să existe un
singur loc unde se schimbă o etichetă și ca să treacă prin assert-urile de
lățime — nu se editează SVG-ul din .md.
Rulează: .venv/bin/python gen/workshop_5_copilul_interior.py
"""
import re
from pathlib import Path
MD = Path("/workspace/atm-curs-dl/summaries/06_MODUL_5/06_workshop_5_copilul_interior.md")
GRAY, RED, GREEN, BLUE, ORANGE = "#777", "#c00", "#188a3e", "#1a5fb4", "#b06000"
INK, MUTED, LINE, FILL = "#333", "#666", "#9bb0c7", "#f7f9fb"
CHAR_W = 5.7 # px/caracter la 12px sans-serif, calibrat ca în audit_diagrams.py
svgs = {}
def fits(txt: str, box_w: float, fs: float = 12.0) -> str:
"""Text care intră în lățimea dată la font-size-ul dat, altfel assert."""
w = len(txt) * CHAR_W * fs / 12.0
assert w <= box_w, f"text de {w:.0f}px în {box_w:.0f}px: {txt!r}"
return txt
# --------------------------------------------------------------- 1. lanțul de decizie
FILTRE = ["filtrele VAKOG — vizual, auditiv, kinestezic",
"valorile și credințele (unele limitative)",
"experiențele, cu rănile emoționale din ele"]
LANT2 = [("gând", '„iar m-a trădat piața"'),
("emoție", "furie"),
("comportament", "intri în revanșă"),
("rezultat", "a doua pierdere")]
BOX2_X = [14 + 172 * k for k in range(len(LANT2))]
BOX2_W = 152
# caseta în care intră săgeata care coboară din „reprezentare mentală"
ARROW_TARGET = 0
X_ARR = BOX2_X[ARROW_TARGET] + BOX2_W / 2
def lant_rana() -> str:
p = ['']
return "\n ".join(p)
# ------------------------------------------------- 2. rană -> mască -> greșeală
# col. 4 = ce e rostit în transcriere (negru); col. 5 = derivația mea pe execuție
# (albastru). Oricare poate fi "" — la abandon cursul nu spune nimic pe cont.
RANI = [("respingere", "fugarul", "de obicei tatăl",
"închizi tranzacția mai devreme; fugi de reguli", ""),
("abandon", "dependentul", "de obicei mama",
"", "nu intri până nu confirmă altcineva setup-ul"),
("umilire", "masochistul", "de obicei mama",
"te autosabotezi", "suporți pierderea mai mult decât trebuie"),
("trădare", "dominatorul", "părintele de sex opus",
"nu ai încredere în nicio strategie; o serie proastă = trădare",
"de aici schimbatul strategiei după o serie proastă"),
("nedreptate", "rigidul", "părintele mai autoritar",
"vrei să ai dreptate; overtrading „ca să meriți”",
"de aici mutatul stopului ca să nu greșești")]
ROW_H = 40
def rani_masti() -> str:
h = 76 + ROW_H * len(RANI) + 58
p = [f'']
return "\n ".join(p)
# ----------------------------------------------------- 3. etapele copiilor interiori
# (start_ani, stop_ani, nume, linia 1, linia 2)
ETAPE = [(0.0, 1.5, "sinele infantil",
"nevoi de bază: hrană, somn, atingere, siguranță.",
"Fără amintiri — cursul le pune în „memoria celulară”."),
(1.5, 3.0, "sinele copilului mic",
"autonomie și testarea limitelor.",
"Mediu restrictiv aici duce în rușine, vinovăție, îndoială."),
(3.0, 6.0, "copilul interior tânăr",
"imaginație, creativitate, stimă de sine.",
"Aici se formează, spune cursul, umilirea și respingerea."),
(6.0, 12.0, "copilul interior școlar",
"identitate și valoare de sine, prin grup.",
"Critica produce aici „nu sunt suficient de bun”."),
(12.0, 15.0, "adolescentul interior",
"rebeliune, căutare de identitate, apartenență.",
"De aici vine, spune cursul, încălcarea regulilor."),
(16.0, 22.0, "tânărul adult interior",
"asumarea responsabilității, primele decizii mari.",
"De aici vine indecizia, inclusiv în trading.")]
AX0, AXW, YEARS, ROW = 20.0, 250.0, 22.0, 54
def eti(a: float, b: float) -> str:
"""Eticheta de vârstă: luni sub doi ani, altfel ani, cu virgulă zecimală."""
if b <= 1.6:
return f"{int(a * 12)}–{int(b * 12)} luni"
lo = "18 luni" if a == 1.5 else f"{a:g}".replace(".", ",")
return f"{lo}–{b:g} ani".replace(".", ",")
def _x(an: float) -> float:
return AX0 + AXW * an / YEARS
def etape_copii() -> str:
h = 74 + ROW * len(ETAPE) + 44
p = [f'']
return "\n ".join(p)
svgs["lant_rana"] = lant_rana()
svgs["rani_masti"] = rani_masti()
svgs["etape_copii"] = etape_copii()
# ---------------------------------------------------------------------- assert-uri
# 1. nicio bară nu iese din axă și barele sunt în ordine crescătoare de vârstă
assert all(0 <= a < b <= YEARS for a, b, *_ in ETAPE), "interval de vârstă invalid"
assert [a for a, *_ in ETAPE] == sorted(a for a, *_ in ETAPE), "etape neordonate"
# 2. eticheta „sub 3 ani nu ai amintiri" trebuie să acopere exact primele două etape
sub3 = [e for e in ETAPE if e[1] <= 3.0]
assert len(sub3) == 2, f"linia de 3 ani nu mai taie 2 etape, ci {len(sub3)}"
# 3. textul spune „șase" copii interiori
assert len(ETAPE) == 6, "titlul spune șase etape"
# 4. textul spune „cinci răni", fiecare cu exact o mască
assert len(RANI) == 5 and len({r[1] for r in RANI}) == 5, "5 răni, 5 măști distincte"
# 5. fiecare rană spune ceva pe cont, din curs sau de la mine; „muți stopul" nu
# poate sta în negru (cuvântul „stop" nu apare în transcrierea workshopului)
assert all(r[3] or r[4] for r in RANI), "o rană fără nimic pe coloana de cont"
assert not any("stop" in r[3] for r in RANI), "«stop» nu e rostit în transcriere"
# 5b. săgeata care coboară din reprezentarea mentală cade pe caseta „gând"
_i = [n for n, _ in LANT2].index("gând")
assert _i == ARROW_TARGET and BOX2_X[_i] < X_ARR < BOX2_X[_i] + BOX2_W, \
f"săgeata la x={X_ARR} nu cade pe caseta „gând” ({BOX2_X[_i]}…{BOX2_X[_i] + BOX2_W})"
# 6. niciun SVG nu are linie goală (python-markdown ar rupe blocul)
for name, svg in svgs.items():
assert "\n\n" not in svg, f"linie goală în {name}"
assert svg.count("