aboutsummaryrefslogtreecommitdiff
path: root/bin/make_redirects
diff options
context:
space:
mode:
Diffstat (limited to 'bin/make_redirects')
-rwxr-xr-xbin/make_redirects78
1 files changed, 78 insertions, 0 deletions
diff --git a/bin/make_redirects b/bin/make_redirects
new file mode 100755
index 0000000..a26b871
--- /dev/null
+++ b/bin/make_redirects
@@ -0,0 +1,78 @@
+#!/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"
+
+HTML_MARKER_START = "<!-- BEGIN AUTO-GENERATED REDIRECTS -->\n"
+HTML_MARKER_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)):
+ assert os.path.isfile(os.path.join(spec_dir, kwd, "index.md"))
+ assert info.get('implicit')
+ continue
+ elif any((os.path.isfile(os.path.join(spec_dir, kwd) + ext)) for ext in [".txt", ".md"]):
+ assert info.get('implicit')
+ continue
+ else:
+ assert not info.get('implicit')
+ source = kwd + ".html"
+ target = info['target']
+ lines.append(
+ f'"/{source}" = "{target}"\n'
+ )
+ return "".join(lines)
+
+def permalinks_redirects(rs):
+ lines = [ "<dl>\n" ]
+ for kwd, info in rs.items():
+ target = info['target']
+ desc = info['description']
+ lines.append(f'<dt><code>/{kwd}</code></dt>\n')
+ lines.append(f'<dd><a href="{target}"><code>{target}</code> ({desc})</a></dt>\n')
+
+ lines.append("</dl>\n")
+ return "".join(lines)
+
+def proposal_redirects(proposals_dir):
+ lines = []
+ for fname in os.listdir(proposals_dir):
+ m = re.match(r'^(\d+)-.*\.(?:md|txt)$', fname)
+ if m:
+ source = m.group(1) + ".html"
+ target, targetext = os.path.splitext(fname)
+ if targetext == '.md':
+ targetext = ".html"
+ lines.append(f'"/{source}" = "./{target}{targetext}"\n')
+ lines.sort()
+ return "".join(lines)
+
+if __name__ == '__main__':
+ toplevel = os.path.join(os.path.dirname(sys.argv[0]), "..")
+ spec_book_fname = os.path.join(toplevel, "mdbook", "spec", "book.toml")
+ spec_dir = os.path.join(toplevel, "spec")
+ permalinks_fname = os.path.join(toplevel, "spec", "permalinks.md")
+ prop_dir = os.path.join(toplevel, "proposals")
+ prop_book_fname = os.path.join(toplevel, "mdbook", "proposals", "book.toml")
+ yaml_fname = os.path.join(toplevel, "mdbook", "spec", "spec-redirects.yaml")
+
+ rs = yaml.load(open(yaml_fname), yaml.Loader)['redirects']
+
+ update_file(spec_book_fname, BOOK_START, BOOK_END, book_redirects(rs, spec_dir))
+ update_file(permalinks_fname, HTML_MARKER_START, HTML_MARKER_END, permalinks_redirects(rs))
+ update_file(prop_book_fname, BOOK_START, BOOK_END, proposal_redirects(prop_dir))