-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate.py
executable file
·100 lines (84 loc) · 3.28 KB
/
generate.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
#!/usr/bin/env python3
from datetime import datetime
import jinja2
import os
import subprocess
from syllabus_processor import SyllabusProcessor
import sys
from tempfile import NamedTemporaryFile
SYLLABUS_FILENAME = 'syllabus.md'
syllabuses = {}
class Syllabus:
def __init__(self, name):
self.name = name
self.files = {}
def add_syllabus(result, relpath, output_dir):
folders = splitpath(relpath)
s = Syllabus(folders[-1])
dest = os.path.join(output_dir, relpath)
os.makedirs(dest, exist_ok=True)
training_card_filename = '{}-training-card.pdf'.format(folders[-1].replace(' ', '-'))
s.files[s.name + ' training card'] = os.path.join(relpath, training_card_filename)
compile_tex(result.card, os.path.join(dest, training_card_filename))
training_doc_filename = '{}-training-doc.pdf'.format(folders[-1].replace(' ', '-'))
s.files[s.name + ' training doc'] = os.path.join(relpath, training_doc_filename)
compile_tex(result.doc, os.path.join(dest, training_doc_filename))
s.version = result.version
s.commit_date = result.commit_date
nested_set(syllabuses, folders, s)
def compile_tex(tex_string, destination_filename):
# TODO: create a whole temp directory so we can cleanup after pdflatex
with NamedTemporaryFile('w', encoding='utf-8') as f:
f.write(tex_string)
f.flush()
for i in range(5):
try:
output = subprocess.check_output(
[
'pdflatex',
'-interaction=nonstopmode',
'-output-directory=' + os.path.dirname(destination_filename),
'-jobname=' + os.path.splitext(os.path.basename(destination_filename))[0],
f.name
],
timeout=5
)
except subprocess.CalledProcessError as e:
print(e.output.decode())
raise
if not 'Rerun LaTeX' in str(output):
break
def generate(syallabus_dir, output_dir):
for root, dirs, files in os.walk(syallabus_dir):
relpath = os.path.relpath(root, syallabus_dir)
if SYLLABUS_FILENAME in files:
dirs.clear()
sp = SyllabusProcessor(root)
result = sp.generate()
if result.success:
add_syllabus(result, relpath, output_dir)
env = jinja2.Environment(loader = jinja2.FileSystemLoader(os.path.abspath('.')), extensions=['jinja2.ext.do'])
site_template = env.get_template('training-site.tmpl')
with open(os.path.join(output_dir, 'index.html'), 'w', encoding='utf-8') as f:
f.write(site_template.render(syllabuses = syllabuses, timestr = datetime.utcnow()))
def nested_set(dic, keys, value):
for key in keys[:-1]:
dic = dic.setdefault(key, {})
dic[keys[-1]] = value
def splitpath(path):
folders = []
while True:
path, folder = os.path.split(path)
if folder != '':
folders.append(folder)
else:
if path != '':
folders.append(path)
break
folders.reverse()
return folders
if __name__ == "__main__":
if len(sys.argv) < 3:
print("Usage: {} <syllabus_dir> <output_dir>".format(sys.argv[0]))
sys.exit()
generate(sys.argv[1], sys.argv[2])