Simple HTML Generation https://minihtml.trendels.name/
at main 54 lines 1.4 kB view raw
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)