Skip to content

Commit 9e9ff5f

Browse files
committed
Avoid recursion in etree.testSerializer
1 parent f06451e commit 9e9ff5f

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

html5lib/treebuilders/etree.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,15 @@ def __init__(self):
200200
def testSerializer(element):
201201
rv = []
202202

203-
def serializeElement(element, indent=0):
204-
if not(hasattr(element, "tag")):
203+
stack = [(element, 0)]
204+
205+
while stack:
206+
element, indent = stack.pop()
207+
if isinstance(element, text_type):
208+
rv.append(element)
209+
continue
210+
211+
if not (hasattr(element, "tag")):
205212
element = element.getroot()
206213
if element.tag == "<!DOCTYPE>":
207214
if element.get("publicId") or element.get("systemId"):
@@ -249,13 +256,12 @@ def serializeElement(element, indent=0):
249256
for name, value in sorted(attributes):
250257
rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
251258
if element.text:
252-
rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
253-
indent += 2
254-
for child in element:
255-
serializeElement(child, indent)
259+
rv.append('|%s"%s"' % (" " * (indent + 2), element.text))
256260
if element.tail:
257-
rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail))
258-
serializeElement(element, 0)
261+
stack.append(('|%s"%s"' % (" " * (indent), element.tail), None))
262+
indent += 2
263+
for child in reversed(element):
264+
stack.append((child, indent))
259265

260266
return "\n".join(rv)
261267

0 commit comments

Comments
 (0)