8000 Rewrote the GenshiAdapter to transform tokens (provided by the Simple… · html5lib/html5lib-python@8c9eb12 · GitHub
[go: up one dir, main page]

Skip to content 8000

Commit 8c9eb12

Browse files
committed
Rewrote the GenshiAdapter to transform tokens (provided by the SimpleTree treewalker) into Genshi's Stream events (which will be transformed back into tokens by the Genshi treewalker)
--HG-- extra : convert_revision : svn%3Aacbfec75-9323-0410-a652-858a13e371e0/trunk%40667
1 parent 52a6acb commit 8c9eb12

File tree

2 files changed

+50
-47
lines changed

2 files changed

+50
-47
lines changed

src/treewalkers/genshistream.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ def __iter__(self):
2525
if previous[0] == END:
2626
depth -= 1
2727
previous = event
28-
if ignore_until is None or ignore_until <= depth:
29-
for token in self.tokens(previous, None):
30-
yield token
31-
elif ignore_until is not None:
32-
raise ValueError("Illformed DOM event stream: void element without END_ELEMENT")
28+
if previous is not None:
29+
if ignore_until is None or ignore_until <= depth:
30+
for token in self.tokens(previous, None):
31+
yield token
32+
elif ignore_until is not None:
33+
raise ValueError("Illformed DOM event stream: void element without END_ELEMENT")
3334

3435
def tokens(self, event, next):
3536
kind, data, pos = event

tests/test_treewalkers.py

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -110,50 +110,52 @@ def PullDOMAdapter(node):
110110
except ImportError:
111111
pass
112112

113-
if "ElementTree" in locals():
114-
try:
115-
from genshi.core import Attrs, QName
116-
from genshi.core import START, END, DOCTYPE, TEXT, COMMENT
117-
118-
def GenshiAdapter(tree):
119-
if not(hasattr(tree, "tag")):
120-
tree = tree.getroot()
121-
122-
if tree.tag in ("<DOCUMENT_ROOT>", "<DOCUMENT_FRAGMENT>"):
123-
if tree.text:
124-
yield TEXT, tree.text, (None, -1, -1)
125-
for child in tree.getchildren():
126-
for item in GenshiAdapter(child):
127-
yield item
128-
129-
elif tree.tag == "<!DOCTYPE>":
130-
yield DOCTYPE, QName(tree.text), (None, -1, -1)
131-
132-
elif type(tree.tag) == type(ElementTree.Comment):
133-
yield COMMENT, tree.text, (None, -1, -1)
113+
try:
114+
from genshi.core import QName, Attrs
115+
from genshi.core import START, END, TEXT, COMMENT, DOCTYPE
116+
117+
def GenshiAdapter(tree):
118+
text = None
119+
for token in treewalkers.getTreeWalker("simpletree")(tree):
120+
type = token["type"]
121+
if type in ("Characters", "SpaceCharacters"):
122+
if text is None:
123+
text = token["data"]
124+
else:
125+
text += token["data"]
126+
elif text is not None:
127+
yield TEXT, text, (None, -1, -1)
128+
text = None
129+
130+
if type in ("StartTag", "EmptyTag"):
131+
yield (START,
132+
(QName(token["name"]),
133+
Attrs([(QName(attr),value) for attr,value in token["data"]])),
134+
(None, -1, -1))
135+
if type == "EmptyTag":
136+
type = "EndTag"
137+
138+
if type == "EndTag":
139+
yield END, QName(token["name"]), (None, -1, -1)
140+
141+
elif type == "Comment":
142+
yield COMMENT, token["data"], (None, -1, -1)
143+
144+
elif type == "Doctype":
145+
yield DOCTYPE, token["name"], (None, -1, -1)
134146

135147
else:
136-
tag_name = QName(tree.tag.lstrip('{'))
137-
attrs = Attrs([(QName(attr.lstrip('{')), value)
138-
for attr, value in tree.items()])
139-
140-
yield START, (tag_name, attrs), (None, -1, -1)
141-
if tree.text:
142-
yield TEXT, tree.text, (None, -1, -1)
143-
for child in tree.getchildren():
144-
for item in GenshiAdapter(child):
145-
yield item
146-
yield END, tag_name, (None, -1, -1)
147-
148-
if tree.tail:
149-
yield TEXT, tree.tail, (None, -1, -1)
150-
151-
treeTypes["genshi"] = \
152-
{"builder": treebuilders.getTreeBuilder("etree", ElementTree),
153-
"adapter": GenshiAdapter,
154-
"walker": treewalkers.getTreeWalker("genshi")}
155-
except ImportError:
156-
pass
148+
pass # FIXME: What to do?
149+
150+
if text is not None:
151+
yield TEXT, text, (None, -1, -1)
152+
153+
treeTypes["genshi"] = \
154+
{"builder": treebuilders.getTreeBuilder("simpletree"),
155+
"adapter": GenshiAdapter,
156+
"walker": treewalkers.getTreeWalker("genshi")}
157+
except ImportError:
158+
pass
157159

158160
def concatenateCharacterTokens(tokens):
159161
charactersToken = None

0 commit comments

Comments
 (0)
0