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

registry.py (3399B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\evelink\client\registry.py
      2 import logging
      3 import localization
      4 from evelink.client import LinkColorInfo
      5 from evelink.client.color import default_link_color_info
      6 from evelink.client.handlers.web import SCHEMES as WEB_SCHEMES
      7 from url_utils.client.canonical import canonical_safe_url
      8 log = logging.getLogger(__name__)
      9 
     10 class Registry(object):
     11 
     12     def __init__(self):
     13         self._handlers = {}
     14 
     15     def has_handler_for(self, url):
     16         try:
     17             scheme = parse_scheme(url)
     18             if scheme is None:
     19                 return False
     20             return normalize_scheme(scheme) in self._handlers
     21         except Exception:
     22             log.exception('Failed to parse url {}'.format(url))
     23             return False
     24 
     25     def get_handler_for(self, url):
     26         scheme = parse_scheme(url)
     27         if scheme is None:
     28             raise ValueError('No scheme found in the given URL')
     29         return self._handlers[normalize_scheme(scheme)]
     30 
     31     def register(self, scheme, handler, hint = None, menu = None, color_info = None, accept_link_text = False, bold = True):
     32         normalized_scheme = normalize_scheme(scheme)
     33         if normalized_scheme in self._handlers:
     34             log.warning('Overriding handler for scheme {}'.format(scheme))
     35         handler = LinkHandler(scheme, handler, hint, menu, color_info, accept_link_text, bold)
     36         self._handlers[normalized_scheme] = handler
     37 
     38     def unregister(self, scheme):
     39         try:
     40             del self._handlers[normalize_scheme(scheme)]
     41         except KeyError:
     42             log.warning('Attempting to unregister nonexisting handler for {}'.format(scheme))
     43 
     44 
     45 def normalize_scheme(scheme):
     46     return scheme.lower()
     47 
     48 
     49 def parse_scheme(url):
     50     try:
     51         return url[:url.index(':')]
     52     except ValueError:
     53         return None
     54 
     55 
     56 class LinkHandler(object):
     57 
     58     def __init__(self, scheme, handler, hint = None, menu = None, color_info = None, accept_link_text = False, bold = True):
     59         self.scheme = scheme
     60         self.handler = handler
     61         self._hint = hint
     62         self._menu = menu
     63         self._color_info = color_info
     64         self._accept_link_text = accept_link_text
     65         self.bold = bold
     66 
     67     def __call__(self, url, link_text = None):
     68         if self._accept_link_text:
     69             self.handler(url, link_text)
     70         else:
     71             self.handler(url)
     72 
     73     def get_hint(self, url):
     74         if callable(self._hint):
     75             if self.scheme in WEB_SCHEMES and canonical_safe_url(url) is None:
     76                 return '<color=red><b>%s</b></color>\n%s' % (localization.GetByLabel('UI/Shared/InvalidOrSpoofedLink'), url)
     77             return self._hint(url)
     78         elif self._hint is not None:
     79             return localization.GetByLabel(self._hint)
     80         else:
     81             return
     82 
     83     def get_menu(self, url):
     84         if self._menu:
     85             return self._menu(url)
     86 
     87     def get_color(self, url, state, style):
     88         if callable(self._color_info):
     89             color_info = self._color_info(url)
     90         elif self.scheme in WEB_SCHEMES and canonical_safe_url(url) is None:
     91             color_info = LinkColorInfo(normal='#ff0000', hover='#ff0000')
     92         else:
     93             color_info = self._color_info
     94         if color_info is None:
     95             color_info = default_link_color_info
     96         return color_info.get_color(state, style)