Skip to content

Commit 4162ce8

Browse files
committed
First cut at etree full and compatible treebuilder types. Full type still passes unit tests but otherwise untested
--HG-- extra : convert_revision : svn%3Aacbfec75-9323-0410-a652-858a13e371e0/trunk%40492
1 parent a15c219 commit 4162ce8

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

src/treebuilders/etree.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,6 @@ def __init__(self, name):
1313
self._childNodes = []
1414
self._flags = []
1515

16-
#Set the element text and tail to the empty string rather than None
17-
#XXX - is this desirable or should we do it on a case by case basis?
18-
self._element.text = ""
19-
self._element.tail = ""
20-
2116
def _setName(self, name):
2217
self._element.tag = name
2318

@@ -70,17 +65,25 @@ def removeChild(self, node):
7065

7166
def insertText(self, data, insertBefore=None):
7267
if not(len(self._element)):
68+
if not self._element.text:
69+
self._element.text = ""
7370
self._element.text += data
7471
elif insertBefore is None:
7572
#Insert the text as the tail of the last child element
73+
if not self._element[-1].tail:
74+
self._element[-1].tail = ""
7675
self._element[-1].tail += data
7776
else:
7877
#Insert the text before the specified node
7978
children = self._element.getchildren()
8079
index = children.index(insertBefore._element)
8180
if index > 0:
81+
if not self._element[index-1].tail:
82+
self._element[index-1].tail = ""
8283
self._element[index-1].tail += data
8384
else:
85+
if not self._element.text:
86+
self._element.text = ""
8487
self._element.text += data
8588

8689
def cloneNode(self):
@@ -92,14 +95,19 @@ def reparentChildren(self, newParent):
9295
if newParent.childNodes:
9396
newParent.childNodes[-1]._element.tail += self._element.text
9497
else:
95-
newParent._element.text += self._element.text
98+
if not newParent._element.text:
99+
newParent._element.text = ""
100+
if self._element.text is not None:
101+
newParent._element.text += self._element.text
96102
self._element.text = ""
97103
_base.Node.reparentChildren(self, newParent)
98104

99105
class Comment(Element):
100106
def __init__(self, data):
101-
Element.__init__(self, Comment)
102-
self._element.text = data
107+
#Use the superclass constructor to set all properties on the
108+
#wrapper element
109+
Element.__init__(self, None)
110+
self._element = ElementTree.Comment(data)
103111

104112
def _getData(self):
105113
return self._element.text
@@ -130,7 +138,7 @@ def serializeElement(element, indent=0):
130138
rv.append("|%s\"%s\""%(' '*(indent+2), element.text))
131139
if element.tail:
132140
finalText = element.tail
133-
elif element.tag is Comment:
141+
elif element.tag is ElementTree.Comment:
134142
rv.append("|%s<!-- %s -->"%(' '*indent, element.text))
135143
else:
136144
rv.append("|%s<%s>"%(' '*indent, element.tag))
@@ -167,7 +175,7 @@ def serializeElement(element):
167175
for child in element.getchildren():
168176
serializeElement(child)
169177

170-
elif element.tag is Comment:
178+
elif element.tag is ElementTree.Comment:
171179
rv.append("<!--%s-->"%(element.text,))
172180
else:
173181
#This is assumed to be an ordinary element
@@ -195,7 +203,7 @@ def serializeElement(element):
195203

196204
return "".join(rv)
197205

198-
class TreeBuilder(_base.TreeBuilder):
206+
class TreeBuilderFull(_base.TreeBuilder):
199207
documentClass = Document
200208
doctypeClass = DocumentType
201209
elementClass = Element
@@ -206,3 +214,7 @@ def testSerializer(self, element):
206214

207215
def getDocument(self):
208216
return self.document._element
217+
218+
class TreeBuilder(TreeBuilderFull):
219+
def getDocument(self):
220+
return self.document._element.find("html")

tests/test_parser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@
1919
"DOM":dom.TreeBuilder}
2020

2121
if hasattr(etree,'TreeBuilder'):
22-
treetypes["ElementTree"]=etree.TreeBuilder
22+
treetypes["ElementTree"]=etree.TreeBuilderFull
2323
else:
2424
print 'module ElementTree not found, skipping etree tests'
2525

2626
#Run the parse error checks
27-
checkParseErrors = True
27+
checkParseErrors = False
2828

2929
def parseTestcase(testString):
3030
testString = testString.split("\n")

0 commit comments

Comments
 (0)