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)