CASOON Open Source
Eine Antwort statt vier.
Gemeinsame Bibliotheken für Web-Audits: Zugänglichkeit, HTML-Konformanz, Wahrnehmung. Vier Werkzeuge prüfen damit dieselbe Seite — zur Bauzeit, in CI, im Browser und in der laufenden Seite — und kommen zum selben Ergebnis, mit denselben Kennungen.
cargo add a11y-rules a11y-report a11y-domnpm i @casoon/a11y-wasm- Crates in einem Workspace
- 14
- Befundkennungen über drei Fähigkeitsstufen
- 42
- Werkzeuge außerhalb, die daran hängen
- 4
- gzip für den Regelbestand als WebAssembly
- 80 KB
Wofür das gut ist
Ein Befund heißt überall gleich
Regelkennung, Schweregrad und JSON kommen aus a11y-report. Ein Bericht aus der Build-Pipeline und einer aus dem Browser lassen sich nebeneinanderlegen, ohne zu übersetzen.
„Lief nicht" ist nicht „bestanden"
Fehlt einer Prüfung ihre Voraussetzung — kein Accessibility-Tree, kein Fokus, abgebrochene Aufnahme —, entsteht ein eigener Zustand mit Grund. Kein stiller Erfolg.
Berechnung ohne Erhebung
Kein Paket hier öffnet eine Seite, spricht ein Protokoll oder liest eine Datei. Die Werkzeuge beschaffen die Daten, die Bibliotheken rechnen. Deshalb läuft derselbe Code auch als WebAssembly in der geöffneten Seite.
Widersprüche fallen auf
Zwei Werkzeuge mit zwei Kopien derselben Prüfung sagten an derselben Seite Gegenteiliges: GPTBot galt einmal als Trainings-, einmal als Zitations-Crawler. Eine gemeinsame Implementierung macht solche Fälle sichtbar, statt sie zu verteilen.
Quickstart
Die Regeln laufen über jedes Dokumentmodell, das die Traits erfüllt. Was ein Host anbietet, entscheidet, welche Stufe läuft.
- Crate einbinden:
cargo add a11y-rules - Baum bereitstellen:
a11y_dom::Documentimplementieren oderArenabenutzen - Laufen lassen:
run,run_with_semanticsoderrun_full, je nach vorhandenen Daten - Bericht lesen:
FindingundRuleRunausa11y-report
use a11y_dom::Arena;
use a11y_report::Outcome;
// Derselbe Regelbestand, den auch der Browser-Auditor und die
// laufende Seite benutzen — hier über einen geparsten Baum.
let bericht = a11y_rules::run_with_semantics(&dokument);
for befund in &bericht.findings {
println!("{} {:?}", befund.rule_id, befund.severity);
}
// Was nicht geprüft werden konnte, ist ein eigener Zustand —
// kein stilles "bestanden".
assert!(bericht.rule_runs.iter().any(|r| r.not_run.is_some()));