From 9f96ebb6c2fa50103b5225ec1a997a30ced37c1d Mon Sep 17 00:00:00 2001 From: j-mendez Date: Sun, 10 Mar 2024 12:29:15 -0400 Subject: [PATCH] chore(rules): fix htmlcs wcag rules --- kayle/builder/build-rules.ts | 10 +- kayle/builder/build-types.ts | 4 +- kayle/builder/htmlcs-rule-map.ts | 38 +- kayle/lib/rules/ar/axe-rules.ts | 1222 ++++++++++----------- kayle/lib/rules/ar/htmlcs-rules.ts | 1434 ++++++++++++------------ kayle/lib/rules/da/axe-rules.ts | 1172 ++++++++++---------- kayle/lib/rules/da/htmlcs-rules.ts | 1404 ++++++++++++------------ kayle/lib/rules/de/axe-rules.ts | 1218 ++++++++++----------- kayle/lib/rules/de/htmlcs-rules.ts | 1404 ++++++++++++------------ kayle/lib/rules/en/axe-rules.ts | 1218 ++++++++++----------- kayle/lib/rules/en/htmlcs-rules.ts | 1404 ++++++++++++------------ kayle/lib/rules/es/axe-rules.ts | 1178 ++++++++++---------- kayle/lib/rules/es/htmlcs-rules.ts | 1421 ++++++++++++------------ kayle/lib/rules/eu/axe-rules.ts | 1218 ++++++++++----------- kayle/lib/rules/eu/htmlcs-rules.ts | 1404 ++++++++++++------------ kayle/lib/rules/fr/axe-rules.ts | 1184 ++++++++++---------- kayle/lib/rules/fr/htmlcs-rules.ts | 1141 ++++++++++---------- kayle/lib/rules/he/axe-rules.ts | 1218 ++++++++++----------- kayle/lib/rules/he/htmlcs-rules.ts | 1404 ++++++++++++------------ kayle/lib/rules/index.ts | 68 +- kayle/lib/rules/it/axe-rules.ts | 1218 ++++++++++----------- kayle/lib/rules/it/htmlcs-rules.ts | 1378 ++++++++++++------------ kayle/lib/rules/ja/axe-rules.ts | 1220 ++++++++++----------- kayle/lib/rules/ja/htmlcs-rules.ts | 1407 +++++++++++------------- kayle/lib/rules/ko/axe-rules.ts | 1220 ++++++++++----------- kayle/lib/rules/ko/htmlcs-rules.ts | 1434 ++++++++++++------------ kayle/lib/rules/nl/axe-rules.ts | 1218 ++++++++++----------- kayle/lib/rules/nl/htmlcs-rules.ts | 1435 +++++++++++++------------ kayle/lib/rules/no_NB/axe-rules.ts | 1218 ++++++++++----------- kayle/lib/rules/no_NB/htmlcs-rules.ts | 1404 ++++++++++++------------ kayle/lib/rules/pl/axe-rules.ts | 1220 ++++++++++----------- kayle/lib/rules/pl/htmlcs-rules.ts | 1391 ++++++++++++------------ kayle/lib/rules/pt_BR/axe-rules.ts | 1218 ++++++++++----------- kayle/lib/rules/pt_BR/htmlcs-rules.ts | 1404 ++++++++++++------------ kayle/lib/rules/zh_CN/axe-rules.ts | 1218 ++++++++++----------- kayle/lib/rules/zh_CN/htmlcs-rules.ts | 266 ++--- kayle/lib/rules/zh_TW/axe-rules.ts | 1218 ++++++++++----------- kayle/lib/rules/zh_TW/htmlcs-rules.ts | 266 ++--- kayle/package.json | 2 +- 39 files changed, 21225 insertions(+), 20894 deletions(-) diff --git a/kayle/builder/build-rules.ts b/kayle/builder/build-rules.ts index fbee8db..cc0f8dd 100644 --- a/kayle/builder/build-rules.ts +++ b/kayle/builder/build-rules.ts @@ -13,7 +13,7 @@ import type { Rule } from "./build-types"; const browser = await chromium.launch({ headless: true }); const pConfig = { - singleQuote: true, + singleQuote: false, semi: false, parser: "babel", }; @@ -46,8 +46,8 @@ import type { Rule } from "./build-types"; content: `window.htmlcsRuleMap = ${htmlcsRuleMap.toString()};`, }); - await page.exposeFunction("pushHtmlcsRule", (t: Rule) => - fast_htmlcs_rules.push(t), + await page.exposeFunction("pushHtmlcsRule", (t: Rule[]) => + fast_htmlcs_rules.push(...t), ); await page.exposeFunction("pushAxeRule", (t: Rule) => @@ -76,7 +76,9 @@ import type { Rule } from "./build-types"; Buffer.from( await format( `/* ${DNE} */\nexport const htmlcsRules = ${JSON.stringify( - fast_htmlcs_rules.filter((r) => r.description).sort((a, b) => a.ruleId.localeCompare(b.ruleId)), + fast_htmlcs_rules + .filter((r) => r.description) + .sort((a, b) => a.ruleId.localeCompare(b.ruleId)), )};`, pConfig, ), diff --git a/kayle/builder/build-types.ts b/kayle/builder/build-types.ts index 06f1ca2..5ed8a25 100644 --- a/kayle/builder/build-types.ts +++ b/kayle/builder/build-types.ts @@ -14,9 +14,9 @@ declare global { interface Window { HTMLCS: any; axe: any; - pushHtmlcsRule: (r: Rule) => void; + pushHtmlcsRule: (r: Rule[]) => void; pushAxeRule: (r: Rule) => void; - htmlcsRuleMap: (t: ParamList) => Rule; + htmlcsRuleMap: (t: ParamList) => Rule[]; paramList: ParamList[]; } } diff --git a/kayle/builder/htmlcs-rule-map.ts b/kayle/builder/htmlcs-rule-map.ts index 7f4fbde..4ba7fe9 100644 --- a/kayle/builder/htmlcs-rule-map.ts +++ b/kayle/builder/htmlcs-rule-map.ts @@ -1,4 +1,4 @@ -import type { ParamList } from "./build-types"; +import type { ParamList, Rule } from "./build-types"; // Hand stich the rules to map from htmlcs. // We need to map the ruleId to the translation file key. @@ -6,6 +6,8 @@ import type { ParamList } from "./build-types"; // map the rules to a detailed object // the descriptions handling is not perfect and needs to handle split cases. export const htmlcsRuleMap = (rule: ParamList) => { + const rules: Rule[] = []; + const concatWcagLink = (l: string) => `https://www.w3.org/TR/WCAG20-TECHS/${l}`; @@ -36,6 +38,10 @@ export const htmlcsRuleMap = (rule: ParamList) => { ""; } catch (_e) {} + if (description.startsWith("HTMLCS.getTranslation(")) { + description = eval(description); + } + const baseRule = `${rule[4]}${ directRuleAssignments.includes(rule[3]) ? "." : "_" }${rule[3]}`; @@ -46,18 +52,36 @@ export const htmlcsRuleMap = (rule: ParamList) => { ? rule[2].replace("HTMLCS.getTranslation(", "").replace(")", "") : ""; - const ruleId = inlineTranslation + const _ruleId = inlineTranslation ? inlineRule.substring(1, inlineRule.length - 1) : baseRuleId; - return { - ruleId: rule[5] - ? `${rule[5].replace("_Guideline", ".Guideline")}.${ruleId}` - : ruleId, + const ruleId = rule[5] + ? `${rule[5].replace("_Guideline", ".Guideline")}.${_ruleId}` + : _ruleId; + + const pattern = /(.{3})_or_(.{3})/; + + const [, leftPart, rightPart] = ruleId.match(pattern) || []; + + const ruleObj = { + ruleId, description, helpUrl: section508 ? [] : helpLinks.map((r) => concatWcagLink(r.split(".")[0])), - ruleType: rule[0], + ruleType: rule[0] as "error" | "warning" | "notice", }; + + // Check if both parts were found + if (leftPart && rightPart) { + ruleObj.ruleId = ruleId.replace(pattern, leftPart); + rules.push(ruleObj); + ruleObj.ruleId = ruleId.replace(pattern, rightPart); + rules.push(ruleObj); + } else { + rules.push(ruleObj); + } + + return rules; }; diff --git a/kayle/lib/rules/ar/axe-rules.ts b/kayle/lib/rules/ar/axe-rules.ts index 6a08a2e..c950364 100644 --- a/kayle/lib/rules/ar/axe-rules.ts +++ b/kayle/lib/rules/ar/axe-rules.ts @@ -1,978 +1,978 @@ /* THIS FILE WAS CREATED DYNAMICALLY - DO NOT EDIT */ export const axeRules = [ { - ruleId: 'accesskeys', - description: 'يضمن أن قيمة خاصية الوصول لكل مفتاح فريدة', - help: 'يجب أن تكون قيمة خاصية الوصول فريدة', + ruleId: "accesskeys", + description: "يضمن أن قيمة خاصية الوصول لكل مفتاح فريدة", + help: "يجب أن تكون قيمة خاصية الوصول فريدة", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/accesskeys?application=axeAPI&lang=ar', - tags: ['cat.keyboard', 'best-practice'], + "https://dequeuniversity.com/rules/axe/4.6/accesskeys?application=axeAPI&lang=ar", + tags: ["cat.keyboard", "best-practice"], }, { - ruleId: 'area-alt', - description: 'يضمن أن عناصر لخرائط الصور لها نص بديل', - help: 'يجب أن تحتوي عناصر الفعالة على نص بديل', + ruleId: "area-alt", + description: "يضمن أن عناصر لخرائط الصور لها نص بديل", + help: "يجب أن تحتوي عناصر الفعالة على نص بديل", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/area-alt?application=axeAPI&lang=ar', + "https://dequeuniversity.com/rules/axe/4.6/area-alt?application=axeAPI&lang=ar", tags: [ - 'cat.text-alternatives', - 'wcag2a', - 'wcag244', - 'wcag412', - 'section508', - 'section508.22.a', - 'ACT', + "cat.text-alternatives", + "wcag2a", + "wcag244", + "wcag412", + "section508", + "section508.22.a", + "ACT", ], - actIds: ['c487ae'], + actIds: ["c487ae"], }, { - ruleId: 'aria-allowed-attr', - description: 'يضمن أن خصائص ARIA مسموحة لدور عنصر معين', - help: 'يجب أن تستخدم العناصر خصائص ARIA المسموحة فقط', + ruleId: "aria-allowed-attr", + description: "يضمن أن خصائص ARIA مسموحة لدور عنصر معين", + help: "يجب أن تستخدم العناصر خصائص ARIA المسموحة فقط", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-allowed-attr?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag412'], - actIds: ['5c01ea'], + "https://dequeuniversity.com/rules/axe/4.6/aria-allowed-attr?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag412"], + actIds: ["5c01ea"], }, { - ruleId: 'aria-allowed-role', - description: 'يضمن أن خاصية الدور لها قيمة مناسبة للعنصر', - help: 'يجب أن يكون دور ARIA مناسباً للعنصر', + ruleId: "aria-allowed-role", + description: "يضمن أن خاصية الدور لها قيمة مناسبة للعنصر", + help: "يجب أن يكون دور ARIA مناسباً للعنصر", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-allowed-role?application=axeAPI&lang=ar', - tags: ['cat.aria', 'best-practice'], + "https://dequeuniversity.com/rules/axe/4.6/aria-allowed-role?application=axeAPI&lang=ar", + tags: ["cat.aria", "best-practice"], }, { - ruleId: 'aria-command-name', - description: 'يضمن أن كل أمر ARIA ورابط وعنصر قائمة له اسم متاح', - help: 'يجب أن تحتوي أوامر ARIA على اسم متاح', + ruleId: "aria-command-name", + description: "يضمن أن كل أمر ARIA ورابط وعنصر قائمة له اسم متاح", + help: "يجب أن تحتوي أوامر ARIA على اسم متاح", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-command-name?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag412', 'ACT'], - actIds: ['97a4e1'], + "https://dequeuniversity.com/rules/axe/4.6/aria-command-name?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag412", "ACT"], + actIds: ["97a4e1"], }, { - ruleId: 'aria-dialog-name', - description: 'يضمن أن كل عقدة حوار وتنبيه حوار في ARIA لها اسم متاح', - help: 'يجب أن تحتوي عقد الحوار وتنبيه الحوار في ARIA على اسم متاح', + ruleId: "aria-dialog-name", + description: "يضمن أن كل عقدة حوار وتنبيه حوار في ARIA لها اسم متاح", + help: "يجب أن تحتوي عقد الحوار وتنبيه الحوار في ARIA على اسم متاح", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-dialog-name?application=axeAPI&lang=ar', - tags: ['cat.aria', 'best-practice'], + "https://dequeuniversity.com/rules/axe/4.6/aria-dialog-name?application=axeAPI&lang=ar", + tags: ["cat.aria", "best-practice"], }, { - ruleId: 'aria-hidden-body', - description: 'يضمن عدم وجود \'aria-hidden="true"\' على جسم الوثيقة', - help: 'يجب ألا يتواجد \'aria-hidden="true"\' على جسم الوثيقة', + ruleId: "aria-hidden-body", + description: "يضمن عدم وجود 'aria-hidden=\"true\"' على جسم الوثيقة", + help: "يجب ألا يتواجد 'aria-hidden=\"true\"' على جسم الوثيقة", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-hidden-body?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag412'], + "https://dequeuniversity.com/rules/axe/4.6/aria-hidden-body?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag412"], }, { - ruleId: 'aria-hidden-focus', + ruleId: "aria-hidden-focus", description: - 'يضمن أن العناصر المخفية بـ aria-hidden ليست قابلة للتركيز ولا تحتوي على عناصر قابلة للتركيز', - help: 'يجب ألا يكون العنصر المخفي بـ ARIA قابل للتركيز أو يحتوي على عناصر قابلة للتركيز', + "يضمن أن العناصر المخفية بـ aria-hidden ليست قابلة للتركيز ولا تحتوي على عناصر قابلة للتركيز", + help: "يجب ألا يكون العنصر المخفي بـ ARIA قابل للتركيز أو يحتوي على عناصر قابلة للتركيز", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-hidden-focus?application=axeAPI&lang=ar', - tags: ['cat.name-role-value', 'wcag2a', 'wcag412'], - actIds: ['6cfa84'], + "https://dequeuniversity.com/rules/axe/4.6/aria-hidden-focus?application=axeAPI&lang=ar", + tags: ["cat.name-role-value", "wcag2a", "wcag412"], + actIds: ["6cfa84"], }, { - ruleId: 'aria-input-field-name', - description: 'يضمن أن كل حقل إدخال ARIA له اسم متاح', - help: 'يجب أن تحتوي حقول إدخال ARIA على اسم متاح', + ruleId: "aria-input-field-name", + description: "يضمن أن كل حقل إدخال ARIA له اسم متاح", + help: "يجب أن تحتوي حقول إدخال ARIA على اسم متاح", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-input-field-name?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag412', 'ACT'], - actIds: ['e086e5'], + "https://dequeuniversity.com/rules/axe/4.6/aria-input-field-name?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag412", "ACT"], + actIds: ["e086e5"], }, { - ruleId: 'aria-meter-name', - description: 'يضمن أن كل عقدة قياس في ARIA لها اسم متاح', - help: 'يجب أن تحتوي عقد القياس في ARIA على اسم متاح', + ruleId: "aria-meter-name", + description: "يضمن أن كل عقدة قياس في ARIA لها اسم متاح", + help: "يجب أن تحتوي عقد القياس في ARIA على اسم متاح", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-meter-name?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag111'], + "https://dequeuniversity.com/rules/axe/4.6/aria-meter-name?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag111"], }, { - ruleId: 'aria-progressbar-name', - description: 'يضمن أن كل عقدة شريط تقدم في ARIA لها اسم متاح', - help: 'يجب أن تحتوي عقد شريط التقدم في ARIA على اسم متاح', + ruleId: "aria-progressbar-name", + description: "يضمن أن كل عقدة شريط تقدم في ARIA لها اسم متاح", + help: "يجب أن تحتوي عقد شريط التقدم في ARIA على اسم متاح", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-progressbar-name?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag111'], + "https://dequeuniversity.com/rules/axe/4.6/aria-progressbar-name?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag111"], }, { - ruleId: 'aria-required-attr', - description: 'يضمن أن العناصر بأدوار ARIA تحتوي على كل خصائص ARIA المطلوبة', - help: 'يجب توفير خصائص ARIA المطلوبة', + ruleId: "aria-required-attr", + description: "يضمن أن العناصر بأدوار ARIA تحتوي على كل خصائص ARIA المطلوبة", + help: "يجب توفير خصائص ARIA المطلوبة", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-required-attr?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag412'], - actIds: ['4e8ab6'], + "https://dequeuniversity.com/rules/axe/4.6/aria-required-attr?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag412"], + actIds: ["4e8ab6"], }, { - ruleId: 'aria-required-children', - description: 'يضمن أن العناصر بدور ARIA يحتوي على الأدوار الفرعية المطلوبة', - help: 'يجب أن تحتوي بعض الأدوار في ARIA على أدوار فرعية محددة', + ruleId: "aria-required-children", + description: "يضمن أن العناصر بدور ARIA يحتوي على الأدوار الفرعية المطلوبة", + help: "يجب أن تحتوي بعض الأدوار في ARIA على أدوار فرعية محددة", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-required-children?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag131'], - actIds: ['bc4a75', 'ff89c9'], + "https://dequeuniversity.com/rules/axe/4.6/aria-required-children?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag131"], + actIds: ["bc4a75", "ff89c9"], }, { - ruleId: 'aria-required-parent', - description: 'يضمن أن العناصر بدور ARIA تحتوي على الأدوار الأصلية المطلوبة', - help: 'يجب أن تحتوي بعض الأدوار في ARIA على أدوار أصلية محددة', + ruleId: "aria-required-parent", + description: "يضمن أن العناصر بدور ARIA تحتوي على الأدوار الأصلية المطلوبة", + help: "يجب أن تحتوي بعض الأدوار في ARIA على أدوار أصلية محددة", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-required-parent?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag131'], - actIds: ['ff89c9'], + "https://dequeuniversity.com/rules/axe/4.6/aria-required-parent?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag131"], + actIds: ["ff89c9"], }, { - ruleId: 'aria-roledescription', + ruleId: "aria-roledescription", description: - 'يضمن استخدام aria-roledescription فقط على العناصر بدور ضمني أو صريح', - help: 'يجب استخدام aria-roledescription على العناصر بدور دلالي', + "يضمن استخدام aria-roledescription فقط على العناصر بدور ضمني أو صريح", + help: "يجب استخدام aria-roledescription على العناصر بدور دلالي", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-roledescription?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag412'], + "https://dequeuniversity.com/rules/axe/4.6/aria-roledescription?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag412"], }, { - ruleId: 'aria-roles', - description: 'يضمن أن كل العناصر بخاصية دور تستخدم قيمة صالحة', - help: 'يجب أن تتوافق الأدوار في ARIA مع قيم صالحة', + ruleId: "aria-roles", + description: "يضمن أن كل العناصر بخاصية دور تستخدم قيمة صالحة", + help: "يجب أن تتوافق الأدوار في ARIA مع قيم صالحة", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-roles?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag412'], - actIds: ['674b10'], + "https://dequeuniversity.com/rules/axe/4.6/aria-roles?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag412"], + actIds: ["674b10"], }, { - ruleId: 'aria-text', + ruleId: "aria-text", description: 'يضمن استخدام "role=text" على العناصر بدون أحفاد قابلين للتركيز', help: '"role=text" يجب ألا يحتوي على أحفاد قابلين للتركيز', helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-text?application=axeAPI&lang=ar', - tags: ['cat.aria', 'best-practice'], + "https://dequeuniversity.com/rules/axe/4.6/aria-text?application=axeAPI&lang=ar", + tags: ["cat.aria", "best-practice"], }, { - ruleId: 'aria-toggle-field-name', - description: 'يضمن أن كل حقل تبديل في ARIA له اسم متاح', - help: 'يجب أن تحتوي حقول التبديل في ARIA على اسم متاح', + ruleId: "aria-toggle-field-name", + description: "يضمن أن كل حقل تبديل في ARIA له اسم متاح", + help: "يجب أن تحتوي حقول التبديل في ARIA على اسم متاح", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-toggle-field-name?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag412', 'ACT'], - actIds: ['e086e5'], + "https://dequeuniversity.com/rules/axe/4.6/aria-toggle-field-name?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag412", "ACT"], + actIds: ["e086e5"], }, { - ruleId: 'aria-tooltip-name', - description: 'يضمن أن كل عقدة تلميح في ARIA لها اسم متاح', - help: 'يجب أن تحتوي عقد التلميح في ARIA على اسم متاح', + ruleId: "aria-tooltip-name", + description: "يضمن أن كل عقدة تلميح في ARIA لها اسم متاح", + help: "يجب أن تحتوي عقد التلميح في ARIA على اسم متاح", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-tooltip-name?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag412'], + "https://dequeuniversity.com/rules/axe/4.6/aria-tooltip-name?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag412"], }, { - ruleId: 'aria-treeitem-name', - description: 'يضمن أن كل عقدة عنصر شجرة في ARIA لها اسم متاح', - help: 'يجب أن تحتوي عقد عناصر الشجرة في ARIA على اسم متاح', + ruleId: "aria-treeitem-name", + description: "يضمن أن كل عقدة عنصر شجرة في ARIA لها اسم متاح", + help: "يجب أن تحتوي عقد عناصر الشجرة في ARIA على اسم متاح", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-treeitem-name?application=axeAPI&lang=ar', - tags: ['cat.aria', 'best-practice'], + "https://dequeuniversity.com/rules/axe/4.6/aria-treeitem-name?application=axeAPI&lang=ar", + tags: ["cat.aria", "best-practice"], }, { - ruleId: 'aria-valid-attr', - description: 'يضمن أن الخصائص التي تبدأ بـ aria- هي خصائص ARIA صالحة', - help: 'يجب أن تتوافق خصائص ARIA مع أسماء صالحة', + ruleId: "aria-valid-attr", + description: "يضمن أن الخصائص التي تبدأ بـ aria- هي خصائص ARIA صالحة", + help: "يجب أن تتوافق خصائص ARIA مع أسماء صالحة", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-valid-attr?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag412'], - actIds: ['5f99a7'], + "https://dequeuniversity.com/rules/axe/4.6/aria-valid-attr?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag412"], + actIds: ["5f99a7"], }, { - ruleId: 'aria-valid-attr-value', - description: 'يضمن أن كل خصائص ARIA لها قيم صالحة', - help: 'يجب أن تتوافق خصائص ARIA مع قيم صالحة', + ruleId: "aria-valid-attr-value", + description: "يضمن أن كل خصائص ARIA لها قيم صالحة", + help: "يجب أن تتوافق خصائص ARIA مع قيم صالحة", helpUrl: - 'https://dequeuniversity.com/rules/axe/4.6/aria-valid-attr-value?application=axeAPI&lang=ar', - tags: ['cat.aria', 'wcag2a', 'wcag412'], - actIds: ['6a7281'], + "https://dequeuniversity.com/rules/axe/4.6/aria-valid-attr-value?application=axeAPI&lang=ar", + tags: ["cat.aria", "wcag2a", "wcag412"], + actIds: ["6a7281"], }, { - ruleId: 'audio-caption', - description: 'يضمن أن عناصر