summaryrefslogtreecommitdiff
path: root/repo/www/generate-index.py
blob: acbeb52f98850aaa5f0a3b1130e62acfab5119b8 (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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env python3

from argparse import ArgumentParser
import json
from os import path
from subprocess import run

from git import Repo

from helpers import deserialize_directories


def parse_arguments():
    parser = ArgumentParser()
    parser.add_argument(
        'site_tree', help='JSON file describing the page tree.'
    )
    parser.add_argument(
        'target', help='Pathspec to generate an index for.'
    )
    parser.add_argument(
        'output', help='Path to the output file.'
    )
    return parser.parse_args()


def list_files(tree_file, folder):
    with open(tree_file) as tree:
        directories = deserialize_directories(json.load(tree))
    return directories[folder].subfolders, directories[folder].files


def generate_index_page(title, directories, files, intro_text):
    dir_list = '\n'.join(
        f'- [{d}/]({d}/index.html)' for d in directories
    )

    file_list = '\n'.join(
        f'- [{f}]({f}.html)' for f in files
    )

    return f'''\
% {title}

{intro_text}

{dir_list}
{file_list}
'''

def convert_page(content, output):
    run(
        ('pandoc', '-s', '-o', output), input=content, check=True, text=True
    )


def main(arguments):
    target = arguments.target

    folders, files = list_files(arguments.site_tree, target)

    names = []
    intro_text = ''

    repo = Repo(search_parent_directories=True)

    for f in files:
        name, _ = path.splitext(f)
        if name == 'README':
            with open(path.join(repo.working_dir, target, f)) as intro:
                intro_text = intro.read()
        else:
            names.append(name)

    title = path.basename(target) if target else 'index'

    convert_page(
        generate_index_page(title, folders, names, intro_text),
        arguments.output
    )


if __name__ == '__main__':
    main(parse_arguments())