/** * Erzeugt die Symbole für die installierte Anwendung aus dem Zeichen selbst – * ohne Bilddienst, ohne Netz. * * npm run symbole * * Zwei Fassungen, weil Android sie unterschiedlich behandelt: * * symbol-192.png / symbol-512.png das Zeichen, wie es ist * symbol-maskabel-512.png derselbe Inhalt, aber randvoll auf * Petrol und nach innen gerückt. Android * schneidet das Symbol in eine eigene * Form – ein Kreis, ein Tropfen, was das * Gerät gerade mag. Was zu weit außen * liegt, ist dann weg. */ import fs from 'node:fs'; import path from 'node:path'; import { chromium } from '@playwright/test'; const ZIEL = path.join(process.cwd(), 'public'); /** Das Zeichen. Gleicher Inhalt wie `public/lernbar.svg`. */ function zeichen(randAnteil: number, eckenRadius: number): string { // Die drei Balken liegen im Original in einem Feld von 64 × 64 Punkten. // `randAnteil` rückt sie nach innen, ohne den Grund zu verkleinern. const innen = 64 * (1 - 2 * randAnteil); const versatz = 64 * randAnteil; return ` `; } type Auftrag = { datei: string; groesse: number; svg: string }; const auftraege: Auftrag[] = [ { datei: 'symbol-192.png', groesse: 192, svg: zeichen(0, 12) }, { datei: 'symbol-512.png', groesse: 512, svg: zeichen(0, 12) }, // Randvoll und nach innen gerückt: der Beschnitt darf nichts abschneiden. { datei: 'symbol-maskabel-512.png', groesse: 512, svg: zeichen(0.14, 0) }, ]; async function main() { const browser = await chromium.launch(); for (const auftrag of auftraege) { const seite = await browser.newPage({ viewport: { width: auftrag.groesse, height: auftrag.groesse }, deviceScaleFactor: 1, }); await seite.setContent( `${auftrag.svg}`, ); const datei = path.join(ZIEL, auftrag.datei); await seite.screenshot({ path: datei, omitBackground: false }); await seite.close(); console.log(` public/${auftrag.datei} (${auftrag.groesse}×${auftrag.groesse}, ${fs.statSync(datei).size} Bytes)`); } await browser.close(); console.log('Symbole erzeugt.'); } main().catch((fehler) => { console.error('Die Symbole konnten nicht erzeugt werden.'); console.error(fehler instanceof Error ? fehler.message : fehler); process.exit(1); });