Skip to content

Commit

Permalink
speed up render function (#8)
Browse files Browse the repository at this point in the history
* fewer function calls

* increment version
  • Loading branch information
keithasaurus authored Nov 25, 2023
1 parent 8b10907 commit 63ccafc
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 24 deletions.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "simple-html"
version = "1.0.0"
version = "1.0.1"
readme = "README.md"
description = "Template-less html rendering in Python"
authors = ["Keith Philpott <[email protected]>"]
Expand Down
43 changes: 20 additions & 23 deletions simple_html/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from html import escape
from types import GeneratorType
from typing import Tuple, Union, Dict, List, Generator, Optional
from typing import Tuple, Union, Dict, List, Generator, Optional, Iterable


class SafeString:
Expand Down Expand Up @@ -167,34 +167,31 @@ def __call__(
wbr = Tag("wbr")


def _render(node: Node, strs: List[str]) -> None:
def _render(nodes: Iterable[Node], strs: List[str]) -> None:
"""
mutate a list instead of constantly rendering strings
"""
if type(node) is tuple:
strs.append(node[0])
for child in node[1]:
_render(child, strs)
strs.append(node[2])
elif isinstance(node, str):
strs.append(escape(node))
elif isinstance(node, SafeString):
strs.append(node.safe_str)
elif isinstance(node, Tag):
strs.append(node.rendered)
elif isinstance(node, list):
for n in node:
_render(n, strs)
elif isinstance(node, GeneratorType):
for n in node:
_render(n, strs)
else:
raise TypeError(f"Got unknown type: {type(node)}")
for node in nodes:
if type(node) is tuple:
strs.append(node[0])
_render(node[1], strs)
strs.append(node[2])
elif isinstance(node, str):
strs.append(escape(node))
elif isinstance(node, SafeString):
strs.append(node.safe_str)
elif isinstance(node, Tag):
strs.append(node.rendered)
elif isinstance(node, list):
_render(node, strs)
elif isinstance(node, GeneratorType):
_render(node, strs)
else:
raise TypeError(f"Got unknown type: {type(node)}")


def render(*nodes: Node) -> str:
results: List[str] = []
for node in nodes:
_render(node, results)
_render(nodes, results)

return "".join(results)

0 comments on commit 63ccafc

Please sign in to comment.