-
Notifications
You must be signed in to change notification settings - Fork 0
/
querycommands.py
99 lines (87 loc) · 3.32 KB
/
querycommands.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
import argparse
from glob import glob
from os.path import dirname
from jinja2 import Environment, FileSystemLoader
def parse_doc(doc):
sections = {}
current_section = None
for line in doc.split('\n'):
if line.startswith('Usage:') or line.startswith('Description:') or \
line.startswith('Example:') or line.startswith('Permissions:'):
# section start
line_parts = line.split(':')
section = line_parts[0]
initial_data = []
if len(line_parts) > 1:
line_data = ''.join(line_parts[1:])
if line_data:
initial_data = [line_data.strip()]
sections.setdefault(section, initial_data)
current_section = section
else:
if not current_section:
# discard data because there's no section for it
continue
# data
line = line.strip()
if line:
sections[current_section].append(line)
if 'Usage' not in sections:
return None, None, None, None
usage_data = sections['Usage'][0].split(maxsplit=1)
command = usage_data[0]
args = usage_data[1] if len(usage_data) > 1 else None
return command, ' '.join(sections.get('Description', [])), args, \
', '.join(sections.get('Permissions', []))
def parse(query_docs):
commands = {}
for query_file in glob(query_docs):
with open(query_file, 'r') as f:
command, description, args, permissions = parse_doc(f.read())
if command is not None and args is not None:
commands[command] = {
'description': description or '',
'arguments': args,
'permissions': permissions
}
return commands
def render(
query_commands, output, template='query.jinja2',
columns=['arguments', 'description', 'permissions']
):
template_loader = FileSystemLoader(dirname(__file__))
template_env = Environment(loader=template_loader)
template = template_env.get_template(template)
with open(output, 'w') as f:
f.write(template.render(
commands=sorted(query_commands.items(), key=lambda i: i[0]),
columns=columns
))
def main(query_docs, output, template='query.jinja2',
columns=['arguments', 'description', 'permissions']):
commands = parse(query_docs)
render(commands, output, template, columns)
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Visualize Teamspeak Query-docs')
parser.add_argument(
'-p', '--path',
help='(globbing) path to serverquerydocs/',
required=True
)
parser.add_argument(
'-o', '--output', help='Output-path', default='query.html'
)
parser.add_argument(
'-t', '--template', help='Template', default='query.jinja2'
)
parser.add_argument(
'-ec', '--excludecolumn', help='Exclude column from output',
action='append'
)
args = parser.parse_args()
default_columns = ['arguments', 'description', 'permissions']
main(args.path, args.output, args.template, [
column for column in default_columns
if column not in args.excludecolumn
] if args.excludecolumn else default_columns)