diff --git a/client/package.json b/client/package.json index 287595e..a9feb6b 100644 --- a/client/package.json +++ b/client/package.json @@ -11,6 +11,7 @@ "preview": "vite preview", "generate:flyer": "node ../scripts/generate-beta-flyer.mjs", "generate:flyer:png": "node ../scripts/generate-beta-flyer.mjs --png", + "generate:flyer:all": "node ../scripts/generate-beta-flyer.mjs --all", "generate:flyer:setup": "playwright install chromium", "translate:locales": "node ../scripts/translate-locales.mjs", "translate:flyer": "node ../scripts/translate-flyer.mjs", diff --git a/docs/marketing/kapteins-daagbok-beta-flyer.da.pdf b/docs/marketing/kapteins-daagbok-beta-flyer.da.pdf new file mode 100644 index 0000000..8a249fb Binary files /dev/null and b/docs/marketing/kapteins-daagbok-beta-flyer.da.pdf differ diff --git a/docs/marketing/kapteins-daagbok-beta-flyer.da.png b/docs/marketing/kapteins-daagbok-beta-flyer.da.png new file mode 100644 index 0000000..31fbe54 Binary files /dev/null and b/docs/marketing/kapteins-daagbok-beta-flyer.da.png differ diff --git a/docs/marketing/kapteins-daagbok-beta-flyer.nb.pdf b/docs/marketing/kapteins-daagbok-beta-flyer.nb.pdf new file mode 100644 index 0000000..feecb98 Binary files /dev/null and b/docs/marketing/kapteins-daagbok-beta-flyer.nb.pdf differ diff --git a/docs/marketing/kapteins-daagbok-beta-flyer.nb.png b/docs/marketing/kapteins-daagbok-beta-flyer.nb.png new file mode 100644 index 0000000..b2b6188 Binary files /dev/null and b/docs/marketing/kapteins-daagbok-beta-flyer.nb.png differ diff --git a/docs/marketing/kapteins-daagbok-beta-flyer.pdf b/docs/marketing/kapteins-daagbok-beta-flyer.pdf index 0f5ad66..9d6256a 100644 Binary files a/docs/marketing/kapteins-daagbok-beta-flyer.pdf and b/docs/marketing/kapteins-daagbok-beta-flyer.pdf differ diff --git a/docs/marketing/kapteins-daagbok-beta-flyer.png b/docs/marketing/kapteins-daagbok-beta-flyer.png index 8348ffe..8dc625f 100644 Binary files a/docs/marketing/kapteins-daagbok-beta-flyer.png and b/docs/marketing/kapteins-daagbok-beta-flyer.png differ diff --git a/docs/marketing/kapteins-daagbok-beta-flyer.sv.pdf b/docs/marketing/kapteins-daagbok-beta-flyer.sv.pdf new file mode 100644 index 0000000..2c1e66b Binary files /dev/null and b/docs/marketing/kapteins-daagbok-beta-flyer.sv.pdf differ diff --git a/docs/marketing/kapteins-daagbok-beta-flyer.sv.png b/docs/marketing/kapteins-daagbok-beta-flyer.sv.png new file mode 100644 index 0000000..0ace2d1 Binary files /dev/null and b/docs/marketing/kapteins-daagbok-beta-flyer.sv.png differ diff --git a/package.json b/package.json index 0ed1a3c..4582a2d 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,8 @@ "scripts": { "translate:locales": "node scripts/translate-locales.mjs", "translate:flyer": "node scripts/translate-flyer.mjs", - "validate:i18n": "node scripts/validate-i18n-keys.mjs" + "validate:i18n": "node scripts/validate-i18n-keys.mjs", + "generate:flyer": "node scripts/generate-beta-flyer.mjs", + "generate:flyer:all": "node scripts/generate-beta-flyer.mjs --all" } } diff --git a/scripts/generate-beta-flyer.mjs b/scripts/generate-beta-flyer.mjs index e3931e2..4334ef5 100644 --- a/scripts/generate-beta-flyer.mjs +++ b/scripts/generate-beta-flyer.mjs @@ -1,7 +1,12 @@ #!/usr/bin/env node /** - * Generates the beta flyer PDF from docs/marketing/beta-flyer.html - * Usage: npm run generate:flyer --prefix client + * Generates beta flyer PDF/PNG from docs/marketing/beta-flyer*.html + * + * Usage: + * node scripts/generate-beta-flyer.mjs # German PDF + * node scripts/generate-beta-flyer.mjs --png # German PNG + * node scripts/generate-beta-flyer.mjs --all # all locales, PDF + PNG + * node scripts/generate-beta-flyer.mjs --lang da,sv # selected locales */ import { execSync } from 'node:child_process' @@ -15,14 +20,38 @@ const repoRoot = resolve(__dirname, '..') const clientDir = resolve(repoRoot, 'client') const marketingDir = resolve(repoRoot, 'docs/marketing') const assetsDir = resolve(marketingDir, 'assets') -const htmlPath = resolve(marketingDir, 'beta-flyer.html') const qrPath = resolve(assetsDir, 'qr-kapteins-daagbok.eu.png') -const pdfPath = resolve(marketingDir, 'kapteins-daagbok-beta-flyer.pdf') -const pngPath = resolve(marketingDir, 'kapteins-daagbok-beta-flyer.png') const appUrl = 'https://kapteins-daagbok.eu' +const LOCALES = { + de: { html: 'beta-flyer.html', suffix: '' }, + da: { html: 'beta-flyer.da.html', suffix: '.da' }, + sv: { html: 'beta-flyer.sv.html', suffix: '.sv' }, + nb: { html: 'beta-flyer.nb.html', suffix: '.nb' } +} + const require = createRequire(resolve(clientDir, 'package.json')) +function parseArgs(argv) { + const all = argv.includes('--all') + let langs = all ? Object.keys(LOCALES) : ['de'] + let pdf = !argv.includes('--png-only') + let png = argv.includes('--png') || argv.includes('--all') || argv.includes('--png-only') + + if (argv.includes('--pdf-only')) { + pdf = true + png = false + } + + for (let i = 2; i < argv.length; i++) { + if (argv[i] === '--lang' && argv[i + 1]) { + langs = argv[++i].split(',').map((l) => l.trim()) + } + } + + return { langs, pdf, png } +} + function isMissingBrowserError(err) { const msg = err instanceof Error ? err.message : String(err) return msg.includes("Executable doesn't exist") || msg.includes('browserType.launch') @@ -64,70 +93,79 @@ async function ensureQrCode() { console.log('QR code written:', qrPath) } -async function renderPdf() { - let playwright +function loadPlaywright() { try { - playwright = require('playwright') + return require('playwright') } catch { console.error('Fehlende Abhängigkeit: "npm install -D playwright" in client/ ausführen.') process.exit(1) } +} + +async function renderPdf(page, htmlPath, pdfPath) { + await page.goto(pathToFileURL(htmlPath).href, { waitUntil: 'networkidle' }) + await page.pdf({ + path: pdfPath, + format: 'A4', + printBackground: true, + preferCSSPageSize: true, + margin: { top: 0, right: 0, bottom: 0, left: 0 } + }) + console.log('PDF written:', pdfPath) +} + +async function renderPng(page, htmlPath, pngPath) { + await page.goto(pathToFileURL(htmlPath).href, { waitUntil: 'networkidle' }) + await page.screenshot({ + path: pngPath, + fullPage: true, + type: 'png' + }) + console.log('PNG written:', pngPath) +} + +async function generateForLocale(playwright, lang, { pdf, png }) { + const locale = LOCALES[lang] + if (!locale) { + console.error(`Unknown locale: ${lang}`) + process.exit(1) + } + + const htmlPath = resolve(marketingDir, locale.html) + const baseName = `kapteins-daagbok-beta-flyer${locale.suffix}` + const pdfPath = resolve(marketingDir, `${baseName}.pdf`) + const pngPath = resolve(marketingDir, `${baseName}.png`) + + console.log(`\n→ ${lang.toUpperCase()} (${locale.html})`) await ensurePlaywrightChromium(playwright) - const browser = await playwright.chromium.launch({ headless: true }) + try { - const page = await browser.newPage() - await page.goto(pathToFileURL(htmlPath).href, { waitUntil: 'networkidle' }) - await page.pdf({ - path: pdfPath, - format: 'A4', - printBackground: true, - preferCSSPageSize: true, - margin: { top: 0, right: 0, bottom: 0, left: 0 } - }) - console.log('PDF written:', pdfPath) - } finally { - await browser.close() - } -} - -async function renderPng() { - let playwright - try { - playwright = require('playwright') - } catch { - console.error('Fehlende Abhängigkeit: "npm install -D playwright" in client/ ausführen.') - process.exit(1) - } - - await ensurePlaywrightChromium(playwright) - - const browser = await playwright.chromium.launch({ headless: true }) - try { - const context = await browser.newContext({ - viewport: { width: 794, height: 1123 }, - deviceScaleFactor: 2 - }) - const page = await context.newPage() - await page.goto(pathToFileURL(htmlPath).href, { waitUntil: 'networkidle' }) - await page.screenshot({ - path: pngPath, - fullPage: true, - type: 'png' - }) - console.log('PNG written:', pngPath) - await context.close() + if (pdf) { + const page = await browser.newPage() + await renderPdf(page, htmlPath, pdfPath) + await page.close() + } + + if (png) { + const context = await browser.newContext({ + viewport: { width: 794, height: 1123 }, + deviceScaleFactor: 2 + }) + const page = await context.newPage() + await renderPng(page, htmlPath, pngPath) + await context.close() + } } finally { await browser.close() } } +const { langs, pdf, png } = parseArgs(process.argv) await ensureQrCode() -const outputMode = process.argv.includes('--png') ? 'png' : 'pdf' -if (outputMode === 'png') { - await renderPng() -} else { - await renderPdf() +const playwright = loadPlaywright() +for (const lang of langs) { + await generateForLocale(playwright, lang, { pdf, png }) }