UNPKG

@markuplint/ml-spec

Version:

Types and schema that specs of the Markup languages for markuplint

50 lines (49 loc) 2.17 kB
import { ariaSpecs } from './aria-specs.js'; export function getRoleSpec(specs, roleName, namespace, version) { const role = getRoleByName(specs, roleName, namespace, version); if (!role) { return null; } const superClassRoles = recursiveTraverseSuperClassRoles(specs, roleName, namespace, version); return { name: role.name, isAbstract: !!role.isAbstract, deprecated: !!role.deprecated, requiredContextRole: role.requiredContextRole ?? [], requiredOwnedElements: role.requiredOwnedElements ?? [], accessibleNameRequired: !!role.accessibleNameRequired, accessibleNameFromAuthor: !!role.accessibleNameFromAuthor, accessibleNameFromContent: !!role.accessibleNameFromContent, accessibleNameProhibited: !!role.accessibleNameProhibited, childrenPresentational: !!role.childrenPresentational, ownedProperties: role.ownedProperties ?? [], prohibitedProperties: role.prohibitedProperties ?? [], superClassRoles, }; } function recursiveTraverseSuperClassRoles(specs, roleName, namespace, version) { const roles = []; const superClassRoles = getSuperClassRoles(specs, roleName, namespace, version); if (superClassRoles) { roles.push(...superClassRoles); for (const superClassRole of superClassRoles) { const ancestorRoles = recursiveTraverseSuperClassRoles(specs, superClassRole.name, namespace, version); roles.push(...ancestorRoles); } } return roles; } function getSuperClassRoles(specs, roleName, namespace, version) { const role = getRoleByName(specs, roleName, namespace, version); return (role?.generalization ?.map(roleName => getRoleByName(specs, roleName, namespace, version)) .filter((role) => !!role) ?? null); } function getRoleByName(specs, roleName, namespace, version) { const { roles, graphicsRoles } = ariaSpecs(specs, version); let role = roles.find(r => r.name === roleName); if (!role && namespace === 'http://www.w3.org/2000/svg') { role = graphicsRoles.find(r => r.name === roleName); } return role; }