Points d'extension
phil/accessibility-checkCe qu'une application implémente, remplace ou utilise.
Écrire une règle
Une règle implémente Contract\Rule — id(), criterion(), severity() — et Contract\HtmlRule, Contract\UjoRule
ou les deux. Elle produit une Violation pour chaque problème : un Location, un Message et, lorsque ce cas diffère
de la règle, sa propre Severity ou son propre SuccessCriterion. Elle ne conserve aucun état entre deux contenus.
use Phil\AccessibilityCheck\Contract\HtmlRule;
use Phil\AccessibilityCheck\Html\HtmlTarget;
use Phil\AccessibilityCheck\Message;
use Phil\AccessibilityCheck\Severity;
use Phil\AccessibilityCheck\SuccessCriterion;
use Phil\AccessibilityCheck\Violation;
final class NoMarquee implements HtmlRule
{
public function id(): string
{
return 'no-marquee';
}
public function criterion(): SuccessCriterion
{
return SuccessCriterion::PauseStopHide;
}
public function severity(): Severity
{
return Severity::Error;
}
public function checkHtml(HtmlTarget $target): iterable
{
foreach ($target->elements('marquee', 'blink') as $element) {
yield new Violation($target->locate($element), new Message('no-marquee.found', ['element' => $element->localName]));
}
}
}
HtmlTarget donne ce qu'une règle demande au contenu : elements(...$names), identifiers(), locate(),
languageOf(), isHidden(), style(), hasRole(), accessibleName(), labelOf(), textOf(), ownText(),
svgTitle(), ainsi que policy, language et isFullDocument. UjoTarget donne blocks(...$types) — chacun étant
un BlockVisit avec son bloc, son pointeur, sa langue et locate() —, fragments(?BlockVisit) — chaque champ HTML
sous forme de HtmlTarget situé dans son bloc —, ainsi que field() et text() pour lire les données.
Rule\FragmentRule est la base d'une règle qui lit les deux : elle implémente checkUjo() en appelant checkBlock()
pour les données de chaque bloc, puis checkHtml() pour chacun de ses champs HTML.
Les règles sont données au vérificateur dans leur ordre d'exécution —
new AccessibilityChecker($policy, [...DefaultRules::all(), new NoMarquee()()]), ou un itérateur étiqueté
(Installation). Deux règles de même identifiant lèvent InvalidPolicy.
Donnez les messages de la règle au traducteur (Messages).
La politique
Policy contient les limites, les titres, le contraste, les couleurs, les langues, les textes de lien génériques et les
règles désactivées ou dotées d'une autre sévérité : voir Politique.
Le traducteur
Le vérificateur prend un TranslatorInterface de symfony/translation-contracts : Translation\Messages::translator()
par défaut, auquel une application ajoute les messages d'une locale ou d'une règle, ou le traducteur de l'application
avec Messages::resources() chargé dans le domaine phil_accessibility_check : voir Messages.
Les champs bruts d'UJO
Ujo\PlainFields nomme, par type de bloc, les champs de données qui ne contiennent jamais de HTML — code d'un bloc
code, latex et mathml de math, chaque champ de chart (*)… Le vérificateur ne les analyse pas, même s'ils
contiennent un <. Un site qui enregistre ses propres types de blocs donne au vérificateur ses champs bruts, qui
remplacent les valeurs par défaut de chaque type nommé :
use Phil\AccessibilityCheck\Ujo\PlainFields;
$checker = new AccessibilityChecker(plainFields: new PlainFields(['recipe' => ['ingredients'], 'chart' => ['*']]));
Le contenu d'un sujet
Contract\SubjectContent indique à la PublicationGuard le HTML ou le document UJO du sujet d'un workflow : voir
Garde de publication.
Le validateur et la commande
Validator\AccessibleContentValidator et Console\CheckCommand reçoivent l'AccessibilityChecker avec lequel ils
vérifient : enregistrez-les comme services avec le vérificateur de l'application.
Le rapport
Report, RuleResult, Finding, Location, Message, Severity, SuccessCriterion et ConformanceLevel sont des
valeurs que lit une application. Les identifiants des règles, les clés des messages, les valeurs de Severity et les
numéros de SuccessCriterion sont stables : un rapport peut ainsi être conservé, puis relu grâce à eux.