#!/bin/sh # Auto-Frontmatter für Hugo 0.165+ # Fügt fehlenden --- Titel-Block in .md-Dateien ein. # Installiert zusätzlich Pagefind und hält den Suchindex im Watch-Modus aktuell. CONTENT_DIR="/src/content" PAGEFIND_DIR="/src/.pagefind" PAGEFIND_BIN="$PAGEFIND_DIR/pagefind" PAGEFIND_VERSION="v1.5.2" # Architektur erkennen (x86_64 / arm64 Raspberry Pi etc.) case "$(uname -m)" in x86_64|amd64) PAGEFIND_ARCH="x86_64" ;; aarch64|arm64) PAGEFIND_ARCH="aarch64" ;; *) PAGEFIND_ARCH="x86_64" ;; esac for md in "$CONTENT_DIR"/*.md; do [ -f "$md" ] || continue first_line=$(head -1 "$md") if [ "$first_line" != "---" ]; then title=$(grep -m1 '^# ' "$md" | sed 's/^# //') [ -z "$title" ] && title=$(basename "$md" .md) date=$(date -r "$md" +%Y-%m-%d 2>/dev/null || date +%Y-%m-%d) tmp="${md}.tmp" { echo "---" echo "title: \"$title\"" echo "date: \"$date\"" echo "---" echo cat "$md" } > "$tmp" && mv "$tmp" "$md" # Besitzer zurückgeben an Host-User chown "${HOST_UID}:${HOST_GID}" "$md" 2>/dev/null || true echo "[frontmatter] $title" fi done # ── Pagefind installieren (einmalig, persistent via site-Mount) ── if [ ! -x "$PAGEFIND_BIN" ]; then echo "[pagefind] installiere ${PAGEFIND_VERSION} ..." mkdir -p "$PAGEFIND_DIR" wget -q -O /tmp/pagefind.tar.gz \ "https://github.com/CloudCannon/pagefind/releases/download/${PAGEFIND_VERSION}/pagefind-${PAGEFIND_VERSION}-${PAGEFIND_ARCH}-unknown-linux-musl.tar.gz" \ && tar -xzf /tmp/pagefind.tar.gz -C "$PAGEFIND_DIR" \ && chmod +x "$PAGEFIND_BIN" \ && rm -f /tmp/pagefind.tar.gz \ && echo "[pagefind] installiert: $("$PAGEFIND_BIN" --version 2>&1 | head -1)" fi # ── Pagefind-Index (neu) bauen ── build_pagefind() { if [ -x "$PAGEFIND_BIN" ] && [ -d /src/public ]; then "$PAGEFIND_BIN" --site /src/public --output-subdir pagefind >/dev/null 2>&1 \ && echo "[pagefind] Index aktualisiert" fi } # Hugo im Hintergrund starten (Watch-Modus) hugo server \ --watch \ --bind=0.0.0.0 \ --port=1313 \ --disableFastRender \ --baseURL=https://localhost:5443/ \ --renderStaticToDisk & HUGO_PID=$! # Warten bis der erste Build fertig ist, dann initial indizieren i=0 while [ $i -lt 60 ]; do [ -f /src/public/index.html ] && break sleep 1 i=$((i + 1)) done build_pagefind # ── Watch-Loop: Pagefind neu bauen, wenn sich HTML in public ändert ── PAGEFIND_MARKER=/tmp/pagefind.marker touch "$PAGEFIND_MARKER" while true; do sleep 2 if find /src/public -name '*.html' -newer "$PAGEFIND_MARKER" 2>/dev/null | grep -q .; then touch "$PAGEFIND_MARKER" build_pagefind fi done & # Hugo im Vordergrund halten; bei dessen Ende den Container beenden wait "$HUGO_PID"