|
1 | 1 | from html import escape |
2 | 2 | from types import GeneratorType |
3 | | -from typing import Tuple, Union, Dict, List, FrozenSet, Generator, Iterable, Any |
| 3 | +from typing import Tuple, Union, Dict, List, FrozenSet, Generator, Iterable, Any, Callable |
4 | 4 |
|
5 | 5 |
|
6 | 6 | class SafeString: |
@@ -128,9 +128,9 @@ def __call__( |
128 | 128 | # attributes values are always escaped (when they are `str`s) |
129 | 129 | if key not in _common_safe_attribute_names: |
130 | 130 | key = ( |
131 | | - key.safe_str |
132 | | - if isinstance(key, SafeString) |
133 | | - else escape_attribute_key(key) |
| 131 | + escape_attribute_key(key) |
| 132 | + if isinstance(key, str) |
| 133 | + else key.safe_str |
134 | 134 | ) |
135 | 135 |
|
136 | 136 | if isinstance(val, str): |
@@ -266,25 +266,25 @@ def __call__( |
266 | 266 | wbr = Tag("wbr") |
267 | 267 |
|
268 | 268 |
|
269 | | -def _render(nodes: Iterable[Node], strs: List[str]) -> None: |
| 269 | +def _render(nodes: Iterable[Node], append_to_list: Callable[[str], None]) -> None: |
270 | 270 | """ |
271 | 271 | mutate a list instead of constantly rendering strings |
272 | 272 | """ |
273 | 273 | for node in nodes: |
274 | 274 | if type(node) is tuple: |
275 | | - strs.append(node[0]) |
276 | | - _render(node[1], strs) |
277 | | - strs.append(node[2]) |
| 275 | + append_to_list(node[0]) |
| 276 | + _render(node[1], append_to_list) |
| 277 | + append_to_list(node[2]) |
278 | 278 | elif isinstance(node, SafeString): |
279 | | - strs.append(node.safe_str) |
| 279 | + append_to_list(node.safe_str) |
280 | 280 | elif isinstance(node, str): |
281 | | - strs.append(escape(node)) |
| 281 | + append_to_list(escape(node)) |
282 | 282 | elif isinstance(node, Tag): |
283 | | - strs.append(node.rendered) |
| 283 | + append_to_list(node.rendered) |
284 | 284 | elif isinstance(node, list): |
285 | | - _render(node, strs) |
| 285 | + _render(node, append_to_list) |
286 | 286 | elif isinstance(node, GeneratorType): |
287 | | - _render(node, strs) |
| 287 | + _render(node, append_to_list) |
288 | 288 | else: |
289 | 289 | raise TypeError(f"Got unknown type: {type(node)}") |
290 | 290 |
|
@@ -526,6 +526,6 @@ def render_styles( |
526 | 526 |
|
527 | 527 | def render(*nodes: Node) -> str: |
528 | 528 | results: List[str] = [] |
529 | | - _render(nodes, results) |
| 529 | + _render(nodes, results.append) |
530 | 530 |
|
531 | 531 | return "".join(results) |
0 commit comments