From 72ed1b208d4fd148ea45e56f1d2b2378790f7d7d Mon Sep 17 00:00:00 2001 From: Kévin Le Gouguec Date: Thu, 16 Apr 2020 23:35:30 +0200 Subject: Touch up web page titles Still a few wrinkles to iron out, e.g. the toplevel page's . --- repo/www/generate-index.py | 99 ++++++++++++++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 35 deletions(-) (limited to 'repo/www/generate-index.py') 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()) -- cgit v1.2.3