96 lines
2.7 KiB
JavaScript
Executable File
96 lines
2.7 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
/**
|
|
* Generates the sharepic PNGs (landscape & portrait) from HTML files
|
|
*
|
|
* Usage:
|
|
* node scripts/generate-sharepic.mjs
|
|
*/
|
|
|
|
import { execSync } from 'node:child_process'
|
|
import { dirname, resolve } from 'node:path'
|
|
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
import { createRequire } from 'node:module'
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
const repoRoot = resolve(__dirname, '..')
|
|
const clientDir = resolve(repoRoot, 'client')
|
|
const marketingDir = resolve(repoRoot, 'docs/marketing')
|
|
|
|
const require = createRequire(resolve(clientDir, 'package.json'))
|
|
|
|
function isMissingBrowserError(err) {
|
|
const msg = err instanceof Error ? err.message : String(err)
|
|
return msg.includes("Executable doesn't exist") || msg.includes('browserType.launch')
|
|
}
|
|
|
|
async function ensurePlaywrightChromium(playwright) {
|
|
try {
|
|
const browser = await playwright.chromium.launch({ headless: true })
|
|
await browser.close()
|
|
return
|
|
} catch (err) {
|
|
if (!isMissingBrowserError(err)) throw err
|
|
}
|
|
|
|
console.log('Playwright Chromium fehlt — installiere Browser (einmalig)…')
|
|
execSync('npx playwright install chromium', {
|
|
cwd: clientDir,
|
|
stdio: 'inherit'
|
|
})
|
|
}
|
|
|
|
function loadPlaywright() {
|
|
try {
|
|
return require('playwright')
|
|
} catch {
|
|
console.error('Fehlende Abhängigkeit: "npm install -D playwright" in client/ ausführen.')
|
|
process.exit(1)
|
|
}
|
|
}
|
|
|
|
async function renderSharepic(browser, htmlName, pngName, width, height) {
|
|
const htmlPath = resolve(marketingDir, htmlName)
|
|
const pngPath = resolve(marketingDir, pngName)
|
|
|
|
console.log(`Generating sharepic (${width}x${height}) from ${htmlName}...`)
|
|
|
|
const context = await browser.newContext({
|
|
viewport: { width, height },
|
|
deviceScaleFactor: 2 // High-DPI for crisp text
|
|
})
|
|
const page = await context.newPage()
|
|
|
|
try {
|
|
await page.goto(pathToFileURL(htmlPath).href, { waitUntil: 'networkidle' })
|
|
await page.screenshot({
|
|
path: pngPath,
|
|
type: 'png'
|
|
})
|
|
console.log('Successfully wrote:', pngPath)
|
|
} finally {
|
|
await page.close()
|
|
}
|
|
}
|
|
|
|
async function main() {
|
|
const playwright = loadPlaywright()
|
|
await ensurePlaywrightChromium(playwright)
|
|
|
|
const browser = await playwright.chromium.launch({ headless: true })
|
|
|
|
try {
|
|
// Landscape 1200x630
|
|
await renderSharepic(browser, 'sharepic.html', 'kapteins-daagbok-sharepic.png', 1200, 630)
|
|
|
|
// Portrait 1080x1920
|
|
await renderSharepic(browser, 'sharepic-portrait.html', 'kapteins-daagbok-sharepic-portrait.png', 1080, 1920)
|
|
} finally {
|
|
await browser.close()
|
|
}
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error('Error generating sharepics:', err)
|
|
process.exit(1)
|
|
})
|