From 2afc313501e43691b251dc04a41ee901de04802c Mon Sep 17 00:00:00 2001 From: Kévin Le Gouguec Date: Wed, 25 Mar 2020 23:11:37 +0100 Subject: Complete READMEs with a page index --- repo/www/Makefile | 10 +++++-- repo/www/TODO | 2 +- repo/www/generate-index.py | 74 +++++++++++++++++++++++++++++++++------------- 3 files changed, 61 insertions(+), 25 deletions(-) (limited to 'repo/www') diff --git a/repo/www/Makefile b/repo/www/Makefile index 7ba566c..913aa65 100644 --- a/repo/www/Makefile +++ b/repo/www/Makefile @@ -1,3 +1,5 @@ +# TODO: set dependencies to scripts correctly + TOP_DIR = ../.. OUT_DIR = $(TOP_DIR)/public TEXT_FILES = md org @@ -23,15 +25,17 @@ site: $(pages) $(indices) $(autoindices) $(page_folders): mkdir -p $@ -$(pages) $(indices): +$(pages): pandoc -s $< -o $@ +$(indices): + python3 generate-index.py "$(TEXT_FILES)" $(dir $<) | pandoc -s > $@ + # ⚠ When tweaking this rule, check whether it still works for the # top-level index.html, i.e. when there is no top-level README. $(autoindices): \ $(OUT_DIR)%/index.html: $(TOP_DIR)% generate-index.py | $(OUT_DIR)% - python3 generate-index.py "$(TEXT_FILES)" "$(*:/%=%)" | \ - pandoc -s > $@ + python3 generate-index.py "$(TEXT_FILES)" $< | pandoc -s > $@ clean: -rm $(dependencies) diff --git a/repo/www/TODO b/repo/www/TODO index 1e1f181..96617e6 100644 --- a/repo/www/TODO +++ b/repo/www/TODO @@ -1,5 +1,5 @@ +- set HTML title to "${blog_title} - ${folder}" - compute "leak count" on toplevel index -- add index to READMEs - autogenerate nav - autogenerate breadcrumbs - get stylin' diff --git a/repo/www/generate-index.py b/repo/www/generate-index.py index 23df192..d4b087c 100755 --- a/repo/www/generate-index.py +++ b/repo/www/generate-index.py @@ -1,48 +1,80 @@ #!/usr/bin/env python3 +from argparse import ArgumentParser from os import path -from sys import argv, exit from git import Repo from helpers import compute_directories -def parse_arguments(args): - if len(args) != 3: - exit(f'Usage: {argv[0]} EXTENSIONS FOLDER') - - return argv[1].split(), argv[2] +def parse_arguments(): + parser = ArgumentParser() + parser.add_argument( + 'extensions', type=str.split, + help='File extensions to consider when recording pages.' + ) + parser.add_argument( + 'target', help='Folder to generate an index for.' + ) + return parser.parse_args() -def list_files(extensions, folder): - directories = compute_directories( - extensions, Repo(search_parent_directories=True) - ) +def list_files(extensions, folder, repo): + directories = compute_directories(extensions, repo) return directories[folder].subfolders, directories[folder].files -def generate_index_page(title, directories, files): - lines = (f'% {title}',) + tuple( +def generate_index_page(title, directories, files, intro_file): + intro_text = '' + if intro_file is not None: + with open(intro_file) as intro: + intro_text = intro.read() + + dir_list = '\n'.join( f'- [{d}/]({d}/index.html)' for d in directories - ) + tuple( + ) + + file_list = '\n'.join( f'- [{f}]({f}.html)' for f in files ) - return '\n'.join(lines) + + return f'''\ +% {title} + +{intro_text} + +{dir_list} +{file_list} +''' def main(arguments): - extensions, folder = parse_arguments(arguments) + repo = Repo(search_parent_directories=True) + + target_path = arguments.target + extensions = arguments.extensions + + target = path.relpath(target_path, repo.working_dir) + if target == '.': + target ='' + + folders, files = list_files(extensions, target, repo) - title = path.basename(folder) if folder else 'index' + names = [] + intro = None - folders, files = list_files(extensions, folder) + for f in files: + name, _ = path.splitext(f) + if name == 'README': + intro = path.join(repo.working_dir, target, f) + else: + names.append(name) - parsed_filenames = (path.splitext(f) for f in files) - names = tuple(name for name, _ in parsed_filenames) + title = path.basename(target) if target else 'index' - print(generate_index_page(title, folders, names)) + print(generate_index_page(title, folders, names, intro)) if __name__ == '__main__': - main(argv) + main(parse_arguments()) -- cgit v1.2.3