4
from htmlentitydefs import name2codepoint
9
elif hasattr(v, '__html__'):
11
elif isinstance(v, basestring):
12
return cgi.escape(v, 1)
14
if hasattr(v, '__unicode__'):
18
return cgi.escape(v, 1)
20
class RewritingParser(HTMLParser.HTMLParser):
27
HTMLParser.HTMLParser.__init__(self)
30
self.data_is_str = isinstance(data, str)
32
self.lines = data.split('\n')
33
self.source_pos = 1, 0
36
HTMLParser.HTMLParser.feed(self, data)
38
_entityref_re = re.compile('&([a-zA-Z][-.a-zA-Z\d]*);')
39
_charref_re = re.compile('&#(\d+|[xX][a-fA-F\d]+);')
41
def unescape(self, s):
42
s = self._entityref_re.sub(self._sub_entityref, s)
43
s = self._charref_re.sub(self._sub_charref, s)
46
def _sub_entityref(self, match):
48
if name not in name2codepoint:
49
# If we don't recognize it, pass it through as though it
50
# wasn't an entity ref at all
52
return unichr(name2codepoint[name])
54
def _sub_charref(self, match):
56
if num.lower().startswith('x'):
57
num = int(num[1:], 16)
62
def handle_misc(self, whatever):
64
handle_charref = handle_misc
65
handle_entityref = handle_misc
66
handle_data = handle_misc
67
handle_comment = handle_misc
68
handle_decl = handle_misc
69
handle_pi = handle_misc
70
unknown_decl = handle_misc
71
handle_endtag = handle_misc
73
def write_tag(self, tag, attrs, startend=False):
74
attr_text = ''.join([' %s="%s"' % (n, html_quote(v))
76
if not n.startswith('form:')])
79
self.write_text('<%s%s>' % (tag, attr_text))
81
def skip_output(self):
85
cur_line, cur_offset = self.getpos()
86
if self.skip_output():
87
self.source_pos = self.getpos()
90
self.skip_next = False
91
self.source_pos = self.getpos()
93
if cur_line == self.source_pos[0]:
95
self.lines[cur_line-1][self.source_pos[1]:cur_offset])
98
self.lines[self.source_pos[0]-1][self.source_pos[1]:])
100
for i in range(self.source_pos[0]+1, cur_line):
101
self.write_text(self.lines[i-1])
102
self.write_text('\n')
103
self.write_text(self.lines[cur_line-1][:cur_offset])
104
self.source_pos = self.getpos()
106
def write_text(self, text):
107
self._content.append(text)
109
def get_attr(self, attr, name, default=None):
110
for n, value in attr:
111
if n.lower() == name:
115
def set_attr(self, attr, name, value):
116
for i in range(len(attr)):
117
if attr[i][0].lower() == name:
118
attr[i] = (name, value)
120
attr.append((name, value))
122
def del_attr(self, attr, name):
123
for i in range(len(attr)):
124
if attr[i][0].lower() == name:
128
def add_class(self, attr, class_name):
129
current = self.get_attr(attr, 'class', '')
130
new = current + ' ' + class_name
131
self.set_attr(attr, 'class', new.strip())
136
except AttributeError:
138
"You must .close() a parser instance before getting "
144
t for t in self._content if not isinstance(t, tuple)])
145
except UnicodeDecodeError, e:
148
" the form was passed in as an encoded string, but "
149
"some data or error messages were unicode strings; "
150
"the form should be passed in as a unicode string")
153
" the form was passed in as an unicode string, but "
154
"some data or error message was an encoded string; "
155
"the data and error messages should be passed in as "