-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbuilder.py
More file actions
58 lines (41 loc) · 1.79 KB
/
builder.py
File metadata and controls
58 lines (41 loc) · 1.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""Builder pattern example."""
from typing import Final, List
class HtmlElement:
"""An HTML element."""
INDENT_SIZE: Final[int] = 2
def __init__(self, name: str = "", text: str = ""):
"""Create an HTML element with the given `name` and `text`."""
self.name = name
self.text = text
self.subelements: List[HtmlElement] = []
def __str(self, indent_level: int) -> str:
lines: List[str] = []
indent = " " * (indent_level * self.INDENT_SIZE)
lines.append(f"{indent}<{self.name}>")
if self.text:
indent_text = " " * ((indent_level + 1) * self.INDENT_SIZE)
lines.append(f"{indent_text}{self.text}")
for subelement in self.subelements:
lines.append(subelement.__str(indent_level + 1))
lines.append(f"{indent}</{self.name}>")
return "\n".join(lines)
def __str__(self) -> str:
return self.__str(0)
@staticmethod
def create(name: str, text: str = "") -> "HtmlBuilder":
"""Create an `HtmlBuilder` with a `name` root element."""
return HtmlBuilder(name, text)
class HtmlBuilder:
"""Builder of `HtmlElement`s."""
def __init__(self, root_name: str, root_text: str = ""):
"""Create a builder of `HtmlElement`s."""
self.__root = HtmlElement(name=root_name, text=root_text)
def add_child(self, child_name: str, child_text: str) -> None:
"""Add a child element."""
self.__root.subelements.append(HtmlElement(child_name, child_text))
def add_child_fluent(self, child_name: str, child_text: str) -> "HtmlBuilder":
"""Add a child using a fluent API."""
self.__root.subelements.append(HtmlElement(child_name, child_text))
return self
def __str__(self) -> str:
return str(self.__root)