]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
parse_declaration(): be more lenient in what we accept. We now
authorGuido van Rossum <guido@python.org>
Mon, 21 May 2001 20:17:17 +0000 (20:17 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 21 May 2001 20:17:17 +0000 (20:17 +0000)
basically accept <!...> where the dots can be single- or double-quoted
strings or any other character except >.

Background: I found a real-life example that failed to parse with
the old assumption: http://www.opensource.org/licenses/jabberpl.html
contains a few constructs of the form <![if !supportLists]>...<![endif]>.

Lib/sgmllib.py

index 5388c07b20d539450622e65fa286daac1bfe0d84..a471c0589b5376f8716812f6e0053412a5b58b0f 100644 (file)
@@ -39,7 +39,7 @@ attrfind = re.compile(
     r'\s*([a-zA-Z_][-.a-zA-Z_0-9]*)(\s*=\s*'
     r'(\'[^\']*\'|"[^"]*"|[-a-zA-Z0-9./:;+*%?!&$\(\)_#=~]*))?')
 
-declname = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9]*\s*')
+decldata = re.compile(r'[^>\'\"]+')
 declstringlit = re.compile(r'(\'[^\']*\'|"[^"]*")\s*')
 
 
@@ -212,8 +212,8 @@ class SGMLParser:
     def parse_declaration(self, i):
         rawdata = self.rawdata
         j = i + 2
-        # in practice, this should look like: ((name|stringlit) S*)+ '>'
-        while 1:
+        n = len(rawdata)
+        while j < n:
             c = rawdata[j:j+1]
             if c == ">":
                 # end of declaration syntax
@@ -225,19 +225,14 @@ class SGMLParser:
                     # incomplete or an error?
                     return -1
                 j = m.end()
-            elif c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ":
-                m = declname.match(rawdata, j)
+            else:
+                m = decldata.match(rawdata, j)
                 if not m:
                     # incomplete or an error?
                     return -1
                 j = m.end()
-            elif i == len(rawdata):
-                # end of buffer between tokens
-                return -1
-            else:
-                raise SGMLParseError(
-                    "unexpected char in declaration: %s" % `rawdata[i]`)
-        assert 0, "can't get here!"
+        # end of buffer between tokens
+        return -1
 
     # Internal -- parse processing instr, return length or -1 if not terminated
     def parse_pi(self, i):