]> granicus.if.org Git - python/commitdiff
Patch #1014930. Expose current parse location to XMLParser.
authorDave Cole <djc@object-craft.com.au>
Thu, 26 Aug 2004 00:37:31 +0000 (00:37 +0000)
committerDave Cole <djc@object-craft.com.au>
Thu, 26 Aug 2004 00:37:31 +0000 (00:37 +0000)
Doc/lib/libpyexpat.tex
Lib/test/test_pyexpat.py
Misc/NEWS
Modules/pyexpat.c

index 5b1c7372a3eab58b14146f30ed10f708ab1876e2..dd218c6a14c5519aa35a0474b34123ad7ac59f28 100644 (file)
@@ -257,6 +257,26 @@ Column number at which an error occurred.
 Line number at which an error occurred.
 \end{memberdesc}
 
+The following attributes contain values relating to the current parse
+location in an \class{xmlparser} object.  During a callback reporting
+a parse event they indicate the location of the first of the sequence
+of characters that generated the event.  When called outside of a
+callback, the position indicated will be just past the last parse
+event (regardless of whether there was an associated callback).
+\versionadded{2.4}
+
+\begin{memberdesc}[xmlparser]{CurrentByteIndex} 
+Current byte index in the parser input.
+\end{memberdesc} 
+
+\begin{memberdesc}[xmlparser]{CurrentColumnNumber} 
+Current column number in the parser input.
+\end{memberdesc}
+
+\begin{memberdesc}[xmlparser]{CurrentLineNumber}
+Current line number in the parser input.
+\end{memberdesc}
+
 Here is the list of handlers that can be set.  To set a handler on an
 \class{xmlparser} object \var{o}, use
 \code{\var{o}.\var{handlername} = \var{func}}.  \var{handlername} must
index 44f9ee8e9b44974a12d72f832d0bd5d0bf8fd153..a9a5e8fa0e4b674f0231129727a2cd516f0921f4 100644 (file)
@@ -326,3 +326,42 @@ except RuntimeError, e:
         print "Expected RuntimeError for element 'a'; found %r" % e.args[0]
 else:
     print "Expected RuntimeError for 'a'"
+
+# Test Current* members:
+class PositionTest:
+
+    def __init__(self, expected_list, parser):
+        self.parser = parser
+        self.parser.StartElementHandler = self.StartElementHandler
+        self.parser.EndElementHandler = self.EndElementHandler
+        self.expected_list = expected_list
+        self.upto = 0
+
+    def StartElementHandler(self, name, attrs):
+        self.check_pos('s')
+
+    def EndElementHandler(self, name):
+        self.check_pos('e')
+
+    def check_pos(self, event):
+        pos = (event,
+               self.parser.CurrentByteIndex,
+               self.parser.CurrentLineNumber,
+               self.parser.CurrentColumnNumber)
+        require(self.upto < len(self.expected_list),
+                'too many parser events')
+        expected = self.expected_list[self.upto]
+        require(pos == expected,
+                'expected position %s, got %s' % (expected, pos))
+        self.upto += 1
+
+
+parser = expat.ParserCreate()
+handler = PositionTest([('s', 0, 1, 0), ('s', 5, 2, 1), ('s', 11, 3, 2),
+                        ('e', 15, 3, 6), ('e', 17, 4, 1), ('e', 22, 5, 0)],
+                       parser)
+parser.Parse('''<a>
+ <b>
+  <c/>
+ </b>
+</a>''', 1)
index cb49e0b71b1f1cdac8579945a1a3ff27d3846fb2..fd5ba686fd514274c64ebc2cd8d5933cd7a863c6 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -54,6 +54,9 @@ Extension modules
 
 - Added socket.socketpair().
 
+- Added CurrentByteIndex, CurrentColumnNumber, CurrentLineNumber
+  members to xml.parsers.expat.XMLParser object.
+
 Library
 -------
 
index 3bee0ace0ec43a16a67404d8d1411a0d4f37420d..d5929b699655c417ec100b284beee391023d4b96 100644 (file)
@@ -1455,6 +1455,17 @@ xmlparse_getattr(xmlparseobject *self, char *name)
             return PyInt_FromLong((long)
                                   XML_GetErrorByteIndex(self->itself));
     }
+    if (name[0] == 'C') {
+        if (strcmp(name, "CurrentLineNumber") == 0)
+            return PyInt_FromLong((long)
+                                  XML_GetCurrentLineNumber(self->itself));
+        if (strcmp(name, "CurrentColumnNumber") == 0)
+            return PyInt_FromLong((long)
+                                  XML_GetCurrentColumnNumber(self->itself));
+        if (strcmp(name, "CurrentByteIndex") == 0)
+            return PyInt_FromLong((long)
+                                  XML_GetCurrentByteIndex(self->itself));
+    }
     if (name[0] == 'b') {
         if (strcmp(name, "buffer_size") == 0)
             return PyInt_FromLong((long) self->buffer_size);
@@ -1503,6 +1514,9 @@ xmlparse_getattr(xmlparseobject *self, char *name)
         APPEND(rc, "ErrorLineNumber");
         APPEND(rc, "ErrorColumnNumber");
         APPEND(rc, "ErrorByteIndex");
+        APPEND(rc, "CurrentLineNumber");
+        APPEND(rc, "CurrentColumnNumber");
+        APPEND(rc, "CurrentByteIndex");
         APPEND(rc, "buffer_size");
         APPEND(rc, "buffer_text");
         APPEND(rc, "buffer_used");