From 3a95a05284dff473b1faca8c774ab430540bc40c Mon Sep 17 00:00:00 2001 From: Levi Neuwirth Date: Wed, 22 Apr 2026 12:10:31 -0400 Subject: [PATCH] Fix broken PDF hyperlinks --- .gitignore | 4 +++ Makefile | 9 ++++- static/cv.pdf | Bin 43774 -> 43688 bytes static/resume.pdf | Bin 31953 -> 31866 bytes tools/download-pdfjs.sh | 64 +++++++++++++++++++++++++++++++++++ tools/pdfjs-checksums.sha256 | 1 + 6 files changed, 77 insertions(+), 1 deletion(-) create mode 100755 tools/download-pdfjs.sh create mode 100644 tools/pdfjs-checksums.sha256 diff --git a/.gitignore b/.gitignore index 30dd112..15c9b73 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,10 @@ levineuwirth_handover.zip # Download with: make download-model static/models/ +# Vendored PDF.js viewer (~18 MB uncompressed, pinned in tools/download-pdfjs.sh). +# Download with: make download-pdfjs +static/pdfjs/ + # Generated WebP companions (produced by tools/convert-images.sh at build time). # To intentionally commit a WebP, use: git add -f path/to/file.webp static/**/*.webp diff --git a/Makefile b/Makefile index da38bb7..a067f48 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: build deploy sign download-model convert-images pdf-thumbs pdfs watch clean dev +.PHONY: build deploy sign download-model download-pdfjs convert-images pdf-thumbs pdfs watch clean dev # Source .env for GITHUB_TOKEN and GITHUB_REPO if it exists. # .env format: KEY=value (one per line, no `export` prefix, no quotes needed). @@ -17,6 +17,7 @@ build: @date +%s > data/build-start.txt @./tools/convert-images.sh @$(MAKE) -s pdf-thumbs + @./tools/download-pdfjs.sh cabal run site -- build pagefind --site _site @if [ -d .venv ]; then \ @@ -37,6 +38,12 @@ sign: download-model: @./tools/download-model.sh +# Vendor Mozilla's prebuilt PDF.js viewer into static/pdfjs/. +# Runs automatically as part of `build` (skips when already present). +# Files are gitignored; sha256-verified against tools/pdfjs-checksums.sha256. +download-pdfjs: + @./tools/download-pdfjs.sh + # Convert JPEG/PNG images to WebP companions (also runs automatically in build). # Requires cwebp: pacman -S libwebp / apt install webp convert-images: diff --git a/static/cv.pdf b/static/cv.pdf index 926aa289d93900c041f9be90b0a208bd5b66cc08..ac15a31f5afa8ec8939da221bf8f6ba3ceed4eb6 100644 GIT binary patch delta 13046 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 R5O6H)TyW&%qVi&J{{srwF@695 delta 13079 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 bdwe%_b@z6)v_j-y/dev/null 2>&1 || { + echo "download-pdfjs: unzip not found — install it (pacman -S unzip / apt install unzip)" >&2 + exit 1 +} + +tmpdir=$(mktemp -d) +trap 'rm -rf "$tmpdir"' EXIT + +echo "pdfjs: downloading $ARCHIVE" +curl -fsSL --progress-bar "$URL" -o "$tmpdir/$ARCHIVE" + +if [ -f "$CHECKSUMS" ]; then + want=$(awk -v p="$ARCHIVE" '$2 == p { print $1; exit }' "$CHECKSUMS") + if [ -n "$want" ]; then + got=$(sha256sum "$tmpdir/$ARCHIVE" | awk '{ print $1 }') + if [ "$got" != "$want" ]; then + echo "pdfjs: sha256 mismatch for $ARCHIVE" >&2 + echo " expected $want" >&2 + echo " got $got" >&2 + exit 1 + fi + echo "pdfjs: sha256 verified" + else + echo "pdfjs: no pinned checksum for $ARCHIVE in $CHECKSUMS — skipping verification" >&2 + fi +else + echo "pdfjs: $CHECKSUMS not found — skipping sha256 verification" >&2 +fi + +mkdir -p "$PDFJS_DIR" +echo "pdfjs: extracting to $PDFJS_DIR" +unzip -q -o "$tmpdir/$ARCHIVE" -d "$PDFJS_DIR" + +echo "pdfjs: done. static/pdfjs/web/viewer.html is ready." +echo " Run 'make build' to include it in _site/." diff --git a/tools/pdfjs-checksums.sha256 b/tools/pdfjs-checksums.sha256 new file mode 100644 index 0000000..7472380 --- /dev/null +++ b/tools/pdfjs-checksums.sha256 @@ -0,0 +1 @@ +0555ef47464e456125dcd0b9742cfa2aaed6d282e804e4dd1f1b99316b46ac00 pdfjs-5.6.205-dist.zip