@markuplint/ml-spec
Version:
Types and schema that specs of the Markup languages for markuplint
72 lines (71 loc) • 2.31 kB
JavaScript
import { getSpecByTagName } from './get-spec-by-tag-name.js';
import { resolveVersion } from './resolve-version.js';
const cache = new Map();
export function getARIA(specs, localName, namespace, version, matches) {
const aria = getVersionResolvedARIA(specs, localName, namespace, version);
if (!aria) {
return null;
}
const conditions = aria.conditions;
if (!conditions) {
return aria;
}
const conditionKeys = Object.keys(conditions);
let { implicitRole, permittedRoles, implicitProperties, properties, namingProhibited } = aria;
for (const cond of conditionKeys) {
if (!matches(cond)) {
continue;
}
const condARIA = conditions[cond];
if (!condARIA) {
continue;
}
implicitRole = condARIA.implicitRole ?? implicitRole;
permittedRoles = condARIA.permittedRoles ?? permittedRoles;
implicitProperties = condARIA.implicitProperties ?? implicitProperties;
properties = condARIA.properties ?? properties;
namingProhibited = condARIA.namingProhibited ?? namingProhibited;
}
return {
implicitRole,
permittedRoles,
implicitProperties,
properties,
namingProhibited,
};
}
function getVersionResolvedARIA(specs, localName, namespace, version) {
const key = localName + namespace + version;
let aria = cache.get(key);
if (aria !== undefined) {
return aria;
}
const spec = getSpecByTagName(specs.specs, localName, namespace)?.aria;
if (!spec) {
cache.set(key, null);
return null;
}
aria = resolveVersion(spec, version);
if (aria.permittedRoles !== false) {
aria = {
...aria,
permittedRoles: optimizePermittedRoles(aria.permittedRoles),
};
}
cache.set(key, aria);
return aria;
}
function optimizePermittedRoles(permittedRoles) {
if (!Array.isArray(permittedRoles)) {
return permittedRoles;
}
const unique = new Set(permittedRoles);
// https://www.w3.org/TR/wai-aria-1.2/#note-regarding-the-aria-1-1-none-role
if (unique.has('presentation')) {
unique.add('none');
}
if (unique.has('none')) {
unique.add('presentation');
}
return [...unique].sort();
}