#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) DEFAULT_INPUT="$SCRIPT_DIR/酷哇商城网页登录接入SSO方案文档.md" usage() { cat <<'EOF' Usage: ./export-sso-pdf.sh [input.md] [output.pdf] Examples: ./export-sso-pdf.sh ./export-sso-pdf.sh notes.md notes.pdf The script renders Mermaid diagrams and prints the Markdown document as A4 PDF. EOF } if [[ ${1:-} == "-h" || ${1:-} == "--help" ]]; then usage exit 0 fi INPUT=${1:-$DEFAULT_INPUT} OUTPUT=${2:-"${INPUT%.md}.pdf"} if [[ ! -f "$INPUT" ]]; then echo "Markdown file not found: $INPUT" >&2 exit 1 fi if [[ ${INPUT##*.} != "md" ]]; then echo "Input must be a .md file: $INPUT" >&2 exit 1 fi if ! command -v node >/dev/null 2>&1; then echo "Node.js is required. Install Node.js 18 or newer and retry." >&2 exit 1 fi for candidate in google-chrome chromium chromium-browser; do if command -v "$candidate" >/dev/null 2>&1; then CHROME=$(command -v "$candidate") break fi done if [[ -z ${CHROME:-} ]]; then echo "Chrome or Chromium is required to create PDF." >&2 exit 1 fi INPUT_DIR=$(cd "$(dirname "$INPUT")" && pwd) INPUT="$INPUT_DIR/$(basename "$INPUT")" OUTPUT_DIR=$(cd "$(dirname "$OUTPUT")" && pwd) OUTPUT="$OUTPUT_DIR/$(basename "$OUTPUT")" WORK_DIR=$(mktemp -d "${TMPDIR:-/tmp}/markdown-pdf.XXXXXX") cleanup() { rm -rf "$WORK_DIR" } trap cleanup EXIT render_mermaid() { if command -v mmdc >/dev/null 2>&1; then PUPPETEER_EXECUTABLE_PATH="$CHROME" mmdc "$@" return fi PUPPETEER_EXECUTABLE_PATH="$CHROME" npm exec --yes \ --package=@mermaid-js/mermaid-cli -- mmdc "$@" } node "$SCRIPT_DIR/scripts/render-markdown-pdf.mjs" prepare "$INPUT" "$WORK_DIR" shopt -s nullglob for diagram in "$WORK_DIR"/diagram-*.mmd; do render_mermaid -i "$diagram" -o "${diagram%.mmd}.svg" done shopt -u nullglob HTML="$WORK_DIR/document.html" node "$SCRIPT_DIR/scripts/render-markdown-pdf.mjs" render "$INPUT" "$WORK_DIR" "$HTML" "$CHROME" --headless=new --no-sandbox --disable-gpu --no-pdf-header-footer \ --print-to-pdf="$OUTPUT" "file://$HTML" >/dev/null 2>&1 echo "PDF created: $OUTPUT"