summaryrefslogtreecommitdiff
path: root/docs/website/build.py
diff options
context:
space:
mode:
Diffstat (limited to 'docs/website/build.py')
-rwxr-xr-xdocs/website/build.py87
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()])