-
Notifications
You must be signed in to change notification settings - Fork 0
/
kbd.py
121 lines (98 loc) · 3.54 KB
/
kbd.py
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
120
121
"""
Adapter for https://github.com/trailjeep/keyboard
Cheatsheets are located in `pages/*/`
Each cheat sheet is a separate file with extension .md
The pages are formatted with a markdown dialect
"""
# pylint: disable=relative-import,abstract-method
import re
import os
from .git_adapter import GitRepositoryAdapter
class Kbd(GitRepositoryAdapter):
"""
trailjeep/keyboard
"""
_adapter_name = "kbd"
_output_format = "text"
_cache_needed = True
_repository_url = "https://github.com/trailjeep/keyboard"
_cheatsheet_files_prefix = "pages/*/"
_cheatsheet_files_extension = ".md"
@staticmethod
def _format_page(text):
"""
Trivial Bastardized Markdown implementation.
* Header goes until the first empty line after > prefixed lines.
"""
answer = []
skip_empty = True
header = 2
for line in text.splitlines():
if line.strip() == '':
if skip_empty and not header:
continue
if header == 1:
header = 0
if header:
continue
else:
skip_empty = False
if line.startswith('-'):
line = '# '+line[2:]
elif line.startswith('> '):
if header == 2:
header = 1
line = '# '+line[2:]
skip_empty = False
elif line.startswith('`') and line.endswith('`'):
line = line[1:-1]
line = re.sub(r'{{(.*?)}}', r'\1', line)
elif line == "|Shortcut|Description|":
continue
elif line == "|:--|:--|":
continue
if line.__contains__("<kbd>") and line.__contains__("</kbd>"):
# bracketed
line = line.replace("<kbd>", "[").replace("</kbd>", "]")
# colored
#line = line.replace("<kbd>", '\033[30;1;4m\033[46m').replace("</kbd>", '\033[0m')
if line.startswith('|') and line.endswith('|'):
line = line[1:-1]
line = line.strip()
dtdd = line.split("|")
line = ("{:<20}{:<20}".format(*dtdd))
answer.append(line)
return "\n".join(answer)
def _get_page(self, topic, request_options=None):
"""
Go through pages/{common,linux,osx,sunos,windows}/
and as soon as anything is found, format and return it.
"""
search_order = ['common', 'linux', 'osx', 'sunos', 'windows', "android"]
local_rep = self.local_repository_location()
ext = self._cheatsheet_files_extension
filename = None
for subdir in search_order:
_filename = os.path.join(
local_rep, 'pages', subdir, "%s%s" % (topic, ext))
if os.path.exists(_filename):
filename = _filename
break
if filename:
answer = self._format_page(open(filename, 'r').read())
else:
# though it should not happen
answer = ''
return answer
@classmethod
def get_updates_list(cls, updated_files_list):
"""
If a .md file was updated, invalidate cache
entry with the name of this file
"""
answer = []
ext = cls._cheatsheet_files_extension
for entry in updated_files_list:
if entry.endswith(ext):
answer.append(entry.split('/')[-1][:-len(ext)])
return answer