From c97d674461c24aa281a246c69bd21a57be70823a Mon Sep 17 00:00:00 2001 From: Stefan Koelle Date: Fri, 14 Aug 2026 21:35:29 +0200 Subject: [PATCH] pdf fix --- AGENTS.md | 19 ++++++++++++++++++- README.md | 5 +++-- package.json | 3 ++- prebuild.sh | 11 +++++++++++ stefankoelle/_includes/stefankoelle.njk | 2 +- stefankoelle/ledmatrix/index.njk | 2 +- stefankoelle/pdf/cv.pdf | Bin 47180 -> 47183 bytes 7 files changed, 36 insertions(+), 6 deletions(-) create mode 100755 prebuild.sh diff --git a/AGENTS.md b/AGENTS.md index bd07215..6709cce 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -77,6 +77,7 @@ moonweb-site/ ```bash npm install +npm run prebuild # Pre-Build Tasks (CV PDF generieren) npm run dev:hub # localhost:8081 npm run dev:infra # localhost:8082 npm run dev:smarthome # localhost:8083 @@ -104,6 +105,23 @@ npm run build # Alle Sites bauen - CV-Partial zentral pflegbar (einmal aendern → Web + PDF aktualisieren) - LED Matrix als eigene Seite unter stefankoelle.de/ledmatrix/ +### CV PDF Generierung + +Das CV-PDF wird via WeasyPrint generiert: + +```bash +npm run pdf:cv # Einzelnes PDF generieren +npm run prebuild # Alle Pre-Build Tasks (inkl. CV PDF) +``` + +Dateien: +- `stefankoelle/pdf/cv-style.css` — WeasyPrint-Stylesheet (A4, Typografie) +- `stefankoelle/pdf/build-pdf.sh` — Shell-Skript für PDF-Generierung +- `stefankoelle/cv-print.njk` — Standalone HTML-Template (nur CV-Content) +- `stefankoelle/pdf/cv.pdf` — Generiertes PDF (Output) + +Wichtig: Das PDF wird via Eleventy-Passthrough ins Build-Output kopiert (`dist/stefankoelle/pdf/cv.pdf`). + ### CSS Cache-Busting CSS-Dateien werden als Passthrough kopiert (kein Hash im Dateinamen). Bei CSS-Änderungen muss der Query-String in der `?v=N` Inkludierung erhöht werden: @@ -133,6 +151,5 @@ Benötigte Secrets: ## Offene Punkte - retro/ ist bewusst rudimentär gehalten -- PDF-Build fuer CV (WeasyPrint) — lokal testen, spaeter in CI integrieren - Querverlinkungen stefankoelle.de <-> smarthome (zukuenftig) - Ledmatrix ggf. nach smarthome verschieben (when ready) diff --git a/README.md b/README.md index 0df45f1..261e156 100755 --- a/README.md +++ b/README.md @@ -100,8 +100,9 @@ Each site has its own minimal Eleventy config (`/eleventy.config.js`). Liv ### Build ```bash -npm run build # builds all 5 → dist// -npm run build:hub # build single site +npm run prebuild # pre-build tasks (CV PDF) +npm run build # builds all 5 → dist// +npm run build:hub # build single site ``` --- diff --git a/package.json b/package.json index 1221764..d23157d 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "build:retro": "npx @11ty/eleventy --config=retro/eleventy.config.js", "build:stefankoelle": "npx @11ty/eleventy --config=stefankoelle/eleventy.config.js", "build": "npm run build:hub && npm run build:infra && npm run build:smarthome && npm run build:code && npm run build:retro && npm run build:stefankoelle", - "pdf:cv": "bash stefankoelle/pdf/build-pdf.sh" + "pdf:cv": "bash stefankoelle/pdf/build-pdf.sh", + "prebuild": "bash prebuild.sh" }, "devDependencies": { "@11ty/eleventy": "^3.1.6" diff --git a/prebuild.sh b/prebuild.sh new file mode 100755 index 0000000..c331e19 --- /dev/null +++ b/prebuild.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "==> Running prebuild tasks..." + +echo "" +echo "--- CV PDF ---" +bash stefankoelle/pdf/build-pdf.sh + +echo "" +echo "==> Prebuild complete." diff --git a/stefankoelle/_includes/stefankoelle.njk b/stefankoelle/_includes/stefankoelle.njk index ac93f08..ad46514 100644 --- a/stefankoelle/_includes/stefankoelle.njk +++ b/stefankoelle/_includes/stefankoelle.njk @@ -24,7 +24,7 @@ - +
diff --git a/stefankoelle/ledmatrix/index.njk b/stefankoelle/ledmatrix/index.njk index 44c5bee..8ac47b8 100644 --- a/stefankoelle/ledmatrix/index.njk +++ b/stefankoelle/ledmatrix/index.njk @@ -10,7 +10,7 @@ description: "WiFi-controlled LED display solution with REST API, DHT22 sensor, {{ title }} - ESP32 Project - +
diff --git a/stefankoelle/pdf/cv.pdf b/stefankoelle/pdf/cv.pdf index de7b2e8a1921a8a8544cc189f33a2762ac561d50..8c2ab6b7774fe2d530dd55e9138dce711c194a27 100644 GIT binary patch delta 11791 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 delta 11758 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 QxE=~PIXDU>B}Gq03ce^U+yDRo