summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xrepo/www/generate-index.py79
-rw-r--r--repo/www/helpers.py6
2 files changed, 44 insertions, 41 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__':
diff --git a/repo/www/helpers.py b/repo/www/helpers.py
index f76fa02..afdb64b 100644
--- a/repo/www/helpers.py
+++ b/repo/www/helpers.py
@@ -56,10 +56,12 @@ def deserialize_directories(directories):
}
-def pandoc(page, output, template, filters, title=None, site_title=None):
+def pandoc(page, output, template, filters, title=None, site_title=None,
+ include_after=()):
cmd = (
'pandoc', '-s', page, '-o', output, '--template', template,
- *chain(*(('--lua-filter', f) for f in filters))
+ *chain(*(('--lua-filter', f) for f in filters)),
+ *chain(*(('--include-after-body', f) for f in include_after))
)
if title is not None: