"""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")]
def lant_rana() -> str:
p = ['']
return "\n ".join(p)
# ------------------------------------------------- 2. rană -> mască -> greșeală
# col. 4: True = legătura cu piața e rostită în transcriere; False = completarea mea
RANI = [("respingere", "fugarul", "de obicei tatăl",
"închizi tranzacția mai devreme; fugi de reguli", True),
("abandon", "dependentul", "de obicei mama",
"nu intri până nu confirmă altcineva setup-ul", False),
("umilire", "masochistul", "de obicei mama",
"te autosabotezi; suporți pierderea mai mult decât trebuie", True),
("trădare", "dominatorul", "părintele de sex opus",
"schimbi strategia la prima serie proastă: „m-a trădat piața”", True),
("nedreptate", "rigidul", "părintele mai autoritar",
"vrei să ai dreptate — muți stopul; overtrading „ca să meriți”", True)]
def rani_masti() -> str:
h = 76 + 34 * 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. legenda spune că exact un rând e completarea mea
assert sum(1 for r in RANI if not r[4]) == 1, "legenda vorbește de un singur rând albastru"
# 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("