Coverage for tdom / tnodes.py: 100%
48 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-17 23:32 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-17 23:32 +0000
1import typing as t
2from dataclasses import dataclass, field
4from .template_utils import TemplateRef
7@dataclass(slots=True, frozen=True)
8class TLiteralAttribute:
9 name: str
10 value: str | None
13@dataclass(slots=True, frozen=True)
14class TInterpolatedAttribute:
15 name: str
16 value_i_index: int
19@dataclass(slots=True, frozen=True)
20class TTemplatedAttribute:
21 name: str
22 value_ref: TemplateRef
25@dataclass(slots=True, frozen=True)
26class TSpreadAttribute:
27 i_index: int
30type TAttribute = (
31 TLiteralAttribute | TTemplatedAttribute | TInterpolatedAttribute | TSpreadAttribute
32)
35@dataclass(slots=True, frozen=True)
36class TNode:
37 def __html__(self) -> str:
38 raise NotImplementedError("Cannot render TNode to HTML directly.")
40 def __str__(self) -> str:
41 raise NotImplementedError("Cannot render TNode to string directly.")
44@dataclass(slots=True, frozen=True)
45class TText(TNode):
46 ref: TemplateRef
48 @classmethod
49 def empty(cls) -> t.Self:
50 return cls(TemplateRef.empty())
52 @classmethod
53 def literal(cls, text: str) -> t.Self:
54 return cls(TemplateRef.literal(text))
57@dataclass(slots=True, frozen=True)
58class TComment(TNode):
59 ref: TemplateRef
61 @classmethod
62 def literal(cls, text: str) -> t.Self:
63 return cls(TemplateRef.literal(text))
66@dataclass(slots=True, frozen=True)
67class TDocumentType(TNode):
68 text: str
71@dataclass(slots=True, frozen=True)
72class TFragment(TNode):
73 children: tuple[TNode, ...] = field(default_factory=tuple)
76@dataclass(slots=True, frozen=True)
77class TElement(TNode):
78 tag: str
79 attrs: tuple[TAttribute, ...] = field(default_factory=tuple)
80 children: tuple[TNode, ...] = field(default_factory=tuple)
83@dataclass(slots=True, frozen=True)
84class TComponent(TNode):
85 start_i_index: int
86 """The interpolation index for the component's starting tag name."""
88 end_i_index: int | None = None
89 """The interpolation index for the component's ending tag name, if any."""
91 # TODO: hold on to _s_indexes too, when we start to need them.
93 attrs: tuple[TAttribute, ...] = field(default_factory=tuple)
94 children: tuple[TNode, ...] = field(default_factory=tuple)
97type TTag = TElement | TComponent | TFragment