#!/usr/bin/env bash set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" OUTPUT_DIR="${OUTPUT_DIR:-$REPO_ROOT/slides}" SLIDES_TITLE="${SLIDES_TITLE:-MakerFLOSS Slides}" REPO_WEB_URL="${REPO_WEB_URL:-https://forgejo.makerfloss.eu/sjat/MakerFLOSS}" mkdir -p "$OUTPUT_DIR" # Wipe previously built slides so deleted/de-tagged .md files disappear. find "$OUTPUT_DIR" -maxdepth 1 -name "*.html" -delete # Find all markdown files with marp: true frontmatter SLIDES=() while IFS= read -r f; do SLIDES+=("$f") done < <(grep -rl "^marp: true" "$REPO_ROOT/docs" --include="*.md" 2>/dev/null || true) if [ ${#SLIDES[@]} -eq 0 ]; then echo "No marp presentations found in docs/." exit 0 fi echo "Found ${#SLIDES[@]} presentation(s):" printf ' %s\n' "${SLIDES[@]}" # Create temp output directory for Docker fallback TEMP_OUTPUT=$(mktemp -d) chmod 777 "$TEMP_OUTPUT" trap "rm -rf '$TEMP_OUTPUT'" EXIT if command -v marp &>/dev/null; then for slide in "${SLIDES[@]}"; do BASENAME=$(basename "${slide%.*}") marp --html --output "$OUTPUT_DIR/${BASENAME}.html" "$slide" done else echo "marp not found locally — using Docker (marpteam/marp-cli)..." for slide in "${SLIDES[@]}"; do REL_SLIDE="${slide#${REPO_ROOT}/}" BASENAME=$(basename "${slide%.*}") docker run --rm \ -v "$REPO_ROOT":/home/marp/app:ro \ -v "$TEMP_OUTPUT":/home/marp/output \ marpteam/marp-cli --html --output "/home/marp/output/${BASENAME}.html" "$REL_SLIDE" done cp "$TEMP_OUTPUT"/*.html "$OUTPUT_DIR/" 2>/dev/null || true fi # Inject mermaid.js into any HTML that contains mermaid code blocks. # Marp emits fenced mermaid blocks as
.
# The script finds those elements, replaces them with ,
# then loads and runs mermaid.js from CDN.
inject_mermaid() {
local html_file="$1"
python3 - "$html_file" << 'PYEOF'
import sys
path = sys.argv[1]
snippet = """\
"""
with open(path, encoding='utf-8') as f:
content = f.read()
new_content = content.replace(''
printf 'Built from %s
' \ "$REPO_WEB_URL" "${REPO_WEB_URL#https://}" printf '', snippet + '\n', 1) if new_content == content: print(f"Warning: not found in {path}", file=sys.stderr) sys.exit(1) with open(path, 'w', encoding='utf-8') as f: f.write(new_content) PYEOF } if command -v python3 &>/dev/null; then for html_file in "$OUTPUT_DIR"/*.html; do [ -f "$html_file" ] || continue if grep -q 'class="language-mermaid"' "$html_file"; then inject_mermaid "$html_file" echo " Injected mermaid.js into $(basename "$html_file")" fi done else echo "Warning: python3 not found — skipping mermaid injection" fi # Regenerate index.html listing every built deck. INDEX="$OUTPUT_DIR/index.html" { printf '
' printf '' printf '
' "$SLIDES_TITLE" printf '