[Lxml-checkins] r44165 - in lxml/trunk: . src/lxml src/lxml/tests
scoder at codespeak.net
scoder at codespeak.net
Tue Jun 12 15:42:55 CEST 2007
Author: scoder
Date: Tue Jun 12 15:42:54 2007
New Revision: 44165
Modified:
lxml/trunk/CHANGES.txt
lxml/trunk/src/lxml/apihelpers.pxi
lxml/trunk/src/lxml/etree.pyx
lxml/trunk/src/lxml/tests/test_elementtree.py
Log:
fix: replacing the children slice of an Element cut off the children's tails
Modified: lxml/trunk/CHANGES.txt
==============================================================================
--- lxml/trunk/CHANGES.txt (original)
+++ lxml/trunk/CHANGES.txt Tue Jun 12 15:42:54 2007
@@ -50,6 +50,9 @@
Bugs fixed
----------
+* Replacing the children slice of an Element would cut off the tails of the
+ original children
+
* API functions now check incoming strings for XML conformity. Zero bytes or
low ASCII characters are no longer accepted.
Modified: lxml/trunk/src/lxml/apihelpers.pxi
==============================================================================
--- lxml/trunk/src/lxml/apihelpers.pxi (original)
+++ lxml/trunk/src/lxml/apihelpers.pxi Tue Jun 12 15:42:54 2007
@@ -485,7 +485,10 @@
cdef void _removeNode(xmlNode* c_node):
"""Unlink and free a node and subnodes if possible.
"""
+ cdef xmlNode* c_next
+ c_next = c_node.next
tree.xmlUnlinkNode(c_node)
+ _moveTail(c_next, c_node)
attemptDeallocation(c_node)
cdef void _moveTail(xmlNode* c_tail, xmlNode* c_target):
@@ -526,8 +529,8 @@
while c_node is not NULL and c < stop:
c_next = c_node.next
if _isElement(c_node):
- _removeText(c_node.next)
- c_next = c_node.next
+ while c_next is not NULL and not _isElement(c_next):
+ c_next = c_next.next
_removeNode(c_node)
c = c + 1
c_node = c_next
Modified: lxml/trunk/src/lxml/etree.pyx
==============================================================================
--- lxml/trunk/src/lxml/etree.pyx (original)
+++ lxml/trunk/src/lxml/etree.pyx Tue Jun 12 15:42:54 2007
@@ -486,7 +486,7 @@
else:
c_node = _findChild(self._c_node, start)
# now delete the slice
- if start != stop:
+ if c_node is not NULL and start != stop:
c_node = _deleteSlice(c_node, start, stop)
# if the insertion point is at the end, append there
if c_node is NULL:
@@ -597,8 +597,8 @@
while c_node is not NULL:
c_node_next = c_node.next
if _isElement(c_node):
- _removeText(c_node_next)
- c_node_next = c_node.next
+ while c_node_next is not NULL and not _isElement(c_node_next):
+ c_node_next = c_node_next.next
_removeNode(c_node)
c_node = c_node_next
Modified: lxml/trunk/src/lxml/tests/test_elementtree.py
==============================================================================
--- lxml/trunk/src/lxml/tests/test_elementtree.py (original)
+++ lxml/trunk/src/lxml/tests/test_elementtree.py Tue Jun 12 15:42:54 2007
@@ -1161,6 +1161,26 @@
self.assertXML('<b><bs></bs></b>', b)
self.assertXML('<c><cs></cs></c>', c)
+ def test_delslice_tail(self):
+ XML = self.etree.XML
+ a = XML('<a><b></b>B2<c></c>C2</a>')
+ b, c = a
+
+ del a[:]
+
+ self.assertEquals("B2", b.tail)
+ self.assertEquals("C2", c.tail)
+
+ def test_replace_slice_tail(self):
+ XML = self.etree.XML
+ a = XML('<a><b></b>B2<c></c>C2</a>')
+ b, c = a
+
+ a[:] = []
+
+ self.assertEquals("B2", b.tail)
+ self.assertEquals("C2", c.tail)
+
def test_delitem_tail(self):
ElementTree = self.etree.ElementTree
f = StringIO('<a><b></b>B2<c></c>C2</a>')
More information about the lxml-checkins
mailing list