Coverage for /home/ken/src/shared/avendesora/avendesora/title.py: 0%

# Coverage for /home/ken/src/shared/avendesora/avendesora/title.py : 0%

## 56 statements 0 run 56 missing 0 excluded

Hot-keys on this page

r m x p toggle line displays

j k next/prev highlighted chunk

0 (zero) top of page

1 (one) first highlighted chunk

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | # Window Titles # # Get and parse window title strings. # License {{{1 # Copyright (C) 2016 Kenneth S. Kundert # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # this program. If not, see http://www.gnu.org/licenses/. # Imports {{{1 from .config import get_setting from shlib import Run from inform import Error, log try: from urllib.parse import urlparse except ImportError: from urlparse import urlparse import re # Regular expressions {{{1 def labelRegex(label, regex): return "(?P<%s>%s)" % (label, regex) URL_REGEX = r'(?:[^ ]+)://(?:[^ ]+)' REGEX_COMPONENTS = { 'title': labelRegex('title', r'.*'), 'url': labelRegex('url', URL_REGEX), 'host': labelRegex('host', URL_REGEX), 'browser': labelRegex('browser', r'[\w ()]+'), } # Title base class {{{1 class Title(object): def __init__(self, override=None): if override: title = override else: xdotool = get_setting('xdotool_executable') if not xdotool: raise Error( "must set xdotool_executable'.", culprit=get_setting('config_file') ) try: output = Run( [xdotool, 'getactivewindow', 'getwindowname'], 'sOeW' ) except OSError as err: raise Error(str(err)) title = output.stdout.strip() log('Focused window title: %s' % title) data = {'rawtitle': title} for sub in sorted(Title.__subclasses__(), key=lambda c: c.PRIORITY): matched = sub._process(title, data) log('%s: %s.' % (sub.__name__, 'matched' if matched else 'no match')) if matched: break # log the components of the title log('Recognized title components ...') for k, v in data.items(): log(' %s: %s' % (k, v)) self.data = data def get_data(self): return self.data @classmethod def _process(cls, title, data): match = cls.PATTERN.match(title) if match: found = match.groupdict() if 'url' in found: components = urlparse(found.get('url')) if components.netloc: log('title matched.', culprit=cls.__name__) data.update(found) data['protocol'] = components.scheme data['host'] = components.netloc data['path'] = components.path return True # AddURLToWindowTitle (Firefox) {{{1 class AddURLToWindowTitle(Title): # This matches the default pattern produced by AddURLToWindowTitle in Firefox PATTERN = re.compile( r'\A{title} - {url} - {host} - {browser}\Z'.format(**REGEX_COMPONENTS) ) PRIORITY = 1 # URLinTitle (Chrome) {{{1 class URLinTitle(Title): # This matches the default pattern produced by URLinTitle in Chrome # By default URLinTitle does not include path or args. Can change the # tab title format option to: # {title} - {protocol}://{hostname}{port}/{path}{args} # to access these fields as well. PATTERN = re.compile( r'\A{title} - {url} - {browser}\Z'.format(**REGEX_COMPONENTS) ) PRIORITY = 2