#!/usr/bin/env python3 """HTML-версия презентации «Автодозвон: как это работает» (тот же текст, что в PDF). Содержание берётся из deck_content.py, поэтому PDF и HTML не разъезжаются. Файл самодостаточный: без внешних шрифтов, картинок и скриптов — открывается двойным щелчком и с телефона, и печатается в PDF по одному слайду на страницу. Запуск: python3 docs/autocall/render-html.py """ from html import escape from pathlib import Path import deck_content as content OUT = Path(__file__).with_name("autocall-how-it-works.html") TONE = { "accent": "#4ADE80", "accent2": "#60A5FA", "warn": "#FBBF24", "danger": "#F87171", } def esc(text): return escape(str(text)) def card_html(card, extra_class=""): tone = TONE.get(card.get("accent", "accent"), TONE["accent"]) items = "".join(f"
  • {esc(i)}
  • " for i in card["items"]) classes = " ".join(f"card {extra_class} {'dense' if card.get('dense') else ''}".split()) return ( f'
    ' f'

    {esc(card["title"])}

    ' ) def table_html(table): head, *body = table["rows"] widths = table.get("widths") or [] colgroup = "".join(f'' for w in widths) if widths else "" head_html = "".join(f"{esc(c)}" for c in head) body_html = "".join( "" + "".join(f"{esc(c)}" for c in row) + "" for row in body ) return ( f'{"" + colgroup + "" if colgroup else ""}' f"{head_html}{body_html}
    " ) def steps_html(steps): out = [] for i, (title, desc) in enumerate(steps): lines = "".join(f"{esc(line)}" for line in desc.split("\n")) arrow = '
    ›
    ' if i < len(steps) - 1 else "" out.append(f'
    {esc(title)}{lines}{arrow}
    ') return f'
    {"".join(out)}
    ' def slide_html(slide, number): kind = slide["kind"] parts = [''] if kind == "title": lines = "".join(f"

    {esc(line)}

    " if line else "

     

    " for line in slide["lines"]) body = ( f'
    {esc(slide["kicker"])}
    ' f'

    {esc(slide["title"])}

    ' f'

    {esc(slide["sub"])}

    ' f'
    {lines}
    ' ) else: head = f'

    {esc(slide["title"])}

    {esc(slide["sub"])}

    ' body = head if kind == "steps": body += steps_html(slide["steps"]) elif kind in ("cards2full", "cards3full"): cards = "".join(card_html(c) for c in slide["cards"]) body += f'
    {cards}
    ' elif kind == "tablecard": body += table_html(slide["table"]) full = slide.get("full") if full: body += card_html(full, extra_class="full") return f'
    {body}{parts[0]}
    ' def build(): slides = "".join(slide_html(s, i + 1) for i, s in enumerate(content.ALL_SLIDES)) html = f""" Автодозвон SuperSam — как это работает {slides} """ OUT.write_text(html, encoding="utf-8") print(f"готово: {OUT} — слайдов {len(content.ALL_SLIDES)}") if __name__ == "__main__": build()