[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