"""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 = ['', f'Formula de' ' funcționare reluată la începutul workshopului — rana stă în a doua' ' casetă'] # stimul extern p += [f'', f'' f'{fits("stimul extern", 130)}', f'' f'{fits("tot ce e în afara pielii", 130, 10)}', f'' f'{fits("ex: piața îți ia stopul", 130, 10)}'] p += [f'', f''] # reprezentare mentală, cu filtrele p += [f'', f'' f'{fits("reprezentare mentală — lentila prin care vezi", 310)}'] for k, t in enumerate(FILTRE): y = 78 + 18 * k p += [f'', f'' f'{fits(t, 296, 11)}'] p += [f'' f'{fits("rana nu schimbă", 140, 11)}', f'' f'{fits("evenimentul —", 140, 11)}', f'' f'{fits("schimbă lentila", 140, 11)}', f''] # coborârea pe rândul doi p += [f'', f''] for k, (nume, ex) in enumerate(LANT2): x = BOX2_X[k] p += [f'', f'' f'{fits(nume, BOX2_W - 20)}', f'{fits(ex, 132, 11)}'] if k < len(LANT2) - 1: p += [f'', f''] p += [f'', f'' f'{fits("De ce te interesează la execuție", 652)}', f'' f'{fits("Doi traderi cu același stop luat, pe același grafic, scriu două reprezentări diferite — deci două", 652, 11)}', f'' f'{fits("comportamente diferite. Regula scrisă dinainte acționează în caseta a doua, nu în ultima.", 652, 11)}', ''] 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'', f'Cele cinci' ' răni: masca fiecăreia și greșeala de execuție pe care o produce', f'RANA', f'MASCA', f'PĂRINTE ASOCIAT', f'CE FACE PE CONT', f''] for k, (rana, masca, par, negru, albastru) in enumerate(RANI): y = 74 + ROW_H * k p += [f'{fits(rana, 92, 11)}', f'' f'{fits(masca, 88, 11)}', f'' f'{fits(par, 126, 10)}'] randuri = [(t, c) for t, c in ((negru, INK), (albastru, BLUE)) if t] for j, (txt, col) in enumerate(randuri): p.append(f'{fits(txt, 340, 11)}') if k < len(RANI) - 1: p.append(f'') yb = 76 + ROW_H * len(RANI) + 18 p += [f'' f'{fits("În coloana a patra, rândul negru e rostit în transcriere; rândul albastru de sub el e derivația mea pe execuție.", 672, 11)}', f'' f'{fits("La abandon cursul vorbește doar de relații și dependențe, nu de cont. Poți fi în mai multe răni, cu una dominantă.", 672, 11)}', ''] 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'', f'Nu un copil' ' interior, ci șase — barele sunt la scară pe axa de vârstă'] # axa de vârstă, sus p += [f''] for an in (0, 3, 6, 12, 22): p += [f'', f'{an}'] p.append(f'ani') y_last = 74 + ROW * (len(ETAPE) - 1) + 18 p += [f''] for k, (a, b, nume, l1, l2) in enumerate(ETAPE): y = 74 + ROW * k col = RED if b <= 3 else INK p += [f'', f'{fits(f"{nume} · {eti(a, b)}", 388, 11)}', f'' f'{fits(l1, 388, 11)}', f'' f'{fits(l2, 388, 10)}'] yb = 74 + ROW * len(ETAPE) + 16 p += [f'' f'{fits("Linia punctată de la 3 ani: sub ea nu ai amintiri (neocortexul nu e dezvoltat), deci informația vine", 672, 11)}', f'' f'{fits("de la părinți sau din corp, nu din memorie. Între 15 și 16 ani cursul nu numește o etapă separată.", 672, 11)}', ''] 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(""), name if MD.exists(): md = MD.read_text(encoding="utf-8") for name, svg in svgs.items(): pat = re.compile(rf".*?", re.S) assert pat.search(md), f"marcatorul {name} lipsește din .md" md = pat.sub(lambda _m: f"\n{svg}\n", md) MD.write_text(md, encoding="utf-8") print("scris", MD) else: print("nu există încă", MD)