#!/usr/bin/env bash #=== HELP START === # convert-md-tree.sh – Recursive Markdown → HTML conversion (Pandoc) # # Usage: # ./convert-md-tree.sh [options] # # Options: # -n, --dry-run Show what would be done without converting # -p, --pandoc-args Extra arguments passed to pandoc (e.g. "-t html5") # -h, --help Show this help message # # Arguments: # Root directory containing .md files # Destination directory for the HTML output # # Behaviour: # • Preserves the directory structure in the destination. # • Creates required sub-directories automatically. # • Emits clear errors for missing programs or invalid parameters. #=== HELP END === set -euo pipefail # ─────────────────────────────────────────────── # Defaults DRY_RUN=false PANDOC_ARGS="" # ─────────────────────────────────────────────── # 0 Help function ------------------------------------------------------------- show_help() { sed -n '/^#=== HELP START ===/,/^#=== HELP END ===/ { /^#=== HELP START ===/d /^#=== HELP END ===/d s/^#// p }' "$0" } # 1 Parse options ------------------------------------------------------------- POSITIONAL=() while [[ $# -gt 0 ]]; do case "$1" in -h|--help) show_help; exit 0 ;; -n|--dry-run) DRY_RUN=true; shift ;; -p|--pandoc-args) [[ $# -lt 2 ]] && { echo "❌ Option $1 requires an argument"; exit 1; } PANDOC_ARGS="$2"; shift 2 ;; --) shift; break ;; -*) echo "❌ Unknown option: $1"; exit 1 ;; *) POSITIONAL+=("$1"); shift ;; esac done set -- "${POSITIONAL[@]}" [[ $# -lt 2 ]] && { echo "❌ Missing and/or "; echo; show_help; exit 1; } SRC="$1" DEST="$2" # 2 Validate arguments -------------------------------------------------------- [[ ! -d "$SRC" ]] && { echo "❌ Source directory does not exist: $SRC"; exit 1; } mkdir -p "$DEST" || { echo "❌ Cannot create/access dest dir: $DEST"; exit 1; } # Remove trailing slash for path manipulation SRC="${SRC%/}" # 3 Check required tools ------------------------------------------------------ need() { command -v "$1" >/dev/null || { echo "❌ $1 is missing"; exit 1; }; } need pandoc; need find; need mkdir # 4 Process files ------------------------------------------------------------- echo "🔍 Scanning for .md files in $SRC …" COUNT_TOTAL=$(find "$SRC" -type f -name '*.md' | wc -l | tr -d ' ') [[ "$COUNT_TOTAL" -eq 0 ]] && { echo "ℹ️ No Markdown files found – nothing to do."; exit 0; } echo "📄 Found $COUNT_TOTAL Markdown file(s)." CONVERTED=0 while IFS= read -r -d '' FILE; do REL_PATH="${FILE#$SRC/}" OUT_FILE="$DEST/${REL_PATH%.md}.html" mkdir -p "$(dirname "$OUT_FILE")" if $DRY_RUN; then echo "🧪 Would convert: $FILE -> $OUT_FILE" else pandoc $PANDOC_ARGS "$FILE" -s -o "$OUT_FILE" echo "✅ Converted: $FILE -> $OUT_FILE" fi ((CONVERTED++)) done < <(find "$SRC" -type f -name '*.md' -print0) if $DRY_RUN; then echo "🧪 Dry-run complete – $CONVERTED file(s) would be processed." else echo "🏁 Finished – $CONVERTED file(s) converted." fi