#!/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 = "\n" HTML_MARKER_END = "\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 = [ "
\n" ] for kwd, info in rs.items(): target = info['target'] desc = info['description'] lines.append(f'
/{kwd}
\n') lines.append(f'
{target} ({desc})\n') lines.append("
\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))