preprocess microkit tutorial for Jekyll

- process {{#include ... }} directives
- replace {{#tab ... }} directives with Jekyll includes

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
This commit is contained in:
Gerwin Klein 2025-06-20 11:05:11 +10:00
parent def6314c02
commit 23cf63658e
No known key found for this signature in database
GPG Key ID: 20A847CE6AB7F5F3
16 changed files with 106 additions and 9 deletions

1
.gitignore vendored
View File

@ -9,3 +9,4 @@ projects/virtualization/docs/api/
.jekyll-cache/
vendor/
node_modules/
_processed/microkit-tutorial/

View File

@ -57,6 +57,18 @@ _repos/tutes/%.md: _repos/sel4proj/sel4-tutorials/tutorials/% _repos/tutes
TUTORIALS:= $(filter-out index.md get-the-tutorials.md how-to.md pathways.md setting-up.md,$(notdir $(wildcard Tutorials/*.md)))
tutorials: ${TUTORIALS:%=_repos/tutes/%}
PROCESS_MDBOOK = _scripts/process-mdbook.py
MICROKIT_TUT_DST = _processed/microkit-tutorial
MICROKIT_TUT_SRC = _repos/au-ts/microkit_tutorial/website/src
MICROKIT_TUT_SRC_FILES = $(wildcard $(MICROKIT_TUT_SRC)/*.md)
MICROKIT_TUT_DST_FILES = $(patsubst $(MICROKIT_TUT_SRC)/%, $(MICROKIT_TUT_DST)/%, $(MICROKIT_TUT_SRC_FILES))
$(MICROKIT_TUT_DST)/%.md: $(MICROKIT_TUT_SRC)/%.md
@echo "$< ==> $@"
@$(PROCESS_MDBOOK) $< $(dir $@)
microkit-tutorial: $(MICROKIT_TUT_DST_FILES)
_generate_api_pages: $(REPOSITORIES)
$(MAKE) markdown -C _repos/sel4/sel4/manual
@ -93,7 +105,7 @@ docker_build:
serve: build
JEKYLL_ENV=$(JEKYLL_ENV) bundle exec jekyll serve
build: generate_api ruby_deps $(REPOSITORIES)
build: generate_api ruby_deps microkit-tutorial $(REPOSITORIES)
$(MAKE) tutorials
ifeq ($(JEKYLL_ENV),production)
$(MAKE) generate_data_files

0
_includes/endtab.html Normal file
View File

0
_includes/endtabs.html Normal file
View File

0
_includes/tab.html Normal file
View File

0
_includes/tabs.html Normal file
View File

16
_processed/README.md Normal file
View File

@ -0,0 +1,16 @@
<!--
Copyright 2025 Proofcraft Pty Ltd
SPDX-License-Identifier: CC-BY-SA-4.0
-->
# Target directory for generated files
This is target directory directory for generated/processed files based on data
or input taken from other repositories in `../_repos`.
- `tutes/` contains processed md files from the sel4-tutorials repository
- `microkit-tutorial/` contains processed md files from the microkit-tutorial
repo.
These files will then be included via Jekyll/Liquid tags elsewhere in the site.

68
_scripts/process-mdbook.py Executable file
View File

@ -0,0 +1,68 @@
#! /usr/bin/env python3
# Copyright 2025 Proofcraft Pty Ltd
# SPDX-License-Identifier: BSD-2-Clause
# Process mdbook .md files to
# - execute `{{#include "path/to/file.md"}}` directives
# - convert tab directives Jekyll includes used in the docsite
import os
import re
import argparse
def inclusion_content(input_path, match):
include_path = match.group(1)
start_line = match.group(2)
end_line = match.group(3)
full_path = os.path.join(input_path, include_path)
if os.path.exists(full_path):
with open(full_path, 'r', encoding='utf-8') as inc_file:
lines = inc_file.read().splitlines()
if start_line is None:
start_line = 1
if end_line is None:
end_line = len(lines)
else:
end_line = int(end_line)
# Return the specified lines as a string
return '\n'.join(lines[int(start_line)-1:end_line])
else:
print(f'Include file {include_path} not found in {input_path}')
return f'<!-- Include file {include_path} not found -->'
def process_mdbook(input_file, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# Read entire input file
with open(input_file, 'r', encoding='utf-8') as f:
content = f.read()
# Process include directives with line numbers
include_pattern = re.compile(r'{{#include[ ]*([^ :]+)(?::(\d+):(\d+))?[ ]*}}')
input_path = os.path.dirname(input_file)
content = re.sub(include_pattern, lambda match: inclusion_content(input_path, match), content)
# Convert tab directives to Jekyll includes
# {{#tabs }}, {{#endtabs }}, {{#endtab }}
pat = re.compile(r'{{#([a-z]*tabs?)[ ]*}}')
content = re.sub(pat, r'{% include \1.html %}', content)
# "{{#tab name="Linux" }}"
pat = re.compile(r'{{#tab name="([^"]+)"[ ]*}}')
content = re.sub(pat, r'{% include tab.html title="\1" %}', content)
# Write processed content
output_file = os.path.join(output_dir, os.path.basename(input_file))
with open(output_file, 'w', encoding='utf-8') as f:
f.write(content)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Process mdbook .md files for includes and tabs.')
parser.add_argument('input_file', help='Path to the input .md file')
parser.add_argument('output_dir', help='Directory to save the processed output')
args = parser.parse_args()
process_mdbook(args.input_file, args.output_dir)

View File

@ -5,4 +5,4 @@ SPDX-FileCopyrightText: 2025 Ivan Velickovic
---
{% include include_external_markdown.md
file="_repos/au-ts/microkit_tutorial/website/src/end.md" %}
file="_processed/microkit-tutorial/end.md" %}

View File

@ -5,4 +5,4 @@ SPDX-FileCopyrightText: 2025 Ivan Velickovic
---
{% include include_external_markdown.md
file="_repos/au-ts/microkit_tutorial/website/src/part0.md" %}
file="_processed/microkit-tutorial/part0.md" %}

View File

@ -5,4 +5,4 @@ SPDX-FileCopyrightText: 2025 Ivan Velickovic
---
{% include include_external_markdown.md
file="_repos/au-ts/microkit_tutorial/website/src/part1.md" %}
file="_processed/microkit-tutorial/part1.md" %}

View File

@ -5,4 +5,4 @@ SPDX-FileCopyrightText: 2025 Ivan Velickovic
---
{% include include_external_markdown.md
file="_repos/au-ts/microkit_tutorial/website/src/part2.md" %}
file="_processed/microkit-tutorial/part2.md" %}

View File

@ -5,4 +5,4 @@ SPDX-FileCopyrightText: 2025 Ivan Velickovic
---
{% include include_external_markdown.md
file="_repos/au-ts/microkit_tutorial/website/src/part3.md" %}
file="_processed/microkit-tutorial/part3.md" %}

View File

@ -5,4 +5,4 @@ SPDX-FileCopyrightText: 2025 Ivan Velickovic
---
{% include include_external_markdown.md
file="_repos/au-ts/microkit_tutorial/website/src/part4.md" %}
file="_processed/microkit-tutorial/part4.md" %}

View File

@ -5,4 +5,4 @@ SPDX-FileCopyrightText: 2025 Ivan Velickovic
---
{% include include_external_markdown.md
file="_repos/au-ts/microkit_tutorial/website/src/rpi3b.md" %}
file="_processed/microkit-tutorial/rpi3b.md" %}

View File

@ -5,4 +5,4 @@ SPDX-FileCopyrightText: 2025 Ivan Velickovic
---
{% include include_external_markdown.md
file="_repos/au-ts/microkit_tutorial/website/src/welcome.md" %}
file="_processed/microkit-tutorial/welcome.md" %}