[ZPT] CVS: Packages/TAL - HTMLParser.py:1.18
Fred L. Drake" <fdrake@acm.org>
Fred L. Drake" <fdrake@acm.org>
Tue, 4 Sep 2001 12:24:24 -0400
Update of /cvs-repository/Packages/TAL
In directory cvs.zope.org:/tmp/cvs-serv8491
Modified Files:
HTMLParser.py
Log Message:
HTMLParser is allowed to be more strict than sgmllib, so let's not
change their basic behaviors: When parsing something that cannot possibly
be valid in either HTML or XHTML, raise an exception.
=== Packages/TAL/HTMLParser.py 1.17 => 1.18 ===
# 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 @@
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 <!DOCTYPE declaration,
@@ -359,11 +345,9 @@
if (j + 1) == n:
# end of buffer; incomplete
return -1
- m = declname.match(rawdata, j + 1)
- s = m.group()
- if s == rawdata[j+1:]:
- return -1
- j = j + 1 + len(s.rstrip())
+ s, j = self.scan_name(j + 1, declstartpos)
+ if j < 0:
+ return j
if rawdata[j] == ";":
j = j + 1
elif c == "]":
@@ -383,8 +367,9 @@
j = j + 1
else:
self.updatepos(declstartpos, j)
- raise HTMLParseError("unexpected char in internal subset",
- self.getpos())
+ raise HTMLParseError(
+ "unexpected char %s in internal subset" % `c`,
+ self.getpos())
# end of buffer reached
return -1