Commit 592bd11e4114bfe3857b14d8f300ac7330bc9684
1 parent
d4557086
Exists in
master
and in
1 other branch
- added tools.py
Showing
1 changed file
with
81 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,81 @@ | @@ -0,0 +1,81 @@ | ||
1 | + | ||
2 | +import subprocess | ||
3 | +import logging | ||
4 | +import yaml | ||
5 | +import markdown | ||
6 | + | ||
7 | +# setup logger for this module | ||
8 | +logger = logging.getLogger(__name__) | ||
9 | + | ||
10 | +# --------------------------------------------------------------------------- | ||
11 | +# load data from yaml file | ||
12 | +# --------------------------------------------------------------------------- | ||
13 | +def load_yaml(filename, default=None): | ||
14 | + try: | ||
15 | + f = open(filename, 'r', encoding='utf-8') | ||
16 | + except IOError: | ||
17 | + logger.error('Can\'t open file "{}"'.format(filename)) | ||
18 | + return default | ||
19 | + else: | ||
20 | + with f: | ||
21 | + try: | ||
22 | + return yaml.load(f) | ||
23 | + except yaml.YAMLError as e: | ||
24 | + mark = e.problem_mark | ||
25 | + logger.error('In YAML file "{0}" near line {1}, column {2}.'.format(filename, mark.line, mark.column+1)) | ||
26 | + return default | ||
27 | + | ||
28 | +# --------------------------------------------------------------------------- | ||
29 | +# Runs a script and returns its stdout parsed as yaml, or None on error. | ||
30 | +# Note: requires python 3.5+ | ||
31 | +# --------------------------------------------------------------------------- | ||
32 | +def run_script(script, stdin='', timeout=5): | ||
33 | + try: | ||
34 | + p = subprocess.run([script], | ||
35 | + input=stdin, | ||
36 | + stdout=subprocess.PIPE, | ||
37 | + stderr=subprocess.STDOUT, | ||
38 | + universal_newlines=True, | ||
39 | + timeout=timeout, | ||
40 | + ) | ||
41 | + except FileNotFoundError: | ||
42 | + logger.error('Script not found: "{0}".'.format(script)) | ||
43 | + except PermissionError: | ||
44 | + logger.error('Script "{0}" not executable (wrong permissions?).'.format(script)) | ||
45 | + except subprocess.TimeoutExpired: | ||
46 | + logger.error('Timeout {0}s exceeded while running script "{1}"'.format(timeout, script)) | ||
47 | + else: | ||
48 | + if p.returncode != 0: | ||
49 | + logger.error('Script "{0}" returned error code {1}.'.format(script, p.returncode)) | ||
50 | + else: | ||
51 | + try: | ||
52 | + output = yaml.load(p.stdout) | ||
53 | + except: | ||
54 | + logger.error('Error parsing yaml output of script "{0}"'.format(script)) | ||
55 | + else: | ||
56 | + return output | ||
57 | + | ||
58 | +def md_to_html(text, ref=None, files={}): | ||
59 | + if ref is not None: | ||
60 | + # given q['ref'] and q['files'] replaces references to files by a | ||
61 | + # GET to /file?ref=???;name=??? | ||
62 | + for k in files: | ||
63 | + text = text.replace(k, '/file?ref={};name={}'.format(ref, k)) | ||
64 | + return markdown.markdown(text, extensions=[ | ||
65 | + 'markdown.extensions.tables', | ||
66 | + 'markdown.extensions.fenced_code', | ||
67 | + 'markdown.extensions.codehilite', | ||
68 | + 'markdown.extensions.def_list', | ||
69 | + 'markdown.extensions.sane_lists' | ||
70 | + ]) | ||
71 | + | ||
72 | +def md_to_html_review(text, q): | ||
73 | + for k,f in q['files'].items(): | ||
74 | + text = text.replace(k, '/absfile?name={}'.format(q['files'][k])) | ||
75 | + return markdown.markdown(text, extensions=[ | ||
76 | + 'markdown.extensions.tables', | ||
77 | + 'markdown.extensions.fenced_code', | ||
78 | + 'markdown.extensions.codehilite', | ||
79 | + 'markdown.extensions.def_list', | ||
80 | + 'markdown.extensions.sane_lists' | ||
81 | + ]) |