"""Szablon widziany tak, jak zobaczy go przeglądarka — z wstawkami modułów. Szablony wspólne mają neutralne gniazda (`{% include "_dodatki_*" %}`), a treść wstawianą w gniazdo trzyma moduł. Testy strukturalne sprawdzają kolejność skryptów i obecność odsyłaczy, więc muszą patrzeć na CAŁOŚĆ — inaczej pilnowałyby połowy strony i przepuściłyby zamianę kolejności, która psuje działanie. """ from __future__ import annotations import pathlib import re APP = pathlib.Path(__file__).resolve().parents[1] / "app" GNIAZDO = re.compile(r'\{%\s*include\s*"(_dodatki_[\w-]+\.html)"[^%]*%\}') def zloz(nazwa: str) -> str: """Treść szablonu z wstawkami rozwiniętymi W MIEJSCU gniazda.""" tresc = (APP / "templates" / nazwa).read_text(encoding="utf-8") def wstaw(m: re.Match) -> str: for katalog in sorted((APP / "moduly").glob("*/templates")): plik = katalog / m.group(1) if plik.exists(): return plik.read_text(encoding="utf-8") return "" return GNIAZDO.sub(wstaw, tresc) def zloz_kod() -> str: """Cały kod tras aplikacji jako jeden tekst — podstawa plus wszystkie ekrany. Trasy mieszkają teraz w `app/ekrany/*.py`, a `main.py` jest samym złożeniem. Testy strukturalne pilnują reguł, które mają obowiązywać W CAŁEJ aplikacji („każde wejście do baz zostawia ślad w dzienniku", „orb jedzie do logiki"), więc muszą widzieć całość — inaczej sprawdzałyby jeden plik i przepuściły regułę złamaną w drugim. """ czesci = [(APP / "podstawa.py").read_text(encoding="utf-8")] czesci += [f.read_text(encoding="utf-8") for f in sorted((APP / "ekrany").glob("*.py"))] czesci += [f.read_text(encoding="utf-8") for f in sorted((APP / "moduly").rglob("*.py"))] return "\n".join(czesci)