Simple HTML Generation https://minihtml.trendels.name/
1from collections.abc import Iterable, Iterator, Sequence
2from contextlib import contextmanager
3from contextvars import ContextVar
4from dataclasses import dataclass, field
5
6from ._core import Node
7
8
9@dataclass
10class TemplateContext:
11 _styles: dict[int, Node] = field(default_factory=dict[int, Node])
12 _scripts: dict[int, Node] = field(default_factory=dict[int, Node])
13
14 def add_style(self, node: Node):
15 self._styles[id(node)] = node
16
17 def add_script(self, node: Node):
18 self._scripts[id(node)] = node
19
20 @property
21 def styles(self) -> Iterable[Node]:
22 return self._styles.values()
23
24 @property
25 def scripts(self) -> Iterable[Node]:
26 return self._scripts.values()
27
28
29_template_context = ContextVar[TemplateContext]("template_context")
30
31
32def register_template_styles(nodes: Sequence[Node]) -> None:
33 if ctx := _template_context.get(None):
34 for node in nodes:
35 ctx.add_style(node)
36
37
38def register_template_scripts(nodes: Sequence[Node]) -> None:
39 if ctx := _template_context.get(None):
40 for node in nodes:
41 ctx.add_script(node)
42
43
44def get_template_context() -> TemplateContext:
45 return _template_context.get()
46
47
48@contextmanager
49def template_context() -> Iterator[None]:
50 token = _template_context.set(TemplateContext())
51 try:
52 yield
53 finally:
54 _template_context.reset(token)