summaryrefslogtreecommitdiff
path: root/hack/markdown-preprocess
blob: 578615845557a5e4e49af37fb6bac0dfa6d0f028 (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
#
# markdown-preprocess - filter *.md.in files, convert to .md
#

import glob
import os
import sys

def main():
    try:
        os.chdir("docs/source/markdown")
    except FileNotFoundError:
        raise Exception("Please invoke me from the base repo dir")

    # If called with args, process only those files
    infiles = [ os.path.basename(x) for x in sys.argv[1:] ]
    if len(infiles) == 0:
        # Called without args: process all *.md.in files
        infiles = glob.glob('*.md.in')
    for infile in infiles:
        process(infile)

def process(infile):
    # Some options are the same between containers and pods; determine
    # which description to use from the name of the source man page.
    pod_or_container = 'container'
    if '-pod-' in infile:
        pod_or_container = 'pod'

    # Sometimes a man page includes the subcommand.
    subcommand = removesuffix(removeprefix(infile,"podman-"),".1.md.in").replace("-", " ")

    # foo.md.in -> foo.md -- but always write to a tmpfile
    outfile = os.path.splitext(infile)[0]
    outfile_tmp = outfile + '.tmp.' + str(os.getpid())

#    print("got here: ",infile, " -> ", outfile)

    with open(infile, 'r') as fh_in, open(outfile_tmp, 'w') as fh_out:
        for line in fh_in:
            # '@@option foo' -> include file options/foo.md
            if line.startswith('@@option '):
                _, optionname = line.strip().split(" ")
                optionfile = os.path.join("options", optionname + '.md')
                fh_out.write("[//]: # (BEGIN included file " + optionfile + ")\n")
                with open(optionfile, 'r') as fh_optfile:
                    for opt_line in fh_optfile:
                        opt_line = opt_line.replace('<POD-OR-CONTAINER>', pod_or_container)
                        opt_line = opt_line.replace('<SUBCOMMAND>', subcommand)
                        fh_out.write(opt_line)

                    # Weird special case: options/image-volume.md ends in a
                    # list, and in markdown lists are continued across lines,
                    # so without an intervening blank line the '[//]' comment
                    # becomes part of the final list entry.
                    if opt_line.startswith('-'):
                        fh_out.write("\n")

                fh_out.write("[//]: # (END   included file " + optionfile + ")\n")
            else:
                fh_out.write(line)

    os.chmod(outfile_tmp, 0o444)
    os.rename(outfile_tmp, outfile)

# str.removeprefix() is python 3.9+, we need to support older versions on mac
def removeprefix(string: str, prefix: str) -> str:
    if string.startswith(prefix):
        return string[len(prefix):]
    else:
        return string[:]

# str.removesuffix() is python 3.9+, we need to support older versions on mac
def removesuffix(string: str, suffix: str) -> str:
    # suffix='' should not call self[:-0].
    if suffix and string.endswith(suffix):
        return string[:-len(suffix)]
    else:
        return string[:]


if __name__ == "__main__":
    main()