92 lines
2.1 KiB
Bash
Executable File
92 lines
2.1 KiB
Bash
Executable File
#!/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"
|