[{"data":1,"prerenderedAt":90},["Reactive",2],{"blog-post-markdown-accessibility-screen-readers-complete-guide":3},{"slug":4,"title":5,"description":6,"excerpt":7,"date":8,"category":9,"author":10,"keywords":11,"readingMinutes":12,"html":13,"headings":14,"tools":64,"related":65},"markdown-accessibility-screen-readers-complete-guide","Markdown Accessibility and Screen Reader Support: Complete Guide for Inclusive Documentation and Content Creation","Master Markdown accessibility techniques for screen readers, assistive technologies, and inclusive content design. Learn semantic markup, alternative text strategies, and accessibility validation for comprehensive documentation accessibility.","Advanced Markdown accessibility and screen reader support techniques enable inclusive documentation that serves users with diverse abilities and assistive technology requirements. By implementing…","2025-11-22","Tutorial","Matthew Rathbone","markdown accessibility, screen reader markdown, accessible documentation, markdown ARIA, inclusive content markdown, markdown alt text, accessibility testing markdown, WCAG markdown compliance",28,"\u003Cp>Advanced Markdown accessibility and screen reader support techniques enable inclusive documentation that serves users with diverse abilities and assistive technology requirements. By implementing semantic markup strategies, comprehensive alternative text systems, and accessibility validation workflows, content creators can build documentation ecosystems that provide equitable access to information while maintaining the simplicity and maintainability that makes Markdown effective for technical writing and content management.\u003C/p>\n\u003Ch2 id=\"why-master-markdown-accessibility\">Why Master Markdown Accessibility?\u003C/h2>\n\u003Cp>Professional accessibility implementation provides essential benefits for inclusive content creation:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Universal Access\u003C/strong>: Ensure content is usable by people with visual, auditory, motor, and cognitive disabilities\u003C/li>\n\u003Cli>\u003Cstrong>Legal Compliance\u003C/strong>: Meet WCAG 2.1 guidelines and accessibility legislation requirements like ADA and Section 508\u003C/li>\n\u003Cli>\u003Cstrong>Enhanced SEO\u003C/strong>: Improve search engine optimization through semantic markup and structured content\u003C/li>\n\u003Cli>\u003Cstrong>Better User Experience\u003C/strong>: Create cleaner, more navigable content that benefits all users\u003C/li>\n\u003Cli>\u003Cstrong>Future-Proof Design\u003C/strong>: Build sustainable content that works across assistive technologies and devices\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"foundation-accessibility-principles\">Foundation Accessibility Principles\u003C/h2>\n\u003Ch3 id=\"semantic-markup-and-screen-reader-navigation\">Semantic Markup and Screen Reader Navigation\u003C/h3>\n\u003Cp>Understanding how screen readers interpret Markdown structure for optimal navigation:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\"># Foundation Accessibility in Markdown\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## Proper Heading Hierarchy\u003C/span>\n\nScreen readers use headings as navigation landmarks. Always use logical progression:\n\n\u003Cspan class=\"hljs-code\">```markdown\n# Main Document Title (H1)\n## Primary Section (H2)\n### Subsection (H3)\n#### Detail Section (H4)\n\n&lt;!-- Avoid skipping levels --&gt;\n# Title (H1)\n### Subsection (H3) &lt;!-- Bad: skips H2 --&gt;\n\n# Title (H1)\n## Section (H2)\n### Detail (H3) &lt;!-- Good: logical progression --&gt;\n```\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"descriptive-link-text\">Descriptive Link Text\u003C/h2>\n\u003Cp>Links should be meaningful when read out of context:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">&lt;!-- Poor: Generic link text --&gt;\nClick [\u003Cspan class=\"hljs-string\">here\u003C/span>](\u003Cspan class=\"hljs-link\">https://example.com\u003C/span>) for more information.\n[\u003Cspan class=\"hljs-string\">Read more\u003C/span>](\u003Cspan class=\"hljs-link\">https://blog.example.com/post-1\u003C/span>) about this topic.\n\n&lt;!-- Good: Descriptive link text --&gt;\n[\u003Cspan class=\"hljs-string\">Download the accessibility testing guide\u003C/span>](\u003Cspan class=\"hljs-link\">https://example.com/a11y-guide.pdf\u003C/span>)\n[\u003Cspan class=\"hljs-string\">Learn about WCAG 2.1 compliance requirements\u003C/span>](\u003Cspan class=\"hljs-link\">https://blog.example.com/wcag-compliance\u003C/span>)\n\n&lt;!-- Excellent: Context and action clear --&gt;\n[\u003Cspan class=\"hljs-string\">Contact support via email\u003C/span>](\u003Cspan class=\"hljs-link\">mailto:support@example.com\u003C/span>) for technical assistance.\n[\u003Cspan class=\"hljs-string\">Schedule a free accessibility audit\u003C/span>](\u003Cspan class=\"hljs-link\">https://example.com/schedule\u003C/span>) (opens in new window).\n\u003C/code>\u003C/pre>\u003Ch2 id=\"alternative-text-for-images\">Alternative Text for Images\u003C/h2>\n\u003Cp>Comprehensive alt text strategies for different image types:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">&lt;!-- Informative images --&gt;\n![\u003Cspan class=\"hljs-string\">Bar chart showing 65% increase in mobile traffic from 2020 to 2024\u003C/span>](\u003Cspan class=\"hljs-link\">charts/mobile-traffic-growth.png\u003C/span>)\n\n&lt;!-- Functional images (buttons, icons) --&gt;\n![\u003Cspan class=\"hljs-string\">Search\u003C/span>](\u003Cspan class=\"hljs-link\">icons/search.svg\u003C/span>)\n![\u003Cspan class=\"hljs-string\">Close dialog\u003C/span>](\u003Cspan class=\"hljs-link\">icons/close.svg\u003C/span>)\n\n&lt;!-- Decorative images (use empty alt text) --&gt;\n![](\u003Cspan class=\"hljs-link\">decorative/border.png\u003C/span>)\n\n&lt;!-- Complex images with long descriptions --&gt;\n![\u003Cspan class=\"hljs-string\">Complex data visualization showing quarterly sales trends\u003C/span>](\u003Cspan class=\"hljs-link\">data/quarterly-sales.png\u003C/span>)\n\n\u003Cspan class=\"hljs-emphasis\">*Long description*\u003C/span>: This chart displays quarterly sales data for four product categories over three years. Technology products show consistent growth from $2M Q1 2022 to $4.2M Q4 2024. Services revenue remained stable around $1.5M per quarter. Hardware sales peaked at $3.1M in Q3 2023 before declining to $2.8M in Q4 2024. Software subscriptions grew steadily from $800K to $1.9M over the period.\n\u003C/code>\u003C/pre>\u003Ch2 id=\"list-structure-for-screen-readers\">List Structure for Screen Readers\u003C/h2>\n\u003Cp>Properly structured lists improve navigation and comprehension:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\">## Task Completion Checklist\u003C/span>\n\nUse unordered lists for non-sequential items:\n\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> [ ] Review content for heading structure\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> [ ] Add alternative text to all images  \n\u003Cspan class=\"hljs-bullet\">-\u003C/span> [ ] Test with screen reader software\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> [ ] Validate HTML output for accessibility\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> [ ] Check color contrast ratios\n\n\u003Cspan class=\"hljs-section\">## Implementation Steps  \u003C/span>\n\nUse ordered lists for sequential processes:\n\n\u003Cspan class=\"hljs-bullet\">1.\u003C/span> Install accessibility testing tools\n\u003Cspan class=\"hljs-bullet\">2.\u003C/span> Configure screen reader software\n\u003Cspan class=\"hljs-bullet\">3.\u003C/span> Navigate content using only keyboard\n\u003Cspan class=\"hljs-bullet\">4.\u003C/span> Document accessibility issues found\n\u003Cspan class=\"hljs-bullet\">5.\u003C/span> Implement fixes and retest\n\u003Cspan class=\"hljs-bullet\">6.\u003C/span> Generate accessibility compliance report\n\n\u003Cspan class=\"hljs-section\">## Navigation Menu Structure\u003C/span>\n\nOrganize navigation hierarchically:\n\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-strong\">**Getting Started**\u003C/span>\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> [\u003Cspan class=\"hljs-string\">Installation Guide\u003C/span>](\u003Cspan class=\"hljs-link\">installation.md\u003C/span>)\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> [\u003Cspan class=\"hljs-string\">Quick Start Tutorial\u003C/span>](\u003Cspan class=\"hljs-link\">quick-start.md\u003C/span>)\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> [\u003Cspan class=\"hljs-string\">Basic Configuration\u003C/span>](\u003Cspan class=\"hljs-link\">configuration.md\u003C/span>)\n\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-strong\">**Advanced Features**\u003C/span>  \n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> [\u003Cspan class=\"hljs-string\">Accessibility Testing\u003C/span>](\u003Cspan class=\"hljs-link\">accessibility-testing.md\u003C/span>)\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> [\u003Cspan class=\"hljs-string\">Screen Reader Integration\u003C/span>](\u003Cspan class=\"hljs-link\">screen-reader-setup.md\u003C/span>)\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> [\u003Cspan class=\"hljs-string\">ARIA Implementation\u003C/span>](\u003Cspan class=\"hljs-link\">aria-patterns.md\u003C/span>)\n\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-strong\">**Resources**\u003C/span>\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> [\u003Cspan class=\"hljs-string\">WCAG 2.1 Guidelines\u003C/span>](\u003Cspan class=\"hljs-link\">wcag-guidelines.md\u003C/span>)\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> [\u003Cspan class=\"hljs-string\">Testing Tools\u003C/span>](\u003Cspan class=\"hljs-link\">testing-tools.md\u003C/span>)\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> [\u003Cspan class=\"hljs-string\">Community Support\u003C/span>](\u003Cspan class=\"hljs-link\">support.md\u003C/span>)\n\u003C/code>\u003C/pre>\u003Ch3 id=\"screen-reader-testing-and-validation-system\">Screen Reader Testing and Validation System\u003C/h3>\n\u003Cp>Comprehensive testing framework for accessibility validation:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// accessibility-validator.js - Comprehensive accessibility testing system\u003C/span>\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> puppeteer = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;puppeteer&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> axeCore = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;@axe-core/puppeteer&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> fs = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;fs&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">promises\u003C/span>;\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> path = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;path&#x27;\u003C/span>);\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownAccessibilityValidator\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">options = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">outputDirectory\u003C/span>: options.\u003Cspan class=\"hljs-property\">outputDirectory\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;./accessibility-reports&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">wcagLevel\u003C/span>: options.\u003Cspan class=\"hljs-property\">wcagLevel\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;AA&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">includeTags\u003C/span>: options.\u003Cspan class=\"hljs-property\">includeTags\u003C/span> || [\u003Cspan class=\"hljs-string\">&#x27;wcag2a&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;wcag2aa&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;section508&#x27;\u003C/span>],\n            \u003Cspan class=\"hljs-attr\">excludeTags\u003C/span>: options.\u003Cspan class=\"hljs-property\">excludeTags\u003C/span> || [],\n            \u003Cspan class=\"hljs-attr\">viewports\u003C/span>: options.\u003Cspan class=\"hljs-property\">viewports\u003C/span> || [\n                { \u003Cspan class=\"hljs-attr\">width\u003C/span>: \u003Cspan class=\"hljs-number\">1920\u003C/span>, \u003Cspan class=\"hljs-attr\">height\u003C/span>: \u003Cspan class=\"hljs-number\">1080\u003C/span>, \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;desktop&#x27;\u003C/span> },\n                { \u003Cspan class=\"hljs-attr\">width\u003C/span>: \u003Cspan class=\"hljs-number\">768\u003C/span>, \u003Cspan class=\"hljs-attr\">height\u003C/span>: \u003Cspan class=\"hljs-number\">1024\u003C/span>, \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;tablet&#x27;\u003C/span> },\n                { \u003Cspan class=\"hljs-attr\">width\u003C/span>: \u003Cspan class=\"hljs-number\">375\u003C/span>, \u003Cspan class=\"hljs-attr\">height\u003C/span>: \u003Cspan class=\"hljs-number\">667\u003C/span>, \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;mobile&#x27;\u003C/span> }\n            ],\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">browser\u003C/span> = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">testResults\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">initialize\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Initializing accessibility validator...&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">browser\u003C/span> = \u003Cspan class=\"hljs-keyword\">await\u003C/span> puppeteer.\u003Cspan class=\"hljs-title function_\">launch\u003C/span>({\n            \u003Cspan class=\"hljs-attr\">headless\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">args\u003C/span>: [\n                \u003Cspan class=\"hljs-string\">&#x27;--no-sandbox&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;--disable-setuid-sandbox&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;--disable-dev-shm-usage&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;--disable-web-security&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;--allow-running-insecure-content&#x27;\u003C/span>\n            ]\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Ensure output directory exists\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">mkdir\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">outputDirectory\u003C/span>, { \u003Cspan class=\"hljs-attr\">recursive\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateMarkdownFiles\u003C/span>(\u003Cspan class=\"hljs-params\">markdownFiles\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">browser\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">initialize\u003C/span>();\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Validating \u003Cspan class=\"hljs-subst\">${markdownFiles.length}\u003C/span> markdown files...`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> validationResults = {\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">totalFiles\u003C/span>: markdownFiles.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">passedFiles\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">failedFiles\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">totalViolations\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">criticalViolations\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">moderateViolations\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">minorViolations\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>\n            },\n            \u003Cspan class=\"hljs-attr\">fileResults\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">aggregatedViolations\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">recommendations\u003C/span>: []\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> filePath \u003Cspan class=\"hljs-keyword\">of\u003C/span> markdownFiles) {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> fileResult = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateFile\u003C/span>(filePath);\n                validationResults.\u003Cspan class=\"hljs-property\">fileResults\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(fileResult);\n                \n                \u003Cspan class=\"hljs-comment\">// Update summary statistics\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fileResult.\u003Cspan class=\"hljs-property\">violations\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                    validationResults.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">passedFiles\u003C/span>++;\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    validationResults.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">failedFiles\u003C/span>++;\n                }\n                \n                validationResults.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalViolations\u003C/span> += fileResult.\u003Cspan class=\"hljs-property\">violations\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                \n                \u003Cspan class=\"hljs-comment\">// Categorize violations by impact\u003C/span>\n                fileResult.\u003Cspan class=\"hljs-property\">violations\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">violation\u003C/span> =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (violation.\u003Cspan class=\"hljs-property\">impact\u003C/span>) {\n                        \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span>:\n                            validationResults.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">criticalViolations\u003C/span>++;\n                            \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                        \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;serious&#x27;\u003C/span>:\n                            validationResults.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">moderateViolations\u003C/span>++;\n                            \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                        \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;moderate&#x27;\u003C/span>:\n                        \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;minor&#x27;\u003C/span>:\n                            validationResults.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">minorViolations\u003C/span>++;\n                            \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    }\n                    \n                    \u003Cspan class=\"hljs-comment\">// Aggregate violation types\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> violationType = violation.\u003Cspan class=\"hljs-property\">id\u003C/span>;\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!validationResults.\u003Cspan class=\"hljs-property\">aggregatedViolations\u003C/span>.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(violationType)) {\n                        validationResults.\u003Cspan class=\"hljs-property\">aggregatedViolations\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(violationType, {\n                            \u003Cspan class=\"hljs-attr\">id\u003C/span>: violationType,\n                            \u003Cspan class=\"hljs-attr\">description\u003C/span>: violation.\u003Cspan class=\"hljs-property\">description\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">impact\u003C/span>: violation.\u003Cspan class=\"hljs-property\">impact\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">help\u003C/span>: violation.\u003Cspan class=\"hljs-property\">help\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">helpUrl\u003C/span>: violation.\u003Cspan class=\"hljs-property\">helpUrl\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">occurrences\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">affectedFiles\u003C/span>: []\n                        });\n                    }\n                    \n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> aggregated = validationResults.\u003Cspan class=\"hljs-property\">aggregatedViolations\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(violationType);\n                    aggregated.\u003Cspan class=\"hljs-property\">occurrences\u003C/span> += violation.\u003Cspan class=\"hljs-property\">nodes\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!aggregated.\u003Cspan class=\"hljs-property\">affectedFiles\u003C/span>.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(filePath)) {\n                        aggregated.\u003Cspan class=\"hljs-property\">affectedFiles\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(filePath);\n                    }\n                });\n                \n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">`Error validating \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>);\n                validationResults.\u003Cspan class=\"hljs-property\">fileResults\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">file\u003C/span>: filePath,\n                    \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">violations\u003C/span>: [],\n                    \u003Cspan class=\"hljs-attr\">passed\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>\n                });\n                validationResults.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">failedFiles\u003C/span>++;\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Generate recommendations\u003C/span>\n        validationResults.\u003Cspan class=\"hljs-property\">recommendations\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateAccessibilityRecommendations\u003C/span>(validationResults);\n        \n        \u003Cspan class=\"hljs-comment\">// Convert aggregated violations map to array\u003C/span>\n        validationResults.\u003Cspan class=\"hljs-property\">aggregatedViolations\u003C/span> = \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(validationResults.\u003Cspan class=\"hljs-property\">aggregatedViolations\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>())\n            .\u003Cspan class=\"hljs-title function_\">sort\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">a, b\u003C/span>) =&gt;\u003C/span> b.\u003Cspan class=\"hljs-property\">occurrences\u003C/span> - a.\u003Cspan class=\"hljs-property\">occurrences\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Save comprehensive report\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">saveValidationReport\u003C/span>(validationResults);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> validationResults;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateFile\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Validating accessibility for: \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Convert markdown to HTML for testing\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> htmlContent = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">convertMarkdownToHTML\u003C/span>(filePath);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fileResults = {\n            \u003Cspan class=\"hljs-attr\">file\u003C/span>: filePath,\n            \u003Cspan class=\"hljs-attr\">violations\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">passed\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">viewportResults\u003C/span>: {},\n            \u003Cspan class=\"hljs-attr\">screenReaderTest\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">keyboardNavigationTest\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Test across different viewports\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> viewport \u003Cspan class=\"hljs-keyword\">of\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">viewports\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> page = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">browser\u003C/span>.\u003Cspan class=\"hljs-title function_\">newPage\u003C/span>();\n            \n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> page.\u003Cspan class=\"hljs-title function_\">setViewport\u003C/span>({ \n                    \u003Cspan class=\"hljs-attr\">width\u003C/span>: viewport.\u003Cspan class=\"hljs-property\">width\u003C/span>, \n                    \u003Cspan class=\"hljs-attr\">height\u003C/span>: viewport.\u003Cspan class=\"hljs-property\">height\u003C/span> \n                });\n                \n                \u003Cspan class=\"hljs-comment\">// Load content\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> page.\u003Cspan class=\"hljs-title function_\">setContent\u003C/span>(htmlContent, { \n                    \u003Cspan class=\"hljs-attr\">waitUntil\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;networkidle0&#x27;\u003C/span> \n                });\n                \n                \u003Cspan class=\"hljs-comment\">// Run axe-core accessibility tests\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> results = \u003Cspan class=\"hljs-keyword\">await\u003C/span> axeCore.\u003Cspan class=\"hljs-title function_\">run\u003C/span>(page, {\n                    \u003Cspan class=\"hljs-attr\">tags\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">includeTags\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">exclude\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">excludeTags\u003C/span>\n                });\n                \n                fileResults.\u003Cspan class=\"hljs-property\">viewportResults\u003C/span>[viewport.\u003Cspan class=\"hljs-property\">name\u003C/span>] = {\n                    \u003Cspan class=\"hljs-attr\">violations\u003C/span>: results.\u003Cspan class=\"hljs-property\">violations\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">passes\u003C/span>: results.\u003Cspan class=\"hljs-property\">passes\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">incomplete\u003C/span>: results.\u003Cspan class=\"hljs-property\">incomplete\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>\n                };\n                \n                \u003Cspan class=\"hljs-comment\">// Aggregate violations across viewports\u003C/span>\n                results.\u003Cspan class=\"hljs-property\">violations\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">violation\u003C/span> =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-comment\">// Check if this violation type already exists\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> existingViolation = fileResults.\u003Cspan class=\"hljs-property\">violations\u003C/span>.\u003Cspan class=\"hljs-title function_\">find\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">v\u003C/span> =&gt;\u003C/span> v.\u003Cspan class=\"hljs-property\">id\u003C/span> === violation.\u003Cspan class=\"hljs-property\">id\u003C/span>);\n                    \n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (existingViolation) {\n                        \u003Cspan class=\"hljs-comment\">// Merge nodes from this viewport\u003C/span>\n                        existingViolation.\u003Cspan class=\"hljs-property\">nodes\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...violation.\u003Cspan class=\"hljs-property\">nodes\u003C/span>);\n                    } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                        \u003Cspan class=\"hljs-comment\">// Add new violation type\u003C/span>\n                        fileResults.\u003Cspan class=\"hljs-property\">violations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            ...violation,\n                            \u003Cspan class=\"hljs-attr\">viewport\u003C/span>: viewport.\u003Cspan class=\"hljs-property\">name\u003C/span>\n                        });\n                    }\n                });\n                \n                \u003Cspan class=\"hljs-comment\">// Test keyboard navigation if desktop viewport\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (viewport.\u003Cspan class=\"hljs-property\">name\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;desktop&#x27;\u003C/span>) {\n                    fileResults.\u003Cspan class=\"hljs-property\">keyboardNavigationTest\u003C/span> = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">testKeyboardNavigation\u003C/span>(page);\n                }\n                \n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">`Error testing viewport \u003Cspan class=\"hljs-subst\">${viewport.name}\u003C/span>: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>);\n                fileResults.\u003Cspan class=\"hljs-property\">viewportResults\u003C/span>[viewport.\u003Cspan class=\"hljs-property\">name\u003C/span>] = {\n                    \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>\n                };\n            } \u003Cspan class=\"hljs-keyword\">finally\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> page.\u003Cspan class=\"hljs-title function_\">close\u003C/span>();\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Run screen reader specific tests\u003C/span>\n        fileResults.\u003Cspan class=\"hljs-property\">screenReaderTest\u003C/span> = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">testScreenReaderCompatibility\u003C/span>(htmlContent);\n        \n        fileResults.\u003Cspan class=\"hljs-property\">passed\u003C/span> = fileResults.\u003Cspan class=\"hljs-property\">violations\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> fileResults;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">convertMarkdownToHTML\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// This is a simplified conversion - in production, use your site&#x27;s actual build process\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> markdownContent = \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">readFile\u003C/span>(filePath, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> marked = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;marked&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Configure marked for accessibility\u003C/span>\n        marked.\u003Cspan class=\"hljs-title function_\">setOptions\u003C/span>({\n            \u003Cspan class=\"hljs-attr\">headerIds\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">headerPrefix\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heading-&#x27;\u003C/span>\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> htmlBody = \u003Cspan class=\"hljs-title function_\">marked\u003C/span>(markdownContent);\n        \n        \u003Cspan class=\"hljs-comment\">// Wrap in full HTML document structure\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`\n&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n&lt;head&gt;\n    &lt;meta charset=&quot;UTF-8&quot;&gt;\n    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;\n    &lt;title&gt;Accessibility Test Document&lt;/title&gt;\n    &lt;style&gt;\n        body { \n            font-family: system-ui, -apple-system, sans-serif; \n            line-height: 1.6; \n            max-width: 800px; \n            margin: 0 auto; \n            padding: 20px; \n        }\n        img { max-width: 100%; height: auto; }\n        table { border-collapse: collapse; width: 100%; }\n        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n        th { background-color: #f2f2f2; }\n        code { background-color: #f4f4f4; padding: 2px 4px; border-radius: 3px; }\n        pre { background-color: #f4f4f4; padding: 15px; border-radius: 5px; overflow-x: auto; }\n    &lt;/style&gt;\n&lt;/head&gt;\n&lt;body&gt;\n    &lt;main role=&quot;main&quot;&gt;\n        \u003Cspan class=\"hljs-subst\">${htmlBody}\u003C/span>\n    &lt;/main&gt;\n&lt;/body&gt;\n&lt;/html&gt;`\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">testKeyboardNavigation\u003C/span>(\u003Cspan class=\"hljs-params\">page\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> navigationTest = {\n            \u003Cspan class=\"hljs-attr\">passed\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">issues\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">tabbableElements\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">focusTraps\u003C/span>: []\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Get all interactive elements\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> interactiveElements = \u003Cspan class=\"hljs-keyword\">await\u003C/span> page.$$eval(\n                \u003Cspan class=\"hljs-string\">&#x27;a, button, input, textarea, select, [tabindex]:not([tabindex=&quot;-1&quot;])&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">elements\u003C/span> =&gt;\u003C/span> elements.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">el\u003C/span> =&gt;\u003C/span> ({\n                    \u003Cspan class=\"hljs-attr\">tagName\u003C/span>: el.\u003Cspan class=\"hljs-property\">tagName\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: el.\u003Cspan class=\"hljs-property\">type\u003C/span> || \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">hasHref\u003C/span>: el.\u003Cspan class=\"hljs-title function_\">hasAttribute\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;href&#x27;\u003C/span>),\n                    \u003Cspan class=\"hljs-attr\">tabIndex\u003C/span>: el.\u003Cspan class=\"hljs-property\">tabIndex\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">ariaLabel\u003C/span>: el.\u003Cspan class=\"hljs-title function_\">getAttribute\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;aria-label&#x27;\u003C/span>),\n                    \u003Cspan class=\"hljs-attr\">text\u003C/span>: el.\u003Cspan class=\"hljs-property\">textContent\u003C/span>.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>().\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">50\u003C/span>)\n                }))\n            );\n            \n            navigationTest.\u003Cspan class=\"hljs-property\">tabbableElements\u003C/span> = interactiveElements.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \n            \u003Cspan class=\"hljs-comment\">// Test tab navigation\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = \u003Cspan class=\"hljs-number\">0\u003C/span>; i &lt; interactiveElements.\u003Cspan class=\"hljs-property\">length\u003C/span> &amp;&amp; i &lt; \u003Cspan class=\"hljs-number\">20\u003C/span>; i++) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> page.\u003Cspan class=\"hljs-property\">keyboard\u003C/span>.\u003Cspan class=\"hljs-title function_\">press\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Tab&#x27;\u003C/span>);\n                \n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> focusedElement = \u003Cspan class=\"hljs-keyword\">await\u003C/span> page.evaluate(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> focused = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">activeElement\u003C/span>;\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                        \u003Cspan class=\"hljs-attr\">tagName\u003C/span>: focused.\u003Cspan class=\"hljs-property\">tagName\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">className\u003C/span>: focused.\u003Cspan class=\"hljs-property\">className\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">visible\u003C/span>: focused.\u003Cspan class=\"hljs-property\">offsetParent\u003C/span> !== \u003Cspan class=\"hljs-literal\">null\u003C/span>\n                    };\n                });\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!focusedElement.\u003Cspan class=\"hljs-property\">visible\u003C/span>) {\n                    navigationTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Hidden element received focus: \u003Cspan class=\"hljs-subst\">${focusedElement.tagName}\u003C/span>`\u003C/span>);\n                    navigationTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                }\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Test skip links\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> skipLinks = \u003Cspan class=\"hljs-keyword\">await\u003C/span> page.$$eval(\n                \u003Cspan class=\"hljs-string\">&#x27;a[href^=&quot;#&quot;], a[href^=&quot;#skip&quot;]&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">links\u003C/span> =&gt;\u003C/span> links.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">link\u003C/span> =&gt;\u003C/span> ({\n                    \u003Cspan class=\"hljs-attr\">href\u003C/span>: link.\u003Cspan class=\"hljs-property\">href\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">text\u003C/span>: link.\u003Cspan class=\"hljs-property\">textContent\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">visible\u003C/span>: link.\u003Cspan class=\"hljs-property\">offsetParent\u003C/span> !== \u003Cspan class=\"hljs-literal\">null\u003C/span>\n                }))\n            );\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (skipLinks.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span> &amp;&amp; interactiveElements.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">10\u003C/span>) {\n                navigationTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;No skip links found for content with many interactive elements&#x27;\u003C/span>);\n                navigationTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n            }\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            navigationTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n            navigationTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Keyboard navigation test failed: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> navigationTest;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">testScreenReaderCompatibility\u003C/span>(\u003Cspan class=\"hljs-params\">htmlContent\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> srTest = {\n            \u003Cspan class=\"hljs-attr\">passed\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">issues\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">landmarks\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">headingStructure\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">listStructure\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">imageAnalysis\u003C/span>: []\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Parse HTML for screen reader specific analysis\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> cheerio = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;cheerio&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> $ = cheerio.\u003Cspan class=\"hljs-title function_\">load\u003C/span>(htmlContent);\n            \n            \u003Cspan class=\"hljs-comment\">// Check landmark elements\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> landmarks = $(\u003Cspan class=\"hljs-string\">&#x27;main, nav, header, footer, section, article, aside, [role=&quot;banner&quot;], [role=&quot;navigation&quot;], [role=&quot;main&quot;], [role=&quot;contentinfo&quot;], [role=&quot;complementary&quot;]&#x27;\u003C/span>);\n            srTest.\u003Cspan class=\"hljs-property\">landmarks\u003C/span> = landmarks.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (srTest.\u003Cspan class=\"hljs-property\">landmarks\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                srTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;No landmark elements found - screen reader navigation will be difficult&#x27;\u003C/span>);\n                srTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Analyze heading structure\u003C/span>\n            $(\u003Cspan class=\"hljs-string\">&#x27;h1, h2, h3, h4, h5, h6&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">each\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">i, el\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> level = \u003Cspan class=\"hljs-built_in\">parseInt\u003C/span>(el.\u003Cspan class=\"hljs-property\">tagName\u003C/span>.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span>));\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> text = $(el).\u003Cspan class=\"hljs-title function_\">text\u003C/span>().\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n                srTest.\u003Cspan class=\"hljs-property\">headingStructure\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({ level, text });\n            });\n            \n            \u003Cspan class=\"hljs-comment\">// Check for proper heading hierarchy\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = \u003Cspan class=\"hljs-number\">1\u003C/span>; i &lt; srTest.\u003Cspan class=\"hljs-property\">headingStructure\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> current = srTest.\u003Cspan class=\"hljs-property\">headingStructure\u003C/span>[i];\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> previous = srTest.\u003Cspan class=\"hljs-property\">headingStructure\u003C/span>[i - \u003Cspan class=\"hljs-number\">1\u003C/span>];\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (current.\u003Cspan class=\"hljs-property\">level\u003C/span> &gt; previous.\u003Cspan class=\"hljs-property\">level\u003C/span> + \u003Cspan class=\"hljs-number\">1\u003C/span>) {\n                    srTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Heading level skip detected: \u003Cspan class=\"hljs-subst\">${previous.level}\u003C/span> to \u003Cspan class=\"hljs-subst\">${current.level}\u003C/span>`\u003C/span>);\n                    srTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                }\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Analyze list structure\u003C/span>\n            $(\u003Cspan class=\"hljs-string\">&#x27;ul, ol&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">each\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">i, list\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> $list = $(list);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> items = $list.\u003Cspan class=\"hljs-title function_\">children\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;li&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> nested = $list.\u003Cspan class=\"hljs-title function_\">find\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;ul, ol&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                \n                srTest.\u003Cspan class=\"hljs-property\">listStructure\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: list.\u003Cspan class=\"hljs-property\">tagName\u003C/span>,\n                    items,\n                    nested,\n                    \u003Cspan class=\"hljs-attr\">hasProperStructure\u003C/span>: items &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>\n                });\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (items === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                    srTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Empty \u003Cspan class=\"hljs-subst\">${list.tagName}\u003C/span> found`\u003C/span>);\n                    srTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                }\n            });\n            \n            \u003Cspan class=\"hljs-comment\">// Analyze images for alt text\u003C/span>\n            $(\u003Cspan class=\"hljs-string\">&#x27;img&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">each\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">i, img\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> $img = $(img);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> src = $img.\u003Cspan class=\"hljs-title function_\">attr\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;src&#x27;\u003C/span>) || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> alt = $img.\u003Cspan class=\"hljs-title function_\">attr\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;alt&#x27;\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> isDecorative = alt === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> hasAlt = alt !== \u003Cspan class=\"hljs-literal\">undefined\u003C/span>;\n                \n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> analysis = {\n                    \u003Cspan class=\"hljs-attr\">src\u003C/span>: src.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">50\u003C/span>),\n                    hasAlt,\n                    isDecorative,\n                    \u003Cspan class=\"hljs-attr\">altLength\u003C/span>: alt ? alt.\u003Cspan class=\"hljs-property\">length\u003C/span> : \u003Cspan class=\"hljs-number\">0\u003C/span>\n                };\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!hasAlt) {\n                    srTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Image missing alt attribute: \u003Cspan class=\"hljs-subst\">${src}\u003C/span>`\u003C/span>);\n                    srTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!isDecorative &amp;&amp; alt.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">125\u003C/span>) {\n                    srTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Alt text too long (\u003Cspan class=\"hljs-subst\">${alt.length}\u003C/span> chars): \u003Cspan class=\"hljs-subst\">${src}\u003C/span>`\u003C/span>);\n                    srTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!isDecorative &amp;&amp; alt.\u003Cspan class=\"hljs-property\">length\u003C/span> &lt; \u003Cspan class=\"hljs-number\">5\u003C/span>) {\n                    srTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Alt text too short: \u003Cspan class=\"hljs-subst\">${src}\u003C/span>`\u003C/span>);\n                    srTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                }\n                \n                srTest.\u003Cspan class=\"hljs-property\">imageAnalysis\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(analysis);\n            });\n            \n            \u003Cspan class=\"hljs-comment\">// Check for table headers\u003C/span>\n            $(\u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">each\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">i, table\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> $table = $(table);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> hasHeaders = $table.\u003Cspan class=\"hljs-title function_\">find\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;th&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> hasCaption = $table.\u003Cspan class=\"hljs-title function_\">find\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;caption&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>;\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!hasHeaders) {\n                    srTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Table found without header cells (th)&#x27;\u003C/span>);\n                    srTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                }\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!hasCaption &amp;&amp; $table.\u003Cspan class=\"hljs-title function_\">find\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;tr&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">3\u003C/span>) {\n                    srTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Complex table found without caption&#x27;\u003C/span>);\n                    srTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                }\n            });\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            srTest.\u003Cspan class=\"hljs-property\">passed\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n            srTest.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Screen reader analysis failed: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> srTest;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateAccessibilityRecommendations\u003C/span>(\u003Cspan class=\"hljs-params\">validationResults\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> recommendations = [];\n        \n        \u003Cspan class=\"hljs-comment\">// Critical violations need immediate attention\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (validationResults.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">criticalViolations\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Critical Accessibility Violations Found&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${validationResults.summary.criticalViolations}\u003C/span> critical violations must be addressed immediately for WCAG compliance`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Review critical violations in the detailed report and implement fixes&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">impact\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Blocks users with disabilities from accessing content&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for common patterns in aggregated violations\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> topViolations = validationResults.\u003Cspan class=\"hljs-property\">aggregatedViolations\u003C/span>.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">5\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (topViolations.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">v\u003C/span> =&gt;\u003C/span> v.\u003Cspan class=\"hljs-property\">id\u003C/span>.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;alt-text&#x27;\u003C/span>) || v.\u003Cspan class=\"hljs-property\">id\u003C/span>.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;image&#x27;\u003C/span>))) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Improve Image Accessibility&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Multiple images lack proper alternative text&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Add descriptive alt attributes to all informative images, use empty alt=&quot;&quot; for decorative images&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">impact\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Screen reader users cannot understand image content&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (topViolations.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">v\u003C/span> =&gt;\u003C/span> v.\u003Cspan class=\"hljs-property\">id\u003C/span>.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;heading&#x27;\u003C/span>) || v.\u003Cspan class=\"hljs-property\">id\u003C/span>.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;structure&#x27;\u003C/span>))) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Fix Heading Structure&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Improper heading hierarchy affects navigation&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Use logical heading progression (H1 → H2 → H3) without skipping levels&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">impact\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Screen reader users cannot navigate content efficiently&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (topViolations.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">v\u003C/span> =&gt;\u003C/span> v.\u003Cspan class=\"hljs-property\">id\u003C/span>.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;link&#x27;\u003C/span>) || v.\u003Cspan class=\"hljs-property\">id\u003C/span>.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;anchor&#x27;\u003C/span>))) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Improve Link Accessibility&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Links need more descriptive text or context&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Use descriptive link text that makes sense out of context&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">impact\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Users cannot understand link destinations or purposes&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for missing landmarks\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> hasLandmarkIssues = validationResults.\u003Cspan class=\"hljs-property\">fileResults\u003C/span>.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">result\u003C/span> =&gt;\u003C/span> \n            result.\u003Cspan class=\"hljs-property\">screenReaderTest\u003C/span> &amp;&amp; result.\u003Cspan class=\"hljs-property\">screenReaderTest\u003C/span>.\u003Cspan class=\"hljs-property\">landmarks\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>\n        );\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (hasLandmarkIssues) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Add Semantic Landmarks&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Documents lack proper landmark elements for navigation&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Use semantic HTML elements like &lt;main&gt;, &lt;nav&gt;, &lt;header&gt;, &lt;footer&gt;&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">impact\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Screen reader users cannot navigate page structure efficiently&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Performance recommendations\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (validationResults.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span> &gt; \u003Cspan class=\"hljs-number\">10\u003C/span> &amp;&amp; validationResults.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">passedFiles\u003C/span> &lt; validationResults.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span> * \u003Cspan class=\"hljs-number\">0.8\u003C/span>) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Implement Accessibility CI/CD&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Consider automating accessibility testing in your build process&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Integrate accessibility testing into continuous integration pipeline&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">impact\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Prevent accessibility regressions and catch issues early&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> recommendations.\u003Cspan class=\"hljs-title function_\">sort\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">a, b\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> priorityOrder = { \u003Cspan class=\"hljs-attr\">critical\u003C/span>: \u003Cspan class=\"hljs-number\">3\u003C/span>, \u003Cspan class=\"hljs-attr\">high\u003C/span>: \u003Cspan class=\"hljs-number\">2\u003C/span>, \u003Cspan class=\"hljs-attr\">medium\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>, \u003Cspan class=\"hljs-attr\">low\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span> };\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> (priorityOrder[b.\u003Cspan class=\"hljs-property\">priority\u003C/span>] || \u003Cspan class=\"hljs-number\">0\u003C/span>) - (priorityOrder[a.\u003Cspan class=\"hljs-property\">priority\u003C/span>] || \u003Cspan class=\"hljs-number\">0\u003C/span>);\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">saveValidationReport\u003C/span>(\u003Cspan class=\"hljs-params\">validationResults\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> timestamp = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>().\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;T&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">0\u003C/span>];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> reportPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">outputDirectory\u003C/span>, \u003Cspan class=\"hljs-string\">`accessibility-report-\u003Cspan class=\"hljs-subst\">${timestamp}\u003C/span>.json`\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> htmlReportPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">outputDirectory\u003C/span>, \u003Cspan class=\"hljs-string\">`accessibility-report-\u003Cspan class=\"hljs-subst\">${timestamp}\u003C/span>.html`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Save JSON report\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">writeFile\u003C/span>(reportPath, \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">stringify\u003C/span>(validationResults, \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-number\">2\u003C/span>));\n        \n        \u003Cspan class=\"hljs-comment\">// Generate and save HTML report\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> htmlReport = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateHTMLReport\u003C/span>(validationResults);\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">writeFile\u003C/span>(htmlReportPath, htmlReport);\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Accessibility reports saved:`\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`  JSON: \u003Cspan class=\"hljs-subst\">${reportPath}\u003C/span>`\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`  HTML: \u003Cspan class=\"hljs-subst\">${htmlReportPath}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">jsonReport\u003C/span>: reportPath, \u003Cspan class=\"hljs-attr\">htmlReport\u003C/span>: htmlReportPath };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateHTMLReport\u003C/span>(\u003Cspan class=\"hljs-params\">validationResults\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { summary, fileResults, aggregatedViolations, recommendations } = validationResults;\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`\n&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n&lt;head&gt;\n    &lt;meta charset=&quot;UTF-8&quot;&gt;\n    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;\n    &lt;title&gt;Accessibility Report&lt;/title&gt;\n    &lt;style&gt;\n        body { font-family: system-ui, sans-serif; max-width: 1200px; margin: 0 auto; padding: 20px; }\n        .summary { background: #f8f9fa; padding: 20px; border-radius: 8px; margin-bottom: 30px; }\n        .metric { display: inline-block; margin: 10px 20px 10px 0; }\n        .metric-value { font-size: 2em; font-weight: bold; display: block; }\n        .critical { color: #dc3545; }\n        .warning { color: #fd7e14; }\n        .success { color: #28a745; }\n        .violation-card { border: 1px solid #ddd; border-radius: 8px; margin: 15px 0; padding: 15px; }\n        .violation-header { font-weight: bold; margin-bottom: 10px; }\n        .file-result { border-left: 4px solid #ccc; margin: 10px 0; padding: 15px; background: #f8f9fa; }\n        .file-result.passed { border-color: #28a745; }\n        .file-result.failed { border-color: #dc3545; }\n        .recommendation { border-left: 4px solid #007bff; padding: 15px; margin: 10px 0; background: #f8f9fa; }\n        .recommendation.critical { border-color: #dc3545; }\n        .recommendation.high { border-color: #fd7e14; }\n        .recommendation.medium { border-color: #ffc107; }\n        table { width: 100%; border-collapse: collapse; margin: 20px 0; }\n        th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }\n        th { background-color: #f2f2f2; }\n    &lt;/style&gt;\n&lt;/head&gt;\n&lt;body&gt;\n    &lt;h1&gt;Accessibility Report&lt;/h1&gt;\n    \n    &lt;div class=&quot;summary&quot;&gt;\n        &lt;h2&gt;Summary&lt;/h2&gt;\n        &lt;div class=&quot;metric&quot;&gt;\n            &lt;span class=&quot;metric-value&quot;&gt;\u003Cspan class=\"hljs-subst\">${summary.totalFiles}\u003C/span>&lt;/span&gt;\n            Total Files\n        &lt;/div&gt;\n        &lt;div class=&quot;metric&quot;&gt;\n            &lt;span class=&quot;metric-value \u003Cspan class=\"hljs-subst\">${summary.passedFiles === summary.totalFiles ? \u003Cspan class=\"hljs-string\">&#x27;success&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>}\u003C/span>&quot;&gt;\u003Cspan class=\"hljs-subst\">${summary.passedFiles}\u003C/span>&lt;/span&gt;\n            Passed\n        &lt;/div&gt;\n        &lt;div class=&quot;metric&quot;&gt;\n            &lt;span class=&quot;metric-value \u003Cspan class=\"hljs-subst\">${summary.failedFiles &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;success&#x27;\u003C/span>}\u003C/span>&quot;&gt;\u003Cspan class=\"hljs-subst\">${summary.failedFiles}\u003C/span>&lt;/span&gt;\n            Failed\n        &lt;/div&gt;\n        &lt;div class=&quot;metric&quot;&gt;\n            &lt;span class=&quot;metric-value \u003Cspan class=\"hljs-subst\">${summary.criticalViolations &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;success&#x27;\u003C/span>}\u003C/span>&quot;&gt;\u003Cspan class=\"hljs-subst\">${summary.criticalViolations}\u003C/span>&lt;/span&gt;\n            Critical Violations\n        &lt;/div&gt;\n    &lt;/div&gt;\n    \n    \u003Cspan class=\"hljs-subst\">${recommendations.length &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \u003Cspan class=\"hljs-string\">`\n    &lt;section&gt;\n        &lt;h2&gt;Recommendations&lt;/h2&gt;\n        \u003Cspan class=\"hljs-subst\">${recommendations.map(rec =&gt; \u003Cspan class=\"hljs-string\">`\n        &lt;div class=&quot;recommendation \u003Cspan class=\"hljs-subst\">${rec.priority}\u003C/span>&quot;&gt;\n            &lt;h3&gt;\u003Cspan class=\"hljs-subst\">${rec.title}\u003C/span>&lt;/h3&gt;\n            &lt;p&gt;&lt;strong&gt;Priority:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${rec.priority.toUpperCase()}\u003C/span>&lt;/p&gt;\n            &lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${rec.description}\u003C/span>&lt;/p&gt;\n            &lt;p&gt;&lt;strong&gt;Action:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${rec.action}\u003C/span>&lt;/p&gt;\n            &lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${rec.impact}\u003C/span>&lt;/p&gt;\n        &lt;/div&gt;\n        `\u003C/span>).join(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)}\u003C/span>\n    &lt;/section&gt;\n    `\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>\n    \n    &lt;section&gt;\n        &lt;h2&gt;Top Violation Types&lt;/h2&gt;\n        &lt;table&gt;\n            &lt;thead&gt;\n                &lt;tr&gt;\n                    &lt;th&gt;Violation Type&lt;/th&gt;\n                    &lt;th&gt;Impact&lt;/th&gt;\n                    &lt;th&gt;Occurrences&lt;/th&gt;\n                    &lt;th&gt;Files Affected&lt;/th&gt;\n                    &lt;th&gt;Description&lt;/th&gt;\n                &lt;/tr&gt;\n            &lt;/thead&gt;\n            &lt;tbody&gt;\n                \u003Cspan class=\"hljs-subst\">${aggregatedViolations.slice(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">10\u003C/span>).map(violation =&gt; \u003Cspan class=\"hljs-string\">`\n                &lt;tr&gt;\n                    &lt;td&gt;&lt;code&gt;\u003Cspan class=\"hljs-subst\">${violation.id}\u003C/span>&lt;/code&gt;&lt;/td&gt;\n                    &lt;td&gt;&lt;span class=&quot;\u003Cspan class=\"hljs-subst\">${violation.impact === \u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span> ? \u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span> : violation.impact === \u003Cspan class=\"hljs-string\">&#x27;serious&#x27;\u003C/span> ? \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>&quot;&gt;\u003Cspan class=\"hljs-subst\">${violation.impact}\u003C/span>&lt;/span&gt;&lt;/td&gt;\n                    &lt;td&gt;\u003Cspan class=\"hljs-subst\">${violation.occurrences}\u003C/span>&lt;/td&gt;\n                    &lt;td&gt;\u003Cspan class=\"hljs-subst\">${violation.affectedFiles.length}\u003C/span>&lt;/td&gt;\n                    &lt;td&gt;\u003Cspan class=\"hljs-subst\">${violation.description}\u003C/span>&lt;/td&gt;\n                &lt;/tr&gt;\n                `\u003C/span>).join(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)}\u003C/span>\n            &lt;/tbody&gt;\n        &lt;/table&gt;\n    &lt;/section&gt;\n    \n    &lt;section&gt;\n        &lt;h2&gt;File Results&lt;/h2&gt;\n        \u003Cspan class=\"hljs-subst\">${fileResults.map(result =&gt; \u003Cspan class=\"hljs-string\">`\n        &lt;div class=&quot;file-result \u003Cspan class=\"hljs-subst\">${result.passed ? \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>}\u003C/span>&quot;&gt;\n            &lt;h3&gt;\u003Cspan class=\"hljs-subst\">${result.file}\u003C/span>&lt;/h3&gt;\n            &lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${result.passed ? \u003Cspan class=\"hljs-string\">&#x27;✅ Passed&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;❌ Failed&#x27;\u003C/span>}\u003C/span>&lt;/p&gt;\n            &lt;p&gt;&lt;strong&gt;Violations:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${result.violations.length}\u003C/span>&lt;/p&gt;\n            \n            \u003Cspan class=\"hljs-subst\">${result.keyboardNavigationTest ? \u003Cspan class=\"hljs-string\">`\n            &lt;p&gt;&lt;strong&gt;Keyboard Navigation:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${result.keyboardNavigationTest.passed ? \u003Cspan class=\"hljs-string\">&#x27;✅ Passed&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;❌ Failed&#x27;\u003C/span>}\u003C/span>&lt;/p&gt;\n            \u003Cspan class=\"hljs-subst\">${result.keyboardNavigationTest.issues.length &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \u003Cspan class=\"hljs-string\">`\n            &lt;ul&gt;\n                \u003Cspan class=\"hljs-subst\">${result.keyboardNavigationTest.issues.map(issue =&gt; \u003Cspan class=\"hljs-string\">`&lt;li&gt;\u003Cspan class=\"hljs-subst\">${issue}\u003C/span>&lt;/li&gt;`\u003C/span>).join(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)}\u003C/span>\n            &lt;/ul&gt;\n            `\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>\n            `\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>\n            \n            \u003Cspan class=\"hljs-subst\">${result.screenReaderTest ? \u003Cspan class=\"hljs-string\">`\n            &lt;p&gt;&lt;strong&gt;Screen Reader Compatibility:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${result.screenReaderTest.passed ? \u003Cspan class=\"hljs-string\">&#x27;✅ Passed&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;❌ Failed&#x27;\u003C/span>}\u003C/span>&lt;/p&gt;\n            &lt;p&gt;&lt;strong&gt;Landmarks:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${result.screenReaderTest.landmarks}\u003C/span>&lt;/p&gt;\n            &lt;p&gt;&lt;strong&gt;Heading Structure:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${result.screenReaderTest.headingStructure.length}\u003C/span> headings&lt;/p&gt;\n            `\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>\n            \n            \u003Cspan class=\"hljs-subst\">${result.violations.length &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \u003Cspan class=\"hljs-string\">`\n            &lt;details&gt;\n                &lt;summary&gt;Show Violations (\u003Cspan class=\"hljs-subst\">${result.violations.length}\u003C/span>)&lt;/summary&gt;\n                \u003Cspan class=\"hljs-subst\">${result.violations.map(violation =&gt; \u003Cspan class=\"hljs-string\">`\n                &lt;div class=&quot;violation-card&quot;&gt;\n                    &lt;div class=&quot;violation-header&quot;&gt;\u003Cspan class=\"hljs-subst\">${violation.id}\u003C/span> - \u003Cspan class=\"hljs-subst\">${violation.impact}\u003C/span>&lt;/div&gt;\n                    &lt;p&gt;\u003Cspan class=\"hljs-subst\">${violation.description}\u003C/span>&lt;/p&gt;\n                    &lt;p&gt;&lt;strong&gt;Help:&lt;/strong&gt; &lt;a href=&quot;\u003Cspan class=\"hljs-subst\">${violation.helpUrl}\u003C/span>&quot; target=&quot;_blank&quot;&gt;\u003Cspan class=\"hljs-subst\">${violation.help}\u003C/span>&lt;/a&gt;&lt;/p&gt;\n                    &lt;p&gt;&lt;strong&gt;Affected elements:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${violation.nodes.length}\u003C/span>&lt;/p&gt;\n                &lt;/div&gt;\n                `\u003C/span>).join(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)}\u003C/span>\n            &lt;/details&gt;\n            `\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>\n        &lt;/div&gt;\n        `\u003C/span>).join(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)}\u003C/span>\n    &lt;/section&gt;\n    \n    &lt;footer style=&quot;margin-top: 50px; padding-top: 20px; border-top: 1px solid #ddd; color: #666;&quot;&gt;\n        &lt;p&gt;Report generated on \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-built_in\">Date\u003C/span>().toLocaleString()}\u003C/span>&lt;/p&gt;\n        &lt;p&gt;Generated by Markdown Accessibility Validator&lt;/p&gt;\n    &lt;/footer&gt;\n&lt;/body&gt;\n&lt;/html&gt;`\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">cleanup\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">browser\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">browser\u003C/span>.\u003Cspan class=\"hljs-title function_\">close\u003C/span>();\n        }\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">// Usage example\u003C/span>\n\u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">function\u003C/span> \u003Cspan class=\"hljs-title function_\">validateDocumentationAccessibility\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> validator = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownAccessibilityValidator\u003C/span>({\n        \u003Cspan class=\"hljs-attr\">outputDirectory\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;./reports/accessibility&#x27;\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">wcagLevel\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;AA&#x27;\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">includeTags\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;wcag2a&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;wcag2aa&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;section508&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;best-practice&#x27;\u003C/span>]\n    });\n    \n    \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n        \u003Cspan class=\"hljs-comment\">// Find all markdown files\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> glob = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;glob&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> markdownFiles = glob.\u003Cspan class=\"hljs-title function_\">sync\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;**/*.md&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">ignore\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;node_modules/**&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.git/**&#x27;\u003C/span>]\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Found \u003Cspan class=\"hljs-subst\">${markdownFiles.length}\u003C/span> markdown files to validate`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Run validation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> results = \u003Cspan class=\"hljs-keyword\">await\u003C/span> validator.\u003Cspan class=\"hljs-title function_\">validateMarkdownFiles\u003C/span>(markdownFiles);\n        \n        \u003Cspan class=\"hljs-comment\">// Log summary\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n=== Accessibility Validation Results ===&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Total files: \u003Cspan class=\"hljs-subst\">${results.summary.totalFiles}\u003C/span>`\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Passed: \u003Cspan class=\"hljs-subst\">${results.summary.passedFiles}\u003C/span>`\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Failed: \u003Cspan class=\"hljs-subst\">${results.summary.failedFiles}\u003C/span>`\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Critical violations: \u003Cspan class=\"hljs-subst\">${results.summary.criticalViolations}\u003C/span>`\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Total violations: \u003Cspan class=\"hljs-subst\">${results.summary.totalViolations}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (results.\u003Cspan class=\"hljs-property\">recommendations\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n=== Top Recommendations ===&#x27;\u003C/span>);\n            results.\u003Cspan class=\"hljs-property\">recommendations\u003C/span>.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">3\u003C/span>).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">rec\u003C/span> =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${rec.priority.toUpperCase()}\u003C/span>: \u003Cspan class=\"hljs-subst\">${rec.title}\u003C/span>`\u003C/span>);\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`  \u003Cspan class=\"hljs-subst\">${rec.action}\u003C/span>`\u003C/span>);\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> results;\n        \n    } \u003Cspan class=\"hljs-keyword\">finally\u003C/span> {\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> validator.\u003Cspan class=\"hljs-title function_\">cleanup\u003C/span>();\n    }\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">MarkdownAccessibilityValidator\u003C/span>;\n\n\u003Cspan class=\"hljs-comment\">// CLI interface\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-built_in\">require\u003C/span>.\u003Cspan class=\"hljs-property\">main\u003C/span> === \u003Cspan class=\"hljs-variable language_\">module\u003C/span>) {\n    \u003Cspan class=\"hljs-title function_\">validateDocumentationAccessibility\u003C/span>()\n        .\u003Cspan class=\"hljs-title function_\">then\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">results\u003C/span> =&gt;\u003C/span> {\n            process.\u003Cspan class=\"hljs-title function_\">exit\u003C/span>(results.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">criticalViolations\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \u003Cspan class=\"hljs-number\">1\u003C/span> : \u003Cspan class=\"hljs-number\">0\u003C/span>);\n        })\n        .\u003Cspan class=\"hljs-title function_\">catch\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">error\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Validation failed:&#x27;\u003C/span>, error);\n            process.\u003Cspan class=\"hljs-title function_\">exit\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span>);\n        });\n}\n\u003C/code>\u003C/pre>\u003Ch3 id=\"alternative-text-and-image-accessibility\">Alternative Text and Image Accessibility\u003C/h3>\n\u003Cp>Comprehensive image accessibility strategies for different content types:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\"># Advanced Image Accessibility Patterns\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## Informative Images\u003C/span>\n\nImages that convey important information require descriptive alt text:\n\n\u003Cspan class=\"hljs-code\">```markdown\n&lt;!-- Data visualizations --&gt;\n![Sales performance chart showing 23% increase in Q3 2024 compared to Q2, with mobile sales leading at 45% growth](charts/q3-sales-performance.png)\n\n&lt;!-- Screenshots with UI elements --&gt;\n![Screenshot of accessibility settings panel with &quot;Enable screen reader support&quot; checkbox selected and &quot;High contrast mode&quot; toggle activated](screenshots/accessibility-settings.png)\n\n&lt;!-- Diagrams and flowcharts --&gt;\n![Software architecture diagram showing three-tier structure: presentation layer (React frontend), business logic layer (Node.js API), and data layer (PostgreSQL database) with bidirectional arrows indicating data flow](diagrams/architecture-overview.png)\n```\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"functional-images\">Functional Images\u003C/h2>\n\u003Cp>Images that serve as buttons or interactive elements:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">&lt;!-- Navigation icons --&gt;\n[\u003Cspan class=\"hljs-string\">![Home page\u003C/span>](\u003Cspan class=\"hljs-link\">icons/home.svg\u003C/span>)](\u003Cspan class=\"hljs-link\">/\u003C/span>)\n[\u003Cspan class=\"hljs-string\">![User settings\u003C/span>](\u003Cspan class=\"hljs-link\">icons/settings.svg\u003C/span>)](\u003Cspan class=\"hljs-link\">/settings\u003C/span>)\n[\u003Cspan class=\"hljs-string\">![Search documentation\u003C/span>](\u003Cspan class=\"hljs-link\">icons/search.svg\u003C/span>)](\u003Cspan class=\"hljs-link\">/search\u003C/span>)\n\n&lt;!-- Social media links --&gt;\n[\u003Cspan class=\"hljs-string\">![Follow us on Twitter\u003C/span>](\u003Cspan class=\"hljs-link\">icons/twitter.svg\u003C/span>)](\u003Cspan class=\"hljs-link\">https://twitter.com/company\u003C/span>)\n[\u003Cspan class=\"hljs-string\">![Connect on LinkedIn\u003C/span>](\u003Cspan class=\"hljs-link\">icons/linkedin.svg\u003C/span>)](\u003Cspan class=\"hljs-link\">https://linkedin.com/company/company\u003C/span>)\n\n&lt;!-- Download buttons --&gt;\n[\u003Cspan class=\"hljs-string\">![Download user guide PDF (2.3 MB)\u003C/span>](\u003Cspan class=\"hljs-link\">icons/pdf-download.svg\u003C/span>)](\u003Cspan class=\"hljs-link\">guides/user-guide.pdf\u003C/span>)\n\u003C/code>\u003C/pre>\u003Ch2 id=\"complex-images-with-extended-descriptions\">Complex Images with Extended Descriptions\u003C/h2>\n\u003Cp>For detailed images requiring longer explanations:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">![\u003Cspan class=\"hljs-string\">Complex network topology diagram\u003C/span>](\u003Cspan class=\"hljs-link\">diagrams/network-topology.png\u003C/span>)\n\n\u003Cspan class=\"hljs-strong\">**Extended Description of Network Topology:**\u003C/span>\n\nThe network architecture consists of four main components arranged in a hierarchical structure:\n\n\u003Cspan class=\"hljs-bullet\">1.\u003C/span> \u003Cspan class=\"hljs-strong\">**Internet Gateway**\u003C/span> (top): Single point of external connectivity\n\u003Cspan class=\"hljs-bullet\">2.\u003C/span> \u003Cspan class=\"hljs-strong\">**Load Balancer Layer**\u003C/span>: Three redundant load balancers (LB-01, LB-02, LB-03) distribute traffic\n\u003Cspan class=\"hljs-bullet\">3.\u003C/span> \u003Cspan class=\"hljs-strong\">**Web Server Tier**\u003C/span>: Six web servers (WEB-01 through WEB-06) arranged in two availability zones\n\u003Cspan class=\"hljs-bullet\">4.\u003C/span> \u003Cspan class=\"hljs-strong\">**Database Cluster**\u003C/span>: Primary database server with two read replicas for high availability\n\nData flows from the internet gateway through the load balancers, which distribute requests across web servers based on current load. Web servers connect to either the primary database (for writes) or read replicas (for read operations). A dedicated backup connection links the primary database to an off-site backup facility.\n\nAll connections use encrypted channels (indicated by lock icons), and each tier includes monitoring agents (shown as small circle icons) that report to a centralized monitoring dashboard.\n\u003C/code>\u003C/pre>\u003Ch2 id=\"decorative-images\">Decorative Images\u003C/h2>\n\u003Cp>Images used purely for visual appeal should use empty alt text:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">&lt;!-- Decorative borders, patterns, or spacing images --&gt;\n![](\u003Cspan class=\"hljs-link\">decorative/page-divider.png\u003C/span>)\n![](\u003Cspan class=\"hljs-link\">assets/decorative-border.svg\u003C/span>)\n![](\u003Cspan class=\"hljs-link\">images/background-pattern.jpg\u003C/span>)\n\n&lt;!-- Note: Empty alt=&quot;&quot; tells screen readers to skip these images --&gt;\n\u003C/code>\u003C/pre>\u003Ch3 id=\"wcag-compliance-and-testing-framework\">WCAG Compliance and Testing Framework\u003C/h3>\n\u003Cp>Automated compliance testing and validation workflows:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-comment\"># wcag-compliance-checker.py - WCAG 2.1 compliance validation\u003C/span>\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> json\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> requests\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> typing \u003Cspan class=\"hljs-keyword\">import\u003C/span> \u003Cspan class=\"hljs-type\">List\u003C/span>, \u003Cspan class=\"hljs-type\">Dict\u003C/span>, \u003Cspan class=\"hljs-type\">Tuple\u003C/span>, \u003Cspan class=\"hljs-type\">Optional\u003C/span>\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> dataclasses \u003Cspan class=\"hljs-keyword\">import\u003C/span> dataclass\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> bs4 \u003Cspan class=\"hljs-keyword\">import\u003C/span> BeautifulSoup\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> urllib.parse \u003Cspan class=\"hljs-keyword\">import\u003C/span> urljoin, urlparse\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> colorsys\n\n\u003Cspan class=\"hljs-meta\">@dataclass\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">AccessibilityIssue\u003C/span>:\n    rule_id: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    severity: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    description: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    element: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    line_number: \u003Cspan class=\"hljs-built_in\">int\u003C/span>\n    recommendation: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    wcag_criterion: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">WCAGComplianceChecker\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">__init__\u003C/span>(\u003Cspan class=\"hljs-params\">self, wcag_level: \u003Cspan class=\"hljs-built_in\">str\u003C/span> = \u003Cspan class=\"hljs-string\">&#x27;AA&#x27;\u003C/span>\u003C/span>):\n        self.wcag_level = wcag_level\n        self.wcag_rules = self.load_wcag_rules()\n        self.color_contrast_ratios = {\n            \u003Cspan class=\"hljs-string\">&#x27;AA&#x27;\u003C/span>: {\u003Cspan class=\"hljs-string\">&#x27;normal&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">4.5\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;large&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">3.0\u003C/span>},\n            \u003Cspan class=\"hljs-string\">&#x27;AAA&#x27;\u003C/span>: {\u003Cspan class=\"hljs-string\">&#x27;normal&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">7.0\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;large&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">4.5\u003C/span>}\n        }\n        \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">load_wcag_rules\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Load WCAG 2.1 success criteria and guidelines&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;1.1.1&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Non-text Content&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;All non-text content has alternative text&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;H37&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H36&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H24&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H53&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;1.3.1&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Info and Relationships&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>, \n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Information and structure are programmatically determinable&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;H42&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H43&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H44&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H51&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;1.3.2&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Meaningful Sequence&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Content order is meaningful when presented sequentially&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;G57&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;C6&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;C8&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;1.4.1&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Use of Color&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Color is not the only means of conveying information&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;G14&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;G122&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;G138&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;1.4.3&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Contrast (Minimum)&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;AA&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Text has sufficient contrast ratio&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;G18&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;G145&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;G174&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;2.1.1&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Keyboard&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;All functionality is available via keyboard&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;G202&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H91&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;SCR20&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;2.4.1&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Bypass Blocks&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Mechanism to skip repeated content blocks&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;G1&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;G123&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;G124&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;2.4.2&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Page Titled&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Web pages have descriptive titles&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;G88&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H25&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;2.4.3&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Focus Order&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Focus order preserves meaning and operability&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;G59&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H4&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;C15&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;2.4.4&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Link Purpose (In Context)&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Link purpose is clear from link text or context&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;G91&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H30&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H24&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;2.4.6&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Headings and Labels&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;AA&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Headings and labels describe topic or purpose&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;G130&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;G131&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;3.1.1&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Language of Page&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Primary language of page is programmatically determinable&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;H57&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H58&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;3.2.1&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;On Focus&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Focus does not trigger unexpected context changes&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;G107&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;G201&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;4.1.1&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Parsing&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Markup is valid and well-formed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;G134&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;G192&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H88&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;4.1.2&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Name, Role, Value&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;UI components have accessible names and roles&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;techniques&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;H44&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;H65&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;G10&#x27;\u003C/span>]\n            }\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_markdown_file\u003C/span>(\u003Cspan class=\"hljs-params\">self, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, html_content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[AccessibilityIssue]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate a markdown file for WCAG compliance&quot;&quot;&quot;\u003C/span>\n        issues = []\n        soup = BeautifulSoup(html_content, \u003Cspan class=\"hljs-string\">&#x27;html.parser&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Check each WCAG criterion\u003C/span>\n        issues.extend(self.check_non_text_content(soup, file_path))\n        issues.extend(self.check_heading_structure(soup, file_path))\n        issues.extend(self.check_link_accessibility(soup, file_path))\n        issues.extend(self.check_image_accessibility(soup, file_path))\n        issues.extend(self.check_table_accessibility(soup, file_path))\n        issues.extend(self.check_language_attributes(soup, file_path))\n        issues.extend(self.check_page_structure(soup, file_path))\n        issues.extend(self.check_form_accessibility(soup, file_path))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_non_text_content\u003C/span>(\u003Cspan class=\"hljs-params\">self, soup: BeautifulSoup, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[AccessibilityIssue]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check WCAG 1.1.1 - Non-text Content&quot;&quot;&quot;\u003C/span>\n        issues = []\n        \n        \u003Cspan class=\"hljs-comment\"># Check images without alt text\u003C/span>\n        images = soup.find_all(\u003Cspan class=\"hljs-string\">&#x27;img&#x27;\u003C/span>)\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, img \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(images):\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> img.has_attr(\u003Cspan class=\"hljs-string\">&#x27;alt&#x27;\u003C/span>):\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;1.1.1&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&#x27;Image missing alt attribute&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-string\">f&#x27;&lt;img src=&quot;\u003Cspan class=\"hljs-subst\">{img.get(\u003Cspan class=\"hljs-string\">&quot;src&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>)[:\u003Cspan class=\"hljs-number\">50\u003C/span>]}\u003C/span>...&quot;&gt;&#x27;\u003C/span>,\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Add alt attribute with descriptive text or alt=&quot;&quot; for decorative images&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;1.1.1 Non-text Content (Level A)&#x27;\u003C/span>\n                ))\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> img.get(\u003Cspan class=\"hljs-string\">&#x27;alt&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(img.get(\u003Cspan class=\"hljs-string\">&#x27;alt&#x27;\u003C/span>)) &gt; \u003Cspan class=\"hljs-number\">125\u003C/span>:\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;1.1.1&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&#x27;Alt text too long&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-string\">f&#x27;&lt;img alt=&quot;\u003Cspan class=\"hljs-subst\">{img.get(\u003Cspan class=\"hljs-string\">&quot;alt&quot;\u003C/span>)[:\u003Cspan class=\"hljs-number\">30\u003C/span>]}\u003C/span>...&quot;&gt;&#x27;\u003C/span>,\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Keep alt text under 125 characters, use longdesc or caption for detailed descriptions&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;1.1.1 Non-text Content (Level A)&#x27;\u003C/span>\n                ))\n        \n        \u003Cspan class=\"hljs-comment\"># Check for audio/video without text alternatives\u003C/span>\n        media_elements = soup.find_all([\u003Cspan class=\"hljs-string\">&#x27;audio&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;video&#x27;\u003C/span>])\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, media \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(media_elements):\n            has_captions = media.find(\u003Cspan class=\"hljs-string\">&#x27;track&#x27;\u003C/span>, {\u003Cspan class=\"hljs-string\">&#x27;kind&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;captions&#x27;\u003C/span>})\n            has_transcript = media.find_next(\u003Cspan class=\"hljs-string\">&#x27;details&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">or\u003C/span> media.find_previous(\u003Cspan class=\"hljs-string\">&#x27;details&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> has_captions \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> has_transcript:\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;1.1.1&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">f&#x27;\u003Cspan class=\"hljs-subst\">{media.name}\u003C/span> element missing text alternative&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-built_in\">str\u003C/span>(media)[:\u003Cspan class=\"hljs-number\">100\u003C/span>],\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Provide captions for video or transcript for audio content&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;1.1.1 Non-text Content (Level A)&#x27;\u003C/span>\n                ))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_heading_structure\u003C/span>(\u003Cspan class=\"hljs-params\">self, soup: BeautifulSoup, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[AccessibilityIssue]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check WCAG 1.3.1 - Info and Relationships (Heading Structure)&quot;&quot;&quot;\u003C/span>\n        issues = []\n        \n        headings = soup.find_all([\u003Cspan class=\"hljs-string\">&#x27;h1&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;h2&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;h3&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;h4&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;h5&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;h6&#x27;\u003C/span>])\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> headings:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues\n            \n        \u003Cspan class=\"hljs-comment\"># Check for logical heading progression\u003C/span>\n        heading_levels = []\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> heading \u003Cspan class=\"hljs-keyword\">in\u003C/span> headings:\n            level = \u003Cspan class=\"hljs-built_in\">int\u003C/span>(heading.name[\u003Cspan class=\"hljs-number\">1\u003C/span>])\n            heading_levels.append(level)\n        \n        \u003Cspan class=\"hljs-comment\"># Check for skipped heading levels\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> i \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">range\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span>, \u003Cspan class=\"hljs-built_in\">len\u003C/span>(heading_levels)):\n            current_level = heading_levels[i]\n            previous_level = heading_levels[i-\u003Cspan class=\"hljs-number\">1\u003C/span>]\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> current_level &gt; previous_level + \u003Cspan class=\"hljs-number\">1\u003C/span>:\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;1.3.1&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">f&#x27;Heading level skip detected: h\u003Cspan class=\"hljs-subst\">{previous_level}\u003C/span> to h\u003Cspan class=\"hljs-subst\">{current_level}\u003C/span>&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-string\">f&#x27;&lt;h\u003Cspan class=\"hljs-subst\">{current_level}\u003C/span>&gt;\u003Cspan class=\"hljs-subst\">{headings[i].get_text()[:\u003Cspan class=\"hljs-number\">50\u003C/span>]}\u003C/span>&lt;/h\u003Cspan class=\"hljs-subst\">{current_level}\u003C/span>&gt;&#x27;\u003C/span>,\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Use logical heading progression without skipping levels&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;1.3.1 Info and Relationships (Level A)&#x27;\u003C/span>\n                ))\n        \n        \u003Cspan class=\"hljs-comment\"># Check for multiple H1s\u003C/span>\n        h1_count = \u003Cspan class=\"hljs-built_in\">len\u003C/span>([h \u003Cspan class=\"hljs-keyword\">for\u003C/span> h \u003Cspan class=\"hljs-keyword\">in\u003C/span> headings \u003Cspan class=\"hljs-keyword\">if\u003C/span> h.name == \u003Cspan class=\"hljs-string\">&#x27;h1&#x27;\u003C/span>])\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> h1_count &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>:\n            issues.append(AccessibilityIssue(\n                rule_id=\u003Cspan class=\"hljs-string\">&#x27;2.4.6&#x27;\u003C/span>,\n                severity=\u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                description=\u003Cspan class=\"hljs-string\">f&#x27;Multiple H1 headings found (\u003Cspan class=\"hljs-subst\">{h1_count}\u003C/span>)&#x27;\u003C/span>,\n                element=\u003Cspan class=\"hljs-string\">&#x27;Multiple &lt;h1&gt; elements&#x27;\u003C/span>,\n                line_number=\u003Cspan class=\"hljs-number\">1\u003C/span>,\n                recommendation=\u003Cspan class=\"hljs-string\">&#x27;Use only one H1 per page for main heading&#x27;\u003C/span>,\n                wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;2.4.6 Headings and Labels (Level AA)&#x27;\u003C/span>\n            ))\n        \n        \u003Cspan class=\"hljs-comment\"># Check for empty headings\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, heading \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(headings):\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> heading.get_text().strip():\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;2.4.6&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&#x27;Empty heading found&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-string\">f&#x27;&lt;\u003Cspan class=\"hljs-subst\">{heading.name}\u003C/span>&gt;&lt;/\u003Cspan class=\"hljs-subst\">{heading.name}\u003C/span>&gt;&#x27;\u003C/span>,\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Provide descriptive heading text&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;2.4.6 Headings and Labels (Level AA)&#x27;\u003C/span>\n                ))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_link_accessibility\u003C/span>(\u003Cspan class=\"hljs-params\">self, soup: BeautifulSoup, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[AccessibilityIssue]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check WCAG 2.4.4 - Link Purpose (In Context)&quot;&quot;&quot;\u003C/span>\n        issues = []\n        \n        links = soup.find_all(\u003Cspan class=\"hljs-string\">&#x27;a&#x27;\u003C/span>, href=\u003Cspan class=\"hljs-literal\">True\u003C/span>)\n        generic_link_text = [\u003Cspan class=\"hljs-string\">&#x27;click here&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;read more&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;more&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;link&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;here&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;this&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;continue&#x27;\u003C/span>]\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, link \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(links):\n            link_text = link.get_text().strip().lower()\n            href = link.get(\u003Cspan class=\"hljs-string\">&#x27;href&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Check for generic link text\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> link_text \u003Cspan class=\"hljs-keyword\">in\u003C/span> generic_link_text:\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;2.4.4&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">f&#x27;Generic link text: &quot;\u003Cspan class=\"hljs-subst\">{link_text}\u003C/span>&quot;&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-string\">f&#x27;&lt;a href=&quot;\u003Cspan class=\"hljs-subst\">{href}\u003C/span>&quot;&gt;\u003Cspan class=\"hljs-subst\">{link_text}\u003C/span>&lt;/a&gt;&#x27;\u003C/span>,\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Use descriptive link text that makes sense out of context&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;2.4.4 Link Purpose (In Context) (Level A)&#x27;\u003C/span>\n                ))\n            \n            \u003Cspan class=\"hljs-comment\"># Check for empty link text\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> link_text \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> link.get(\u003Cspan class=\"hljs-string\">&#x27;aria-label&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> link.get(\u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>):\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;2.4.4&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&#x27;Link with no accessible text&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-string\">f&#x27;&lt;a href=&quot;\u003Cspan class=\"hljs-subst\">{href}\u003C/span>&quot;&gt;&lt;/a&gt;&#x27;\u003C/span>,\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Provide link text, aria-label, or title attribute&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;2.4.4 Link Purpose (In Context) (Level A)&#x27;\u003C/span>\n                ))\n            \n            \u003Cspan class=\"hljs-comment\"># Check for very long link text\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(link_text) &gt; \u003Cspan class=\"hljs-number\">80\u003C/span>:\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;2.4.4&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&#x27;Link text too long&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-string\">f&#x27;&lt;a href=&quot;\u003Cspan class=\"hljs-subst\">{href}\u003C/span>&quot;&gt;\u003Cspan class=\"hljs-subst\">{link_text[:\u003Cspan class=\"hljs-number\">30\u003C/span>]}\u003C/span>...&lt;/a&gt;&#x27;\u003C/span>,\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Keep link text concise while remaining descriptive&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;2.4.4 Link Purpose (In Context) (Level A)&#x27;\u003C/span>\n                ))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_image_accessibility\u003C/span>(\u003Cspan class=\"hljs-params\">self, soup: BeautifulSoup, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[AccessibilityIssue]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Enhanced image accessibility checks&quot;&quot;&quot;\u003C/span>\n        issues = []\n        \n        images = soup.find_all(\u003Cspan class=\"hljs-string\">&#x27;img&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, img \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(images):\n            src = img.get(\u003Cspan class=\"hljs-string\">&#x27;src&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)\n            alt = img.get(\u003Cspan class=\"hljs-string\">&#x27;alt&#x27;\u003C/span>, \u003Cspan class=\"hljs-literal\">None\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Skip if already checked in check_non_text_content\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> alt \u003Cspan class=\"hljs-keyword\">is\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n                \n            \u003Cspan class=\"hljs-comment\"># Check for redundant text in alt\u003C/span>\n            redundant_phrases = [\u003Cspan class=\"hljs-string\">&#x27;image of&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;picture of&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;photo of&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;graphic of&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;illustration of&#x27;\u003C/span>]\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> alt \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(phrase \u003Cspan class=\"hljs-keyword\">in\u003C/span> alt.lower() \u003Cspan class=\"hljs-keyword\">for\u003C/span> phrase \u003Cspan class=\"hljs-keyword\">in\u003C/span> redundant_phrases):\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;1.1.1&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&#x27;Alt text contains redundant phrases&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-string\">f&#x27;&lt;img alt=&quot;\u003Cspan class=\"hljs-subst\">{alt[:\u003Cspan class=\"hljs-number\">30\u003C/span>]}\u003C/span>...&quot;&gt;&#x27;\u003C/span>,\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Remove redundant phrases like &quot;image of&quot; from alt text&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;1.1.1 Non-text Content (Level A)&#x27;\u003C/span>\n                ))\n            \n            \u003Cspan class=\"hljs-comment\"># Check for file extensions in alt text\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> alt \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(ext \u003Cspan class=\"hljs-keyword\">in\u003C/span> alt.lower() \u003Cspan class=\"hljs-keyword\">for\u003C/span> ext \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;.jpg&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.png&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.gif&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.svg&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.jpeg&#x27;\u003C/span>]):\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;1.1.1&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&#x27;Alt text contains file extension&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-string\">f&#x27;&lt;img alt=&quot;\u003Cspan class=\"hljs-subst\">{alt[:\u003Cspan class=\"hljs-number\">30\u003C/span>]}\u003C/span>...&quot;&gt;&#x27;\u003C/span>,\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Remove file extensions from alt text&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;1.1.1 Non-text Content (Level A)&#x27;\u003C/span>\n                ))\n            \n            \u003Cspan class=\"hljs-comment\"># Check for images that might be complex (charts, diagrams)\u003C/span>\n            complex_indicators = [\u003Cspan class=\"hljs-string\">&#x27;chart&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;graph&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;diagram&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;flowchart&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;timeline&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;map&#x27;\u003C/span>]\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> alt \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(indicator \u003Cspan class=\"hljs-keyword\">in\u003C/span> alt.lower() \u003Cspan class=\"hljs-keyword\">for\u003C/span> indicator \u003Cspan class=\"hljs-keyword\">in\u003C/span> complex_indicators):\n                \u003Cspan class=\"hljs-comment\"># Look for extended description\u003C/span>\n                has_longdesc = img.get(\u003Cspan class=\"hljs-string\">&#x27;longdesc&#x27;\u003C/span>)\n                has_caption = img.find_next([\u003Cspan class=\"hljs-string\">&#x27;figcaption&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;details&#x27;\u003C/span>])\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> has_longdesc \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> has_caption:\n                    issues.append(AccessibilityIssue(\n                        rule_id=\u003Cspan class=\"hljs-string\">&#x27;1.1.1&#x27;\u003C/span>,\n                        severity=\u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                        description=\u003Cspan class=\"hljs-string\">&#x27;Complex image may need extended description&#x27;\u003C/span>,\n                        element=\u003Cspan class=\"hljs-string\">f&#x27;&lt;img alt=&quot;\u003Cspan class=\"hljs-subst\">{alt[:\u003Cspan class=\"hljs-number\">30\u003C/span>]}\u003C/span>...&quot;&gt;&#x27;\u003C/span>,\n                        line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        recommendation=\u003Cspan class=\"hljs-string\">&#x27;Consider adding a detailed description via longdesc or adjacent text&#x27;\u003C/span>,\n                        wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;1.1.1 Non-text Content (Level A)&#x27;\u003C/span>\n                    ))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_table_accessibility\u003C/span>(\u003Cspan class=\"hljs-params\">self, soup: BeautifulSoup, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[AccessibilityIssue]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check table accessibility&quot;&quot;&quot;\u003C/span>\n        issues = []\n        \n        tables = soup.find_all(\u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, table \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(tables):\n            \u003Cspan class=\"hljs-comment\"># Check for table headers\u003C/span>\n            headers = table.find_all(\u003Cspan class=\"hljs-string\">&#x27;th&#x27;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> headers:\n                \u003Cspan class=\"hljs-comment\"># Check if first row contains what should be headers\u003C/span>\n                first_row = table.find(\u003Cspan class=\"hljs-string\">&#x27;tr&#x27;\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> first_row \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(first_row.find_all(\u003Cspan class=\"hljs-string\">&#x27;td&#x27;\u003C/span>)) &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>:\n                    issues.append(AccessibilityIssue(\n                        rule_id=\u003Cspan class=\"hljs-string\">&#x27;1.3.1&#x27;\u003C/span>,\n                        severity=\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                        description=\u003Cspan class=\"hljs-string\">&#x27;Table missing header cells&#x27;\u003C/span>,\n                        element=\u003Cspan class=\"hljs-built_in\">str\u003C/span>(table)[:\u003Cspan class=\"hljs-number\">100\u003C/span>] + \u003Cspan class=\"hljs-string\">&#x27;...&#x27;\u003C/span>,\n                        line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        recommendation=\u003Cspan class=\"hljs-string\">&#x27;Use &lt;th&gt; elements for table headers&#x27;\u003C/span>,\n                        wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;1.3.1 Info and Relationships (Level A)&#x27;\u003C/span>\n                    ))\n            \n            \u003Cspan class=\"hljs-comment\"># Check for table caption\u003C/span>\n            caption = table.find(\u003Cspan class=\"hljs-string\">&#x27;caption&#x27;\u003C/span>)\n            rows = table.find_all(\u003Cspan class=\"hljs-string\">&#x27;tr&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> caption \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(rows) &gt; \u003Cspan class=\"hljs-number\">3\u003C/span>:\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;1.3.1&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&#x27;Complex table missing caption&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-built_in\">str\u003C/span>(table)[:\u003Cspan class=\"hljs-number\">100\u003C/span>] + \u003Cspan class=\"hljs-string\">&#x27;...&#x27;\u003C/span>,\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Add &lt;caption&gt; element to describe table purpose&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;1.3.1 Info and Relationships (Level A)&#x27;\u003C/span>\n                ))\n            \n            \u003Cspan class=\"hljs-comment\"># Check for scope attributes in complex tables\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(headers) &gt; \u003Cspan class=\"hljs-number\">2\u003C/span> \u003Cspan class=\"hljs-keyword\">or\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(rows) &gt; \u003Cspan class=\"hljs-number\">5\u003C/span>:\n                headers_with_scope = [h \u003Cspan class=\"hljs-keyword\">for\u003C/span> h \u003Cspan class=\"hljs-keyword\">in\u003C/span> headers \u003Cspan class=\"hljs-keyword\">if\u003C/span> h.get(\u003Cspan class=\"hljs-string\">&#x27;scope&#x27;\u003C/span>)]\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(headers_with_scope) != \u003Cspan class=\"hljs-built_in\">len\u003C/span>(headers):\n                    issues.append(AccessibilityIssue(\n                        rule_id=\u003Cspan class=\"hljs-string\">&#x27;1.3.1&#x27;\u003C/span>,\n                        severity=\u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                        description=\u003Cspan class=\"hljs-string\">&#x27;Complex table headers missing scope attributes&#x27;\u003C/span>,\n                        element=\u003Cspan class=\"hljs-built_in\">str\u003C/span>(table)[:\u003Cspan class=\"hljs-number\">100\u003C/span>] + \u003Cspan class=\"hljs-string\">&#x27;...&#x27;\u003C/span>,\n                        line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        recommendation=\u003Cspan class=\"hljs-string\">&#x27;Add scope=&quot;row&quot; or scope=&quot;col&quot; to table headers&#x27;\u003C/span>,\n                        wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;1.3.1 Info and Relationships (Level A)&#x27;\u003C/span>\n                    ))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_language_attributes\u003C/span>(\u003Cspan class=\"hljs-params\">self, soup: BeautifulSoup, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[AccessibilityIssue]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check WCAG 3.1.1 - Language of Page&quot;&quot;&quot;\u003C/span>\n        issues = []\n        \n        html_tag = soup.find(\u003Cspan class=\"hljs-string\">&#x27;html&#x27;\u003C/span>)\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> html_tag \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> html_tag.get(\u003Cspan class=\"hljs-string\">&#x27;lang&#x27;\u003C/span>):\n            issues.append(AccessibilityIssue(\n                rule_id=\u003Cspan class=\"hljs-string\">&#x27;3.1.1&#x27;\u003C/span>,\n                severity=\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                description=\u003Cspan class=\"hljs-string\">&#x27;HTML element missing lang attribute&#x27;\u003C/span>,\n                element=\u003Cspan class=\"hljs-string\">&#x27;&lt;html&gt;&#x27;\u003C/span>,\n                line_number=\u003Cspan class=\"hljs-number\">1\u003C/span>,\n                recommendation=\u003Cspan class=\"hljs-string\">&#x27;Add lang=&quot;en&quot; or appropriate language code to &lt;html&gt; element&#x27;\u003C/span>,\n                wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;3.1.1 Language of Page (Level A)&#x27;\u003C/span>\n            ))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_page_structure\u003C/span>(\u003Cspan class=\"hljs-params\">self, soup: BeautifulSoup, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[AccessibilityIssue]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check for proper page landmarks and structure&quot;&quot;&quot;\u003C/span>\n        issues = []\n        \n        \u003Cspan class=\"hljs-comment\"># Check for main landmark\u003C/span>\n        main_element = soup.find(\u003Cspan class=\"hljs-string\">&#x27;main&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">or\u003C/span> soup.find(attrs={\u003Cspan class=\"hljs-string\">&#x27;role&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;main&#x27;\u003C/span>})\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> main_element:\n            issues.append(AccessibilityIssue(\n                rule_id=\u003Cspan class=\"hljs-string\">&#x27;2.4.1&#x27;\u003C/span>,\n                severity=\u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                description=\u003Cspan class=\"hljs-string\">&#x27;Page missing main landmark&#x27;\u003C/span>,\n                element=\u003Cspan class=\"hljs-string\">&#x27;Document structure&#x27;\u003C/span>,\n                line_number=\u003Cspan class=\"hljs-number\">1\u003C/span>,\n                recommendation=\u003Cspan class=\"hljs-string\">&#x27;Add &lt;main&gt; element or role=&quot;main&quot; to identify main content&#x27;\u003C/span>,\n                wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;2.4.1 Bypass Blocks (Level A)&#x27;\u003C/span>\n            ))\n        \n        \u003Cspan class=\"hljs-comment\"># Check for skip links\u003C/span>\n        skip_links = soup.find_all(\u003Cspan class=\"hljs-string\">&#x27;a&#x27;\u003C/span>, href=re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^#&#x27;\u003C/span>))\n        visible_skip_links = [link \u003Cspan class=\"hljs-keyword\">for\u003C/span> link \u003Cspan class=\"hljs-keyword\">in\u003C/span> skip_links \n                            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;skip&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> link.get_text().lower() \u003Cspan class=\"hljs-keyword\">or\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;main&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> link.get_text().lower()]\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> visible_skip_links \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(soup.find_all([\u003Cspan class=\"hljs-string\">&#x27;nav&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;header&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;footer&#x27;\u003C/span>])) &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>:\n            issues.append(AccessibilityIssue(\n                rule_id=\u003Cspan class=\"hljs-string\">&#x27;2.4.1&#x27;\u003C/span>,\n                severity=\u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                description=\u003Cspan class=\"hljs-string\">&#x27;Page may benefit from skip links&#x27;\u003C/span>,\n                element=\u003Cspan class=\"hljs-string\">&#x27;Document structure&#x27;\u003C/span>,\n                line_number=\u003Cspan class=\"hljs-number\">1\u003C/span>,\n                recommendation=\u003Cspan class=\"hljs-string\">&#x27;Add skip links to help users bypass repetitive content&#x27;\u003C/span>,\n                wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;2.4.1 Bypass Blocks (Level A)&#x27;\u003C/span>\n            ))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_form_accessibility\u003C/span>(\u003Cspan class=\"hljs-params\">self, soup: BeautifulSoup, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[AccessibilityIssue]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check form accessibility if forms are present&quot;&quot;&quot;\u003C/span>\n        issues = []\n        \n        \u003Cspan class=\"hljs-comment\"># Check for form labels\u003C/span>\n        inputs = soup.find_all([\u003Cspan class=\"hljs-string\">&#x27;input&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;select&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;textarea&#x27;\u003C/span>])\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, input_element \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(inputs):\n            input_type = input_element.get(\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Skip hidden inputs and buttons\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> input_type \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;hidden&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;submit&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;button&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;reset&#x27;\u003C/span>]:\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \n            input_id = input_element.get(\u003Cspan class=\"hljs-string\">&#x27;id&#x27;\u003C/span>)\n            aria_label = input_element.get(\u003Cspan class=\"hljs-string\">&#x27;aria-label&#x27;\u003C/span>)\n            aria_labelledby = input_element.get(\u003Cspan class=\"hljs-string\">&#x27;aria-labelledby&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Look for associated label\u003C/span>\n            label = \u003Cspan class=\"hljs-literal\">None\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> input_id:\n                label = soup.find(\u003Cspan class=\"hljs-string\">&#x27;label&#x27;\u003C/span>, {\u003Cspan class=\"hljs-string\">&#x27;for&#x27;\u003C/span>: input_id})\n            \n            \u003Cspan class=\"hljs-comment\"># Check if input has accessible name\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> label \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> aria_label \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> aria_labelledby:\n                issues.append(AccessibilityIssue(\n                    rule_id=\u003Cspan class=\"hljs-string\">&#x27;4.1.2&#x27;\u003C/span>,\n                    severity=\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&#x27;Form input missing accessible label&#x27;\u003C/span>,\n                    element=\u003Cspan class=\"hljs-built_in\">str\u003C/span>(input_element)[:\u003Cspan class=\"hljs-number\">100\u003C/span>] + \u003Cspan class=\"hljs-string\">&#x27;...&#x27;\u003C/span>,\n                    line_number=i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    recommendation=\u003Cspan class=\"hljs-string\">&#x27;Add &lt;label&gt; element or aria-label attribute&#x27;\u003C/span>,\n                    wcag_criterion=\u003Cspan class=\"hljs-string\">&#x27;4.1.2 Name, Role, Value (Level A)&#x27;\u003C/span>\n                ))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_compliance_report\u003C/span>(\u003Cspan class=\"hljs-params\">self, issues: \u003Cspan class=\"hljs-type\">List\u003C/span>[AccessibilityIssue], file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Generate comprehensive compliance report&quot;&quot;&quot;\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Categorize issues by WCAG level and severity\u003C/span>\n        level_a_issues = [issue \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue \u003Cspan class=\"hljs-keyword\">in\u003C/span> issues \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.get_wcag_level(issue.rule_id) == \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>]\n        level_aa_issues = [issue \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue \u003Cspan class=\"hljs-keyword\">in\u003C/span> issues \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.get_wcag_level(issue.rule_id) == \u003Cspan class=\"hljs-string\">&#x27;AA&#x27;\u003C/span>]\n        level_aaa_issues = [issue \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue \u003Cspan class=\"hljs-keyword\">in\u003C/span> issues \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.get_wcag_level(issue.rule_id) == \u003Cspan class=\"hljs-string\">&#x27;AAA&#x27;\u003C/span>]\n        \n        error_issues = [issue \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue \u003Cspan class=\"hljs-keyword\">in\u003C/span> issues \u003Cspan class=\"hljs-keyword\">if\u003C/span> issue.severity == \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>]\n        warning_issues = [issue \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue \u003Cspan class=\"hljs-keyword\">in\u003C/span> issues \u003Cspan class=\"hljs-keyword\">if\u003C/span> issue.severity == \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>]\n        \n        \u003Cspan class=\"hljs-comment\"># Calculate compliance score\u003C/span>\n        total_checks = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(self.wcag_rules)\n        failed_checks = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(\u003Cspan class=\"hljs-built_in\">set\u003C/span>(issue.rule_id \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue \u003Cspan class=\"hljs-keyword\">in\u003C/span> error_issues))\n        compliance_score = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, (total_checks - failed_checks) / total_checks * \u003Cspan class=\"hljs-number\">100\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;file&#x27;\u003C/span>: file_path,\n            \u003Cspan class=\"hljs-string\">&#x27;compliance_score&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">round\u003C/span>(compliance_score, \u003Cspan class=\"hljs-number\">2\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;total_issues&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(issues),\n                \u003Cspan class=\"hljs-string\">&#x27;errors&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(error_issues),\n                \u003Cspan class=\"hljs-string\">&#x27;warnings&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(warning_issues),\n                \u003Cspan class=\"hljs-string\">&#x27;level_a_issues&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(level_a_issues),\n                \u003Cspan class=\"hljs-string\">&#x27;level_aa_issues&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(level_aa_issues),\n                \u003Cspan class=\"hljs-string\">&#x27;level_aaa_issues&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(level_aaa_issues)\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>: [\n                {\n                    \u003Cspan class=\"hljs-string\">&#x27;rule_id&#x27;\u003C/span>: issue.rule_id,\n                    \u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>: issue.severity,\n                    \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: issue.description,\n                    \u003Cspan class=\"hljs-string\">&#x27;element&#x27;\u003C/span>: issue.element,\n                    \u003Cspan class=\"hljs-string\">&#x27;recommendation&#x27;\u003C/span>: issue.recommendation,\n                    \u003Cspan class=\"hljs-string\">&#x27;wcag_criterion&#x27;\u003C/span>: issue.wcag_criterion\n                } \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue \u003Cspan class=\"hljs-keyword\">in\u003C/span> issues\n            ],\n            \u003Cspan class=\"hljs-string\">&#x27;compliance_status&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;level_a&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(level_a_issues) == \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level_aa&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(level_a_issues + level_aa_issues) == \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;level_aaa&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(issues) == \u003Cspan class=\"hljs-number\">0\u003C/span>\n            }\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">get_wcag_level\u003C/span>(\u003Cspan class=\"hljs-params\">self, rule_id: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Get WCAG level for a given rule&quot;&quot;&quot;\u003C/span>\n        rule = self.wcag_rules.get(rule_id)\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> rule[\u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">if\u003C/span> rule \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Usage example\u003C/span>\n\u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_markdown_accessibility\u003C/span>(\u003Cspan class=\"hljs-params\">file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n    \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate a single markdown file for accessibility compliance&quot;&quot;&quot;\u003C/span>\n    checker = WCAGComplianceChecker(wcag_level=\u003Cspan class=\"hljs-string\">&#x27;AA&#x27;\u003C/span>)\n    \n    \u003Cspan class=\"hljs-comment\"># Convert markdown to HTML (simplified - use your actual conversion process)\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(file_path, \u003Cspan class=\"hljs-string\">&#x27;r&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n        content = f.read()\n    \n    \u003Cspan class=\"hljs-comment\"># You would use your actual markdown processor here\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">import\u003C/span> markdown\n    html_content = markdown.markdown(content)\n    \n    \u003Cspan class=\"hljs-comment\"># Add basic HTML structure\u003C/span>\n    full_html = \u003Cspan class=\"hljs-string\">f&quot;&quot;&quot;\n    &lt;!DOCTYPE html&gt;\n    &lt;html lang=&quot;en&quot;&gt;\n    &lt;head&gt;&lt;title&gt;Test Document&lt;/title&gt;&lt;/head&gt;\n    &lt;body&gt;&lt;main&gt;\u003Cspan class=\"hljs-subst\">{html_content}\u003C/span>&lt;/main&gt;&lt;/body&gt;\n    &lt;/html&gt;\n    &quot;&quot;&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Validate accessibility\u003C/span>\n    issues = checker.validate_markdown_file(file_path, full_html)\n    \n    \u003Cspan class=\"hljs-comment\"># Generate report\u003C/span>\n    report = checker.generate_compliance_report(issues, file_path)\n    \n    \u003Cspan class=\"hljs-keyword\">return\u003C/span> report\n\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> __name__ == \u003Cspan class=\"hljs-string\">&quot;__main__&quot;\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">import\u003C/span> sys\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(sys.argv) &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>:\n        file_path = sys.argv[\u003Cspan class=\"hljs-number\">1\u003C/span>]\n        report = validate_markdown_accessibility(file_path)\n        \n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Accessibility Report for \u003Cspan class=\"hljs-subst\">{file_path}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Compliance Score: \u003Cspan class=\"hljs-subst\">{report[\u003Cspan class=\"hljs-string\">&#x27;compliance_score&#x27;\u003C/span>]}\u003C/span>%&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Total Issues: \u003Cspan class=\"hljs-subst\">{report[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;total_issues&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Errors: \u003Cspan class=\"hljs-subst\">{report[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;errors&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Warnings: \u003Cspan class=\"hljs-subst\">{report[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;warnings&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> report[\u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>]:\n            \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;\\nIssues Found:&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue \u003Cspan class=\"hljs-keyword\">in\u003C/span> report[\u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>][:\u003Cspan class=\"hljs-number\">5\u003C/span>]:  \u003Cspan class=\"hljs-comment\"># Show first 5 issues\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;- \u003Cspan class=\"hljs-subst\">{issue[\u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>].upper()}\u003C/span>: \u003Cspan class=\"hljs-subst\">{issue[\u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n                \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  Recommendation: \u003Cspan class=\"hljs-subst\">{issue[\u003Cspan class=\"hljs-string\">&#x27;recommendation&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n\u003C/code>\u003C/pre>\u003Ch2 id=\"integration-with-documentation-systems\">Integration with Documentation Systems\u003C/h2>\n\u003Cp>Accessibility features integrate seamlessly with comprehensive documentation workflows. When combined with \u003Ca href=\"/blog/markdown-tables-advanced-features-and-styling-guide\">table accessibility and data presentation techniques\u003C/a>, accessible design principles ensure that complex data structures remain navigable and understandable for users with assistive technologies, creating inclusive information architectures that serve diverse user needs.\u003C/p>\n\u003Cp>For sophisticated content management, accessibility systems work effectively with \u003Ca href=\"/blog/markdown-automation-workflows-complete-guide\">automation workflows and testing integration\u003C/a> to ensure that accessibility requirements are validated continuously as content is created and updated, preventing regressions and maintaining compliance standards across large documentation repositories.\u003C/p>\n\u003Cp>When building comprehensive content architectures, accessibility complements \u003Ca href=\"/blog/markdown-link-management-cross-referencing-complete-guide\">link management and cross-referencing systems\u003C/a> by ensuring that navigation aids and content relationships are properly communicated to screen readers and other assistive technologies, creating cohesive user experiences that support independent content exploration.\u003C/p>\n\u003Ch2 id=\"advanced-accessibility-techniques\">Advanced Accessibility Techniques\u003C/h2>\n\u003Ch3 id=\"aria-integration-in-markdown\">ARIA Integration in Markdown\u003C/h3>\n\u003Cp>Implementing ARIA (Accessible Rich Internet Applications) patterns in markdown-generated content:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\"># Advanced ARIA Implementation\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## Custom Landmarks and Roles\u003C/span>\n\nWhen your markdown generates complex layouts, use ARIA to enhance structure:\n\n\u003Cspan class=\"hljs-code\">```html\n&lt;!-- In your markdown processor templates --&gt;\n&lt;nav role=&quot;navigation&quot; aria-label=&quot;Main navigation&quot;&gt;\n  &lt;!-- Navigation content from markdown --&gt;\n&lt;/nav&gt;\n\n&lt;section role=&quot;search&quot; aria-label=&quot;Documentation search&quot;&gt;\n  &lt;!-- Search functionality --&gt;\n&lt;/section&gt;\n\n&lt;aside role=&quot;complementary&quot; aria-label=&quot;Related topics&quot;&gt;\n  &lt;!-- Related content from cross-references --&gt;\n&lt;/aside&gt;\n```\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"progressive-enhancement-for-accessibility\">Progressive Enhancement for Accessibility\u003C/h2>\n\u003Cp>Build accessibility into your markdown processing pipeline:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// Enhanced markdown processor with accessibility features\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">AccessibleMarkdownProcessor\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">renderer\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> marked.\u003Cspan class=\"hljs-title class_\">Renderer\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">configureAccessibleRendering\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">configureAccessibleRendering\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Enhanced heading rendering with landmarks\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">renderer\u003C/span>.\u003Cspan class=\"hljs-property\">heading\u003C/span> = \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">text, level, raw\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> escapedText = text.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>().\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/[^\\w]+/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> id = \u003Cspan class=\"hljs-string\">`heading-\u003Cspan class=\"hljs-subst\">${escapedText}\u003C/span>`\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`\n                &lt;h\u003Cspan class=\"hljs-subst\">${level}\u003C/span> id=&quot;\u003Cspan class=\"hljs-subst\">${id}\u003C/span>&quot; tabindex=&quot;-1&quot;&gt;\n                    \u003Cspan class=\"hljs-subst\">${text}\u003C/span>\n                    &lt;a href=&quot;#\u003Cspan class=\"hljs-subst\">${id}\u003C/span>&quot; class=&quot;header-anchor&quot; aria-label=&quot;Permalink to \u003Cspan class=\"hljs-subst\">${text}\u003C/span>&quot; title=&quot;Permalink&quot;&gt;\n                        &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;\n                    &lt;/a&gt;\n                &lt;/h\u003Cspan class=\"hljs-subst\">${level}\u003C/span>&gt;\n            `\u003C/span>;\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Enhanced image rendering with better alt text handling\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">renderer\u003C/span>.\u003Cspan class=\"hljs-property\">image\u003C/span> = \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">href, title, text\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> isDecorative = text === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span> || text === \u003Cspan class=\"hljs-string\">&#x27;decorative&#x27;\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> alt = isDecorative ? \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span> : text;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> titleAttr = title ? \u003Cspan class=\"hljs-string\">` title=&quot;\u003Cspan class=\"hljs-subst\">${title}\u003C/span>&quot;`\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (isDecorative) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`&lt;img src=&quot;\u003Cspan class=\"hljs-subst\">${href}\u003C/span>&quot; alt=&quot;&quot;\u003Cspan class=\"hljs-subst\">${titleAttr}\u003C/span> role=&quot;presentation&quot;&gt;`\u003C/span>;\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`&lt;img src=&quot;\u003Cspan class=\"hljs-subst\">${href}\u003C/span>&quot; alt=&quot;\u003Cspan class=\"hljs-subst\">${alt}\u003C/span>&quot;\u003Cspan class=\"hljs-subst\">${titleAttr}\u003C/span>&gt;`\u003C/span>;\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Enhanced link rendering with better context\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">renderer\u003C/span>.\u003Cspan class=\"hljs-property\">link\u003C/span> = \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">href, title, text\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> isExternal = href.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;http&#x27;\u003C/span>) &amp;&amp; !href.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-variable language_\">window\u003C/span>.\u003Cspan class=\"hljs-property\">location\u003C/span>.\u003Cspan class=\"hljs-property\">hostname\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> titleAttr = title ? \u003Cspan class=\"hljs-string\">` title=&quot;\u003Cspan class=\"hljs-subst\">${title}\u003C/span>&quot;`\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> externalAttr = isExternal ? \u003Cspan class=\"hljs-string\">&#x27; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> ariaLabel = isExternal ? \u003Cspan class=\"hljs-string\">` aria-label=&quot;\u003Cspan class=\"hljs-subst\">${text}\u003C/span> (opens in new window)&quot;`\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`&lt;a href=&quot;\u003Cspan class=\"hljs-subst\">${href}\u003C/span>&quot;\u003Cspan class=\"hljs-subst\">${titleAttr}\u003C/span>\u003Cspan class=\"hljs-subst\">${externalAttr}\u003C/span>\u003Cspan class=\"hljs-subst\">${ariaLabel}\u003C/span>&gt;\u003Cspan class=\"hljs-subst\">${text}\u003C/span>\u003Cspan class=\"hljs-subst\">${isExternal ? \u003Cspan class=\"hljs-string\">&#x27; &lt;span aria-hidden=&quot;true&quot;&gt;↗&lt;/span&gt;&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>&lt;/a&gt;`\u003C/span>;\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Enhanced table rendering with accessibility features\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">renderer\u003C/span>.\u003Cspan class=\"hljs-property\">table\u003C/span> = \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">header, body\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`\n                &lt;div class=&quot;table-container&quot; role=&quot;region&quot; aria-label=&quot;Data table&quot; tabindex=&quot;0&quot;&gt;\n                    &lt;table&gt;\n                        &lt;thead&gt;\u003Cspan class=\"hljs-subst\">${header}\u003C/span>&lt;/thead&gt;\n                        &lt;tbody&gt;\u003Cspan class=\"hljs-subst\">${body}\u003C/span>&lt;/tbody&gt;\n                    &lt;/table&gt;\n                &lt;/div&gt;\n            `\u003C/span>;\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Enhanced code block rendering with copy functionality\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">renderer\u003C/span>.\u003Cspan class=\"hljs-property\">code\u003C/span> = \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">code, language, escaped\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> langClass = language ? \u003Cspan class=\"hljs-string\">` class=&quot;language-\u003Cspan class=\"hljs-subst\">${language}\u003C/span>&quot;`\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> copyButton = \u003Cspan class=\"hljs-string\">`\n                &lt;button class=&quot;copy-code&quot; \n                        aria-label=&quot;Copy code to clipboard&quot;\n                        data-code=&quot;\u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-built_in\">encodeURIComponent\u003C/span>(code)}\u003C/span>&quot;&gt;\n                    &lt;span aria-hidden=&quot;true&quot;&gt;📋&lt;/span&gt;\n                    Copy\n                &lt;/button&gt;\n            `\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`\n                &lt;div class=&quot;code-block&quot; role=&quot;region&quot; aria-label=&quot;Code example\u003Cspan class=\"hljs-subst\">${language ? \u003Cspan class=\"hljs-string\">` in \u003Cspan class=\"hljs-subst\">${language}\u003C/span>`\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>&quot;&gt;\n                    \u003Cspan class=\"hljs-subst\">${copyButton}\u003C/span>\n                    &lt;pre&gt;&lt;code\u003Cspan class=\"hljs-subst\">${langClass}\u003C/span>&gt;\u003Cspan class=\"hljs-subst\">${escaped ? code : \u003Cspan class=\"hljs-built_in\">escape\u003C/span>(code)}\u003C/span>&lt;/code&gt;&lt;/pre&gt;\n                &lt;/div&gt;\n            `\u003C/span>;\n        };\n    }\n}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"screen-reader-navigation-optimization\">Screen Reader Navigation Optimization\u003C/h2>\n\u003Cp>Advanced techniques for optimizing screen reader navigation:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\"># Screen Reader Navigation Patterns\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## Descriptive Navigation Structure\u003C/span>\n\nCreate clear navigation hierarchies that work well with screen readers:\n\n\u003Cspan class=\"hljs-code\">```markdown\n&lt;!-- Main document structure --&gt;\n# User Guide (Main heading)\n\n## Getting Started (Primary section)\n### Installation (Sub-section)\n#### System Requirements (Detail level)\n#### Download Instructions (Detail level)\n### Configuration (Sub-section)\n#### Basic Setup (Detail level)\n#### Advanced Options (Detail level)\n\n## Advanced Features (Primary section)\n### Integration Options (Sub-section)\n### Customization (Sub-section)\n\n## Troubleshooting (Primary section)\n### Common Issues (Sub-section)\n### Support Resources (Sub-section)\n```\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"content-landmarks-and-skip-links\">Content Landmarks and Skip Links\u003C/h2>\n\u003Cp>Implement proper landmark navigation:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-html\">\u003Cspan class=\"hljs-comment\">&lt;!-- Skip links at the beginning of content --&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">div\u003C/span> \u003Cspan class=\"hljs-attr\">class\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;skip-links&quot;\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">a\u003C/span> \u003Cspan class=\"hljs-attr\">href\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;#main-content&quot;\u003C/span>&gt;\u003C/span>Skip to main content\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">a\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">a\u003C/span> \u003Cspan class=\"hljs-attr\">href\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;#navigation&quot;\u003C/span>&gt;\u003C/span>Skip to navigation\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">a\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">a\u003C/span> \u003Cspan class=\"hljs-attr\">href\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;#search&quot;\u003C/span>&gt;\u003C/span>Skip to search\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">a\u003C/span>&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">div\u003C/span>&gt;\u003C/span>\n\n\u003Cspan class=\"hljs-comment\">&lt;!-- Semantic document structure --&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">header\u003C/span> \u003Cspan class=\"hljs-attr\">role\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;banner&quot;\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">nav\u003C/span> \u003Cspan class=\"hljs-attr\">role\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;navigation&quot;\u003C/span> \u003Cspan class=\"hljs-attr\">aria-label\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;Main navigation&quot;\u003C/span>&gt;\u003C/span>\n        \u003Cspan class=\"hljs-comment\">&lt;!-- Navigation menu --&gt;\u003C/span>\n    \u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">nav\u003C/span>&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">header\u003C/span>&gt;\u003C/span>\n\n\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">main\u003C/span> \u003Cspan class=\"hljs-attr\">role\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;main&quot;\u003C/span> \u003Cspan class=\"hljs-attr\">id\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;main-content&quot;\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-comment\">&lt;!-- Main content from markdown --&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">main\u003C/span>&gt;\u003C/span>\n\n\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">aside\u003C/span> \u003Cspan class=\"hljs-attr\">role\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;complementary&quot;\u003C/span> \u003Cspan class=\"hljs-attr\">aria-label\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;Table of contents&quot;\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-comment\">&lt;!-- Table of contents --&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">aside\u003C/span>&gt;\u003C/span>\n\n\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">footer\u003C/span> \u003Cspan class=\"hljs-attr\">role\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;contentinfo&quot;\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-comment\">&lt;!-- Footer information --&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">footer\u003C/span>&gt;\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"focus-management-and-keyboard-navigation\">Focus Management and Keyboard Navigation\u003C/h2>\n\u003Cp>Ensure proper focus management for keyboard users:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-css\">\u003Cspan class=\"hljs-comment\">/* Visual focus indicators */\u003C/span>\n\u003Cspan class=\"hljs-selector-pseudo\">:focus\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">outline\u003C/span>: \u003Cspan class=\"hljs-number\">2px\u003C/span> solid \u003Cspan class=\"hljs-number\">#0066cc\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">outline-offset\u003C/span>: \u003Cspan class=\"hljs-number\">2px\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Skip links styling */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.skip-links\u003C/span> \u003Cspan class=\"hljs-selector-tag\">a\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">position\u003C/span>: absolute;\n    \u003Cspan class=\"hljs-attribute\">top\u003C/span>: -\u003Cspan class=\"hljs-number\">40px\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">left\u003C/span>: \u003Cspan class=\"hljs-number\">6px\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#0066cc\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: white;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">8px\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">text-decoration\u003C/span>: none;\n    \u003Cspan class=\"hljs-attribute\">z-index\u003C/span>: \u003Cspan class=\"hljs-number\">1000\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.skip-links\u003C/span> \u003Cspan class=\"hljs-selector-tag\">a\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:focus\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">top\u003C/span>: \u003Cspan class=\"hljs-number\">6px\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Focus management for dynamic content */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.content-updated\u003C/span> {\n    focus: outline;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Accessible button states */\u003C/span>\n\u003Cspan class=\"hljs-selector-tag\">button\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:focus\u003C/span>,\n\u003Cspan class=\"hljs-selector-tag\">button\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:hover\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#0052a3\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-tag\">button\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:disabled\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">opacity\u003C/span>: \u003Cspan class=\"hljs-number\">0.5\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">cursor\u003C/span>: not-allowed;\n}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"troubleshooting-common-accessibility-issues\">Troubleshooting Common Accessibility Issues\u003C/h2>\n\u003Ch3 id=\"screen-reader-compatibility-problems\">Screen Reader Compatibility Problems\u003C/h3>\n\u003Cp>\u003Cstrong>Problem\u003C/strong>: Content not being announced properly by screen readers\u003C/p>\n\u003Cp>\u003Cstrong>Solutions\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">&lt;!-- Problematic patterns --&gt;\nClick [\u003Cspan class=\"hljs-string\">here\u003C/span>](\u003Cspan class=\"hljs-link\">https://example.com\u003C/span>) to download.\nSee the image below. ![](\u003Cspan class=\"hljs-link\">chart.png\u003C/span>)\n[\u003Cspan class=\"hljs-string\">More info\u003C/span>](\u003Cspan class=\"hljs-link\">https://example.com\u003C/span>)\n\n&lt;!-- Improved patterns --&gt;\n[\u003Cspan class=\"hljs-string\">Download the accessibility guide (PDF, 2.3 MB)\u003C/span>](\u003Cspan class=\"hljs-link\">https://example.com/guide.pdf\u003C/span>)\nThe following chart shows quarterly sales data:\n![\u003Cspan class=\"hljs-string\">Bar chart displaying Q1-Q4 sales figures with 23% overall growth trend\u003C/span>](\u003Cspan class=\"hljs-link\">chart.png\u003C/span>)\n[\u003Cspan class=\"hljs-string\">Learn more about WCAG 2.1 compliance requirements\u003C/span>](\u003Cspan class=\"hljs-link\">https://example.com/wcag\u003C/span>)\n\u003C/code>\u003C/pre>\u003Ch3 id=\"keyboard-navigation-issues\">Keyboard Navigation Issues\u003C/h3>\n\u003Cp>\u003Cstrong>Problem\u003C/strong>: Content not accessible via keyboard navigation\u003C/p>\n\u003Cp>\u003Cstrong>Solutions\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// Enhance markdown-generated content for keyboard accessibility\u003C/span>\n\u003Cspan class=\"hljs-keyword\">function\u003C/span> \u003Cspan class=\"hljs-title function_\">enhanceKeyboardAccessibility\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n    \u003Cspan class=\"hljs-comment\">// Add keyboard event handlers to interactive elements\u003C/span>\n    \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-title function_\">querySelectorAll\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;[role=&quot;button&quot;], .interactive&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">element\u003C/span> =&gt;\u003C/span> {\n        element.\u003Cspan class=\"hljs-title function_\">addEventListener\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;keydown&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">e\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (e.\u003Cspan class=\"hljs-property\">key\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;Enter&#x27;\u003C/span> || e.\u003Cspan class=\"hljs-property\">key\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27; &#x27;\u003C/span>) {\n                e.\u003Cspan class=\"hljs-title function_\">preventDefault\u003C/span>();\n                element.\u003Cspan class=\"hljs-title function_\">click\u003C/span>();\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Ensure focusable elements have tabindex\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!element.\u003Cspan class=\"hljs-title function_\">hasAttribute\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;tabindex&#x27;\u003C/span>)) {\n            element.\u003Cspan class=\"hljs-title function_\">setAttribute\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;tabindex&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;0&#x27;\u003C/span>);\n        }\n    });\n    \n    \u003Cspan class=\"hljs-comment\">// Manage focus for dynamic content updates\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> observer = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">MutationObserver\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">mutations\u003C/span>) =&gt;\u003C/span> {\n        mutations.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">mutation\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (mutation.\u003Cspan class=\"hljs-property\">addedNodes\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> newContent = mutation.\u003Cspan class=\"hljs-property\">addedNodes\u003C/span>[\u003Cspan class=\"hljs-number\">0\u003C/span>];\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (newContent.\u003Cspan class=\"hljs-property\">nodeType\u003C/span> === \u003Cspan class=\"hljs-title class_\">Node\u003C/span>.\u003Cspan class=\"hljs-property\">ELEMENT_NODE\u003C/span>) {\n                    \u003Cspan class=\"hljs-comment\">// Focus first heading in new content\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> firstHeading = newContent.\u003Cspan class=\"hljs-title function_\">querySelector\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;h1, h2, h3, h4, h5, h6&#x27;\u003C/span>);\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (firstHeading) {\n                        firstHeading.\u003Cspan class=\"hljs-title function_\">setAttribute\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;tabindex&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-1&#x27;\u003C/span>);\n                        firstHeading.\u003Cspan class=\"hljs-title function_\">focus\u003C/span>();\n                    }\n                }\n            }\n        });\n    });\n    \n    observer.\u003Cspan class=\"hljs-title function_\">observe\u003C/span>(\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">body\u003C/span>, {\n        \u003Cspan class=\"hljs-attr\">childList\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">subtree\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    });\n}\n\u003C/code>\u003C/pre>\u003Ch3 id=\"color-and-contrast-issues\">Color and Contrast Issues\u003C/h3>\n\u003Cp>\u003Cstrong>Problem\u003C/strong>: Insufficient color contrast or color-only information\u003C/p>\n\u003Cp>\u003Cstrong>Solutions\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-css\">\u003Cspan class=\"hljs-comment\">/* Ensure sufficient color contrast */\u003C/span>\n\u003Cspan class=\"hljs-selector-pseudo\">:root\u003C/span> {\n    \u003Cspan class=\"hljs-attr\">--text-color\u003C/span>: \u003Cspan class=\"hljs-number\">#212529\u003C/span>;           \u003Cspan class=\"hljs-comment\">/* 16.75:1 contrast ratio on white */\u003C/span>\n    \u003Cspan class=\"hljs-attr\">--link-color\u003C/span>: \u003Cspan class=\"hljs-number\">#0056b3\u003C/span>;           \u003Cspan class=\"hljs-comment\">/* 7.03:1 contrast ratio */\u003C/span>\n    \u003Cspan class=\"hljs-attr\">--link-hover\u003C/span>: \u003Cspan class=\"hljs-number\">#004085\u003C/span>;           \u003Cspan class=\"hljs-comment\">/* 9.26:1 contrast ratio */\u003C/span>\n    \u003Cspan class=\"hljs-attr\">--success-color\u003C/span>: \u003Cspan class=\"hljs-number\">#155724\u003C/span>;        \u003Cspan class=\"hljs-comment\">/* 7.47:1 contrast ratio */\u003C/span>\n    \u003Cspan class=\"hljs-attr\">--warning-color\u003C/span>: \u003Cspan class=\"hljs-number\">#856404\u003C/span>;        \u003Cspan class=\"hljs-comment\">/* 5.14:1 contrast ratio */\u003C/span>\n    \u003Cspan class=\"hljs-attr\">--error-color\u003C/span>: \u003Cspan class=\"hljs-number\">#721c24\u003C/span>;          \u003Cspan class=\"hljs-comment\">/* 8.66:1 contrast ratio */\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\">/* Don&#x27;t rely solely on color for meaning */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.status-indicator\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: inline-block;\n    \u003Cspan class=\"hljs-attribute\">width\u003C/span>: \u003Cspan class=\"hljs-number\">1em\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">height\u003C/span>: \u003Cspan class=\"hljs-number\">1em\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-right\u003C/span>: \u003Cspan class=\"hljs-number\">0.5em\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.status-success\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;✓&#x27;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--success-color);\n}\n\n\u003Cspan class=\"hljs-selector-class\">.status-warning\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;⚠&#x27;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--warning-color);\n}\n\n\u003Cspan class=\"hljs-selector-class\">.status-error\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;✗&#x27;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--error-color);\n}\n\n\u003Cspan class=\"hljs-comment\">/* Focus indicators for dark themes */\u003C/span>\n\u003Cspan class=\"hljs-keyword\">@media\u003C/span> (\u003Cspan class=\"hljs-attribute\">prefers-color-scheme\u003C/span>: dark) {\n    \u003Cspan class=\"hljs-selector-pseudo\">:focus\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">outline-color\u003C/span>: \u003Cspan class=\"hljs-number\">#66b3ff\u003C/span>;\n    }\n}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Advanced Markdown accessibility and screen reader support represents a comprehensive approach to inclusive content creation that ensures documentation and technical content serves users with diverse abilities and assistive technology requirements. By implementing semantic markup strategies, comprehensive testing frameworks, and thoughtful design patterns, content creators can build documentation ecosystems that provide equitable access to information while maintaining the efficiency and maintainability that makes Markdown such an effective content creation format.\u003C/p>\n\u003Cp>The key to successful accessibility implementation lies in understanding that accessibility benefits all users, not just those with disabilities. Clear heading structures, descriptive link text, and well-organized content improve the experience for everyone while ensuring compliance with legal requirements and ethical standards for inclusive design. Whether you&#39;re building technical documentation, educational content, or public information resources, the techniques covered in this guide provide the foundation for creating accessible, sustainable content that serves diverse user needs.\u003C/p>\n\u003Cp>Remember to implement accessibility testing as part of your content creation workflow, regularly validate your accessibility improvements with actual users of assistive technologies, and stay current with evolving accessibility standards and best practices. With proper implementation of accessibility principles and testing frameworks, your Markdown-based content can achieve excellent accessibility compliance while delivering exceptional user experiences that demonstrate your commitment to inclusive design and universal access to information.\u003C/p>\n",[15,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61],{"id":16,"text":17,"level":18},"why-master-markdown-accessibility","Why Master Markdown Accessibility?",2,{"id":20,"text":21,"level":18},"foundation-accessibility-principles","Foundation Accessibility Principles",{"id":23,"text":24,"level":18},"descriptive-link-text","Descriptive Link Text",{"id":26,"text":27,"level":18},"alternative-text-for-images","Alternative Text for Images",{"id":29,"text":30,"level":18},"list-structure-for-screen-readers","List Structure for Screen Readers",{"id":32,"text":33,"level":18},"functional-images","Functional Images",{"id":35,"text":36,"level":18},"complex-images-with-extended-descriptions","Complex Images with Extended Descriptions",{"id":38,"text":39,"level":18},"decorative-images","Decorative Images",{"id":41,"text":42,"level":18},"integration-with-documentation-systems","Integration with Documentation Systems",{"id":44,"text":45,"level":18},"advanced-accessibility-techniques","Advanced Accessibility Techniques",{"id":47,"text":48,"level":18},"progressive-enhancement-for-accessibility","Progressive Enhancement for Accessibility",{"id":50,"text":51,"level":18},"screen-reader-navigation-optimization","Screen Reader Navigation Optimization",{"id":53,"text":54,"level":18},"content-landmarks-and-skip-links","Content Landmarks and Skip Links",{"id":56,"text":57,"level":18},"focus-management-and-keyboard-navigation","Focus Management and Keyboard Navigation",{"id":59,"text":60,"level":18},"troubleshooting-common-accessibility-issues","Troubleshooting Common Accessibility Issues",{"id":62,"text":63,"level":18},"conclusion","Conclusion",[],[66,74,82],{"slug":67,"title":68,"description":69,"excerpt":70,"date":71,"category":9,"author":10,"keywords":72,"readingMinutes":73},"markdown-accessibility-screen-reader-support-complete-guide","Markdown Accessibility and Screen Reader Support: Complete Guide for Inclusive Documentation","Master Markdown accessibility techniques for screen readers, keyboard navigation, and inclusive documentation. Learn WCAG compliance, semantic HTML generation, and accessible formatting for all users.","Advanced Markdown accessibility and screen reader support techniques enable inclusive documentation that serves all users regardless of their abilities or assistive technologies. By implementing…","2025-11-23","markdown accessibility, screen reader markdown, accessible documentation, markdown WCAG, inclusive markdown, markdown semantic html, accessibility best practices, markdown for disabled users",13,{"slug":75,"title":76,"description":77,"excerpt":78,"date":79,"category":9,"author":10,"keywords":80,"readingMinutes":81},"markdown-table-accessibility-screen-readers-complete-guide","Markdown Table Accessibility and Screen Reader Support: Complete Guide for Inclusive Documentation and Web Content","Master Markdown table accessibility techniques for screen readers, ARIA labels, semantic markup, and inclusive design patterns. Learn to create accessible tables that work seamlessly with assistive technologies and meet WCAG compliance standards.","Advanced Markdown table accessibility and screen reader optimization enable inclusive documentation and web content that serves users with diverse accessibility needs. By implementing proper…","2025-11-21","markdown table accessibility, screen reader tables, accessible markdown, aria labels markdown, wcag compliance markdown, inclusive design tables, semantic table markup, assistive technology markdown",29,{"slug":83,"title":84,"description":85,"excerpt":86,"date":87,"category":9,"author":10,"keywords":88,"readingMinutes":89},"markdown-accessibility-complete-guide","Markdown Accessibility and WCAG Compliance: Complete Guide for Inclusive Documentation and Content Creation","Master accessibility in Markdown documentation with comprehensive WCAG compliance techniques, semantic markup strategies, and assistive technology support. Learn to create inclusive content that works for all users.","Advanced Markdown accessibility and WCAG compliance enable the creation of inclusive documentation that serves users with diverse abilities and assistive technology requirements. By implementing…","2025-12-19","markdown accessibility, WCAG compliance markdown, accessible documentation, inclusive content markdown, assistive technology markdown, screen reader markdown, semantic markup markdown, accessibility testing markdown",32,1792184945053]