[Lxml-checkins] r40876 - in lxml/trunk/src/lxml: . tests

scoder at codespeak.net scoder at codespeak.net
Wed Mar 21 09:48:19 CET 2007


Author: scoder
Date: Wed Mar 21 09:48:17 2007
New Revision: 40876

Modified:
   lxml/trunk/src/lxml/etree.pyx
   lxml/trunk/src/lxml/tests/test_etree.py
   lxml/trunk/src/lxml/tree.pxd
Log:
'sourceline' property on Elements

Modified: lxml/trunk/src/lxml/etree.pyx
==============================================================================
--- lxml/trunk/src/lxml/etree.pyx	(original)
+++ lxml/trunk/src/lxml/etree.pyx	Wed Mar 21 09:48:17 2007
@@ -673,6 +673,24 @@
             return None
 
     # not in ElementTree, read-only
+    property sourceline:
+        """Original line number as found by the parser or None if unknown.
+        """
+        def __get__(self):
+            cdef long line
+            line = tree.xmlGetLineNo(self._c_node)
+            if line > 0:
+                return line
+            else:
+                return None
+
+        def __set__(self, line):
+            if line < 0:
+                self._c_node.line = 0
+            else:
+                self._c_node.line = line
+
+    # not in ElementTree, read-only
     property nsmap:
         """Namespace prefix->URI mapping known in the context of this Element.
         """

Modified: lxml/trunk/src/lxml/tests/test_etree.py
==============================================================================
--- lxml/trunk/src/lxml/tests/test_etree.py	(original)
+++ lxml/trunk/src/lxml/tests/test_etree.py	Wed Mar 21 09:48:17 2007
@@ -1119,6 +1119,37 @@
             ["tail0", "tail1", "tail2", "TAIL0", "TAIL1", "TAIL2"],
             [ el.tail for el in root ])
 
+    def test_sourceline_XML(self):
+        XML = self.etree.XML
+        root = XML('''<?xml version="1.0"?>
+        <root><test>
+
+        <bla/></test>
+        </root>
+        ''')
+
+        self.assertEquals(
+            [2, 2, 4],
+            [ el.sourceline for el in root.getiterator() ])
+
+    def test_sourceline_parse(self):
+        parse = self.etree.parse
+        tree = parse(fileInTestDir('test_xinclude.xml'))
+
+        self.assertEquals(
+            [1, 2, 3],
+            [ el.sourceline for el in tree.getiterator() ])
+
+    def test_sourceline_element(self):
+        Element = self.etree.Element
+        SubElement = self.etree.SubElement
+        el = Element("test")
+        self.assertEquals(None, el.sourceline)
+
+        child = SubElement(el, "test")
+        self.assertEquals(None, el.sourceline)
+        self.assertEquals(None, child.sourceline)
+
     def test_docinfo_public(self):
         etree = self.etree
         xml_header = '<?xml version="1.0" encoding="ascii"?>'

Modified: lxml/trunk/src/lxml/tree.pxd
==============================================================================
--- lxml/trunk/src/lxml/tree.pxd	(original)
+++ lxml/trunk/src/lxml/tree.pxd	Wed Mar 21 09:48:17 2007
@@ -97,6 +97,7 @@
         xmlAttr* properties
         xmlNs* ns
         xmlNs* nsDef
+        unsigned short line
 
     ctypedef struct xmlDtd:
         char* ExternalID
@@ -198,6 +199,7 @@
     cdef xmlNs* xmlSearchNs(xmlDoc* doc, xmlNode* node, char* prefix)
     cdef xmlNs* xmlSearchNsByHref(xmlDoc* doc, xmlNode* node, char* href)
     cdef int xmlIsBlankNode(xmlNode* node)
+    cdef long xmlGetLineNo(xmlNode* node)
     cdef void xmlElemDump(FILE* f, xmlDoc* doc, xmlNode* cur)
     cdef void xmlNodeDumpOutput(xmlOutputBuffer* buf,
                                 xmlDoc* doc, xmlNode* cur, int level,


More information about the lxml-checkins mailing list