diff --git a/Lib/HTMLParser.py b/Lib/HTMLParser.py
index 584046d81e..df8383ecb1 100644
--- a/Lib/HTMLParser.py
+++ b/Lib/HTMLParser.py
@@ -269,17 +269,18 @@ class HTMLParser:
return -1
# in practice, this should look like: ((name|stringlit) S*)+ '>'
n = len(rawdata)
- decltype = None
- extrachars = ""
+ decltype, j = self.scan_name(j, i)
+ if j < 0:
+ return j
+ if decltype.lower() != "doctype":
+ raise HTMLParseError("unknown declaration: '%s'" % decltype,
+ self.getpos())
while j < n:
c = rawdata[j]
if c == ">":
# end of declaration syntax
data = rawdata[i+2:j]
- if decltype == "doctype":
- self.handle_decl(data)
- else:
- self.unknown_decl(data)
+ self.handle_decl(data)
return j + 1
if c in "\"'":
m = declstringlit.match(rawdata, j)
@@ -287,30 +288,15 @@ class HTMLParser:
return -1 # incomplete
j = m.end()
elif c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ":
- m = declname.match(rawdata, j)
- if not m:
- return -1 # incomplete
- j = m.end()
- if decltype is None:
- decltype = m.group(0).rstrip().lower()
- if decltype != "doctype":
- extrachars = "="
+ name, j = self.scan_name(j, i)
elif c == "[" and decltype == "doctype":
j = self.parse_doctype_subset(j + 1, i)
- if j < 0:
- return j
- elif c in extrachars:
- j = j + 1
- while j < n and rawdata[j] in string.whitespace:
- j = j + 1
- if j == n:
- # end of buffer while in declaration
- return -1
else:
raise HTMLParseError(
"unexpected char in declaration: %s" % `rawdata[j]`,
self.getpos())
- decltype = decltype or ''
+ if j < 0:
+ return j
return -1 # incomplete
# Internal -- scan past the internal subset in a def'
- self._run_check(s, [
- ("data", "abc"),
- ("unknown decl", 'spacer type="block" height="25"'),
- ("data", "def"),
- ])
+ self._parse_error('')
def test_starttag_end_boundary(self):
self._run_check("""""", [("starttag", "a", [("b", "<")])])