Files
tsysstaticsites/scripts/convert-mdbook-to-grav.sh
Charles N Wyble 6e0ede6acc feat: add docker-compose with volume mounts for all 21 sites
- Mounts all converted pages/ directories into container
- Multi-site routing via setup.php hostname mapping
- Port 12000 exposed for development access

All 21 mdbook sites converted to Grav format:
- charters.turnsys.com (199 pages)
- plan.afabn.org, plan.ap4ap.org, plan.ezeda.org, plan.ezpodstack.org
- plan.hfnoc.net, plan.knownelement.com (7 pages)
- plan.meetmorse.com, plan.merchantsofhope.org, plan.rackrental.net
- plan.redwfo.com, plan.rwscp.net, plan.sidedoorgroup.org
- plan.sol-calc.com, plan.suborbital-systems.com (2 pages)
- plan.teamrental.net, plan.thecampustradingcompany.com
- plan.thepeernet.com, plan.turnsys.com
- plan.yourdreamnamehere.com, plan.startinglineproductions.com (10 pages)

Assisted-by: GLM-5 via Crush <crush@charm.land>
2026-03-02 16:37:42 -05:00

96 lines
2.4 KiB
Bash
Executable File

#!/bin/bash
# Convert mdbook to Grav format in-place
# Usage: convert-mdbook-to-grav.sh <repo_path>
REPO="$1"
SRC="$REPO/src"
if [ ! -d "$SRC" ]; then
echo "ERROR: No src/ directory in $REPO"
exit 1
fi
cd "$REPO" || exit 1
echo "Converting: $REPO"
# Parse SUMMARY.md to get page order
SUMMARY="$SRC/SUMMARY.md"
if [ ! -f "$SUMMARY" ]; then
echo "ERROR: No SUMMARY.md found"
exit 1
fi
# Create Grav pages directory structure
# mdbook: src/chapter/file.md -> Grav: pages/02.chapter/file.md (with frontmatter)
# Step 1: Rename src/ to pages/ temporarily
mv src pages_tmp
# Step 2: Create proper Grav structure
mkdir -p pages
# Step 3: Process each markdown file
ORDER=1
find pages_tmp -name "*.md" -type f | while read MD_FILE; do
REL_PATH="${MD_FILE#pages_tmp/}"
DIRNAME=$(dirname "$REL_PATH")
BASENAME=$(basename "$REL_PATH" .md)
# Create numbered folder (01.home, 02.chapter, etc.)
if [ "$BASENAME" = "introduction" ] || [ "$BASENAME" = "Introduction" ]; then
FOLDER_NAME="01.home"
ORDER=1
elif [ "$BASENAME" = "SUMMARY" ]; then
# Skip SUMMARY.md - Grav doesn't need it
continue
else
ORDER=$((ORDER + 1))
FOLDER_NAME=$(printf "%02d.%s" $ORDER "$BASENAME")
fi
mkdir -p "pages/$FOLDER_NAME"
# Add Grav frontmatter if not present
TARGET_FILE="pages/$FOLDER_NAME/default.md"
# Get title from first heading or filename
TITLE=$(grep -m1 "^#" "$MD_FILE" 2>/dev/null | sed 's/^#*\s*//' | head -1)
[ -z "$TITLE" ] && TITLE="$BASENAME"
# Check if file already has frontmatter
if head -1 "$MD_FILE" | grep -q "^---"; then
# Has frontmatter, copy as-is
cp "$MD_FILE" "$TARGET_FILE"
else
# Add frontmatter
{
echo "---"
echo "title: '$TITLE'"
echo "menu: '$TITLE'"
echo "---"
echo ""
cat "$MD_FILE"
} > "$TARGET_FILE"
fi
echo " Created: $FOLDER_NAME/default.md"
done
# Copy any non-md assets (images, etc.)
find pages_tmp -type f ! -name "*.md" | while read ASSET; do
REL_PATH="${ASSET#pages_tmp/}"
mkdir -p "pages/$(dirname "$REL_PATH")"
cp "$ASSET" "pages/$REL_PATH"
echo " Copied asset: $REL_PATH"
done
# Cleanup
rm -rf pages_tmp
# Remove mdbook-specific files
rm -f book.toml
echo "Conversion complete for $REPO"
echo "Files now in: $REPO/pages/"