|
1 | 1 | from html import escape |
2 | 2 | from types import GeneratorType |
3 | | -from typing import Tuple, Union, Dict, List, Generator, Optional |
| 3 | +from typing import Tuple, Union, Dict, List, Generator, Optional, Iterable |
4 | 4 |
|
5 | 5 |
|
6 | 6 | class SafeString: |
@@ -167,34 +167,31 @@ def __call__( |
167 | 167 | wbr = Tag("wbr") |
168 | 168 |
|
169 | 169 |
|
170 | | -def _render(node: Node, strs: List[str]) -> None: |
| 170 | +def _render(nodes: Iterable[Node], strs: List[str]) -> None: |
171 | 171 | """ |
172 | 172 | mutate a list instead of constantly rendering strings |
173 | 173 | """ |
174 | | - if type(node) is tuple: |
175 | | - strs.append(node[0]) |
176 | | - for child in node[1]: |
177 | | - _render(child, strs) |
178 | | - strs.append(node[2]) |
179 | | - elif isinstance(node, str): |
180 | | - strs.append(escape(node)) |
181 | | - elif isinstance(node, SafeString): |
182 | | - strs.append(node.safe_str) |
183 | | - elif isinstance(node, Tag): |
184 | | - strs.append(node.rendered) |
185 | | - elif isinstance(node, list): |
186 | | - for n in node: |
187 | | - _render(n, strs) |
188 | | - elif isinstance(node, GeneratorType): |
189 | | - for n in node: |
190 | | - _render(n, strs) |
191 | | - else: |
192 | | - raise TypeError(f"Got unknown type: {type(node)}") |
| 174 | + for node in nodes: |
| 175 | + if type(node) is tuple: |
| 176 | + strs.append(node[0]) |
| 177 | + _render(node[1], strs) |
| 178 | + strs.append(node[2]) |
| 179 | + elif isinstance(node, str): |
| 180 | + strs.append(escape(node)) |
| 181 | + elif isinstance(node, SafeString): |
| 182 | + strs.append(node.safe_str) |
| 183 | + elif isinstance(node, Tag): |
| 184 | + strs.append(node.rendered) |
| 185 | + elif isinstance(node, list): |
| 186 | + _render(node, strs) |
| 187 | + elif isinstance(node, GeneratorType): |
| 188 | + _render(node, strs) |
| 189 | + else: |
| 190 | + raise TypeError(f"Got unknown type: {type(node)}") |
193 | 191 |
|
194 | 192 |
|
195 | 193 | def render(*nodes: Node) -> str: |
196 | 194 | results: List[str] = [] |
197 | | - for node in nodes: |
198 | | - _render(node, results) |
| 195 | + _render(nodes, results) |
199 | 196 |
|
200 | 197 | return "".join(results) |
0 commit comments