diff options
Diffstat (limited to 'docs/website/build.py')
-rwxr-xr-x | docs/website/build.py | 87 |
1 files changed, 85 insertions, 2 deletions
diff --git a/docs/website/build.py b/docs/website/build.py index 49c086529..596717400 100755 --- a/docs/website/build.py +++ b/docs/website/build.py @@ -19,7 +19,11 @@ # Boston, MA 02110-1301, USA. +import bs4 + import argparse +import contextlib +import html.parser import logging import pathlib import shutil @@ -30,7 +34,12 @@ import tempfile log = logging.getLogger('build.py') output_path = pathlib.Path('public') -mkdocs_root = pathlib.Path(__file__).parent.parent +website_root = pathlib.Path(__file__).parent +docs_root = website_root.parent +source_root = docs_root.parent + +asciidoc = shutil.which('asciidoc') +xmlto = shutil.which('xmlto') def argument_parser(): @@ -43,6 +52,8 @@ def argument_parser(): "$prefix/share/gtk-doc/html/") parser.add_argument('--tracker-commit', required=True, metavar='COMMIT', help="Commit ID of tracker.git repo used to build") + parser.add_argument('--man-pages', nargs='+', required=True, + help="List of Asciidoc manual page source") return parser @@ -79,6 +90,54 @@ def add_apidocs_header(text, filename): shutil.move(f_out.name, filename) +class Manpages(): + def run(self, command): + command = [str(c) for c in command] + log.debug("Running: %s", ' '.join(command)) + subprocess.run(command, check=True) + + def generate_manpage_xml(self, in_path, out_path): + """Generate a docbook XML file for an Asciidoc manpage source file.""" + self.run([asciidoc, '--backend', 'docbook', '--doctype', 'manpage', + '--out-file', out_path, in_path]) + + def generate_manpage_html(self, in_path, out_path): + """Generate a HTML page from a docbook XML file""" + self.run([xmlto, 'xhtml-nochunks', '-o', out_path, in_path]) + + def generate_toplevel_markdown(self, in_path, out_path, html_files): + """Generate the master commandline.md page.""" + + includes = [] + for path in sorted(html_files): + parser = bs4.BeautifulSoup(path.read_text(), 'html.parser') + + title = parser.title.text + if title and title.startswith('tracker-'): + title = 'tracker ' + title[8:] + + body = parser.body.contents[0] + + includes.append("## %s\n\n%s\n---\n" % (title, body)) + + text = in_path.read_text() + text = text.format( + includes='\n'.join(includes) + ) + out_path.write_text(text) + + +@contextlib.contextmanager +def tmpdir(): + path = pathlib.Path(tempfile.mkdtemp()) + log.debug("Created temporary directory %s", path) + try: + yield path + finally: + log.debug("Removed temporary directory %s", path) + shutil.rmtree(path) + + def main(): args = argument_parser().parse_args() @@ -90,8 +149,32 @@ def main(): if output_path.exists(): raise RuntimeError(f"Output path '{output_path}' already exists.") + log.info("Generating online man pages") + with tmpdir() as workdir: + manpages = Manpages() + + htmldir = website_root.joinpath('docs') + htmlfiles = [] + + for man_page in args.man_pages: + asciidocpath = pathlib.Path(man_page) + xmlpath = workdir.joinpath(asciidocpath.stem + '.xml') + + manpages.generate_manpage_xml(asciidocpath, xmlpath) + manpages.generate_manpage_html(xmlpath, htmldir) + + htmlpath = htmldir.joinpath(xmlpath.with_suffix('.html').name) + htmlfiles.append(htmlpath) + + template_in = website_root.joinpath('docs/commandline.md.in') + template_out = website_root.joinpath('docs/commandline.md') + + manpages.generate_toplevel_markdown(template_in, template_out, htmlfiles) + + #shutil.copy('/usr/share/asciidoc/stylesheets/docbook-xsl.css', manpage_output_path) + log.info("Building website") - mkdocs_config = mkdocs_root.joinpath('mkdocs.yml') + mkdocs_config = docs_root.joinpath('mkdocs.yml') subprocess.run(['mkdocs', 'build', '--config-file', mkdocs_config, '--site-dir', output_path.absolute()]) |