summaryrefslogtreecommitdiffstats
path: root/docs/build_website.py
blob: 7e04cc7bf164ec832872be114eb042321ba83c20 (plain)
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
#!/usr/bin/env python3
import glob
import itertools
from jinja2 import Environment, FileSystemLoader, Markup, select_autoescape, contextfunction
from markdown import markdown
import os
import os.path
import re
import shutil
import yaml

env = Environment(
  loader=FileSystemLoader('templates'),
  autoescape=select_autoescape(['html.j2']),
)

def load_yml_file(fn):
  with open(fn) as f:
    return yaml.load(f)

env.filters['search_id'] = lambda input: input.replace(r'`', '')
env.filters['section_id'] = lambda input: re.sub(r"[^a-zA-Z0-9_]", '', input)
env.filters['entry_id'] = lambda input: re.sub(r"[ `]", '', input)
env.filters['markdownify'] = lambda input: Markup(markdown(input))
env.filters['no_paragraph'] = lambda input: Markup(re.sub(r"</?p>", '', input))

env.globals['unique_id'] = contextfunction(lambda ctx: str(next(ctx['unique_ctr'])))


env.globals.update(load_yml_file('site.yml'))


env.globals['navigation'] = ['tutorial', 'download', 'manual']

def generate_file(env, fname='content/1.tutorial/default.yml'):
  path, base = os.path.split(fname)
  path = os.path.relpath(path, 'content')
  if path == '.':
    path = ''
    slug = 'index'
    permalink = ''
  else:
    slug = os.path.basename(path)
    permalink = path + '/'

  output_dir = os.path.join('output', path)
  output_path = os.path.join(output_dir, 'index.html')

  template_name = re.sub(r".yml$", '.html.j2', base)

  ctx = load_yml_file(fname)
  ctx.update(unique_ctr=itertools.count(1), permalink=permalink, slug=slug, navitem=path)
  os.makedirs(output_dir, exist_ok=True)
  env.get_template(template_name).stream(ctx).dump(output_path, encoding='utf-8')


def copy_public_files(root=''):
  for f in os.scandir(os.path.join('public', root)):
    src = os.path.join(root, f.name)
    dst = os.path.join('output', src)
    if f.is_dir():
      os.makedirs(dst, exist_ok=True)
      copy_public_files(src)
    else:
      shutil.copyfile(f.path, dst)

copy_public_files()

for fn in glob.glob('content/**/*.yml', recursive=True):
  generate_file(env, fn)