Quelltext des aktuellen Standes
<?php
declare(strict_types=1);
/**
* Deckt ab, dass jedes benutzte Icon auch ankommt.
*
* Ein Icon-Name, den die mitgelieferte Schriftart nicht kennt, erzeugt keinen
* Fehler – die Stelle bleibt einfach leer. Das fällt erst auf, wenn jemand
* hinsieht. Die Namen aus Font Awesome 6 (`fa-xmark`, `fa-gear`,
* `fa-triangle-exclamation` …) sind besonders verführerisch, weil sie überall
* dokumentiert sind; die ausgelieferte Fassung kennt nur die älteren.
*/
return static function (): void {
$wurzel = dirname(__DIR__);
/** Alle Icons, die die mitgelieferte Schriftart darstellen kann. */
$verfuegbar = static function () use ($wurzel): array {
$css = (string)file_get_contents($wurzel . '/public/assets/fontawesome/css/fontawesome.min.css');
preg_match_all('/\.(fa-[a-z0-9-]+):before/', $css, $m);
return array_flip($m[1]);
};
/** Alle Icons, die Vorlagen und Skripte verwenden: Name => Fundstellen. */
$benutzt = static function () use ($wurzel): array {
$treffer = [];
$dateien = array_merge(
glob($wurzel . '/templates/*.php') ?: [],
glob($wurzel . '/templates/*/*.php') ?: [],
glob($wurzel . '/templates/*/*/*.php') ?: [],
glob($wurzel . '/public/assets/js/*.js') ?: []
);
foreach ($dateien as $datei) {
$inhalt = (string)file_get_contents($datei);
// Nur mit Stil-Präfix (fas/far/fab …), wie der Umschalter es erwartet.
preg_match_all('/\bfa[srlbd]?\s+(fa-[a-z0-9-]+)/', $inhalt, $m);
foreach ($m[1] as $name) {
$treffer[$name][] = str_replace($wurzel . '/', '', $datei);
}
}
return $treffer;
};
test('Die mitgelieferte Schriftart kennt jedes benutzte Icon', function () use ($verfuegbar, $benutzt) {
$da = $verfuegbar();
$fehlt = [];
foreach ($benutzt() as $name => $stellen) {
if (!isset($da[$name])) {
$fehlt[] = $name . ' (' . count($stellen) . 'x, z. B. ' . $stellen[0] . ')';
}
}
assertSame([], $fehlt, "Diese Icons bleiben leer:\n " . implode("\n ", $fehlt));
});
test('Die Schriftart bringt ueberhaupt Icons mit', function () use ($verfuegbar) {
// Schlägt der Auslesepfad fehl, wäre der Test oben immer grün.
assertTrue(count($verfuegbar()) > 500, 'Die Icon-Liste konnte nicht gelesen werden');
});
test('Jedes benutzte Icon steht in der Emoji-Karte', function () use ($wurzel, $benutzt) {
// Fehlt der Eintrag, bleibt das Icon im Emoji-Modus monochrom.
$karte = (string)file_get_contents($wurzel . '/src/Core/IconMap.php');
preg_match_all("/'(fa-[a-z0-9-]+)'\s*=>/", $karte, $m);
$bekannt = array_flip($m[1]);
$fehlt = [];
foreach (array_keys($benutzt()) as $name) {
if (!isset($bekannt[$name])) {
$fehlt[] = $name;
}
}
assertSame([], $fehlt, 'Ohne Eintrag in IconMap: ' . implode(', ', $fehlt));
});
};