accname 0.8.0

WAI-ARIA Accessible Name and Description Computation in Rust, generic over the document model.
Documentation

accname

WAI-ARIA Accessible Name and Description Computation in Rust, generisch über das Dokumentmodell aus a11y-dom. Teil von a11y-core.

Umsetzung von accname 1.2 und den Namensregeln aus HTML-AAM 1.0 — gegen die Spezifikation geschrieben, nicht gegen eine vorhandene Implementierung. Die Schrittnummern im Quelltext entsprechen denen des Normtexts.

Warum das nicht nebenbei geht

Eine Näherung aus „Teilbaumtext plus aria-label" liegt in genau den Fällen falsch, in denen es darauf ankommt:

  • aria-labelledby löst Verweisketten auf und darf dabei Knoten heranziehen, die sonst versteckt sind
  • ein eingebettetes Steuerelement steuert innerhalb einer Rekursion seinen Wert bei, nicht seine Beschriftung
  • für Rollen wie generic oder paragraph ist ein Name schlicht verboten
use a11y_dom::{elements, Arena, Document, Node};
use accname::{name, IdIndex};

let doc = Arena::builder()
    .open("form")
        .open("span").attr("id", "l").text("Vorname").close()
        .open("input").attr("id", "v").attr("aria-labelledby", "l").close()
    .close()
    .build();

let ids = IdIndex::build(doc.root());
let feld = elements(&doc).find(|n| n.local_name() == "input").unwrap();
assert_eq!(name(feld, &ids).as_deref(), Some("Vorname"));

Neben name gibt es description und role — Letzteres als Rollenberechnung nach HTML-AAM, inklusive der kontextabhängigen Fälle: header und footer sind nur außerhalb sektionierender Elemente Landmarks, section nur benannt eine region, img mit leerem alt ist presentation.

Grenze ohne Rendering

Schritt 2A der Spezifikation schließt versteckte Knoten aus. Ohne Rendering-Daten sind nur aria-hidden="true" und das hidden-Attribut erkennbar — display: none und visibility: hidden nicht. Ein Host mit a11y_dom::Rendering kann hier genauer sein; dieses Crate bleibt bewusst bei dem, was ohne Layout entscheidbar ist.

Lizenz

MIT.