clean up makefile and support recursive [[!inline]]
[libreriscv.git] / openpower / mdwn_inline.py
1 #!/usr/bin/env python3
2 import sys
3 import os.path
4 from io import StringIO
5
6 deps_only = sys.argv[1] == '--deps'
7
8 if deps_only:
9 del sys.argv[1]
10
11 opened_files = []
12
13 def open_tracked(name, mode='r'):
14 opened_files.append(name)
15 try:
16 return open(name, mode)
17 except FileNotFoundError:
18 if deps_only:
19 return StringIO("")
20 raise
21
22 output_file = sys.argv[2]
23 try:
24 os.remove(output_file)
25 except FileNotFoundError:
26 pass
27 temp_output_file = output_file + '.tmp'
28 file_path = os.path.abspath(__file__)
29 openpower_path = os.path.split(file_path)[0]
30 wiki_path = os.path.split(openpower_path)[0]
31 def body(o, print=print):
32 def recursive_inline(f, input_name, depth):
33 assert depth < 10, "probably found an [[!inline]]-loop"
34 for line in f.readlines():
35 if input_name.endswith("comparison_table.tex") and \
36 line.startswith("\begin{itemize}"):
37 o.write(line)
38 o.write("\\itemsep -0.3em\n")
39 continue
40 if not line.startswith("[[!inline"):
41 o.write(line)
42 continue
43 print(line.strip())
44 # assume first thing is pagename
45 line = line.split('"')
46 fname = line[1]
47 print(f"\tdepth={depth}: {fname}")
48 if fname.endswith(".py"):
49 if fname.startswith("gf_reference"):
50 with open_tracked(
51 wiki_path + "/../nmigen-gf/" + fname) as inc:
52 recursive_inline(inc, fname, depth + 1)
53 else:
54 with open_tracked(wiki_path + "/" + fname) as inc:
55 recursive_inline(inc, fname, depth + 1)
56 else:
57 if fname.endswith(".mdwn"):
58 with open_tracked(wiki_path + "/" + fname) as inc:
59 recursive_inline(inc, fname, depth + 1)
60 elif fname == 'openpower/isatables/fields.text':
61 with open_tracked(
62 wiki_path + "/../openpower-isa/" + fname) as inc:
63 recursive_inline(inc, fname, depth + 1)
64 else:
65 with open_tracked(
66 wiki_path + "/" + fname + ".mdwn") as inc:
67 recursive_inline(inc, fname, depth + 1)
68
69 with open_tracked(sys.argv[1], "r") as f:
70 recursive_inline(f, sys.argv[1], 0)
71
72 if deps_only:
73 with StringIO() as o:
74 body(o, print=lambda *_: None)
75 deps_file = output_file + '.d'
76 with open(deps_file, "w") as o:
77 deps = " ".join(opened_files)
78 o.write(f"{output_file} {deps_file}: {deps}\n")
79 else:
80 with open(temp_output_file, "w") as o:
81 body(o)
82 os.rename(temp_output_file, output_file)