Mercurial > cpython-lru_cache-weakref
annotate Lib/HTMLParser.py @ 49955:878d40468c4e legacy-trunk
Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
| author | Vinay Sajip <vinay_sajip@yahoo.co.uk> |
|---|---|
| date | Wed, 03 Dec 2008 23:22:58 +0000 |
| parents | 454d38c1f47e |
| children | ebda6803f8d5 |
| rev | line source |
|---|---|
|
47177
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
1 """A parser for HTML and XHTML.""" |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
2 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
3 # This file is based on sgmllib.py, but the API is slightly different. |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
4 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
5 # XXX There should be a way to distinguish between PCDATA (parsed |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
6 # character data -- the normal case), RCDATA (replaceable character |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
7 # data -- only char and entity references and end tags are special) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
8 # and CDATA (character data -- only end tags are special). |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
9 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
10 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
11 import markupbase |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
12 import re |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
13 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
14 # Regular expressions used for parsing |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
15 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
16 interesting_normal = re.compile('[&<]') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
17 interesting_cdata = re.compile(r'<(/|\Z)') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
18 incomplete = re.compile('&[a-zA-Z#]') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
19 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
20 entityref = re.compile('&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
21 charref = re.compile('&#(?:[0-9]+|[xX][0-9a-fA-F]+)[^0-9a-fA-F]') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
22 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
23 starttagopen = re.compile('<[a-zA-Z]') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
24 piclose = re.compile('>') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
25 commentclose = re.compile(r'--\s*>') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
26 tagfind = re.compile('[a-zA-Z][-.a-zA-Z0-9:_]*') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
27 attrfind = re.compile( |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
28 r'\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*' |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
29 r'(\'[^\']*\'|"[^"]*"|[-a-zA-Z0-9./,:;+*%?!&$\(\)_#=~@]*))?') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
30 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
31 locatestarttagend = re.compile(r""" |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
32 <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
33 (?:\s+ # whitespace before attribute name |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
34 (?:[a-zA-Z_][-.:a-zA-Z0-9_]* # attribute name |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
35 (?:\s*=\s* # value indicator |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
36 (?:'[^']*' # LITA-enclosed value |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
37 |\"[^\"]*\" # LIT-enclosed value |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
38 |[^'\">\s]+ # bare value |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
39 ) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
40 )? |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
41 ) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
42 )* |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
43 \s* # trailing whitespace |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
44 """, re.VERBOSE) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
45 endendtag = re.compile('>') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
46 endtagfind = re.compile('</\s*([a-zA-Z][-.a-zA-Z0-9:_]*)\s*>') |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
47 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
48 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
49 class HTMLParseError(Exception): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
50 """Exception raised for all parse errors.""" |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
51 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
52 def __init__(self, msg, position=(None, None)): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
53 assert msg |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
54 self.msg = msg |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
55 self.lineno = position[0] |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
56 self.offset = position[1] |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
57 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
58 def __str__(self): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
59 result = self.msg |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
60 if self.lineno is not None: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
61 result = result + ", at line %d" % self.lineno |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
62 if self.offset is not None: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
63 result = result + ", column %d" % (self.offset + 1) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
64 return result |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
65 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
66 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
67 class HTMLParser(markupbase.ParserBase): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
68 """Find tags and other markup and call handler functions. |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
69 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
70 Usage: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
71 p = HTMLParser() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
72 p.feed(data) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
73 ... |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
74 p.close() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
75 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
76 Start tags are handled by calling self.handle_starttag() or |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
77 self.handle_startendtag(); end tags by self.handle_endtag(). The |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
78 data between tags is passed from the parser to the derived class |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
79 by calling self.handle_data() with the data as argument (the data |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
80 may be split up in arbitrary chunks). Entity references are |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
81 passed by calling self.handle_entityref() with the entity |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
82 reference as the argument. Numeric character references are |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
83 passed to self.handle_charref() with the string containing the |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
84 reference as the argument. |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
85 """ |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
86 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
87 CDATA_CONTENT_ELEMENTS = ("script", "style") |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
88 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
89 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
90 def __init__(self): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
91 """Initialize and reset this instance.""" |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
92 self.reset() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
93 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
94 def reset(self): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
95 """Reset this instance. Loses all unprocessed data.""" |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
96 self.rawdata = '' |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
97 self.lasttag = '???' |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
98 self.interesting = interesting_normal |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
99 markupbase.ParserBase.reset(self) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
100 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
101 def feed(self, data): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
102 """Feed data to the parser. |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
103 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
104 Call this as often as you want, with as little or as much text |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
105 as you want (may include '\n'). |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
106 """ |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
107 self.rawdata = self.rawdata + data |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
108 self.goahead(0) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
109 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
110 def close(self): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
111 """Handle any buffered data.""" |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
112 self.goahead(1) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
113 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
114 def error(self, message): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
115 raise HTMLParseError(message, self.getpos()) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
116 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
117 __starttag_text = None |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
118 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
119 def get_starttag_text(self): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
120 """Return full source of start tag: '<...>'.""" |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
121 return self.__starttag_text |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
122 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
123 def set_cdata_mode(self): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
124 self.interesting = interesting_cdata |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
125 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
126 def clear_cdata_mode(self): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
127 self.interesting = interesting_normal |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
128 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
129 # Internal -- handle data as far as reasonable. May leave state |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
130 # and data to be processed by a subsequent call. If 'end' is |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
131 # true, force handling all data as if followed by EOF marker. |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
132 def goahead(self, end): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
133 rawdata = self.rawdata |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
134 i = 0 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
135 n = len(rawdata) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
136 while i < n: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
137 match = self.interesting.search(rawdata, i) # < or & |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
138 if match: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
139 j = match.start() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
140 else: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
141 j = n |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
142 if i < j: self.handle_data(rawdata[i:j]) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
143 i = self.updatepos(i, j) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
144 if i == n: break |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
145 startswith = rawdata.startswith |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
146 if startswith('<', i): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
147 if starttagopen.match(rawdata, i): # < + letter |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
148 k = self.parse_starttag(i) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
149 elif startswith("</", i): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
150 k = self.parse_endtag(i) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
151 elif startswith("<!--", i): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
152 k = self.parse_comment(i) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
153 elif startswith("<?", i): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
154 k = self.parse_pi(i) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
155 elif startswith("<!", i): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
156 k = self.parse_declaration(i) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
157 elif (i + 1) < n: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
158 self.handle_data("<") |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
159 k = i + 1 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
160 else: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
161 break |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
162 if k < 0: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
163 if end: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
164 self.error("EOF in middle of construct") |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
165 break |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
166 i = self.updatepos(i, k) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
167 elif startswith("&#", i): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
168 match = charref.match(rawdata, i) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
169 if match: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
170 name = match.group()[2:-1] |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
171 self.handle_charref(name) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
172 k = match.end() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
173 if not startswith(';', k-1): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
174 k = k - 1 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
175 i = self.updatepos(i, k) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
176 continue |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
177 else: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
178 break |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
179 elif startswith('&', i): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
180 match = entityref.match(rawdata, i) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
181 if match: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
182 name = match.group(1) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
183 self.handle_entityref(name) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
184 k = match.end() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
185 if not startswith(';', k-1): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
186 k = k - 1 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
187 i = self.updatepos(i, k) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
188 continue |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
189 match = incomplete.match(rawdata, i) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
190 if match: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
191 # match.group() will contain at least 2 chars |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
192 if end and match.group() == rawdata[i:]: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
193 self.error("EOF in middle of entity or char ref") |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
194 # incomplete |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
195 break |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
196 elif (i + 1) < n: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
197 # not the end of the buffer, and can't be confused |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
198 # with some other construct |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
199 self.handle_data("&") |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
200 i = self.updatepos(i, i + 1) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
201 else: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
202 break |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
203 else: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
204 assert 0, "interesting.search() lied" |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
205 # end while |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
206 if end and i < n: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
207 self.handle_data(rawdata[i:n]) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
208 i = self.updatepos(i, n) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
209 self.rawdata = rawdata[i:] |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
210 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
211 # Internal -- parse processing instr, return end or -1 if not terminated |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
212 def parse_pi(self, i): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
213 rawdata = self.rawdata |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
214 assert rawdata[i:i+2] == '<?', 'unexpected call to parse_pi()' |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
215 match = piclose.search(rawdata, i+2) # > |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
216 if not match: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
217 return -1 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
218 j = match.start() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
219 self.handle_pi(rawdata[i+2: j]) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
220 j = match.end() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
221 return j |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
222 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
223 # Internal -- handle starttag, return end or -1 if not terminated |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
224 def parse_starttag(self, i): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
225 self.__starttag_text = None |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
226 endpos = self.check_for_whole_start_tag(i) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
227 if endpos < 0: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
228 return endpos |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
229 rawdata = self.rawdata |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
230 self.__starttag_text = rawdata[i:endpos] |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
231 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
232 # Now parse the data between i+1 and j into a tag and attrs |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
233 attrs = [] |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
234 match = tagfind.match(rawdata, i+1) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
235 assert match, 'unexpected call to parse_starttag()' |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
236 k = match.end() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
237 self.lasttag = tag = rawdata[i+1:k].lower() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
238 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
239 while k < endpos: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
240 m = attrfind.match(rawdata, k) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
241 if not m: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
242 break |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
243 attrname, rest, attrvalue = m.group(1, 2, 3) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
244 if not rest: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
245 attrvalue = None |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
246 elif attrvalue[:1] == '\'' == attrvalue[-1:] or \ |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
247 attrvalue[:1] == '"' == attrvalue[-1:]: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
248 attrvalue = attrvalue[1:-1] |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
249 attrvalue = self.unescape(attrvalue) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
250 attrs.append((attrname.lower(), attrvalue)) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
251 k = m.end() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
252 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
253 end = rawdata[k:endpos].strip() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
254 if end not in (">", "/>"): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
255 lineno, offset = self.getpos() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
256 if "\n" in self.__starttag_text: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
257 lineno = lineno + self.__starttag_text.count("\n") |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
258 offset = len(self.__starttag_text) \ |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
259 - self.__starttag_text.rfind("\n") |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
260 else: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
261 offset = offset + len(self.__starttag_text) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
262 self.error("junk characters in start tag: %r" |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
263 % (rawdata[k:endpos][:20],)) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
264 if end.endswith('/>'): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
265 # XHTML-style empty tag: <span attr="value" /> |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
266 self.handle_startendtag(tag, attrs) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
267 else: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
268 self.handle_starttag(tag, attrs) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
269 if tag in self.CDATA_CONTENT_ELEMENTS: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
270 self.set_cdata_mode() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
271 return endpos |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
272 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
273 # Internal -- check to see if we have a complete starttag; return end |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
274 # or -1 if incomplete. |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
275 def check_for_whole_start_tag(self, i): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
276 rawdata = self.rawdata |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
277 m = locatestarttagend.match(rawdata, i) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
278 if m: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
279 j = m.end() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
280 next = rawdata[j:j+1] |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
281 if next == ">": |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
282 return j + 1 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
283 if next == "/": |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
284 if rawdata.startswith("/>", j): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
285 return j + 2 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
286 if rawdata.startswith("/", j): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
287 # buffer boundary |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
288 return -1 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
289 # else bogus input |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
290 self.updatepos(i, j + 1) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
291 self.error("malformed empty start tag") |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
292 if next == "": |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
293 # end of input |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
294 return -1 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
295 if next in ("abcdefghijklmnopqrstuvwxyz=/" |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
296 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
297 # end of input in or before attribute value, or we have the |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
298 # '/' from a '/>' ending |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
299 return -1 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
300 self.updatepos(i, j) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
301 self.error("malformed start tag") |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
302 raise AssertionError("we should not get here!") |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
303 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
304 # Internal -- parse endtag, return end or -1 if incomplete |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
305 def parse_endtag(self, i): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
306 rawdata = self.rawdata |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
307 assert rawdata[i:i+2] == "</", "unexpected call to parse_endtag" |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
308 match = endendtag.search(rawdata, i+1) # > |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
309 if not match: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
310 return -1 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
311 j = match.end() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
312 match = endtagfind.match(rawdata, i) # </ + tag + > |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
313 if not match: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
314 self.error("bad end tag: %r" % (rawdata[i:j],)) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
315 tag = match.group(1) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
316 self.handle_endtag(tag.lower()) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
317 self.clear_cdata_mode() |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
318 return j |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
319 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
320 # Overridable -- finish processing of start+end tag: <tag.../> |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
321 def handle_startendtag(self, tag, attrs): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
322 self.handle_starttag(tag, attrs) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
323 self.handle_endtag(tag) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
324 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
325 # Overridable -- handle start tag |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
326 def handle_starttag(self, tag, attrs): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
327 pass |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
328 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
329 # Overridable -- handle end tag |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
330 def handle_endtag(self, tag): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
331 pass |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
332 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
333 # Overridable -- handle character reference |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
334 def handle_charref(self, name): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
335 pass |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
336 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
337 # Overridable -- handle entity reference |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
338 def handle_entityref(self, name): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
339 pass |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
340 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
341 # Overridable -- handle data |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
342 def handle_data(self, data): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
343 pass |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
344 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
345 # Overridable -- handle comment |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
346 def handle_comment(self, data): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
347 pass |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
348 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
349 # Overridable -- handle declaration |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
350 def handle_decl(self, decl): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
351 pass |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
352 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
353 # Overridable -- handle processing instruction |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
354 def handle_pi(self, data): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
355 pass |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
356 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
357 def unknown_decl(self, data): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
358 self.error("unknown declaration: %r" % (data,)) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
359 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
360 # Internal -- helper to remove special character quoting |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
361 entitydefs = None |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
362 def unescape(self, s): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
363 if '&' not in s: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
364 return s |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
365 def replaceEntities(s): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
366 s = s.groups()[0] |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
367 if s[0] == "#": |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
368 s = s[1:] |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
369 if s[0] in ['x','X']: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
370 c = int(s[1:], 16) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
371 else: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
372 c = int(s) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
373 return unichr(c) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
374 else: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
375 # Cannot use name2codepoint directly, because HTMLParser supports apos, |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
376 # which is not part of HTML 4 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
377 import htmlentitydefs |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
378 if HTMLParser.entitydefs is None: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
379 entitydefs = HTMLParser.entitydefs = {'apos':u"'"} |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
380 for k, v in htmlentitydefs.name2codepoint.iteritems(): |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
381 entitydefs[k] = unichr(v) |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
382 try: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
383 return self.entitydefs[s] |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
384 except KeyError: |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
385 return '&'+s+';' |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
386 |
|
454d38c1f47e
revert creation of the html.entities and html.parser modules
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
387 return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", replaceEntities, s) |
