NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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