diff options
author | itchyny <itchyny@cybozu.co.jp> | 2023-07-31 09:52:52 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-31 09:52:52 +0900 |
commit | c8e28da12973f8844ac0457e2db6ccd56286b34a (patch) | |
tree | 614af32689cf652eb7446eb9dfa4f1d91a2f1c97 /docs/build_website.py | |
parent | 4af3f99728f924b327b6f455c52452ef0ca09e1a (diff) |
Redesign website (#2628)
* Bump up Bootstrap to v5.3.1, Bootstrap Icon to v1.10.5.
* Use autoComplete.js to drop dependency on jQuery and typeahead.js.
* Support dark mode.
* New svg logo and icon with responsive color mode support.
* Normalize section ids to lower kebab-case for easiness of linking.
* Use relative paths for links for local development (--root /output).
* Various markup cleanups and accessibility improvements.
Diffstat (limited to 'docs/build_website.py')
-rwxr-xr-x | docs/build_website.py | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/docs/build_website.py b/docs/build_website.py index 5867f8c0..2b3afc77 100755 --- a/docs/build_website.py +++ b/docs/build_website.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import argparse import glob import itertools from jinja2 import Environment, FileSystemLoader, select_autoescape, pass_context @@ -10,6 +11,10 @@ import re import shutil import yaml +parser = argparse.ArgumentParser() +parser.add_argument('--root', default='/jq') +args = parser.parse_args() + env = Environment( loader=FileSystemLoader('templates'), autoescape=select_autoescape(['html.j2']), @@ -21,40 +26,51 @@ def load_yml_file(fn): return yaml.safe_load(f) +env.globals['url'] = 'https://jqlang.github.io/jq' +env.globals['root'] = args.root + env.filters['search_id'] = lambda input: input.replace(r'`', '') -env.filters['section_id'] = lambda input: re.sub(r"[^a-zA-Z0-9_]", '', input) -env.filters['entry_id'] = lambda input: re.sub(r"[ `]", '', input) +env.filters['section_id'] = lambda input: re.sub( + r'[^-a-zA-Z0-9_]', '', input.replace(' ', '-')).lower() +env.filters['entry_id'] = lambda input: re.sub( + r'^(split|first-last-nth)$', + r'\1' + ('-1' if ';' not in input else '-2'), # avoid id conflict + re.sub( + r'\b([^-]+)(?:-\1)+\b', + r'\1', # e.g. range-range-range -> range + re.sub(r' ?/ ?|,? ', '-', + re.sub(r'[`;]|: .*|\(.*?\)| \[.+\]', '', input)))).lower() env.filters['markdownify'] = lambda input: Markup(markdown(input)) -env.filters['no_paragraph'] = lambda input: Markup(re.sub(r"</?p>", '', input)) +env.filters['no_paragraph'] = lambda input: Markup(re.sub(r'</?p>', '', input)) env.globals['unique_id'] = pass_context( lambda ctx: str(next(ctx['unique_ctr']))) -env.globals.update(load_yml_file('site.yml')) -env.globals['navigation'] = ['tutorial', 'download', 'manual'] +def raise_handler(message): + raise Exception(message) + + +env.globals['raise'] = raise_handler -def generate_file(env, fname='content/1.tutorial/default.yml'): +def generate_file(env, fname): path, base = os.path.split(fname) path = os.path.relpath(path, 'content') if path == '.': path = '' - slug = 'index' permalink = '' else: - slug = os.path.basename(path) permalink = path + '/' output_dir = os.path.join('output', path) output_path = os.path.join(output_dir, 'index.html') - template_name = re.sub(r".yml$", '.html.j2', base) + template_name = re.sub(r'.yml$', '.html.j2', base) ctx = load_yml_file(fname) ctx.update(unique_ctr=itertools.count(1), permalink=permalink, - slug=slug, navitem=path) os.makedirs(output_dir, exist_ok=True) env.get_template(template_name).stream(ctx).dump(output_path, @@ -72,6 +88,7 @@ def copy_public_files(root=''): shutil.copyfile(f.path, dst) +os.makedirs('output', exist_ok=True) copy_public_files() for fn in glob.glob('content/**/*.yml', recursive=True): |