#!/usr/bin/env python3 # This script constructs a Markdown file (on standard output) that constitutes # an index of all web-rendered pages of Dex examples, documentation, and # libraries. # The rendered HTML of the index is meant to be placed at the root of the Dex # page tree, so that relative links work. # The script accepts three arguments: # - One argument containing a space-separated list of documentation files # - One argument containing a space-separated list of example files # - One argument containing a space-separated list of library files # TODO: Right now, the indexing script requires every file to have a single # title, identified by having a "'# " line in the Dex source. We should # detect when a file lacks such a title and fail loudly, instead of just # omitting that file from the index. import re import sys def file_block(files): for fname in files: if fname.startswith("doc/"): link_name = fname[len("doc/"):-len(".dx")] else: link_name = fname[:-len(".dx")] with open(fname, 'r') as f: line = f.readline() title = re.match(r"' *# ?(.*)", line) if title: print(f"- [{fname}]({link_name}.html) {title.group(1)}") else: raise ValueError(f"First line of file {fname} was not a title (top-level Markdown heading)") def main(): docs, examples, libraries = sys.argv[1:4] print("# InDex"); print("") print("## Documentation"); print("") file_block(docs.split()) print(""); print("## Examples"); print("") file_block(examples.split()) print(""); print("## Libraries"); print("") print("- [lib/prelude.dx](lib/prelude.html): The Dex Prelude (automatically imported)") file_block(libraries.split()) if __name__ == '__main__': main()