Aller au contenu

Vérification

phil/accessibility-check

HTML

$report = $checker->checkHtml($html);            // the language of the content is the policy's
$report = $checker->checkHtml($html, 'fr-CA');   // a content that does not say its language is in French

Le HTML est une page entière ou un fragment. Dom\HTMLDocument l'analyse comme le fait un navigateur, après deux contrôles : un contenu plus grand que le maxBytes de la politique lève LimitExceeded avant l'analyse, et un contenu qui n'est pas en UTF-8 lève InvalidContent. Ses éléments sont ensuite indexés une seule fois, dans l'ordre du document et sans récursion : des éléments imbriqués plus profondément que maxDepth, ou plus nombreux que maxElements, lèvent LimitExceeded. Chaque règle qui implémente HtmlRule et que la politique retient lit ensuite l'index.

Un contenu qui commence — après une marque d'ordre d'octets, des espaces et des commentaires — par <!doctype ou <html est une page entière : html-lang vérifie sa langue, et heading-h1 signale une page sans titre de premier niveau. Tout autre contenu est un fragment affiché à l'intérieur d'une page.

UJO

use Phil\Ujo\Ujo;

$document = new Ujo()->decode($json);            // read and normalized by phil/ujo
$report = $checker->checkUjo($document, 'fr');

Les blocs sont parcourus dans l'ordre du document, chaque bloc imbriqué juste après son parent, que le document ait été normalisé ou non : un bloc imbriqué est un Block de phil/ujo ou un tableau de la forme {id, type, data}. La langue d'un bloc est celle de sa tune language, sinon celle de son parent, sinon celle du document. Chaque règle qui implémente UjoRule lit ce que disent les données d'un bloc : le texte de remplacement d'un bloc image, le title d'un embed, les pistes d'une video, le level d'un header. Les règles qui lisent le HTML lisent chaque champ de données contenant du HTML, analysé à part, de sorte qu'un constat nomme le bloc et le champ.

Un texte des données qui contient un < est du HTML, sauf s'il s'agit d'un champ brut de son type : la source d'un bloc code, le LaTeX d'un bloc math, chaque champ d'un chart… (points d'extension). Les blocs comptent dans maxElements, et l'imbrication des blocs et des données dans maxDepth. Chaque champ HTML est borné comme un contenu HTML.

Le rapport

MembreDonne
passes(Severity $minimum = Error)si aucun constat n'atteint $minimum ou plus grave : si le contenu peut être publié
findings(Severity $minimum = Notice)les constats de sévérité $minimum ou plus grave
withSeverity(Severity)les constats d'une seule sévérité exacte
ofRule(string)les constats d'une règle
results, result(string)le RuleResult de chaque règle exécutée — identifiant, critère, sévérité, nombre de constats, passed() — ou d'une seule
message(Finding)ce que dit un constat, dans la locale du rapport
inLocale(string)le même rapport, avec ses messages dans une autre locale
count(), toArray(), jsonSerialize()le nombre de constats ; le rapport sous forme de tableau et de JSON

Les constats se suivent règle par règle, dans l'ordre d'exécution des règles, et dans l'ordre du contenu à l'intérieur d'une règle. Une règle qui ne lit pas le format vérifié — html-lang sur un document UJO — ou que la politique désactive n'a pas de résultat.

Un constat

PropriétéContient
rulel'identifiant de la règle, par exemple image-alt
criterionle SuccessCriterion de WCAG 2.2 non respecté, avec title(), level() et understandingUrl()
severitySeverity::Error, Warning ou Notice
messageun Message : la clé du domaine phil_accessibility_check et les valeurs de ses paramètres substituables
locationun Location

Un Location contient ce que l'on sait de l'emplacement du constat. En HTML : la line (à partir de 1), le chemin element depuis le corps, par exemple div:nth-of-type(2) > p > a, et un snippet de sa balise ouvrante coupé à 160 caractères. En UJO : l'identifiant block, le blockType et le pointer du champ, par exemple blocks[2].data.items[0].content, avec le chemin de l'élément dans le champ lorsque le constat se trouve dans son HTML. describe() le rédige pour une personne, et toArray() conserve les champs connus.

JSON

{
    "passed": false,
    "locale": "en",
    "counts": {"error": 1, "warning": 0, "notice": 0},
    "rules": [
        {"rule": "image-alt", "criterion": "1.1.1", "level": "A", "severity": "error", "passed": false, "findings": 1}
    ],
    "findings": [
        {
            "rule": "image-alt",
            "criterion": "1.1.1",
            "level": "A",
            "severity": "error",
            "message": "The image /a.png has no text alternative: describe it in an alt text, or give it alt=\"\" when it is only decoration.",
            "messageKey": "image-alt.missing",
            "parameters": {"source": "/a.png"},
            "location": {"block": "i1", "blockType": "image", "pointer": "blocks[0]"}
        }
    ]
}

passed correspond à passes(), à la sévérité d'erreur. messageKey et parameters permettent à une application de traduire un constat avec son propre traducteur.