"""Cele două scheme din summaries/06_MODUL_5/07_workshop_6_abundenta.md. Workshop de psihologie: nu există preț, deci nu există candele. Schemele sunt structuri — lanțul a fi / a face / a avea, și schema logică a unei strategii, cea pe care autorul spune că o desenează cu romb de pe vremea Turbo Pascal. 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_6_abundenta.py """ import re from pathlib import Path MD = Path("/workspace/atm-curs-dl/summaries/06_MODUL_5/07_workshop_6_abundenta.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. a fi -> a face -> a avea # (eticheta, ce e, cele două rânduri de detaliu din transcriere) VERBE = [ ("a FI", "abilitățile + starea emoțională", ["„20% strategie, 80% psihologie — puse", "la pachet ca să obții 100%”"]), ("a FACE", "procesul: execuția strategiei", ["„acțiunea sau procesul care", "înseamnă creștere și dezvoltare\u201d"]), ("a AVEA", "rezultatul: banii", ["„a avea ce este? rezultatul, frate —", "rezultatul e consecința procesului”"]), ] BOX_W, BOX_H, GAP_X, X0, Y0 = 200, 104, 32, 18, 44 def a_fi_a_face_a_avea() -> str: w = X0 * 2 + 3 * BOX_W + 2 * GAP_X p = [f'', f'' f'{fits("Ordinea dată de curs: a fi, a face, a avea — și scurtcircuitul pe care îl ia majoritatea", w - 2 * X0)}'] for i, (verb, ce, detail) in enumerate(VERBE): x = X0 + i * (BOX_W + GAP_X) col = GREEN if i < 2 else ORANGE p += [f'', f'' f'{fits(verb, BOX_W - 24)}', f'' f'{fits(ce, BOX_W - 24, 11)}'] for k, d in enumerate(detail): p += [f'' f'{fits(d, BOX_W - 20, 10)}'] if i < len(VERBE) - 1: xa = x + BOX_W p += [f'', f''] # scurtcircuitul: de la stânga primei casete direct la a treia, pe dedesubt y_sc = Y0 + BOX_H + 34 x_end = X0 + 2 * (BOX_W + GAP_X) + BOX_W / 2 p += [f'', f'', f'' f'{fits("scurtcircuitul: pui obiectivul direct pe rezultat, în bani", 400, 11)}', f'' f'{fits("Motivul pe care îl dă autorul: „oamenii nu-și asumă responsabilitatea transformării. Stau în a avea pentru", w - 2 * X0, 11)}', f'' f'{fits("că nu-și asumă responsabilitatea transformării.” Transformarea sunt exact cele două casete sărite.", w - 2 * X0, 11)}', ''] return "\n ".join(p) # ------------------------------------------------ 2. schema logică a strategiei # (eticheta nodului, tipul) — tipul contează pentru assert-uri NODURI = [ ("A — condiția de intrare din strategie", "start"), ("s-a format A, exact ca în reguli?", "romb"), ("B — intri, cu stopul pus în același ordin", "pas"), ("prețul face D: se duce la stop?", "romb"), ("E — stopul te scoate: pierdere planificată", "iesire-plan"), ("C — duci poziția la ieșirea din plan", "iesire-bun"), ("nu faci nimic, aștepți următoarea alertă", "iesire-bun"), ] def schema_logica() -> str: w, h = 700, 382 p = [f'', f'' f'{fits("Strategia ca schemă logică — forma pe care autorul spune că o desenează cu romb, din liceu", w - 32)}'] def box(x, y, bw, bh, txt, col, bold=False, fs=11): wt = "font-weight:bold" if bold else "" return [f'', f'{fits(txt, bw - 20, fs)}'] def diamond(cx, cy, dw, dh, lines): """Romb cu text centrat; textul stă în banda din mijloc, unde rombul e lat.""" out = [f''] y0 = cy - 4 if len(lines) == 2 else cy + 3 for k, t in enumerate(lines): dy = abs(y0 + k * 13 - cy) + 5 # cât de departe de mijloc e rândul half = dw / 2 * (1 - dy / (dh / 2)) # semi-lățimea rombului acolo out += [f'{fits(t, 2 * half - 16, 10)}'] return out def arrow(x1, y1, x2, y2, col=LINE): d = 4 head = (f'M {x2 - d} {y2 - 9} L {x2} {y2} L {x2 + d} {y2 - 9} Z' if y2 > y1 else f'M {x2 - 9} {y2 - d} L {x2} {y2} L {x2 - 9} {y2 + d} Z') return [f'', f''] # coloana centrală: start -> romb 1 -> B -> romb 2 -> C p += box(200, 40, 300, 34, NODURI[0][0], GRAY, bold=True) p += arrow(350, 74, 350, 92) p += diamond(350, 130, 300, 76, ["s-a format A, exact ca în reguli?", "(fără „dar aici e un bull flag”)"]) p += arrow(350, 168, 350, 182) p += box(200, 182, 300, 34, NODURI[2][0], GREEN) p += arrow(350, 216, 350, 230) p += diamond(350, 268, 300, 76, ["prețul se duce înspre stop (D)?"]) p += arrow(350, 306, 350, 320) p += box(200, 320, 300, 34, NODURI[5][0], GREEN) # ramura NU a primului romb -> aștepți p += arrow(500, 130, 536, 130) p += box(536, 113, 150, 34, "aștepți alerta", GRAY) p += [f'NU', f'DA'] # ramura DA a celui de-al doilea romb -> stopul p += arrow(500, 268, 536, 268) p += box(536, 251, 150, 34, "E — stopul te scoate", RED) p += [f'DA', f'NU', f'' f'{fits("pierdere planificată", 150, 10)}'] p += [f'' f'{fits("Trei capete de drum, o singură pierdere — și e planificată. Literele A, B, C, D, E sunt ale autorului.", w - 32, 10)}', ''] return "\n ".join(p) svgs["a_fi_a_face_a_avea"] = a_fi_a_face_a_avea() svgs["schema_logica"] = schema_logica() # ------------------------------------------------------------------- assert-uri # 1. textul vorbește despre trei verbe, în ordinea a fi -> a face -> a avea assert [v[0] for v in VERBE] == ["a FI", "a FACE", "a AVEA"], "ordinea verbelor" # 2. scurtcircuitul roșu sare exact două casete (de la prima direct la a treia) assert len(VERBE) == 3, "scurtcircuitul e desenat ca sărind peste exact 2 casete" # 3. schema logică: exact două rombi (autorul descrie o ramificație de intrare și # una de ieșire) și exact o singură ieșire etichetată ca pierdere assert sum(1 for _, t in NODURI if t == "romb") == 2, "textul spune două ramificații" assert sum(1 for _, t in NODURI if t == "iesire-plan") == 1, \ "legenda spune «o singură pierdere»" # 4. legenda spune „trei capete de drum" — exact nodurile din care nu mai pleacă # nicio săgeată (E, C, aștepți) assert sum(1 for _, t in NODURI if t.startswith("iesire")) == 3, \ "legenda spune trei capete de drum" # 5. literele din schemă sunt exact cele rostite în transcriere litere = {s[0] for s, _ in NODURI if s[0].isupper() and s[1] == " "} assert litere == {"A", "B", "C", "E"}, f"litere desenate: {litere}" # 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)