Generate beta flyer PDF and PNG for all locales.
Extend generate-beta-flyer.mjs with --all/--lang support and add da, sv, nb assets alongside refreshed German exports. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -11,6 +11,7 @@
|
|||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"generate:flyer": "node ../scripts/generate-beta-flyer.mjs",
|
"generate:flyer": "node ../scripts/generate-beta-flyer.mjs",
|
||||||
"generate:flyer:png": "node ../scripts/generate-beta-flyer.mjs --png",
|
"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",
|
"generate:flyer:setup": "playwright install chromium",
|
||||||
"translate:locales": "node ../scripts/translate-locales.mjs",
|
"translate:locales": "node ../scripts/translate-locales.mjs",
|
||||||
"translate:flyer": "node ../scripts/translate-flyer.mjs",
|
"translate:flyer": "node ../scripts/translate-flyer.mjs",
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 3.4 MiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 3.8 MiB |
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 3.5 MiB |
+3
-1
@@ -5,6 +5,8 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"translate:locales": "node scripts/translate-locales.mjs",
|
"translate:locales": "node scripts/translate-locales.mjs",
|
||||||
"translate:flyer": "node scripts/translate-flyer.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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
/**
|
/**
|
||||||
* Generates the beta flyer PDF from docs/marketing/beta-flyer.html
|
* Generates beta flyer PDF/PNG from docs/marketing/beta-flyer*.html
|
||||||
* Usage: npm run generate:flyer --prefix client
|
*
|
||||||
|
* 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'
|
import { execSync } from 'node:child_process'
|
||||||
@@ -15,14 +20,38 @@ const repoRoot = resolve(__dirname, '..')
|
|||||||
const clientDir = resolve(repoRoot, 'client')
|
const clientDir = resolve(repoRoot, 'client')
|
||||||
const marketingDir = resolve(repoRoot, 'docs/marketing')
|
const marketingDir = resolve(repoRoot, 'docs/marketing')
|
||||||
const assetsDir = resolve(marketingDir, 'assets')
|
const assetsDir = resolve(marketingDir, 'assets')
|
||||||
const htmlPath = resolve(marketingDir, 'beta-flyer.html')
|
|
||||||
const qrPath = resolve(assetsDir, 'qr-kapteins-daagbok.eu.png')
|
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 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'))
|
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) {
|
function isMissingBrowserError(err) {
|
||||||
const msg = err instanceof Error ? err.message : String(err)
|
const msg = err instanceof Error ? err.message : String(err)
|
||||||
return msg.includes("Executable doesn't exist") || msg.includes('browserType.launch')
|
return msg.includes("Executable doesn't exist") || msg.includes('browserType.launch')
|
||||||
@@ -64,70 +93,79 @@ async function ensureQrCode() {
|
|||||||
console.log('QR code written:', qrPath)
|
console.log('QR code written:', qrPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function renderPdf() {
|
function loadPlaywright() {
|
||||||
let playwright
|
|
||||||
try {
|
try {
|
||||||
playwright = require('playwright')
|
return require('playwright')
|
||||||
} catch {
|
} catch {
|
||||||
console.error('Fehlende Abhängigkeit: "npm install -D playwright" in client/ ausführen.')
|
console.error('Fehlende Abhängigkeit: "npm install -D playwright" in client/ ausführen.')
|
||||||
process.exit(1)
|
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)
|
await ensurePlaywrightChromium(playwright)
|
||||||
|
|
||||||
const browser = await playwright.chromium.launch({ headless: true })
|
const browser = await playwright.chromium.launch({ headless: true })
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const page = await browser.newPage()
|
if (pdf) {
|
||||||
await page.goto(pathToFileURL(htmlPath).href, { waitUntil: 'networkidle' })
|
const page = await browser.newPage()
|
||||||
await page.pdf({
|
await renderPdf(page, htmlPath, pdfPath)
|
||||||
path: pdfPath,
|
await page.close()
|
||||||
format: 'A4',
|
}
|
||||||
printBackground: true,
|
|
||||||
preferCSSPageSize: true,
|
if (png) {
|
||||||
margin: { top: 0, right: 0, bottom: 0, left: 0 }
|
const context = await browser.newContext({
|
||||||
})
|
viewport: { width: 794, height: 1123 },
|
||||||
console.log('PDF written:', pdfPath)
|
deviceScaleFactor: 2
|
||||||
} finally {
|
})
|
||||||
await browser.close()
|
const page = await context.newPage()
|
||||||
}
|
await renderPng(page, htmlPath, pngPath)
|
||||||
}
|
await context.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()
|
|
||||||
} finally {
|
} finally {
|
||||||
await browser.close()
|
await browser.close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const { langs, pdf, png } = parseArgs(process.argv)
|
||||||
await ensureQrCode()
|
await ensureQrCode()
|
||||||
const outputMode = process.argv.includes('--png') ? 'png' : 'pdf'
|
|
||||||
|
|
||||||
if (outputMode === 'png') {
|
const playwright = loadPlaywright()
|
||||||
await renderPng()
|
for (const lang of langs) {
|
||||||
} else {
|
await generateForLocale(playwright, lang, { pdf, png })
|
||||||
await renderPdf()
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user