aboutsummaryrefslogtreecommitdiff
path: root/mdbook/spec/make_redirects.py
blob: c582505ac9a55de630d18156a2899fe8c910384d (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
#!/usr/bin/env python3

import yaml, os, re, sys

def update_file(fname, start_marker, end_marker, replacement):
    content = list(open(fname, 'r').readlines())
    startline = content.index(start_marker)
    endline = content.index(end_marker)
    assert endline > startline
    content[startline+1:endline] = replacement

    with open(fname+".tmp", 'w') as f:
        f.write("".join(content))
    os.rename(fname+".tmp", fname)

BOOK_START = "# BEGIN AUTO-GENERATED REDIRECTS\n"
BOOK_END = "# END AUTO-GENERATED REDIRECTS\n"

README_START = "<!-- BEGIN AUTO-GENERATED REDIRECTS -->\n"
README_END = "<!-- END AUTO-GENERATED REDIRECTS -->\n"

def book_redirects(rs, spec_dir):
    lines = []
    for kwd, info in rs.items():
        if os.path.isdir(os.path.join(spec_dir, kwd)):
            source = kwd + "/index.html"
        else:
            source = kwd
        target = info['target']
        lines.append(
            f'"/{source}" = "{target}"\n'
        )
    return "".join(lines)

def readme_redirects(rs):
    lines = [ "<dl>\n" ]
    for kwd, info in rs.items():
        target = info['target']
        desc = info['description']
        lines.append(f'<dt><a href="/{kwd}"><code>/{kwd}</code></a></dt>\n')
        lines.append(f'<dd><a href="{target}"><code>{target}</code> ({desc})</a></dt>\n')

    lines.append("</dl>\n")
    return "".join(lines)

if __name__ == '__main__':
    toplevel = os.path.join(os.path.dirname(sys.argv[0]), "..", "..")
    book_fname = os.path.join(toplevel, "mdbook", "spec", "book.toml")
    spec_dir = os.path.join(toplevel, "spec")
    readme_fname = os.path.join(toplevel, "spec", "README.md")
    yaml_fname = os.path.join(toplevel, "mdbook", "spec", "spec-redirects.yaml")

    rs = yaml.load(open(yaml_fname), yaml.Loader)['redirects']

    update_file(book_fname, BOOK_START, BOOK_END, book_redirects(rs, spec_dir))
    update_file(readme_fname, README_START, README_END, readme_redirects(rs))