Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6bc4fc4

Browse files
committed
Re-enable Genshi treewalker.
The Genshi treewalker was never fully updated when support fornamespaces was added to treewalkers. This finally fixes this, allowingall tests to once again pass.This removes the ignoring of children of void elements as the commonlyused treewalkers don't support this and there was some subtle bug Icouldn't see in the code. Given most don't support this, this seemslike little loss. (You will, however, still get an error from thetreewalker if a void element has children.)
1 parent3dabe2c commit6bc4fc4

File tree

2 files changed

+33
-32
lines changed

2 files changed

+33
-32
lines changed

‎html5lib/tests/test_treewalkers.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,19 @@ def GenshiAdapter(tree):
127127
name="{%s}%s"% (token["namespace"],token["name"])
128128
else:
129129
name=token["name"]
130-
yield (START,
131-
(QName(name),
132-
Attrs([(QName(attr),value)forattr,valueintoken["data"]])),
133-
(None,-1,-1))
130+
attrs=Attrs([(QName("{%s}%s"%attrifattr[0]isnotNoneelseattr[1]),value)
131+
forattr,valueintoken["data"].items()])
132+
yield (START, (QName(name),attrs), (None,-1,-1))
134133
iftype=="EmptyTag":
135134
type="EndTag"
136135

137136
iftype=="EndTag":
138-
yieldEND,QName(token["name"]), (None,-1,-1)
137+
iftoken["namespace"]:
138+
name="{%s}%s"% (token["namespace"],token["name"])
139+
else:
140+
name=token["name"]
141+
142+
yieldEND,QName(name), (None,-1,-1)
139143

140144
eliftype=="Comment":
141145
yieldCOMMENT,token["data"], (None,-1,-1)
@@ -150,10 +154,10 @@ def GenshiAdapter(tree):
150154
iftextisnotNone:
151155
yieldTEXT,text, (None,-1,-1)
152156

153-
#treeTypes["genshi"] = \
154-
# {"builder": treebuilders.getTreeBuilder("simpletree"),
155-
# "adapter": GenshiAdapter,
156-
# "walker": treewalkers.getTreeWalker("genshi")}
157+
treeTypes["genshi"]= \
158+
{"builder":treebuilders.getTreeBuilder("simpletree"),
159+
"adapter":GenshiAdapter,
160+
"walker":treewalkers.getTreeWalker("genshi")}
157161
exceptImportError:
158162
pass
159163

‎html5lib/treewalkers/genshistream.py

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,49 @@
11
from __future__importabsolute_import,division,unicode_literals
22

3+
fromgenshi.coreimportQName
34
fromgenshi.coreimportSTART,END,XML_NAMESPACE,DOCTYPE,TEXT
45
fromgenshi.coreimportSTART_NS,END_NS,START_CDATA,END_CDATA,PI,COMMENT
56
fromgenshi.outputimportNamespaceFlattener
67

78
from .import_base
89

9-
fromhtml5lib.constantsimportvoidElements
10+
fromhtml5lib.constantsimportvoidElements,namespaces
1011

1112
classTreeWalker(_base.TreeWalker):
1213
def__iter__(self):
13-
depth=0
14-
ignore_until=None
14+
# Buffer the events so we can pass in the following one
1515
previous=None
1616
foreventinself.tree:
1717
ifpreviousisnotNone:
18-
ifprevious[0]==START:
19-
depth+=1
20-
ifignore_until<=depth:
21-
ignore_until=None
22-
ifignore_untilisNone:
23-
fortokeninself.tokens(previous,event):
24-
yieldtoken
25-
iftoken["type"]=="EmptyTag":
26-
ignore_until=depth
27-
ifprevious[0]==END:
28-
depth-=1
18+
fortokeninself.tokens(previous,event):
19+
yieldtoken
2920
previous=event
21+
22+
# Don't forget the final event!
3023
ifpreviousisnotNone:
31-
ifignore_untilisNoneorignore_until<=depth:
32-
fortokeninself.tokens(previous,None):
33-
yieldtoken
34-
elifignore_untilisnotNone:
35-
raiseValueError("Illformed DOM event stream: void element without END_ELEMENT")
24+
fortokeninself.tokens(previous,None):
25+
yieldtoken
3626

3727
deftokens(self,event,next):
3828
kind,data,pos=event
3929
ifkind==START:
40-
tag,attrib=data
30+
tag,attribs=data
4131
name=tag.localname
4232
namespace=tag.namespace
43-
iftaginvoidElements:
44-
fortokeninself.emptyTag(namespace,name,list(attrib),
33+
converted_attribs= {}
34+
fork,vinattribs:
35+
ifisinstance(k,QName):
36+
converted_attribs[(k.namespace,k.localname)]=v
37+
else:
38+
converted_attribs[(None,k)]=v
39+
40+
ifnamespace==namespaces["html"]andnameinvoidElements:
41+
fortokeninself.emptyTag(namespace,name,converted_attribs,
4542
notnextornext[0]!=END
4643
ornext[1]!=tag):
4744
yieldtoken
4845
else:
49-
yieldself.startTag(namespace,name,list(attrib))
46+
yieldself.startTag(namespace,name,converted_attribs)
5047

5148
elifkind==END:
5249
name=data.localname

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp