diff options
Diffstat (limited to 'repo/www/generate-index.py')
| -rwxr-xr-x | repo/www/generate-index.py | 79 |
1 files changed, 40 insertions, 39 deletions
diff --git a/repo/www/generate-index.py b/repo/www/generate-index.py index 316a0f3..116a454 100755 --- a/repo/www/generate-index.py +++ b/repo/www/generate-index.py @@ -42,32 +42,15 @@ def list_files(tree_file, folder): return directories[folder].subfolders, directories[folder].files -def has_title(markdown): +def has_title(document_path): pandoc = run( - ('pandoc', '-t', 'json'), input=markdown, + ('pandoc', '-t', 'json', document_path), check=True, text=True, capture_output=True ) ast = json.loads(pandoc.stdout) return 'title' in ast['meta'] -def format_readme_index(readme, title, items): - blocks = [ - readme, - f'# {title}', - items - ] - - if not has_title(readme): - blocks.insert(0, '% README') - - return '\n\n'.join(blocks) - - -def format_plain_index(title, items): - return '\n'.join((f'% {title}', items)) - - def list_pages(files): readme = None pages = [] @@ -83,39 +66,57 @@ def list_pages(files): return pages, readme -# TODO: use pandoc's --include-after-body, so that this works with -# non-markdown READMEs. -def format_index(target, directories, files): - pages, readme = list_pages(files) +def format_toc(directories, pages): + dir_template = '<li><a href="{d}/index.html">{d}/</a></li>' + page_template = '<li><a href="{p}.html">{p}</a></li>' dir_list = ( - f'- [{d}/]({d}/index.html)' for d in directories + dir_template.format(d=d) for d in directories ) page_list = ( - f'- [{p}]({p}.html)' for p in pages + page_template.format(p=p) for p in pages ) - items = '\n'.join(chain(dir_list, page_list)) - - title = f'Index for {target}' if target else 'Index' - if readme is None: - return format_plain_index(title, items) - - repo_top = Repo(search_parent_directories=True).working_dir - intro = Path(repo_top, target, readme).read_text() - return format_readme_index(intro, title, items) + return '\n'.join(( + '<ul>', *chain(dir_list, page_list), '</ul>' + )) def main(arguments): target = arguments.target folders, files = list_files(arguments.site_tree, target) + pages, readme = list_pages(files) + + html_toc = format_toc(folders, pages) + + index_title = f'Index for {target}' if target else 'Index' + + if readme is not None: + repo_top = Repo(search_parent_directories=True).working_dir + readme_path = Path(repo_top, target, readme) + + # If the README doesn't have a title, give a default to pandoc + # out-of-band. + page_title = None if has_title(readme_path) else 'README' + + with NamedTemporaryFile(mode='w+') as toc: + toc.write('<h1>{title}</h1>\n'.format(title=index_title)) + toc.write(html_toc) + toc.flush() + + pandoc(readme_path, arguments.output, arguments.template, + arguments.filters, site_title=arguments.site_title, + title=page_title, include_after=(toc.name,)) + return - with NamedTemporaryFile(suffix='.md', mode='w+') as page: - page.write(format_index(target, folders, files)) - page.flush() + with NamedTemporaryFile(suffix='.md') as dummy_readme, \ + NamedTemporaryFile(mode='w+') as toc: + toc.write(html_toc) + toc.flush() - pandoc(page.name, arguments.output, arguments.template, - arguments.filters, site_title=arguments.site_title) + pandoc(dummy_readme.name, arguments.output, arguments.template, + arguments.filters, site_title=arguments.site_title, + title=index_title, include_after=(toc.name,)) if __name__ == '__main__': |
