OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

a11y-scan.php

3 KB
<?php

declare(strict_types=1);

/**
 * Barrieren in den Vorlagen finden.
 *
 *   php bin/a11y-scan.php                    Übersicht je Regel und Verzeichnis
 *   php bin/a11y-scan.php --files            Übersicht je Datei
 *   php bin/a11y-scan.php templates/tickets  nur diesen Pfad
 *   php bin/a11y-scan.php --list <pfad>      Fundstellen mit Zeilennummer
 *
 * Geprüft wird der Quelltext. Was ein Skript zur Laufzeit nachträgt, sieht die
 * Prüfung nicht – sie ersetzt keinen Durchgang mit Tastatur und Vorlese-Software.
 */

require __DIR__ . '/../src/Core/AccessibilityScan.php';

use OpenNIT\Core\AccessibilityScan;

$wurzel = dirname(__DIR__);
$args   = array_slice($argv, 1);
$modus  = 'dirs';
$pfade  = [];

foreach ($args as $arg) {
    if ($arg === '--files') {
        $modus = 'files';
    } elseif ($arg === '--list') {
        $modus = 'list';
    } else {
        $pfade[] = $arg;
    }
}

$sammle = static function (string $basis): array {
    if (is_file($basis)) {
        return [$basis];
    }
    $dateien = [];
    $lauf = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($basis, FilesystemIterator::SKIP_DOTS));
    foreach ($lauf as $datei) {
        if ($datei->isFile() && $datei->getExtension() === 'php') {
            $dateien[] = $datei->getPathname();
        }
    }
    sort($dateien);
    return $dateien;
};

$basen  = $pfade ?: [$wurzel . '/templates'];
$gruppen = [];
$regeln  = [];
$gesamt  = 0;

foreach ($basen as $basis) {
    foreach ($sammle($basis) as $datei) {
        $funde   = AccessibilityScan::pruefe((string)file_get_contents($datei));
        $relativ = str_replace($wurzel . '/', '', $datei);

        if ($modus === 'list') {
            foreach ($funde as $fund) {
                printf("%s:%d  %-28s %s\n", $relativ, $fund['zeile'], $fund['regel'], $fund['fund']);
            }
        }

        $gruppe = $modus === 'files' ? $relativ : dirname($relativ);
        $gruppen[$gruppe] = ($gruppen[$gruppe] ?? 0) + count($funde);
        foreach ($funde as $fund) {
            $regeln[$fund['regel']] = ($regeln[$fund['regel']] ?? 0) + 1;
        }
        $gesamt += count($funde);
    }
}

if ($modus === 'list') {
    printf("\n%d Fundstelle(n)\n", $gesamt);
    exit($gesamt === 0 ? 0 : 1);
}

arsort($regeln);
printf("%-34s %8s\n", 'Regel', 'Funde');
printf("%s\n", str_repeat('-', 44));
foreach ($regeln as $regel => $anzahl) {
    printf("%-34s %8d\n", $regel, $anzahl);
}

$gruppen = array_filter($gruppen);
arsort($gruppen);
printf("\n%-52s %8s\n", 'Pfad', 'Funde');
printf("%s\n", str_repeat('-', 62));
foreach ($gruppen as $gruppe => $anzahl) {
    printf("%-52s %8d\n", mb_strlen($gruppe) > 52 ? '…' . mb_substr($gruppe, -51) : $gruppe, $anzahl);
}
printf("%s\n", str_repeat('-', 62));
printf("%-52s %8d\n", 'Gesamt', $gesamt);

exit($gesamt === 0 ? 0 : 1);