При разработке интерфейсов с соблюдением стандартов доступности часто возникают ситуации, когда атрибуты ARIA используются некорректно: применяются неподдерживаемые роли, указываются несовместимые свойства, либо значения атрибутов не соответствуют спецификации. Подобные ошибки ухудшают работу вспомогательных технологий и нарушают семантику документа.
Библиотека aria-query предоставляет структурированные данные о ролях, состояниях и свойствах ARIA. Эти данные используются инструментами анализа кода, линтерами, валидаторами и автоматическими системами исправления. На основе описаний ролей и атрибутов можно не только обнаруживать нарушения, но и формировать механизмы автоматической коррекции.
Автоматическое исправление ошибок — это процесс программного анализа разметки или JSX-кода с последующим внесением корректных изменений на основе официальной модели ARIA.
Библиотека предоставляет несколько ключевых коллекций, содержащих нормативные данные:
1. roles
Содержит карту ролей ARIA и их характеристик:
2. aria
Определяет свойства и состояния ARIA:
3. elementRoles
Связывает HTML-элементы с ролями ARIA.
4. roleElements
Позволяет определить, какие элементы соответствуют определённой роли.
Эти структуры формируют базу знаний, которая используется алгоритмами автоматической коррекции.
Автоматическое исправление обычно касается нескольких распространённых типов нарушений.
Пример:
<div role="buton"></div>
Ошибка — опечатка в значении role.
Алгоритм исправления:
rolesИсправленная версия:
<div role="button"></div>
Некоторые атрибуты допустимы только для определённых ролей.
Пример ошибки:
<div role="button" aria-checked="true"></div>
Свойство aria-checked не применяется к роли
button.
Алгоритм:
roles.get(role).propsИсправление:
<div role="checkbox" aria-checked="true"></div>
или
<div role="button"></div>
Решение зависит от контекста.
Некоторые роли требуют обязательные ARIA-свойства.
Пример:
<div role="slider"></div>
Для slider требуются:
aria-valueminaria-valuemaxaria-valuenowАлгоритм исправления:
requiredPropsРезультат:
<div
role="slider"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="0"
></div>
Использование aria-query для проверки роли:
import { roles } from "aria-query";
function isValidRole(role) {
return roles.has(role);
}
console.log(isValidRole("button"));
console.log(isValidRole("buton"));
На основе такой проверки строятся механизмы автокоррекции.
Каждая роль содержит список допустимых ARIA-свойств.
Пример:
import { roles } from "aria-query";
const buttonRole = roles.get("button");
console.log(buttonRole.props);
Результат представляет объект вида:
{
"aria-expanded": null,
"aria-pressed": null
}
Алгоритм исправления:
Некоторые свойства принимают ограниченный набор значений.
Пример:
<div aria-hidden="maybe"></div>
Значение maybe недопустимо.
Проверка через aria:
import { aria } from "aria-query";
const attr = aria.get("aria-hidden");
console.log(attr.type);
Тип boolean означает допустимые значения:
true
false
Автоматическая коррекция:
<div aria-hidden="false"></div>
Процесс автокоррекции обычно состоит из нескольких этапов.
HTML или JSX преобразуется в AST (абстрактное синтаксическое дерево).
Популярные инструменты:
Выделяются:
rolearia-*Пример узла AST:
{
"name": "div",
"attributes": [
{ "name": "role", "value": "buton" }
]
}
if (!roles.has(roleValue)) {
const corrected = suggestRole(roleValue);
}
Алгоритм suggestRole может использовать:
const roleDefinition = roles.get(roleValue);
const allowedProps = Object.keys(roleDefinition.props);
Сравнение с фактическими атрибутами.
const required = roleDefinition.requiredProps;
Если свойство отсутствует — оно добавляется.
Проверка через aria:
import { aria } from "aria-query";
function isValidValue(attr, value) {
const def = aria.get(attr);
if (def.type === "boolean") {
return value === "true" || value === "false";
}
}
Упрощённый пример функции:
import { roles, aria } from "aria-query";
function fixAriaAttributes(node) {
const roleAttr = node.attributes.find(a => a.name === "role");
if (roleAttr && !roles.has(roleAttr.value)) {
roleAttr.value = "button";
}
if (roleAttr) {
const roleDef = roles.get(roleAttr.value);
const allowedProps = Object.keys(roleDef.props);
node.attributes = node.attributes.filter(attr => {
if (!attr.name.startsWith("aria-")) return true;
return allowedProps.includes(attr.name);
});
}
return node;
}
Такая функция может применяться в инструментах автоматического форматирования кода.
aria-query активно используется линтерами доступности,
например:
Линтер выполняет следующие действия:
Пример правила ESLint:
aria-props
Ошибка:
Invalid ARIA property aria-cheked
Автоисправление:
aria-checked
Некоторые ошибки нельзя исправить без анализа HTML-контекста.
Пример:
<li role="button"></li>
Элемент li обычно используется внутри ul
или ol.
Автокорректор может предложить:
<button></button>
или
<li role="menuitem"></li>
Для этого используется информация из elementRoles.
Пример получения ролей для элемента:
import { elementRoles } from "aria-query";
for (const [element, rolesSet] of elementRoles) {
console.log(element, rolesSet);
}
Это позволяет:
Обратная операция — поиск элементов для роли.
import { roleElements } from "aria-query";
const buttonElements = roleElements.get("button");
console.log(buttonElements);
Применение:
div role="button" на
<button>Автокоррекция часто выполняет семантическое улучшение.
Исходный код:
<div role="button" tabindex="0"></div>
Исправление:
<button></button>
Преимущества:
Автоматические исправления могут выполняться:
Типичная цепочка:
AST parser → aria-query validation → autofix → code generator
Несмотря на наличие полной модели ARIA, существуют ограничения.
1. Недостаток контекста
Инструмент не всегда понимает логику интерфейса.
2. Потенциальная потеря поведения
Замена элементов может повлиять на CSS или JavaScript.
3. Частичная корректность
Иногда возможны несколько допустимых решений.
Поэтому большинство систем применяют консервативную стратегию:
В сложных инструментах используются дополнительные методы.
Определение:
Если элемент с ролью button содержит обработчик
onClick, система может предложить замену на
<button>.
В некоторых системах используются модели машинного обучения, которые:
aria-query представляет данные в виде
Map-структур, что обеспечивает быстрый доступ:
roles.has(role)
roles.get(role)
aria.get(attribute)
Поиск выполняется за O(1).
Это позволяет применять автоматическую проверку и исправление даже в больших кодовых базах.
Типичная структура:
Parser
↓
AST Analyzer
↓
ARIA Validator (aria-query)
↓
Fix Generator
↓
Code Transformer
Каждый этап изолирован и может быть заменён.
Автоматическое исправление ошибок ARIA снижает количество проблем доступности в интерфейсах:
Библиотека aria-query выступает фундаментом таких систем, предоставляя точную модель ARIA-спецификации, пригодную для анализа и автоматической трансформации пользовательского интерфейса.