From 1b7eebb3563dab36584247bcab1d8e3b4e78833b Mon Sep 17 00:00:00 2001 From: Kévin Le Gouguec Date: Wed, 25 Mar 2020 18:48:12 +0100 Subject: Split index generation and HTML conversion So that I can re-use generate-index.py for READMEs. --- repo/www/Makefile | 8 ++-- repo/www/generate-deps.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++ repo/www/generate-index.py | 48 ++++++++++++++++++++++++ repo/www/make-deps.py | 91 ---------------------------------------------- repo/www/make-index.py | 54 --------------------------- 5 files changed, 144 insertions(+), 148 deletions(-) create mode 100755 repo/www/generate-deps.py create mode 100755 repo/www/generate-index.py delete mode 100755 repo/www/make-deps.py delete mode 100755 repo/www/make-index.py (limited to 'repo/www') diff --git a/repo/www/Makefile b/repo/www/Makefile index fc25ddb..7ba566c 100644 --- a/repo/www/Makefile +++ b/repo/www/Makefile @@ -15,7 +15,7 @@ all: site dependencies = deps.mk include $(dependencies) -$(dependencies): make-deps.py $(text_folders) +$(dependencies): generate-deps.py $(text_folders) python3 $< "$(TEXT_FILES)" $(OUT_DIR) site: $(pages) $(indices) $(autoindices) @@ -28,8 +28,10 @@ $(pages) $(indices): # ⚠ 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)% make-index.py | $(OUT_DIR)% - python3 make-index.py "$(TEXT_FILES)" "$(*:/%=%)" > $@ +$(autoindices): \ +$(OUT_DIR)%/index.html: $(TOP_DIR)% generate-index.py | $(OUT_DIR)% + python3 generate-index.py "$(TEXT_FILES)" "$(*:/%=%)" | \ + pandoc -s > $@ clean: -rm $(dependencies) diff --git a/repo/www/generate-deps.py b/repo/www/generate-deps.py new file mode 100755 index 0000000..d88d333 --- /dev/null +++ b/repo/www/generate-deps.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 + +"""Write dependencies for all website pages in makefile syntax. + +We want to compute: + +- a list of leaf pages, +- a list of auto-generated indices, +- dependencies for leaf pages: + OUTPUT/foo/bar.html: foo/bar.txt | OUTPUT/foo + - special case for READMEs: + OUTPUT/foo/index.html: foo/README.txt foo | OUTPUT/foo +""" + +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 OUTPUT-DIR') + + return argv[1].split(), argv[2] + + +def pjoin(directory, item): + return ( + path.join(directory, item) + if item # Avoid trailing slash for top-level files. + else directory + ) + + +def write_dependencies(deps_file, directories, top_dir, out_dir): + pages = list() + indices = list() + autoindices = list() + + for dpath, d in directories.items(): + autoindex = True + + src_dir = pjoin(top_dir, dpath) + + for f in d.files: + src_path = path.join(src_dir, f) + + name, _ = path.splitext(f) + deps = [src_path] + target = pages + + if name == 'README': + name = 'index' + deps.append(src_dir) + target = indices + autoindex = False + + html_dir = pjoin(out_dir, dpath) + html_path = path.join(html_dir, name+'.html') + + print(f'{html_path}: {" ".join(deps)} | {html_dir}', file=deps_file) + target.append(html_path) + + if autoindex: + autoindices.append( + path.join(out_dir, dpath, 'index.html') + ) + + print(file=deps_file) + print(f'pages = {" ".join(pages)}', file=deps_file) + print(f'indices = {" ".join(indices)}', file=deps_file) + print(f'autoindices = {" ".join(autoindices)}', file=deps_file) + + +def main(arguments): + extensions, out_dir = parse_arguments(arguments) + + repository = Repo(search_parent_directories=True) + top_dir = path.relpath(repository.working_dir, path.curdir) + + directories = compute_directories(extensions, repository) + + with open('deps.mk', 'w') as deps: + write_dependencies(deps, directories, top_dir, out_dir) + + +if __name__ == '__main__': + main(argv) diff --git a/repo/www/generate-index.py b/repo/www/generate-index.py new file mode 100755 index 0000000..23df192 --- /dev/null +++ b/repo/www/generate-index.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 + +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 list_files(extensions, folder): + directories = compute_directories( + extensions, Repo(search_parent_directories=True) + ) + return directories[folder].subfolders, directories[folder].files + + +def generate_index_page(title, directories, files): + lines = (f'% {title}',) + tuple( + f'- [{d}/]({d}/index.html)' for d in directories + ) + tuple( + f'- [{f}]({f}.html)' for f in files + ) + return '\n'.join(lines) + + +def main(arguments): + extensions, folder = parse_arguments(arguments) + + title = path.basename(folder) if folder else 'index' + + folders, files = list_files(extensions, folder) + + parsed_filenames = (path.splitext(f) for f in files) + names = tuple(name for name, _ in parsed_filenames) + + print(generate_index_page(title, folders, names)) + + +if __name__ == '__main__': + main(argv) diff --git a/repo/www/make-deps.py b/repo/www/make-deps.py deleted file mode 100755 index d88d333..0000000 --- a/repo/www/make-deps.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python3 - -"""Write dependencies for all website pages in makefile syntax. - -We want to compute: - -- a list of leaf pages, -- a list of auto-generated indices, -- dependencies for leaf pages: - OUTPUT/foo/bar.html: foo/bar.txt | OUTPUT/foo - - special case for READMEs: - OUTPUT/foo/index.html: foo/README.txt foo | OUTPUT/foo -""" - -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 OUTPUT-DIR') - - return argv[1].split(), argv[2] - - -def pjoin(directory, item): - return ( - path.join(directory, item) - if item # Avoid trailing slash for top-level files. - else directory - ) - - -def write_dependencies(deps_file, directories, top_dir, out_dir): - pages = list() - indices = list() - autoindices = list() - - for dpath, d in directories.items(): - autoindex = True - - src_dir = pjoin(top_dir, dpath) - - for f in d.files: - src_path = path.join(src_dir, f) - - name, _ = path.splitext(f) - deps = [src_path] - target = pages - - if name == 'README': - name = 'index' - deps.append(src_dir) - target = indices - autoindex = False - - html_dir = pjoin(out_dir, dpath) - html_path = path.join(html_dir, name+'.html') - - print(f'{html_path}: {" ".join(deps)} | {html_dir}', file=deps_file) - target.append(html_path) - - if autoindex: - autoindices.append( - path.join(out_dir, dpath, 'index.html') - ) - - print(file=deps_file) - print(f'pages = {" ".join(pages)}', file=deps_file) - print(f'indices = {" ".join(indices)}', file=deps_file) - print(f'autoindices = {" ".join(autoindices)}', file=deps_file) - - -def main(arguments): - extensions, out_dir = parse_arguments(arguments) - - repository = Repo(search_parent_directories=True) - top_dir = path.relpath(repository.working_dir, path.curdir) - - directories = compute_directories(extensions, repository) - - with open('deps.mk', 'w') as deps: - write_dependencies(deps, directories, top_dir, out_dir) - - -if __name__ == '__main__': - main(argv) diff --git a/repo/www/make-index.py b/repo/www/make-index.py deleted file mode 100755 index ef699f0..0000000 --- a/repo/www/make-index.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python3 - -from os import path -from subprocess import run -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 list_files(extensions, folder): - directories = compute_directories( - extensions, Repo(search_parent_directories=True) - ) - return directories[folder].subfolders, directories[folder].files - - -def generate_index_page(title, directories, files): - lines = (f'% {title}',) + tuple( - f'- [{d}/]({d}/index.html)' for d in directories - ) + tuple( - f'- [{f}]({f}.html)' for f in files - ) - mdown = '\n'.join(lines) - - return run( - ('pandoc', '-s'), text=True, check=True, capture_output=True, - input=mdown - ).stdout - - -def main(arguments): - extensions, folder = parse_arguments(arguments) - - title = path.basename(folder) if folder else 'index' - - folders, files = list_files(extensions, folder) - - parsed_filenames = (path.splitext(f) for f in files) - names = tuple(name for name, _ in parsed_filenames) - - print(generate_index_page(title, folders, names)) - - -if __name__ == '__main__': - main(argv) -- cgit v1.2.3