.svg ab (nur viewBox + Pfade, * Größe/Farbe steuert CSS über die .icon-Klasse bzw. currentColor). * * NUR CLI/Build — nie im Request-Pfad. Besucher laden ausschließlich die lokalen * SVGs (inline via icon()-Helper), niemals ein CDN. * * Aufruf: php bin/icons-add.php pause-fill play-fill arrow-right ... * Icon-Namen siehe https://icons.getbootstrap.com (Dateiname ohne .svg). */ if (PHP_SAPI !== 'cli') { exit(1); } require dirname(__DIR__) . '/app/bootstrap.php'; const BI_VERSION = '1.11.3'; const BI_BASE = 'https://cdn.jsdelivr.net/npm/bootstrap-icons@' . BI_VERSION . '/icons/'; $names = array_slice($argv, 1); if ($names === []) { fwrite(STDERR, "Usage: php bin/icons-add.php [ ...]\n"); exit(1); } $dir = PUBLIC_PATH . '/assets/icons'; if (!is_dir($dir) && !mkdir($dir, 0775, true) && !is_dir($dir)) { fwrite(STDERR, "Kann Verzeichnis nicht anlegen: {$dir}\n"); exit(1); } $failed = 0; foreach ($names as $name) { $name = basename(trim($name)); if ($name === '' || !preg_match('/^[a-z0-9-]+$/', $name)) { fwrite(STDERR, "Übersprungen (ungültiger Name): {$name}\n"); $failed++; continue; } $raw = @file_get_contents(BI_BASE . $name . '.svg'); if ($raw === false || !str_contains($raw, ']*>/s', '#\s*$#s'], '', $raw); $svg = '' . trim((string) $inner) . '' . "\n"; file_put_contents($dir . '/' . $name . '.svg', $svg); echo "✓ {$name}\n"; } exit($failed > 0 ? 1 : 0);