diff options
author | eldritch horrors <pennae@lix.systems> | 2024-04-08 21:44:40 +0200 |
---|---|---|
committer | eldritch horrors <pennae@lix.systems> | 2024-04-11 13:32:06 +0000 |
commit | 725f5cd358b2a3906a1922017fa424666a972758 (patch) | |
tree | f7dbdb265fa15e0ce05460adae6a8a4eae5b0812 /doc/manual/docroot.py | |
parent | a0875f6adf5f7b8d3c3dced7ccff35ef4b22c864 (diff) |
docs: redo content generation for mdbook and manual
manpages can be rendered using the markdown output of mdbook, the rest
of the manual can generated out of the main doc/manual source tree. we
still use lowdown to actually render manpages instead of eg mdbook-man
because lowdown does generate reasonably good manpages (though that is
also somewhat debatable, but they're a lot better than mdbook-man).
doing this not only lets us drastically simplify the lowdown pipeline,
but also remove all custom {{#include}} handling since now mdbook does
all of it, even for the manpage builds. even the lowdown wrapper isn't
entirely necessary because lowdown can take all wrapper arguments with
command line flags rather than bits of input file content.
This also implements running mdbook in Meson, in order to generate the
manpages. The mdbook outputs are also installed in the usual location.
Co-authored-by: Qyriad <qyriad@qyriad.me>
Change-Id: I60193f9fd0f15d48872f071af35855cda2a0f40b
Diffstat (limited to 'doc/manual/docroot.py')
-rwxr-xr-x | doc/manual/docroot.py | 84 |
1 files changed, 0 insertions, 84 deletions
diff --git a/doc/manual/docroot.py b/doc/manual/docroot.py deleted file mode 100755 index e95f8abbf..000000000 --- a/doc/manual/docroot.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python3 - -from pathlib import Path -import json -import os, os.path -import sys - -name = 'process-docroot.py' - -def log(*args, **kwargs): - kwargs['file'] = sys.stderr - return print(f'{name}:', *args, **kwargs) - -def replace_docroot(relative_md_path: Path, content: str, book_root: Path): - assert not relative_md_path.is_absolute(), f'{relative_md_path=} from mdbook should be relative' - - md_path_abs = book_root / relative_md_path - docroot_abs = md_path_abs.parent - assert docroot_abs.is_dir(), f'supposed docroot {docroot_abs} is not a directory (cwd={os.getcwd()})' - - # The paths mdbook gives us are relative to the directory with book.toml. - # @docroot@ wants to be replaced with the path relative to `src/`. - docroot_rel = os.path.relpath(book_root / 'src', start=docroot_abs) - - return content.replace('@docroot@', docroot_rel) - -def recursive_replace(data, book_root): - match data: - case {'sections': sections}: - return data | dict( - sections = [recursive_replace(section, book_root) for section in sections], - ) - case {'Chapter': chapter}: - # Path to the .md file for this chapter, relative to book_root. - path_to_chapter = Path('src') / chapter['path'] - chapter_content = chapter['content'] - - return data | dict( - Chapter = chapter | dict( - content = replace_docroot(path_to_chapter, chapter_content, book_root), - sub_items = [recursive_replace(sub_item, book_root) for sub_item in chapter['sub_items']], - ), - ) - - case rest: - assert False, f'should have been called on a dict, not {type(rest)=}\n\t{rest=}' - -def main(): - - if len(sys.argv) > 1 and sys.argv[1] == 'supports': - log('confirming to mdbook that we support their stuff') - return 0 - - # mdbook communicates with us over stdin and stdout. - # It splorks us a JSON array, the first element describing the context, - # the second element describing the book itself, - # and then expects us to send it the modified book JSON over stdout. - - context, book = json.load(sys.stdin) - - # book_root is *not* @docroot@. @docroot@ gets replaced with a relative path to `./src/`. - # book_root is the directory where book.toml, aka `src`'s parent. - book_root = Path(context['root']) - assert book_root.exists(), f'{book_root=} does not exist' - assert book_root.joinpath('book.toml').is_file(), f'{book_root / "book.toml"} is not a file' - - log('replacing all occurrences of @docroot@ with a relative path') - - # Find @docroot@ in all parts of our recursive book structure. - replaced_content = recursive_replace(book, book_root) - - replaced_content_str = json.dumps(replaced_content) - - # Give mdbook our changes. - print(replaced_content_str) - - log('done!') - -try: - sys.exit(main()) -except AssertionError as e: - print(f'{name}: INTERNAL ERROR in mdbook preprocessor', file=sys.stderr) - print(f'this is a bug in {name}') - raise |