Hide keyboard shortcuts

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