summaryrefslogtreecommitdiff
path: root/repo/www/generate-index.py
diff options
context:
space:
mode:
Diffstat (limited to 'repo/www/generate-index.py')
-rwxr-xr-xrepo/www/generate-index.py99
1 files changed, 64 insertions, 35 deletions
diff --git a/repo/www/generate-index.py b/repo/www/generate-index.py
index acbeb52..62daf79 100755
--- a/repo/www/generate-index.py
+++ b/repo/www/generate-index.py
@@ -1,8 +1,9 @@
#!/usr/bin/env python3
from argparse import ArgumentParser
+from itertools import chain
import json
-from os import path
+from pathlib import Path
from subprocess import run
from git import Repo
@@ -16,7 +17,10 @@ def parse_arguments():
'site_tree', help='JSON file describing the page tree.'
)
parser.add_argument(
- 'target', help='Pathspec to generate an index for.'
+ 'site_title', help='Title to add to <title>.'
+ )
+ parser.add_argument(
+ 'target', help='Subfolder to generate an index for.'
)
parser.add_argument(
'output', help='Path to the output file.'
@@ -30,55 +34,80 @@ def list_files(tree_file, folder):
return directories[folder].subfolders, directories[folder].files
-def generate_index_page(title, directories, files, intro_text):
- dir_list = '\n'.join(
- f'- [{d}/]({d}/index.html)' for d in directories
- )
-
- file_list = '\n'.join(
- f'- [{f}]({f}.html)' for f in files
+def has_title(markdown):
+ pandoc = run(
+ ('pandoc', '-t', 'json'), input=markdown,
+ check=True, text=True, capture_output=True
)
+ ast = json.loads(pandoc.stdout)
+ return 'title' in ast['meta']
- return f'''\
-% {title}
-
-{intro_text}
-{dir_list}
-{file_list}
-'''
+def format_readme_index(readme, title, items):
+ blocks = [
+ readme,
+ f'# {title}',
+ items
+ ]
-def convert_page(content, output):
- run(
- ('pandoc', '-s', '-o', output), input=content, check=True, text=True
- )
+ if not has_title(readme):
+ blocks.insert(0, '% README')
+ return '\n\n'.join(blocks)
-def main(arguments):
- target = arguments.target
- folders, files = list_files(arguments.site_tree, target)
+def format_plain_index(title, items):
+ return '\n'.join((f'% {title}', items))
- names = []
- intro_text = ''
- repo = Repo(search_parent_directories=True)
+def list_pages(files):
+ readme = None
+ pages = []
for f in files:
- name, _ = path.splitext(f)
- if name == 'README':
- with open(path.join(repo.working_dir, target, f)) as intro:
- intro_text = intro.read()
+ page = Path(f).stem
+
+ if page == 'README':
+ readme = f
else:
- names.append(name)
+ pages.append(page)
+
+ return pages, readme
+
- title = path.basename(target) if target else 'index'
+def format_index(target, directories, files):
+ pages, readme = list_pages(files)
- convert_page(
- generate_index_page(title, folders, names, intro_text),
- arguments.output
+ dir_list = (
+ f'- [{d}/]({d}/index.html)' for d in directories
+ )
+ page_list = (
+ f'- [{p}]({p}.html)' 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)
+
+
+def convert_page(content, output, site_title):
+ run(
+ ('pandoc', '-s', '-o', output, '-T', site_title),
+ input=content, check=True, text=True
)
+def main(arguments):
+ folders, files = list_files(arguments.site_tree, arguments.target)
+ index_page = format_index(arguments.target, folders, files)
+ convert_page(index_page, arguments.output, arguments.site_title)
+
+
if __name__ == '__main__':
main(parse_arguments())