From d0d869e06b30a1f8b7b539978caa0ed6123f9864 Mon Sep 17 00:00:00 2001 From: Kévin Le Gouguec Date: Wed, 26 Aug 2020 00:17:32 +0200 Subject: Add breadcrumbs Likewise, use relative links so that things work when just browsing files locally without a server. Next: tweak or remove redundant titles. --- repo/www/Makefile | 2 +- repo/www/crumbs.css | 31 +++++++++++++++++++++++++++++++ repo/www/generate-index.py | 9 ++++++--- repo/www/generate-page.py | 8 ++++++-- repo/www/helpers.py | 29 ++++++++++++++++++++++++++++- repo/www/template.html | 5 +++++ 6 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 repo/www/crumbs.css (limited to 'repo') diff --git a/repo/www/Makefile b/repo/www/Makefile index 86d1d98..1f32115 100644 --- a/repo/www/Makefile +++ b/repo/www/Makefile @@ -14,7 +14,7 @@ page_patterns = $(foreach ext,$(EXTENSIONS),'$(TOP_DIR)/**.$(ext)') page_folders = $(call dirnames,$(shell git ls-files $(page_patterns))) top_readme = $(shell git ls-files $(addprefix $(TOP_DIR)/README.,$(EXTENSIONS))) html_template = template.html -stylesheets_src = +stylesheets_src = crumbs.css lua_filters = convert-internal-links.lua all: site diff --git a/repo/www/crumbs.css b/repo/www/crumbs.css new file mode 100644 index 0000000..ef42620 --- /dev/null +++ b/repo/www/crumbs.css @@ -0,0 +1,31 @@ +nav.breadcrumb ol { + padding-left: 0; +} + +nav.breadcrumb li { + /* Prefer inline-block to inline, to prevent wrapping inside + * individual crumbs. */ + display: inline-block; +} + +/* Prefer + * li:not(:last-child)::after + * to + * li + li::before + * as I want crumbs and slashes to wrap like this: + * foo / bar / + * baz + * rather than like that: + * foo / bar + * / baz + */ +nav.breadcrumb li:not(:last-child)::after { + margin-left: 0.25em; + height: 0.8em; + font-weight: bold; + content: '/'; +} + +nav.breadcrumb li[aria-current="page"] { + font-weight: bold; +} diff --git a/repo/www/generate-index.py b/repo/www/generate-index.py index d615756..a993c41 100755 --- a/repo/www/generate-index.py +++ b/repo/www/generate-index.py @@ -10,7 +10,7 @@ from tempfile import NamedTemporaryFile from git import Repo -from helpers import deserialize_directories, pandoc +from helpers import deserialize_directories, generate_crumbs, pandoc def parse_arguments(): @@ -102,6 +102,7 @@ def main(arguments): path_to_top = '.' stylesheets = (path.join(path_to_top, s) for s in arguments.css) + variables = {'crumbs': generate_crumbs(Path(target)/'index')} if readme is not None: repo_top = Repo(search_parent_directories=True).working_dir @@ -118,7 +119,8 @@ def main(arguments): pandoc(readme_path, arguments.output, arguments.template, arguments.filters, stylesheets, title=page_title, - site_title=arguments.site_title, include_after=(toc.name,)) + site_title=arguments.site_title, include_after=(toc.name,), + variables=variables) return with NamedTemporaryFile(suffix='.md') as dummy_readme, \ @@ -128,7 +130,8 @@ def main(arguments): pandoc(dummy_readme.name, arguments.output, arguments.template, arguments.filters, stylesheets, title=index_title, - site_title=arguments.site_title, include_after=(toc.name,)) + site_title=arguments.site_title, include_after=(toc.name,), + variables=variables) if __name__ == '__main__': diff --git a/repo/www/generate-page.py b/repo/www/generate-page.py index e200a9e..8036cc5 100755 --- a/repo/www/generate-page.py +++ b/repo/www/generate-page.py @@ -2,10 +2,11 @@ from argparse import ArgumentParser from os import path +from pathlib import Path from git import Repo -from helpers import pandoc +from helpers import generate_crumbs, pandoc def parse_arguments(): @@ -41,6 +42,8 @@ def main(arguments): path_to_top = path.relpath(repo_top, path.dirname(arguments.page)) stylesheets = (path.join(path_to_top, s) for s in arguments.css) + page_path = Path(arguments.page).resolve().relative_to(repo_top) + pandoc( arguments.page, arguments.output, @@ -48,7 +51,8 @@ def main(arguments): arguments.filters, stylesheets, title=arguments.title, - site_title=arguments.site_title + site_title=arguments.site_title, + variables={'crumbs': generate_crumbs(page_path)} ) diff --git a/repo/www/helpers.py b/repo/www/helpers.py index 9b97902..80b8857 100644 --- a/repo/www/helpers.py +++ b/repo/www/helpers.py @@ -57,7 +57,7 @@ def deserialize_directories(directories): def pandoc(page, output, template, filters, stylesheets, title=None, - site_title=None, include_after=()): + site_title=None, include_after=(), variables=None): cmd = ( 'pandoc', '-s', page, '-o', output, '--template', template, *chain(*(('--lua-filter', f) for f in filters)), @@ -69,6 +69,33 @@ def pandoc(page, output, template, filters, stylesheets, title=None, cmd += ('-M', f'title={title}') if site_title is not None: cmd += ('-T', site_title) + if variables is not None: + cmd += tuple(chain( + *(('-V', f'{k}={v}') for k, v in variables.items()) + )) environ['LUA_PATH'] = '.cache/?.lua;;' run(cmd, check=True) + + +def generate_crumbs(target): + parts = ('(top)', *target.parts) + + if parts[-1] == 'index': + *crumbs, current = parts[:-1] + else: + crumbs = parts[:-1] + current, _ = path.splitext(parts[-1]) + + crumbs_li = ( + '
  • {crumb}
  • '.format( + link=(path.relpath(path.join(*crumbs[1:i], 'index.html'), + start=target.parent)), + crumb=crumb + ) + for i, crumb in enumerate(crumbs, start=1) + ) + + current_li = f'
  • {current}
  • ' + + return '\n'.join((*crumbs_li, current_li)) diff --git a/repo/www/template.html b/repo/www/template.html index 724cde4..f2b308d 100644 --- a/repo/www/template.html +++ b/repo/www/template.html @@ -33,6 +33,11 @@ $include-before$ $endfor$ $if(title)$
    +

    $title$

    $if(subtitle)$

    $subtitle$

    -- cgit v1.2.3