#!/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'
' 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()