diff options
Diffstat (limited to 'repo/www')
| -rw-r--r-- | repo/www/Makefile | 9 | ||||
| -rw-r--r-- | repo/www/TODO | 7 | ||||
| -rwxr-xr-x | repo/www/generate-index.py | 99 |
3 files changed, 75 insertions, 40 deletions
diff --git a/repo/www/Makefile b/repo/www/Makefile index fdc0112..3c5f813 100644 --- a/repo/www/Makefile +++ b/repo/www/Makefile @@ -1,6 +1,9 @@ TOP_DIR = ../.. OUT_DIR = $(TOP_DIR)/public TEXT_FILES = md org +# make does not care about unpaired single quotes (nor double quotes +# for that matter) but Emacs does. Shell out. +TITLE = $(shell echo "peniblec's memleaks") dirname = $(patsubst %/,%,$(dir $(1))) dirnames = $(sort $(call dirname,$(1))) @@ -31,13 +34,13 @@ site: $(pages) $(indices) $(call dirnames,$(pages) $(indices)): mkdir -p $@ -$(pages): - pandoc -s $< -o $@ +$(pages): $(OUT_DIR)/%.html: + pandoc -s $< -o $@ -T "$(TITLE)" -M title="$*" # ⚠ When tweaking this rule, check whether it still works for the # top-level index.html. $(indices): $(OUT_DIR)/%index.html: - ./generate-index.py $(site_tree) "$(patsubst %/,%,$*)" $@ + ./generate-index.py $(site_tree) "$(TITLE)" "$(patsubst %/,%,$*)" $@ clean: -rm $(dependencies) diff --git a/repo/www/TODO b/repo/www/TODO index 55741c9..09adbae 100644 --- a/repo/www/TODO +++ b/repo/www/TODO @@ -1,8 +1,11 @@ -- set HTML title to "${blog_title} - ${folder}" +- fix redundant title prefix on toplevel index page - compute "leak count" on toplevel index - autogenerate nav - autogenerate breadcrumbs - get stylin' - pandoc template - tufte css? at least sidenotes rather than footnotes -- use tags somehow +- use tags somehow (eg to fill in the "keywords" metadata in pandoc template) +- add author +- add creation & last update dates +- link to history 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()) |
