Skip to content

Commit 90e4348

Browse files
committed
Move Genshi tree adapter to be in the public API, because sanity.
1 parent f4490be commit 90e4348

File tree

3 files changed

+65
-49
lines changed

3 files changed

+65
-49
lines changed

html5lib/tests/test_treewalkers.py

Lines changed: 3 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from .support import get_data_files, TestData, convertExpected
1515

16-
from html5lib import html5parser, treewalkers, treebuilders, constants
16+
from html5lib import html5parser, treewalkers, treebuilders, treeadapters, constants
1717

1818

1919
def PullDOMAdapter(node):
@@ -84,59 +84,13 @@ def PullDOMAdapter(node):
8484

8585

8686
try:
87-
from genshi.core import QName, Attrs
88-
from genshi.core import START, END, TEXT, COMMENT, DOCTYPE
87+
import genshi # flake8: noqa
8988
except ImportError:
9089
pass
9190
else:
92-
def GenshiAdapter(tree):
93-
text = None
94-
for token in treewalkers.getTreeWalker("dom")(tree):
95-
type = token["type"]
96-
if type in ("Characters", "SpaceCharacters"):
97-
if text is None:
98-
text = token["data"]
99-
else:
100-
text += token["data"]
101-
elif text is not None:
102-
yield TEXT, text, (None, -1, -1)
103-
text = None
104-
105-
if type in ("StartTag", "EmptyTag"):
106-
if token["namespace"]:
107-
name = "{%s}%s" % (token["namespace"], token["name"])
108-
else:
109-
name = token["name"]
110-
attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value)
111-
for attr, value in token["data"].items()])
112-
yield (START, (QName(name), attrs), (None, -1, -1))
113-
if type == "EmptyTag":
114-
type = "EndTag"
115-
116-
if type == "EndTag":
117-
if token["namespace"]:
118-
name = "{%s}%s" % (token["namespace"], token["name"])
119-
else:
120-
name = token["name"]
121-
122-
yield END, QName(name), (None, -1, -1)
123-
124-
elif type == "Comment":
125-
yield COMMENT, token["data"], (None, -1, -1)
126-
127-
elif type == "Doctype":
128-
yield DOCTYPE, (token["name"], token["publicId"],
129-
token["systemId"]), (None, -1, -1)
130-
131-
else:
132-
pass # FIXME: What to do?
133-
134-
if text is not None:
135-
yield TEXT, text, (None, -1, -1)
136-
13791
treeTypes["genshi"] = \
13892
{"builder": treebuilders.getTreeBuilder("dom"),
139-
"adapter": GenshiAdapter,
93+
"adapter": lambda tree: treeadapters.genshi.to_genshi(treewalkers.getTreeWalker("dom")(tree)),
14094
"walker": treewalkers.getTreeWalker("genshi")}
14195

14296
import re

html5lib/treeadapters/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from __future__ import absolute_import, division, unicode_literals
2+
3+
from . import sax
4+
5+
__all__ = ["sax"]
6+
7+
try:
8+
from . import genshi # flake8: noqa
9+
except ImportError:
10+
pass
11+
else:
12+
__all__.append("genshi")

html5lib/treeadapters/genshi.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from __future__ import absolute_import, division, unicode_literals
2+
3+
from genshi.core import QName, Attrs
4+
from genshi.core import START, END, TEXT, COMMENT, DOCTYPE
5+
6+
7+
def to_genshi(walker):
8+
text = None
9+
for token in walker:
10+
type = token["type"]
11+
if type in ("Characters", "SpaceCharacters"):
12+
if text is None:
13+
text = token["data"]
14+
else:
15+
text += token["data"]
16+
elif text is not None:
17+
yield TEXT, text, (None, -1, -1)
18+
text = None
19+
20+
if type in ("StartTag", "EmptyTag"):
21+
if token["namespace"]:
22+
name = "{%s}%s" % (token["namespace"], token["name"])
23+
else:
24+
name = token["name"]
25+
attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value)
26+
for attr, value in token["data"].items()])
27+
yield (START, (QName(name), attrs), (None, -1, -1))
28+
if type == "EmptyTag":
29+
type = "EndTag"
30+
31+
if type == "EndTag":
32+
if token["namespace"]:
33+
name = "{%s}%s" % (token["namespace"], token["name"])
34+
else:
35+
name = token["name"]
36+
37+
yield END, QName(name), (None, -1, -1)
38+
39+
elif type == "Comment":
40+
yield COMMENT, token["data"], (None, -1, -1)
41+
42+
elif type == "Doctype":
43+
yield DOCTYPE, (token["name"], token["publicId"],
44+
token["systemId"]), (None, -1, -1)
45+
46+
else:
47+
pass # FIXME: What to do?
48+
49+
if text is not None:
50+
yield TEXT, text, (None, -1, -1)

0 commit comments

Comments
 (0)