parser.py (9579B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\control\editutils\parser.py 2 from carbonui.control.editutils import htmlscraper 3 import _weakref 4 import htmlentitydefs 5 import types 6 import sys 7 import re 8 supportedTags = ['area', 9 'a', 10 'b', 11 'blockquote', 12 'br', 13 'body', 14 'em', 15 'form', 16 'h1', 17 'h2', 18 'h3', 19 'h4', 20 'h5', 21 'h6', 22 'hr', 23 'i', 24 'img', 25 'input', 26 'li', 27 'link', 28 'map', 29 'ol', 30 'option', 31 'p', 32 'select', 33 'strong', 34 'textarea', 35 'title', 36 'u', 37 'ul', 38 'table', 39 'colgroup', 40 'col', 41 'tr', 42 'td', 43 'th', 44 'font', 45 'div', 46 'span', 47 'pre', 48 'meta'] 49 ignoredTags = ['html', 'head'] 50 autoClose = {'body': ('p', 'a', 'u', 'i', 'b', 'strong', 'em', 'table', 'div', 'ul', 'ol'), 51 'p': ('a', 'u', 'i', 'b', 'strong', 'em'), 52 'table': ('tr', 'td', 'th', 'colgroup', 'div'), 53 'tr': ('td', 'th'), 54 'td': ('td', 'th'), 55 'th': ('td', 'th'), 56 'div': ('p', 'table', 'a', 'u', 'i', 'b'), 57 'ul': 'li', 58 'ol': 'li', 59 'a': ('b', 'u', 'i'), 60 'option': 'option', 61 'select': 'option'} 62 optionalClose = {'option': 'option', 63 'td': ('td', 'th'), 64 'th': ('td', 'th'), 65 'tr': ('td', 'th', 'tr')} 66 colors = {'Black': '#000000', 67 'Green': '#008000', 68 'Silver': '#C0C0C0', 69 'Lime': '#00FF00', 70 'Gray': '#808080', 71 'Olive': '#808000', 72 'White': '#FFFFFF', 73 'Yellow': '#FFFF00', 74 'Maroon': '#800000', 75 'Navy': '#000080', 76 'Red': '#FF0000', 77 'Blue': '#0000FF', 78 'Purple': '#800080', 79 'Teal': '#008080', 80 'Fuchsia': '#FF00FF', 81 'Aqua': '#00FFFF'} 82 entityref = re.compile('&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]') 83 charref = re.compile('&#(?:[0-9]+|[xX][0-9a-fA-F]+)[^0-9a-fA-F]') 84 85 class Parser(htmlscraper.HtmlScraper): 86 __guid__ = 'eveparser.Html' 87 88 def __init__(self, handler): 89 self.__handler = _weakref.proxy(handler) 90 91 def handletag(self, tag, attrs, thetag): 92 tag = tag.lower() 93 d = {} 94 for name, val in attrs: 95 d[str(name)] = val 96 97 attrs = globals().get('Tag_%s' % tag, Tag)(**d) 98 if self.__handler.destroyed: 99 return 100 self.__handler.OnStartTag(tag, attrs) 101 return '' 102 103 def emptytag(self, tag): 104 self.handletag(tag, [], tag) 105 106 def endtag(self, tag): 107 tag = tag.lower() 108 tag = tag[1:] 109 if self.__handler.destroyed: 110 return 111 self.__handler.OnEndTag(tag) 112 return '' 113 114 def pdata(self, data): 115 if hasattr(self.__handler, 'OnData'): 116 self.__handler.OnData(self.decode_string(data)) 117 return '' 118 119 def pdecl(self, tag): 120 return '' 121 122 def decode_string(self, data): 123 if type(data) == types.StringType: 124 data = data.decode(self.__handler.charset, 'replace') 125 i = 0 126 s = data.split(u'&') 127 ndata = [s[0]] 128 for chunk in s[1:]: 129 name = None 130 k = 0 131 match = charref.match(u'&' + chunk, 0) 132 if match: 133 name = match.group()[2:-1] 134 else: 135 match = entityref.match(u'&' + chunk, 0) 136 if match: 137 name = match.group(1) 138 if name: 139 t = self.handle_charref(name) 140 k = match.end() 141 if not chunk.startswith(u';', k - 1): 142 k = k - 1 143 ndata.append(t) 144 else: 145 ndata.append(u'&') 146 ndata.append(chunk[k:]) 147 148 return u''.join(ndata) 149 150 def handle_charref(self, name): 151 code = htmlentitydefs.name2codepoint.get(name, None) 152 if code: 153 return unichr(code) 154 if name.startswith('x'): 155 try: 156 return unichr(int('0' + name, 16)) 157 except: 158 sys.exc_clear() 159 160 elif name.isdigit(): 161 try: 162 return unichr(int(name)) 163 except: 164 sys.exc_clear() 165 166 return name 167 168 handle_entityref = handle_charref 169 170 171 class Tag: 172 173 def __init__(self, **attrs): 174 self.__dict__.update(attrs) 175 176 def SetDefault(self, *attrs): 177 for name in attrs: 178 setattr(self, name, getattr(self, name, None)) 179 180 def SetBoolean(self, *attrs): 181 for each in attrs: 182 setattr(self, each, hasattr(self, each)) 183 184 def Get(self, attr, default): 185 return self.__dict__.get(attr, default) 186 187 188 class Tag_img(Tag): 189 190 def __init__(self, **attrs): 191 Tag.__init__(self, **attrs) 192 self.src = getattr(self, 'src', None) 193 self.SetDefault('alt', 'align', 'width', 'height', 'border', 'bordercolor', 'hspace', 'vspace', 'usemap') 194 if hasattr(self, 'size'): 195 self.size = int(self.size) 196 197 198 class Tag_a(Tag): 199 200 def __init__(self, **attrs): 201 Tag.__init__(self, **attrs) 202 self.SetDefault('href', 'alt') 203 204 205 class Tag_body(Tag): 206 207 def __init__(self, **attrs): 208 Tag.__init__(self, **attrs) 209 self.SetDefault('background', 'bgcolor', 'text', 'link', 'vlink', 'alink', 'style') 210 211 212 class Tag_form(Tag): 213 214 def __init__(self, **attrs): 215 Tag.__init__(self, **attrs) 216 self.SetDefault('method', 'action') 217 if self.method is None: 218 self.method = 'get' 219 220 221 class Tag_input(Tag): 222 223 def __init__(self, **attrs): 224 Tag.__init__(self, **attrs) 225 self.size = int(getattr(self, 'size', None) or 0) 226 self.SetDefault('type', 'name', 'value', 'valign') 227 228 229 class Tag_textarea(Tag): 230 231 def __init__(self, **attrs): 232 Tag.__init__(self, **attrs) 233 try: 234 self.rows = int(getattr(self, 'rows', None) or 0) 235 self.cols = int(getattr(self, 'cols', None) or 0) 236 except ValueError: 237 raise RuntimeError('ParsingError', {'what': 'TextArea %s has uninitialized or bad rows or cols.' % getattr(self, 'name', '[Unnamed]')}) 238 239 self.SetDefault('name', 'value') 240 241 242 class Tag_div(Tag): 243 244 def __init__(self, **attrs): 245 Tag.__init__(self, **attrs) 246 self.SetDefault('align', 'height', 'width', 'border', 'bordercolor', 'background', 'bgcolor') 247 248 249 class Tag_select(Tag): 250 251 def __init__(self, **attrs): 252 Tag.__init__(self, **attrs) 253 self.SetDefault('name') 254 255 256 class Tag_option(Tag): 257 258 def __init__(self, **attrs): 259 Tag.__init__(self, **attrs) 260 self.SetBoolean('selected') 261 self.SetDefault('value') 262 263 264 class Tag_hr(Tag): 265 266 def __init__(self, **attrs): 267 Tag.__init__(self, **attrs) 268 self.SetDefault('size', 'color', 'width', 'align') 269 270 271 class Tag_table(Tag): 272 273 def __init__(self, **attrs): 274 Tag.__init__(self, **attrs) 275 self.SetDefault('align', 'width', 'height', 'border', 'bordercolor', 'background', 'bgcolor', 'cellspacing', 'cellpadding', 'vspace', 'hspace') 276 277 278 class Tag_colgroup(Tag): 279 280 def __init__(self, **attrs): 281 Tag.__init__(self, **attrs) 282 self.SetDefault('width', 'span') 283 284 285 class Tag_col(Tag): 286 287 def __init__(self, **attrs): 288 Tag.__init__(self, **attrs) 289 self.SetDefault('width', 'span') 290 291 292 class Tag_td(Tag): 293 294 def __init__(self, **attrs): 295 Tag.__init__(self, **attrs) 296 self.SetDefault('align', 'valign', 'width', 'rowspan', 'colspan', 'nowrap', 'background', 'bgcolor') 297 298 299 class Tag_th(Tag): 300 301 def __init__(self, **attrs): 302 Tag.__init__(self, **attrs) 303 self.SetDefault('align', 'valign', 'width', 'rowspan', 'colspan', 'nowrap', 'background', 'bgcolor') 304 305 306 class Tag_tr(Tag): 307 308 def __init__(self, **attrs): 309 Tag.__init__(self, **attrs) 310 self.SetDefault('align', 'valign', 'height', 'background', 'bgcolor') 311 312 313 class Tag_h1(Tag): 314 315 def __init__(self, **attrs): 316 Tag.__init__(self, **attrs) 317 self.SetDefault('align') 318 319 320 class Tag_h2(Tag): 321 322 def __init__(self, **attrs): 323 Tag.__init__(self, **attrs) 324 self.SetDefault('align') 325 326 327 class Tag_h3(Tag): 328 329 def __init__(self, **attrs): 330 Tag.__init__(self, **attrs) 331 self.SetDefault('align') 332 333 334 class Tag_h4(Tag): 335 336 def __init__(self, **attrs): 337 Tag.__init__(self, **attrs) 338 self.SetDefault('align') 339 340 341 class Tag_h5(Tag): 342 343 def __init__(self, **attrs): 344 Tag.__init__(self, **attrs) 345 self.SetDefault('align') 346 347 348 class Tag_h6(Tag): 349 350 def __init__(self, **attrs): 351 Tag.__init__(self, **attrs) 352 self.SetDefault('align') 353 354 355 class Tag_font(Tag): 356 357 def __init__(self, **attrs): 358 Tag.__init__(self, **attrs) 359 self.SetDefault('size', 'color', 'style') 360 361 362 class Tag_span(Tag): 363 364 def __init__(self, **attrs): 365 Tag.__init__(self, **attrs) 366 self.SetDefault('style') 367 368 369 class Tag_link(Tag): 370 371 def __init__(self, **attrs): 372 Tag.__init__(self, **attrs) 373 self.SetDefault('rel', 'type', 'href') 374 375 376 class Tag_map(Tag): 377 378 def __init__(self, **attrs): 379 Tag.__init__(self, **attrs) 380 self.SetDefault('name') 381 382 383 class Tag_area(Tag): 384 385 def __init__(self, **attrs): 386 Tag.__init__(self, **attrs) 387 self.SetDefault('shape', 'coords', 'href') 388 389 390 class Tag_meta(Tag): 391 392 def __init__(self, **attrs): 393 Tag.__init__(self, **attrs) 394 self.SetDefault('content') 395 396 397 parseErrorMsg = '\n <html><body>\n <h1>Unsupported Format</h1>\n <p>This page is not suitable for displaying.</p>\n <p>%s.</p>\n <p>line %s, offset %s.</p>\n </body></html>\n ' 398 ALIGNBASELINE = 0 399 ALIGNTOP = 1 400 ALIGNMIDDLE = 2 401 ALIGNBOTTOM = 3 402 ALIGNSUB = 4 403 ALIGNSUPER = 5 404 BG_TILED = 0 405 BG_SCROLL = 1 406 BG_FIXED = 2 407 ErrorMsg = parseErrorMsg 408 HtmlAutoClose = autoClose 409 HtmlColors = colors 410 HtmlIgnoredTags = ignoredTags 411 HtmlOptionalClose = optionalClose 412 HtmlSupportedTags = supportedTags