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

Commit1a8ee1a

Browse files
committed
Fix lxml to work in the fragment case
--HG--extra : convert_revision : svn%3Aacbfec75-9323-0410-a652-858a13e371e0/trunk%401128
1 parentabe8a00 commit1a8ee1a

File tree

1 file changed

+43
-23
lines changed

1 file changed

+43
-23
lines changed

‎src/html5lib/treebuilders/etree_lxml.py‎

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
fromhtml5lib.constantsimportDataLossWarning
55
importetreeasetree_builders
66
try:
7-
importlxml.htmlasetree
7+
importlxml.etreeasetree
88
exceptImportError:
99
importlxml.etreeasetree
1010

@@ -48,21 +48,33 @@ def testSerializer(element):
4848
finalText=None
4949
defserializeElement(element,indent=0):
5050
ifnothasattr(element,"tag"):
51-
rv.append("#document")
52-
ifelement.docinfo.internalDTD:
53-
ifnot (element.docinfo.public_idorelement.docinfo.system_url):
54-
dtd_str="<!DOCTYPE %s>"%element.docinfo.root_name
55-
else:
56-
dtd_str="""<!DOCTYPE %s PUBLIC "%s" "%s">"""%(
57-
element.docinfo.root_name,element.docinfo.public_id,
58-
element.docinfo.system_url)
59-
rv.append("|%s%s"%(' '*(indent+2),dtd_str))
60-
next_element=element.getroot()
61-
whilenext_element.getprevious()isnotNone:
62-
next_element=next_element.getprevious()
63-
whilenext_elementisnotNone:
64-
serializeElement(next_element,indent+2)
65-
next_element=next_element.getnext()
51+
ifhasattr(element,"getroot"):
52+
#Full tree case
53+
rv.append("#document")
54+
ifelement.docinfo.internalDTD:
55+
ifnot (element.docinfo.public_idor
56+
element.docinfo.system_url):
57+
dtd_str="<!DOCTYPE %s>"%element.docinfo.root_name
58+
else:
59+
dtd_str="""<!DOCTYPE %s PUBLIC "%s" "%s">"""%(
60+
element.docinfo.root_name,
61+
element.docinfo.public_id,
62+
element.docinfo.system_url)
63+
rv.append("|%s%s"%(' '*(indent+2),dtd_str))
64+
next_element=element.getroot()
65+
whilenext_element.getprevious()isnotNone:
66+
next_element=next_element.getprevious()
67+
whilenext_elementisnotNone:
68+
serializeElement(next_element,indent+2)
69+
next_element=next_element.getnext()
70+
elifisinstance(element,basestring):
71+
#Text in a fragment
72+
rv.append("|%s\"%s\""%(' '*indent,element))
73+
else:
74+
#Fragment case
75+
rv.append("#document-fragment")
76+
fornext_elementinelement:
77+
serializeElement(next_element,indent+2)
6678
eliftype(element.tag)==type(etree.Comment):
6779
rv.append("|%s<!-- %s -->"%(' '*indent,element.text))
6880
else:
@@ -132,13 +144,13 @@ class TreeBuilder(_base.TreeBuilder):
132144
doctypeClass=DocumentType
133145
elementClass=None
134146
commentClass=None
135-
fragmentClass=None
147+
fragmentClass=Document
136148

137149
def__init__(self,fullTree=False):
138150
builder=etree_builders.getETreeModule(etree,fullTree=fullTree)
139151
self.elementClass=builder.Element
140152
self.commentClass=builder.Comment
141-
self.fragmentClass=builder.DocumentFragment
153+
#self.fragmentClass = builder.DocumentFragment
142154
_base.TreeBuilder.__init__(self)
143155

144156
defreset(self):
@@ -157,7 +169,14 @@ def getDocument(self):
157169
returnself.document._elementTree.getroot()
158170

159171
defgetFragment(self):
160-
return_base.TreeBuilder.getFragment(self)._element
172+
fragment= []
173+
element=self.openElements[0]._element
174+
ifelement.text:
175+
fragment.append(element.text)
176+
fragment.extend(element.getchildren())
177+
ifelement.tail:
178+
fragment.append(element.tail)
179+
returnfragment
161180

162181
definsertDoctype(self,name,publicId,systemId):
163182
ifnotname:
@@ -172,9 +191,10 @@ def insertCommentInitial(self, data, parent=None):
172191

173192
definsertRoot(self,name):
174193
"""Create the document root"""
175-
#Because of the way libxml2 works, it doesn't seem to be possible to alter information
176-
#like the doctype after the tree has been parsed. Therefore we need to use the built-in
177-
#parser to create our iniial tree, after which we can add elements like normal
194+
#Because of the way libxml2 works, it doesn't seem to be possible to
195+
#alter informatioN like the doctype after the tree has been parsed.
196+
#Therefore we need to use the built-in parser to create our iniial
197+
#tree, after which we can add elements like normal
178198
docStr=""
179199
ifself.doctype:
180200
docStr+="<!DOCTYPE %s"%self.doctype.name
@@ -205,4 +225,4 @@ def insertRoot(self, name):
205225
self.openElements.append(root_element)
206226

207227
#Reset to the default insert comment function
208-
self.insertComment=super(TreeBuilder,self).insertComment
228+
self.insertComment=super(TreeBuilder,self).insertComment

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp