[{"data":1,"prerenderedAt":65},["Reactive",2],{"blog-post-markdown-content-validation-automated-quality-assurance-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":40,"related":41},"markdown-content-validation-automated-quality-assurance-complete-guide","Markdown Content Validation and Automated Quality Assurance: Complete Guide for Robust Documentation Workflows","Master comprehensive Markdown content validation techniques including syntax checking, link verification, accessibility testing, and automated quality assurance systems. Learn to build reliable documentation workflows with error prevention and content integrity checks.","Advanced Markdown content validation and automated quality assurance systems ensure documentation integrity, prevent content errors, and maintain consistent formatting standards across large-scale…","2025-10-09","Tutorial","Matthew Rathbone","markdown validation, markdown quality assurance, markdown syntax checking, link validation markdown, markdown testing automation, content validation tools, markdown linting, documentation qa",27,"\u003Cp>Advanced Markdown content validation and automated quality assurance systems ensure documentation integrity, prevent content errors, and maintain consistent formatting standards across large-scale projects. By implementing comprehensive validation workflows that check syntax correctness, verify link accessibility, validate accessibility compliance, and enforce style guidelines, development teams can create robust documentation systems that automatically catch issues before publication and maintain high content quality standards throughout the entire content lifecycle.\u003C/p>\n\u003Ch2 id=\"why-implement-markdown-content-validation\">Why Implement Markdown Content Validation?\u003C/h2>\n\u003Cp>Professional content validation provides essential benefits for scalable documentation systems:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Error Prevention\u003C/strong>: Automatically detect and prevent syntax errors, broken links, and formatting issues before content publication\u003C/li>\n\u003Cli>\u003Cstrong>Consistency Enforcement\u003C/strong>: Ensure uniform formatting, style guidelines, and structural patterns across all documentation\u003C/li>\n\u003Cli>\u003Cstrong>Accessibility Compliance\u003C/strong>: Validate content against accessibility standards to ensure inclusive user experiences\u003C/li>\n\u003Cli>\u003Cstrong>Quality Assurance\u003C/strong>: Maintain high content standards through automated checks and validation rules\u003C/li>\n\u003Cli>\u003Cstrong>Team Productivity\u003C/strong>: Reduce manual review overhead and enable faster content publishing workflows\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"foundation-validation-concepts\">Foundation Validation Concepts\u003C/h2>\n\u003Ch3 id=\"core-markdown-syntax-validation\">Core Markdown Syntax Validation\u003C/h3>\n\u003Cp>Understanding essential syntax validation patterns and common error detection:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// markdown-validator.js - Core syntax validation system\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownValidator\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\">strictMode\u003C/span>: options.\u003Cspan class=\"hljs-property\">strictMode\u003C/span> || \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">allowHtml\u003C/span>: options.\u003Cspan class=\"hljs-property\">allowHtml\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxLineLength\u003C/span>: options.\u003Cspan class=\"hljs-property\">maxLineLength\u003C/span> || \u003Cspan class=\"hljs-number\">120\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enforceHeadingStructure\u003C/span>: options.\u003Cspan class=\"hljs-property\">enforceHeadingStructure\u003C/span> || \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validateCodeBlocks\u003C/span>: options.\u003Cspan class=\"hljs-property\">validateCodeBlocks\u003C/span> || \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">checkLinkFormat\u003C/span>: options.\u003Cspan class=\"hljs-property\">checkLinkFormat\u003C/span> || \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationRules\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span> = [];\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span> = [];\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">setupDefaultRules\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">setupDefaultRules\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Basic syntax validation rules\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;heading-structure&#x27;\u003C/span>, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateHeadingStructure\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>));\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;link-format&#x27;\u003C/span>, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateLinkFormat\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>));\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;code-block-syntax&#x27;\u003C/span>, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateCodeBlocks\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>));\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;list-formatting&#x27;\u003C/span>, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateListFormatting\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>));\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;table-structure&#x27;\u003C/span>, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateTableStructure\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>));\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;line-length&#x27;\u003C/span>, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateLineLength\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>));\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;trailing-whitespace&#x27;\u003C/span>, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateTrailingWhitespace\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>));\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;empty-links&#x27;\u003C/span>, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateEmptyLinks\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>));\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-params\">name, validationFunction\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(name, validationFunction);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">removeRule\u003C/span>(\u003Cspan class=\"hljs-params\">name\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(name);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validate\u003C/span>(\u003Cspan class=\"hljs-params\">content, filePath = \u003Cspan class=\"hljs-string\">&#x27;unknown&#x27;\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span> = [];\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span> = [];\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = content.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Run all validation rules\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> [ruleName, ruleFunction] \u003Cspan class=\"hljs-keyword\">of\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationRules\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-title function_\">ruleFunction\u003C/span>(content, lines, filePath);\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">rule\u003C/span>: ruleName,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Validation rule &#x27;\u003Cspan class=\"hljs-subst\">${ruleName}\u003C/span>&#x27; failed: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n                });\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">errors\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">totalErrors\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">totalWarnings\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">rulesChecked\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationRules\u003C/span>.\u003Cspan class=\"hljs-property\">size\u003C/span>\n            }\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateHeadingStructure\u003C/span>(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enforceHeadingStructure\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> headings = [];\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> previousLevel = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> headingMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(#{1,6})\\s+(.+)$/\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headingMatch) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> level = headingMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> text = headingMatch[\u003Cspan class=\"hljs-number\">2\u003C/span>].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n                \n                headings.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({ level, text, \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span> });\n                \n                \u003Cspan class=\"hljs-comment\">// Check for heading level jumps\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (level &gt; previousLevel + \u003Cspan class=\"hljs-number\">1\u003C/span> &amp;&amp; previousLevel &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heading-structure&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Heading level jumps from h\u003Cspan class=\"hljs-subst\">${previousLevel}\u003C/span> to h\u003Cspan class=\"hljs-subst\">${level}\u003C/span>. Consider using h\u003Cspan class=\"hljs-subst\">${previousLevel + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span> instead.`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                    });\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Check for empty headings\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!text) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heading-structure&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Empty heading found&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n                    });\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Check for duplicate headings (can cause anchor conflicts)\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> duplicates = headings.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">h\u003C/span> =&gt;\u003C/span> h.\u003Cspan class=\"hljs-property\">text\u003C/span> === text &amp;&amp; h.\u003Cspan class=\"hljs-property\">line\u003C/span> !== index + \u003Cspan class=\"hljs-number\">1\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (duplicates.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heading-structure&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Duplicate heading &quot;\u003Cspan class=\"hljs-subst\">${text}\u003C/span>&quot; found. This may cause anchor link conflicts.`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                    });\n                }\n                \n                previousLevel = level;\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Check for missing h1\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headings.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> &amp;&amp; headings[\u003Cspan class=\"hljs-number\">0\u003C/span>].\u003Cspan class=\"hljs-property\">level\u003C/span> &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heading-structure&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Document should start with an h1 heading&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: headings[\u003Cspan class=\"hljs-number\">0\u003C/span>].\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateLinkFormat\u003C/span>(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">checkLinkFormat\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Check for malformed links\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> malformedLinks = line.\u003Cspan class=\"hljs-title function_\">matchAll\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\[([^\\]]*)\\]\\s*\\(([^)]*)\\)/g\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> match \u003Cspan class=\"hljs-keyword\">of\u003C/span> malformedLinks) {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (match[\u003Cspan class=\"hljs-number\">0\u003C/span>].\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;]\\n(&#x27;\u003C/span>) || match[\u003Cspan class=\"hljs-number\">0\u003C/span>].\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-params\">\u003Cspan class=\"hljs-string\">&#x27;]\\t(&#x27;\u003C/span>\u003C/span>)) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;link-format&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Link has whitespace between ] and (&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n                    });\n                }\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Check for reference links without definitions\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> referenceLinks = line.\u003Cspan class=\"hljs-title function_\">matchAll\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\[([^\\]]+)\\]\\[([^\\]]*)\\]/g\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> match \u003Cspan class=\"hljs-keyword\">of\u003C/span> referenceLinks) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> refId = match[\u003Cspan class=\"hljs-number\">2\u003C/span>] || match[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!content.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">`[\u003Cspan class=\"hljs-subst\">${refId}\u003C/span>]:`\u003C/span>)) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;link-format&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Reference link &quot;\u003Cspan class=\"hljs-subst\">${refId}\u003C/span>&quot; has no definition`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n                    });\n                }\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Check for unescaped brackets in link text\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> linkTextPattern = \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]*\\[[^\\]]*\\])[^\\]]*\\]/g\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (linkTextPattern.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(line)) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;link-format&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Link text contains unescaped brackets&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                });\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateCodeBlocks\u003C/span>(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">validateCodeBlocks\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> inCodeBlock = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> codeBlockStart = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> codeBlockLanguage = \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> codeBlockMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^```(\\w+)?/\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (codeBlockMatch) {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!inCodeBlock) {\n                    \u003Cspan class=\"hljs-comment\">// Starting code block\u003C/span>\n                    inCodeBlock = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                    codeBlockStart = index + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                    codeBlockLanguage = codeBlockMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    \u003Cspan class=\"hljs-comment\">// Ending code block\u003C/span>\n                    inCodeBlock = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                    \n                    \u003Cspan class=\"hljs-comment\">// Validate code block content if language is specified\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (codeBlockLanguage) {\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateCodeBlockContent\u003C/span>(\n                            lines.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(codeBlockStart, index),\n                            codeBlockLanguage,\n                            codeBlockStart + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                        );\n                    }\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>) &amp;&amp; line.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">3\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;code-block-syntax&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Invalid code block syntax. Use ``` followed by language identifier.&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n                });\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Check for unclosed code blocks\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inCodeBlock) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;code-block-syntax&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Unclosed code block starting at line \u003Cspan class=\"hljs-subst\">${codeBlockStart}\u003C/span>`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: codeBlockStart,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for nested code blocks (4 backticks pattern)\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> nestedCodePattern = \u003Cspan class=\"hljs-regexp\">/````/g\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = nestedCodePattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(content)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> lineNumber = content.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, match.\u003Cspan class=\"hljs-property\">index\u003C/span>).\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;code-block-syntax&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Consider using proper nesting for code blocks containing triple backticks&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: lineNumber,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateCodeBlockContent\u003C/span>(\u003Cspan class=\"hljs-params\">codeLines, language, startLine\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Basic syntax validation for common languages\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> validators = {\n            \u003Cspan class=\"hljs-attr\">javascript\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateJavaScript\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">json\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateJSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">yaml\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateYAML\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">markdown\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateNestedMarkdown\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> validator = validators[language.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>()];\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (validator) {\n            \u003Cspan class=\"hljs-title function_\">validator\u003C/span>(codeLines, startLine);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateJavaScript\u003C/span>(\u003Cspan class=\"hljs-params\">codeLines, startLine\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> code = codeLines.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Check for common syntax issues\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> brackets = { \u003Cspan class=\"hljs-string\">&#x27;(&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;[&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;{&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span> };\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> closers = { \u003Cspan class=\"hljs-string\">&#x27;)&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;(&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;]&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;[&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;}&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;{&#x27;\u003C/span> };\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> char \u003Cspan class=\"hljs-keyword\">of\u003C/span> code) {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (brackets.\u003Cspan class=\"hljs-title function_\">hasOwnProperty\u003C/span>(char)) {\n                brackets[char]++;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (closers.\u003Cspan class=\"hljs-title function_\">hasOwnProperty\u003C/span>(char)) {\n                brackets[closers[char]]--;\n            }\n        }\n        \n        \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(brackets).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[bracket, count]\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (count !== \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;code-block-syntax&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Unmatched \u003Cspan class=\"hljs-subst\">${bracket}\u003C/span> in JavaScript code block`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: startLine,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                });\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateJSON\u003C/span>(\u003Cspan class=\"hljs-params\">codeLines, startLine\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> jsonString = codeLines.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">parse\u003C/span>(jsonString);\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;code-block-syntax&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Invalid JSON syntax: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: startLine,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateYAML\u003C/span>(\u003Cspan class=\"hljs-params\">codeLines, startLine\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Basic YAML validation - check indentation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> previousIndent = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        codeLines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> match = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*)/\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> currentIndent = match ? match[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span> : \u003Cspan class=\"hljs-number\">0\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() &amp;&amp; currentIndent % \u003Cspan class=\"hljs-number\">2\u003C/span> !== \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;code-block-syntax&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;YAML should use 2-space indentation&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: startLine + index,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                });\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateNestedMarkdown\u003C/span>(\u003Cspan class=\"hljs-params\">codeLines, startLine\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Validate markdown syntax within code blocks\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> nestedContent = codeLines.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> nestedValidator = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownValidator\u003C/span>({\n            ...\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">strictMode\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span> \u003Cspan class=\"hljs-comment\">// More lenient for nested content\u003C/span>\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = nestedValidator.\u003Cspan class=\"hljs-title function_\">validate\u003C/span>(nestedContent);\n        result.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">error\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;code-block-syntax&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Nested markdown issue: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: startLine + error.\u003Cspan class=\"hljs-property\">line\u003C/span> - \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n            });\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateListFormatting\u003C/span>(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> inList = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> listType = \u003Cspan class=\"hljs-literal\">null\u003C/span>; \u003Cspan class=\"hljs-comment\">// &#x27;ordered&#x27; or &#x27;unordered&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> listIndent = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> orderedMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*)(\\d+)\\.\\s/\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> unorderedMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*)[-*+]\\s/\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (orderedMatch || unorderedMatch) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> currentIndent = (orderedMatch || unorderedMatch)[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> currentType = orderedMatch ? \u003Cspan class=\"hljs-string\">&#x27;ordered&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;unordered&#x27;\u003C/span>;\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!inList) {\n                    \u003Cspan class=\"hljs-comment\">// Starting new list\u003C/span>\n                    inList = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                    listType = currentType;\n                    listIndent = currentIndent;\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    \u003Cspan class=\"hljs-comment\">// Check indentation consistency\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentIndent === listIndent &amp;&amp; currentType !== listType) {\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;list-formatting&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Mixing ordered and unordered list items at same level`\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                        });\n                    }\n                    \n                    \u003Cspan class=\"hljs-comment\">// Check proper indentation for nested lists\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentIndent &gt; listIndent &amp;&amp; currentIndent !== listIndent + \u003Cspan class=\"hljs-number\">2\u003C/span>) {\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;list-formatting&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Nested list items should be indented by exactly 2 spaces&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                        });\n                    }\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Validate ordered list numbering\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (orderedMatch) {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> number = \u003Cspan class=\"hljs-built_in\">parseInt\u003C/span>(orderedMatch[\u003Cspan class=\"hljs-number\">2\u003C/span>]);\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentIndent === listIndent &amp;&amp; number !== \u003Cspan class=\"hljs-number\">1\u003C/span>) {\n                        \u003Cspan class=\"hljs-comment\">// Check if this should be sequential\u003C/span>\n                        \u003Cspan class=\"hljs-keyword\">let\u003C/span> expectedNumber = \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = index - \u003Cspan class=\"hljs-number\">1\u003C/span>; i &gt;= \u003Cspan class=\"hljs-number\">0\u003C/span>; i--) {\n                            \u003Cspan class=\"hljs-keyword\">const\u003C/span> prevMatch = lines[i].\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*)(\\d+)\\.\\s/\u003C/span>);\n                            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (prevMatch &amp;&amp; prevMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span> === currentIndent) {\n                                expectedNumber = \u003Cspan class=\"hljs-built_in\">parseInt\u003C/span>(prevMatch[\u003Cspan class=\"hljs-number\">2\u003C/span>]) + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                                \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (lines[i].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>;\n                            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                                \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                            }\n                        }\n                        \n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (number !== expectedNumber &amp;&amp; number !== \u003Cspan class=\"hljs-number\">1\u003C/span>) {\n                            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                                \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;list-formatting&#x27;\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Ordered list number \u003Cspan class=\"hljs-subst\">${number}\u003C/span> should be \u003Cspan class=\"hljs-subst\">${expectedNumber}\u003C/span> or 1`\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                            });\n                        }\n                    }\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inList &amp;&amp; line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Empty line in list - acceptable\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inList &amp;&amp; !line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^\\s/\u003C/span>) &amp;&amp; line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() !== \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// End of list\u003C/span>\n                inList = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                listType = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n                listIndent = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateTableStructure\u003C/span>(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> inTable = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> expectedColumns = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> tableStartLine = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> isTableRow = line.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>) &amp;&amp; line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>().\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> isSeparatorRow = \u003Cspan class=\"hljs-regexp\">/^\\s*\\|[\\s\\-:|]*\\|\\s*$/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(line);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (isTableRow || isSeparatorRow) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> columns = line.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span> - \u003Cspan class=\"hljs-number\">2\u003C/span>; \u003Cspan class=\"hljs-comment\">// Subtract 2 for leading/trailing |\u003C/span>\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!inTable) {\n                    \u003Cspan class=\"hljs-comment\">// Starting new table\u003C/span>\n                    inTable = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                    expectedColumns = columns;\n                    tableStartLine = index + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    \u003Cspan class=\"hljs-comment\">// Check column consistency\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (columns !== expectedColumns) {\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;table-structure&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Table row has \u003Cspan class=\"hljs-subst\">${columns}\u003C/span> columns, expected \u003Cspan class=\"hljs-subst\">${expectedColumns}\u003C/span>`\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n                        });\n                    }\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Validate separator row format\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (isSeparatorRow) {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> separatorCells = line.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span>, -\u003Cspan class=\"hljs-number\">1\u003C/span>);\n                    separatorCells.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">cell, cellIndex\u003C/span>) =&gt;\u003C/span> {\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> trimmed = cell.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-regexp\">/^:?-+:?$/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(trimmed)) {\n                            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                                \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;table-structure&#x27;\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Invalid table separator format in column \u003Cspan class=\"hljs-subst\">${cellIndex + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>`\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n                            });\n                        }\n                    });\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inTable &amp;&amp; line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() !== \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// End of table\u003C/span>\n                inTable = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                expectedColumns = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateLineLength\u003C/span>(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">maxLineLength\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">maxLineLength\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Skip code blocks and URLs\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>().\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>) &amp;&amp; !line.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;http&#x27;\u003C/span>)) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;line-length&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Line exceeds maximum length of \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.options.maxLineLength}\u003C/span> characters (\u003Cspan class=\"hljs-subst\">${line.length}\u003C/span>)`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                    });\n                }\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateTrailingWhitespace\u003C/span>(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) {\n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27; &#x27;\u003C/span>) || line.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\t&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;trailing-whitespace&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Line has trailing whitespace&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                });\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateEmptyLinks\u003C/span>(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) {\n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Check for empty link URLs\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> emptyUrlPattern = \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]+)\\]\\(\\s*\\)/g\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n            \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = emptyUrlPattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(line)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;empty-links&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Empty link URL for text &quot;\u003Cspan class=\"hljs-subst\">${match[\u003Cspan class=\"hljs-number\">1\u003C/span>]}\u003C/span>&quot;`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n                });\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Check for empty link text\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> emptyTextPattern = \u003Cspan class=\"hljs-regexp\">/\\[\\s*\\]\\([^)]+\\)/g\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = emptyTextPattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(line)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;empty-links&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Link has empty text&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                });\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateReport\u003C/span>(\u003Cspan class=\"hljs-params\">validationResult, filePath = \u003Cspan class=\"hljs-string\">&#x27;unknown&#x27;\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> report = {\n            filePath,\n            \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: validationResult.\u003Cspan class=\"hljs-property\">isValid\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: validationResult.\u003Cspan class=\"hljs-property\">summary\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">issues\u003C/span>: [\n                ...validationResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">e\u003C/span> =&gt;\u003C/span> ({ ...e, \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span> })),\n                ...validationResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">w\u003C/span> =&gt;\u003C/span> ({ ...w, \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\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> a.\u003Cspan class=\"hljs-property\">line\u003C/span> - b.\u003Cspan class=\"hljs-property\">line\u003C/span>)\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> report;\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">// Usage example\u003C/span>\n\u003Cspan class=\"hljs-keyword\">function\u003C/span> \u003Cspan class=\"hljs-title function_\">demonstrateValidation\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_\">MarkdownValidator\u003C/span>({\n        \u003Cspan class=\"hljs-attr\">strictMode\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">maxLineLength\u003C/span>: \u003Cspan class=\"hljs-number\">100\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">enforceHeadingStructure\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">validateCodeBlocks\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    });\n    \n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> sampleMarkdown = \u003Cspan class=\"hljs-string\">`\n# Main Heading\n\nThis is a paragraph with a [broken link]().\n\n## Subsection\n\nHere&#x27;s a code block:\n\n\\`\\`\\`javascript\nfunction example() {\n    console.log(&quot;Hello World&quot;\n// Missing closing brace\n\\`\\`\\`\n\n### Another heading\n\n- List item 1\n- List item 2\n  - Nested item\n    - Wrong indentation level\n\n| Column 1 | Column 2 |\n|----------|----------|\n| Data 1   | Data 2   |\n| Data 3   |          | Extra cell\n`\u003C/span>;\n    \n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = validator.\u003Cspan class=\"hljs-title function_\">validate\u003C/span>(sampleMarkdown);\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> report = validator.\u003Cspan class=\"hljs-title function_\">generateReport\u003C/span>(result, \u003Cspan class=\"hljs-string\">&#x27;sample.md&#x27;\u003C/span>);\n    \n    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Validation Report:&#x27;\u003C/span>, \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">stringify\u003C/span>(report, \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-number\">2\u003C/span>));\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">MarkdownValidator\u003C/span>;\n\u003C/code>\u003C/pre>\u003Ch3 id=\"advanced-link-validation-system\">Advanced Link Validation System\u003C/h3>\n\u003Cp>Comprehensive link checking with accessibility and performance considerations:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// link-validator.js - Advanced link validation system\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">LinkValidator\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\">checkExternalLinks\u003C/span>: options.\u003Cspan class=\"hljs-property\">checkExternalLinks\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">checkInternalLinks\u003C/span>: options.\u003Cspan class=\"hljs-property\">checkInternalLinks\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validateAnchors\u003C/span>: options.\u003Cspan class=\"hljs-property\">validateAnchors\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">checkAccessibility\u003C/span>: options.\u003Cspan class=\"hljs-property\">checkAccessibility\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">timeout\u003C/span>: options.\u003Cspan class=\"hljs-property\">timeout\u003C/span> || \u003Cspan class=\"hljs-number\">10000\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxConcurrency\u003C/span>: options.\u003Cspan class=\"hljs-property\">maxConcurrency\u003C/span> || \u003Cspan class=\"hljs-number\">5\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">baseUrl\u003C/span>: options.\u003Cspan class=\"hljs-property\">baseUrl\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">ignoredDomains\u003C/span>: options.\u003Cspan class=\"hljs-property\">ignoredDomains\u003C/span> || [],\n            \u003Cspan class=\"hljs-attr\">cacheResults\u003C/span>: options.\u003Cspan class=\"hljs-property\">cacheResults\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">linkCache\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">accessibilityCache\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">rateLimiter\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>(); \u003Cspan class=\"hljs-comment\">// Domain -&gt; last request time\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">validLinks\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">brokenLinks\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">accessibilityIssues\u003C/span>: []\n        };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateContent\u003C/span>(\u003Cspan class=\"hljs-params\">content, filePath = \u003Cspan class=\"hljs-string\">&#x27;unknown&#x27;\u003C/span>, baseDir = \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">validLinks\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">brokenLinks\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">accessibilityIssues\u003C/span>: []\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> links = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractLinks\u003C/span>(content);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> linkChunks = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">chunkArray\u003C/span>(links, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">maxConcurrency\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Process links in chunks to respect rate limits\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> chunk \u003Cspan class=\"hljs-keyword\">of\u003C/span> linkChunks) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> promises = chunk.\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-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateLink\u003C/span>(link, filePath, baseDir)\n            );\n            \n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>.\u003Cspan class=\"hljs-title function_\">allSettled\u003C/span>(promises);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">totalLinks\u003C/span>: links.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">validLinks\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">validLinks\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">brokenLinks\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">brokenLinks\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">accessibilityIssues\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">accessibilityIssues\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            },\n            \u003Cspan class=\"hljs-attr\">results\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">extractLinks\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> links = [];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> patterns = [\n            \u003Cspan class=\"hljs-comment\">// Standard markdown links [text](url)\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]+)\\]\\(([^)]+)\\)/g\u003C/span>,\n            \u003Cspan class=\"hljs-comment\">// Reference links [text][ref]\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]+)\\]\\[([^\\]]*)\\]/g\u003C/span>,\n            \u003Cspan class=\"hljs-comment\">// Link definitions [ref]: url\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/^\\[([^\\]]+)\\]:\\s*(.+?)(?:\\s+&quot;([^&quot;]*)&quot;)?$/gm\u003C/span>,\n            \u003Cspan class=\"hljs-comment\">// Auto-links &lt;url&gt;\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/&lt;(https?:\\/\\/[^&gt;]+)&gt;/g\u003C/span>,\n            \u003Cspan class=\"hljs-comment\">// Image links ![alt](url)\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/!\\[([^\\]]*)\\]\\(([^)]+)\\)/g\u003C/span>\n        ];\n        \n        patterns.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">pattern\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n            \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = pattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(content)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> linkData = {\n                    \u003Cspan class=\"hljs-attr\">text\u003C/span>: match[\u003Cspan class=\"hljs-number\">1\u003C/span>] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">url\u003C/span>: match[\u003Cspan class=\"hljs-number\">2\u003C/span>] || match[\u003Cspan class=\"hljs-number\">1\u003C/span>],\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getLineNumber\u003C/span>(content, match.\u003Cspan class=\"hljs-property\">index\u003C/span>),\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">determineLinkType\u003C/span>(match[\u003Cspan class=\"hljs-number\">0\u003C/span>]),\n                    \u003Cspan class=\"hljs-attr\">fullMatch\u003C/span>: match[\u003Cspan class=\"hljs-number\">0\u003C/span>],\n                    \u003Cspan class=\"hljs-attr\">position\u003C/span>: match.\u003Cspan class=\"hljs-property\">index\u003C/span>\n                };\n                \n                links.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(linkData);\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">deduplicateLinks\u003C/span>(links);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">determineLinkType\u003C/span>(\u003Cspan class=\"hljs-params\">matchText\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (matchText.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;![&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;image&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (matchText.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&lt;&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;autolink&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (matchText.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;]:&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;reference-definition&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/\\]\\[/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(matchText)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;reference&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;standard&#x27;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getLineNumber\u003C/span>(\u003Cspan class=\"hljs-params\">content, position\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> content.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, position).\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">deduplicateLinks\u003C/span>(\u003Cspan class=\"hljs-params\">links\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> seen = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> links.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">link\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> key = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${link.url}\u003C/span>-\u003Cspan class=\"hljs-subst\">${link.type}\u003C/span>`\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (seen.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(key)) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n            }\n            seen.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(key, \u003Cspan class=\"hljs-literal\">true\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateLink\u003C/span>(\u003Cspan class=\"hljs-params\">linkData, filePath, baseDir\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { url, text, line, type } = linkData;\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Skip validation for certain types if disabled\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">shouldSkipValidation\u003C/span>(url)) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Check cache first\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">linkCache\u003C/span>.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(url)) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> cached = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">linkCache\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(url);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>() - cached.\u003Cspan class=\"hljs-property\">timestamp\u003C/span> &lt; \u003Cspan class=\"hljs-number\">3600000\u003C/span>) { \u003Cspan class=\"hljs-comment\">// 1 hour cache\u003C/span>\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">processCachedResult\u003C/span>(cached.\u003Cspan class=\"hljs-property\">result\u003C/span>, linkData);\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n                }\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">let\u003C/span> validationResult;\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isExternalUrl\u003C/span>(url)) {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">checkExternalLinks\u003C/span>) {\n                    validationResult = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateExternalLink\u003C/span>(url, linkData);\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span>; \u003Cspan class=\"hljs-comment\">// Skip external links if disabled\u003C/span>\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isAnchorLink\u003C/span>(url)) {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">validateAnchors\u003C/span>) {\n                    validationResult = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateAnchorLink\u003C/span>(url, filePath, baseDir);\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">checkInternalLinks\u003C/span>) {\n                    validationResult = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateInternalLink\u003C/span>(url, baseDir);\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n                }\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Cache result\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">cacheResults\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">linkCache\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(url, {\n                    \u003Cspan class=\"hljs-attr\">result\u003C/span>: validationResult,\n                    \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n                });\n            }\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">processValidationResult\u003C/span>(validationResult, linkData);\n            \n            \u003Cspan class=\"hljs-comment\">// Check accessibility if enabled\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">checkAccessibility\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateAccessibility\u003C/span>(linkData, validationResult);\n            }\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">brokenLinks\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                ...linkData,\n                \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">shouldSkipValidation\u003C/span>(\u003Cspan class=\"hljs-params\">url\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Skip mailto, tel, and other non-http protocols\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^(mailto|tel|ftp|file):/i\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(url)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Skip ignored domains\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> urlObj = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title function_\">URL\u003C/span>(url, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">baseUrl\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">ignoredDomains\u003C/span>.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">domain\u003C/span> =&gt;\u003C/span> \n                urlObj.\u003Cspan class=\"hljs-property\">hostname\u003C/span>.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(domain)\n            );\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isExternalUrl\u003C/span>(\u003Cspan class=\"hljs-params\">url\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> urlObj = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title function_\">URL\u003C/span>(url, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">baseUrl\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;http:&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;https:&#x27;\u003C/span>].\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(urlObj.\u003Cspan class=\"hljs-property\">protocol\u003C/span>);\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isAnchorLink\u003C/span>(\u003Cspan class=\"hljs-params\">url\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> url.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateExternalLink\u003C/span>(\u003Cspan class=\"hljs-params\">url, linkData\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> domain = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title function_\">URL\u003C/span>(url).\u003Cspan class=\"hljs-property\">hostname\u003C/span>;\n        \n        \u003Cspan class=\"hljs-comment\">// Implement rate limiting\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">respectRateLimit\u003C/span>(domain);\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> controller = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">AbortController\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> timeoutId = \u003Cspan class=\"hljs-built_in\">setTimeout\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> controller.\u003Cspan class=\"hljs-title function_\">abort\u003C/span>(), \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">timeout\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> response = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title function_\">fetch\u003C/span>(url, {\n                \u003Cspan class=\"hljs-attr\">method\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;HEAD&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">signal\u003C/span>: controller.\u003Cspan class=\"hljs-property\">signal\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">headers\u003C/span>: {\n                    \u003Cspan class=\"hljs-string\">&#x27;User-Agent&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Mozilla/5.0 (compatible; Markdown-Validator/1.0)&#x27;\u003C/span>\n                }\n            });\n            \n            \u003Cspan class=\"hljs-built_in\">clearTimeout\u003C/span>(timeoutId);\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">statusCode\u003C/span>: response.\u003Cspan class=\"hljs-property\">status\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">statusText\u003C/span>: response.\u003Cspan class=\"hljs-property\">statusText\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">redirected\u003C/span>: response.\u003Cspan class=\"hljs-property\">redirected\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">finalUrl\u003C/span>: response.\u003Cspan class=\"hljs-property\">url\u003C/span>\n            };\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-comment\">// Try GET request if HEAD fails\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (error.\u003Cspan class=\"hljs-property\">name\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;AbortError&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">throw\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Request timeout&#x27;\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> response = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title function_\">fetch\u003C/span>(url, {\n                    \u003Cspan class=\"hljs-attr\">method\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;GET&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">headers\u003C/span>: {\n                        \u003Cspan class=\"hljs-string\">&#x27;User-Agent&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Mozilla/5.0 (compatible; Markdown-Validator/1.0)&#x27;\u003C/span>\n                    }\n                });\n                \n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                    \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">statusCode\u003C/span>: response.\u003Cspan class=\"hljs-property\">status\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">statusText\u003C/span>: response.\u003Cspan class=\"hljs-property\">statusText\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">redirected\u003C/span>: response.\u003Cspan class=\"hljs-property\">redirected\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">finalUrl\u003C/span>: response.\u003Cspan class=\"hljs-property\">url\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">method\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;GET&#x27;\u003C/span>\n                };\n                \n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (getError) {\n                \u003Cspan class=\"hljs-keyword\">throw\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">`Both HEAD and GET requests failed: \u003Cspan class=\"hljs-subst\">${getError.message}\u003C/span>`\u003C/span>);\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">respectRateLimit\u003C/span>(\u003Cspan class=\"hljs-params\">domain\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lastRequest = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">rateLimiter\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(domain) || \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> now = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> timeSinceLastRequest = now - lastRequest;\n        \n        \u003Cspan class=\"hljs-comment\">// Minimum 1 second between requests to same domain\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (timeSinceLastRequest &lt; \u003Cspan class=\"hljs-number\">1000\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">resolve\u003C/span> =&gt;\u003C/span> \n                \u003Cspan class=\"hljs-built_in\">setTimeout\u003C/span>(resolve, \u003Cspan class=\"hljs-number\">1000\u003C/span> - timeSinceLastRequest)\n            );\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">rateLimiter\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(domain, \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>());\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateInternalLink\u003C/span>(\u003Cspan class=\"hljs-params\">url, baseDir\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-comment\">// Resolve relative path\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fullPath = path.\u003Cspan class=\"hljs-title function_\">resolve\u003C/span>(baseDir, url);\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> stats = \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">stat\u003C/span>(fullPath);\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;internal&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">exists\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">isDirectory\u003C/span>: stats.\u003Cspan class=\"hljs-title function_\">isDirectory\u003C/span>(),\n                \u003Cspan class=\"hljs-attr\">size\u003C/span>: stats.\u003Cspan class=\"hljs-property\">size\u003C/span>,\n                fullPath\n            };\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;invalid&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;internal&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">exists\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>,\n                fullPath\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateAnchorLink\u003C/span>(\u003Cspan class=\"hljs-params\">anchor, filePath, baseDir\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-comment\">// Extract file path and anchor from URL like file.md#anchor\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> [targetFile, anchorId] = anchor.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>) \n            ? anchor.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>) \n            : [\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>, anchor.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span>)];\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fileToCheck = targetFile \n            ? path.\u003Cspan class=\"hljs-title function_\">resolve\u003C/span>(baseDir, targetFile)\n            : filePath;\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> content = \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">readFile\u003C/span>(fileToCheck, \u003Cspan class=\"hljs-string\">&#x27;utf-8&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> anchorExists = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">findAnchorInContent\u003C/span>(content, anchorId);\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">status\u003C/span>: anchorExists ? \u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;invalid&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;anchor&#x27;\u003C/span>,\n                anchorId,\n                \u003Cspan class=\"hljs-attr\">targetFile\u003C/span>: fileToCheck,\n                \u003Cspan class=\"hljs-attr\">found\u003C/span>: anchorExists\n            };\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;invalid&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;anchor&#x27;\u003C/span>,\n                anchorId,\n                \u003Cspan class=\"hljs-attr\">error\u003C/span>: \u003Cspan class=\"hljs-string\">`Cannot read file: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">findAnchorInContent\u003C/span>(\u003Cspan class=\"hljs-params\">content, anchorId\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Check for heading anchors\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> headingPattern = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">RegExp\u003C/span>(\u003Cspan class=\"hljs-string\">`^#{1,6}\\\\s+.*\u003Cspan class=\"hljs-subst\">${anchorId.replace(/-/g, \u003Cspan class=\"hljs-string\">&#x27;[-\\\\s]&#x27;\u003C/span>)}\u003C/span>`\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;im&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headingPattern.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(content)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for explicit anchor tags\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> anchorTagPattern = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">RegExp\u003C/span>(\u003Cspan class=\"hljs-string\">`&lt;a[^&gt;]+(?:name|id)=[&#x27;&quot;]\u003Cspan class=\"hljs-subst\">${anchorId}\u003C/span>[&#x27;&quot;]`\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;i&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (anchorTagPattern.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(content)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for heading IDs (auto-generated)\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> autoIdPattern = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">RegExp\u003C/span>(\u003Cspan class=\"hljs-string\">`^#{1,6}\\\\s+([^\\\\n]+)`\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;gm&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = autoIdPattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(content)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> generatedId = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateHeadingId\u003C/span>(match[\u003Cspan class=\"hljs-number\">1\u003C/span>]);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (generatedId === anchorId) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateHeadingId\u003C/span>(\u003Cspan class=\"hljs-params\">headingText\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Simulate common heading ID generation algorithms\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> headingText\n            .\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>()\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/[^\\w\\s-]/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\s+/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateAccessibility\u003C/span>(\u003Cspan class=\"hljs-params\">linkData, validationResult\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { text, url, type } = linkData;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = [];\n        \n        \u003Cspan class=\"hljs-comment\">// Check for meaningful link text\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isGenericLinkText\u003C/span>(text)) {\n            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;generic-link-text&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Link text &quot;\u003Cspan class=\"hljs-subst\">${text}\u003C/span>&quot; is not descriptive`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for empty alt text on images\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (type === \u003Cspan class=\"hljs-string\">&#x27;image&#x27;\u003C/span> &amp;&amp; !text) {\n            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;missing-alt-text&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Image link has no alt text&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check URL accessibility (if external link validation succeeded)\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (validationResult.\u003Cspan class=\"hljs-property\">status\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span> &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isExternalUrl\u003C/span>(url)) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> accessibilityIssues = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">checkUrlAccessibility\u003C/span>(url);\n            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...accessibilityIssues);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (issues.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">accessibilityIssues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                ...linkData,\n                issues\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isGenericLinkText\u003C/span>(\u003Cspan class=\"hljs-params\">text\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> genericTexts = [\n            \u003Cspan class=\"hljs-string\">&#x27;click here&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;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>,\n            \u003Cspan class=\"hljs-string\">&#x27;this link&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;continue reading&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;see more&#x27;\u003C/span>\n        ];\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> genericTexts.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">generic\u003C/span> =&gt;\u003C/span> \n            text.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>().\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(generic.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>())\n        );\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">checkUrlAccessibility\u003C/span>(\u003Cspan class=\"hljs-params\">url\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Basic accessibility checks (in production, integrate with actual a11y tools)\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = [];\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Check if URL requires authentication\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> response = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title function_\">fetch\u003C/span>(url, { \u003Cspan class=\"hljs-attr\">method\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;HEAD&#x27;\u003C/span> });\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (response.\u003Cspan class=\"hljs-property\">status\u003C/span> === \u003Cspan class=\"hljs-number\">401\u003C/span> || response.\u003Cspan class=\"hljs-property\">status\u003C/span> === \u003Cspan class=\"hljs-number\">403\u003C/span>) {\n                issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;authentication-required&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Link may require authentication to access&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                });\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Check content-type for PDFs (may need special handling)\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> contentType = response.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;content-type&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (contentType &amp;&amp; contentType.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;application/pdf&#x27;\u003C/span>)) {\n                issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;pdf-link&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Link points to PDF - consider accessibility implications&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>\n                });\n            }\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-comment\">// Already handled in main validation\u003C/span>\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">processCachedResult\u003C/span>(\u003Cspan class=\"hljs-params\">result, linkData\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (result.\u003Cspan class=\"hljs-property\">status\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">validLinks\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({ ...linkData, ...result });\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">brokenLinks\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({ ...linkData, ...result });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">processValidationResult\u003C/span>(\u003Cspan class=\"hljs-params\">result, linkData\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (result.\u003Cspan class=\"hljs-property\">status\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">validLinks\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({ ...linkData, ...result });\n            \n            \u003Cspan class=\"hljs-comment\">// Add warnings for redirects\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (result.\u003Cspan class=\"hljs-property\">redirected\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    ...linkData,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Link redirects to \u003Cspan class=\"hljs-subst\">${result.finalUrl}\u003C/span>`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;redirect&#x27;\u003C/span>\n                });\n            }\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">brokenLinks\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({ ...linkData, ...result });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">chunkArray\u003C/span>(\u003Cspan class=\"hljs-params\">array, chunkSize\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> chunks = [];\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; array.\u003Cspan class=\"hljs-property\">length\u003C/span>; i += chunkSize) {\n            chunks.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(array.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(i, i + chunkSize));\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> chunks;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateReport\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">totalLinks\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">validLinks\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> + \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">brokenLinks\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">validLinks\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">validLinks\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">brokenLinks\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">brokenLinks\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">accessibilityIssues\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">accessibilityIssues\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            },\n            \u003Cspan class=\"hljs-attr\">details\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>\n        };\n    }\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">LinkValidator\u003C/span>;\n\u003C/code>\u003C/pre>\u003Ch2 id=\"automated-quality-assurance-systems\">Automated Quality Assurance Systems\u003C/h2>\n\u003Ch3 id=\"comprehensive-qa-pipeline-implementation\">Comprehensive QA Pipeline Implementation\u003C/h3>\n\u003Cp>Building integrated quality assurance workflows for Markdown content:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// qa-pipeline.js - Comprehensive quality assurance system\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownQAPipeline\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\">enableSyntaxValidation\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableSyntaxValidation\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableLinkValidation\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableLinkValidation\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableAccessibilityChecks\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableAccessibilityChecks\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableStyleChecks\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableStyleChecks\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableSpellCheck\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableSpellCheck\u003C/span> || \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enablePerformanceChecks\u003C/span>: options.\u003Cspan class=\"hljs-property\">enablePerformanceChecks\u003C/span> || \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">outputFormat\u003C/span>: options.\u003Cspan class=\"hljs-property\">outputFormat\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;json&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">reportPath\u003C/span>: options.\u003Cspan class=\"hljs-property\">reportPath\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;./qa-reports&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">failOnError\u003C/span>: options.\u003Cspan class=\"hljs-property\">failOnError\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">failOnWarning\u003C/span>: options.\u003Cspan class=\"hljs-property\">failOnWarning\u003C/span> || \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">components\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">syntaxValidator\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownValidator\u003C/span>(options.\u003Cspan class=\"hljs-property\">syntaxValidator\u003C/span> || {}),\n            \u003Cspan class=\"hljs-attr\">linkValidator\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">LinkValidator\u003C/span>(options.\u003Cspan class=\"hljs-property\">linkValidator\u003C/span> || {}),\n            \u003Cspan class=\"hljs-attr\">styleChecker\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">StyleChecker\u003C/span>(options.\u003Cspan class=\"hljs-property\">styleChecker\u003C/span> || {}),\n            \u003Cspan class=\"hljs-attr\">spellChecker\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableSpellCheck\u003C/span> ? \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">SpellChecker\u003C/span>(options.\u003Cspan class=\"hljs-property\">spellChecker\u003C/span> || {}) : \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">performanceAnalyzer\u003C/span>: options.\u003Cspan class=\"hljs-property\">enablePerformanceChecks\u003C/span> ? \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">PerformanceAnalyzer\u003C/span>(options.\u003Cspan class=\"hljs-property\">performance\u003C/span> || {}) : \u003Cspan class=\"hljs-literal\">null\u003C/span>\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">files\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">totalFiles\u003C/span>: \u003Cspan class=\"hljs-number\">0\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\">totalIssues\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">errors\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">info\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>\n            }\n        };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">processFile\u003C/span>(\u003Cspan class=\"hljs-params\">filePath, content = \u003Cspan class=\"hljs-literal\">null\u003C/span>\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        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Read content if not provided\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!content) {\n                content = \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">readFile\u003C/span>(filePath, \u003Cspan class=\"hljs-string\">&#x27;utf-8&#x27;\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> fileResults = {\n                filePath,\n                \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>(),\n                \u003Cspan class=\"hljs-attr\">size\u003C/span>: content.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">checks\u003C/span>: {},\n                \u003Cspan class=\"hljs-attr\">issues\u003C/span>: [],\n                \u003Cspan class=\"hljs-attr\">metrics\u003C/span>: {},\n                \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>\n            };\n            \n            \u003Cspan class=\"hljs-comment\">// Run syntax validation\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableSyntaxValidation\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Running syntax validation for \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>...`\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> syntaxResult = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">components\u003C/span>.\u003Cspan class=\"hljs-property\">syntaxValidator\u003C/span>.\u003Cspan class=\"hljs-title function_\">validate\u003C/span>(content, filePath);\n                fileResults.\u003Cspan class=\"hljs-property\">checks\u003C/span>.\u003Cspan class=\"hljs-property\">syntax\u003C/span> = syntaxResult;\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">aggregateIssues\u003C/span>(fileResults, syntaxResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;syntax&#x27;\u003C/span>);\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">aggregateIssues\u003C/span>(fileResults, syntaxResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;syntax&#x27;\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Run link validation\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableLinkValidation\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Running link validation for \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>...`\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> baseDir = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;path&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">dirname\u003C/span>(filePath);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> linkResult = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">components\u003C/span>.\u003Cspan class=\"hljs-property\">linkValidator\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateContent\u003C/span>(content, filePath, baseDir);\n                fileResults.\u003Cspan class=\"hljs-property\">checks\u003C/span>.\u003Cspan class=\"hljs-property\">links\u003C/span> = linkResult;\n                \n                linkResult.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">brokenLinks\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">link\u003C/span> =&gt;\u003C/span> {\n                    fileResults.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">category\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: link.\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Broken link: \u003Cspan class=\"hljs-subst\">${link.url}\u003C/span> - \u003Cspan class=\"hljs-subst\">${link.error || link.statusText}\u003C/span>`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;broken-link&#x27;\u003C/span>\n                    });\n                });\n                \n                linkResult.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">accessibilityIssues\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> {\n                    issue.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">a11yIssue\u003C/span> =&gt;\u003C/span> {\n                        fileResults.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: a11yIssue.\u003Cspan class=\"hljs-property\">severity\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">category\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;accessibility&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">line\u003C/span>: issue.\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: a11yIssue.\u003Cspan class=\"hljs-property\">message\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">rule\u003C/span>: a11yIssue.\u003Cspan class=\"hljs-property\">type\u003C/span>\n                        });\n                    });\n                });\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Run style checks\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableStyleChecks\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Running style checks for \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>...`\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> styleResult = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">components\u003C/span>.\u003Cspan class=\"hljs-property\">styleChecker\u003C/span>.\u003Cspan class=\"hljs-title function_\">checkStyle\u003C/span>(content, filePath);\n                fileResults.\u003Cspan class=\"hljs-property\">checks\u003C/span>.\u003Cspan class=\"hljs-property\">style\u003C/span> = styleResult;\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">aggregateIssues\u003C/span>(fileResults, styleResult.\u003Cspan class=\"hljs-property\">violations\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;style&#x27;\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Run spell check\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableSpellCheck\u003C/span> &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">components\u003C/span>.\u003Cspan class=\"hljs-property\">spellChecker\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Running spell check for \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>...`\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> spellResult = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">components\u003C/span>.\u003Cspan class=\"hljs-property\">spellChecker\u003C/span>.\u003Cspan class=\"hljs-title function_\">checkContent\u003C/span>(content);\n                fileResults.\u003Cspan class=\"hljs-property\">checks\u003C/span>.\u003Cspan class=\"hljs-property\">spelling\u003C/span> = spellResult;\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">aggregateIssues\u003C/span>(fileResults, spellResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;spelling&#x27;\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Run performance analysis\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enablePerformanceChecks\u003C/span> &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">components\u003C/span>.\u003Cspan class=\"hljs-property\">performanceAnalyzer\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Running performance analysis for \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>...`\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> perfResult = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">components\u003C/span>.\u003Cspan class=\"hljs-property\">performanceAnalyzer\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyze\u003C/span>(content);\n                fileResults.\u003Cspan class=\"hljs-property\">checks\u003C/span>.\u003Cspan class=\"hljs-property\">performance\u003C/span> = perfResult;\n                fileResults.\u003Cspan class=\"hljs-property\">metrics\u003C/span> = perfResult.\u003Cspan class=\"hljs-property\">metrics\u003C/span>;\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (perfResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">aggregateIssues\u003C/span>(fileResults, perfResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;performance&#x27;\u003C/span>);\n                }\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Determine overall file status\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> hasErrors = fileResults.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> issue.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> hasWarnings = fileResults.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> issue.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (hasErrors &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">failOnError\u003C/span>) {\n                fileResults.\u003Cspan class=\"hljs-property\">status\u003C/span> = \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (hasWarnings &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">failOnWarning\u003C/span>) {\n                fileResults.\u003Cspan class=\"hljs-property\">status\u003C/span> = \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>;\n            }\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">files\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(filePath, fileResults);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">updateSummary\u003C/span>(fileResults);\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> fileResults;\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> errorResult = {\n                filePath,\n                \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>(),\n                \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">issues\u003C/span>: [{\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">category\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;system&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Failed to process file: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;processing-error&#x27;\u003C/span>\n                }]\n            };\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">files\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(filePath, errorResult);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">updateSummary\u003C/span>(errorResult);\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> errorResult;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">processBatch\u003C/span>(\u003Cspan class=\"hljs-params\">filePaths, options = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> concurrency = options.\u003Cspan class=\"hljs-property\">concurrency\u003C/span> || \u003Cspan class=\"hljs-number\">3\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> chunks = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">chunkArray\u003C/span>(filePaths, concurrency);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> results = [];\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Processing \u003Cspan class=\"hljs-subst\">${filePaths.length}\u003C/span> files in batches of \u003Cspan class=\"hljs-subst\">${concurrency}\u003C/span>...`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> chunk \u003Cspan class=\"hljs-keyword\">of\u003C/span> chunks) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> promises = chunk.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">filePath\u003C/span> =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">processFile\u003C/span>(filePath));\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> chunkResults = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>.\u003Cspan class=\"hljs-title function_\">allSettled\u003C/span>(promises);\n            \n            chunkResults.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">result, index\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (result.\u003Cspan class=\"hljs-property\">status\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;fulfilled&#x27;\u003C/span>) {\n                    results.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(result.\u003Cspan class=\"hljs-property\">value\u003C/span>);\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">`Failed to process \u003Cspan class=\"hljs-subst\">${chunk[index]}\u003C/span>:`\u003C/span>, result.\u003Cspan class=\"hljs-property\">reason\u003C/span>);\n                    results.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">filePath\u003C/span>: chunk[index],\n                        \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">error\u003C/span>: result.\u003Cspan class=\"hljs-property\">reason\u003C/span>.\u003Cspan class=\"hljs-property\">message\u003C/span>\n                    });\n                }\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> results;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">aggregateIssues\u003C/span>(\u003Cspan class=\"hljs-params\">fileResults, issues, severity, category\u003C/span>) {\n        issues.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> {\n            fileResults.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: severity,\n                \u003Cspan class=\"hljs-attr\">category\u003C/span>: category,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: issue.\u003Cspan class=\"hljs-property\">line\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: issue.\u003Cspan class=\"hljs-property\">message\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">rule\u003C/span>: issue.\u003Cspan class=\"hljs-property\">rule\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;unknown&#x27;\u003C/span>\n            });\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">updateSummary\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span>++;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fileResult.\u003Cspan class=\"hljs-property\">status\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">passedFiles\u003C/span>++;\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">failedFiles\u003C/span>++;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fileResult.\u003Cspan class=\"hljs-property\">issues\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalIssues\u003C/span> += fileResult.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \n            fileResult.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (issue.\u003Cspan class=\"hljs-property\">type\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>:\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>++;\n                        \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>:\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>++;\n                        \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \u003Cspan class=\"hljs-attr\">default\u003C/span>:\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">info\u003C/span>++;\n                }\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">generateReport\u003C/span>(\u003Cspan class=\"hljs-params\">format = \u003Cspan class=\"hljs-literal\">null\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> reportFormat = format || \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">outputFormat\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_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/[:.]/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> report = {\n            \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>(),\n                \u003Cspan class=\"hljs-attr\">version\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;1.0.0&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">configuration\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">duration\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>() \u003Cspan class=\"hljs-comment\">// Will be calculated properly in real implementation\u003C/span>\n            },\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">files\u003C/span>: \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">files\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>()),\n            \u003Cspan class=\"hljs-attr\">recommendations\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateRecommendations\u003C/span>()\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (reportFormat) {\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;json&#x27;\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateJSONReport\u003C/span>(report, timestamp);\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;html&#x27;\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateHTMLReport\u003C/span>(report, timestamp);\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;markdown&#x27;\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateMarkdownReport\u003C/span>(report, timestamp);\n            \u003Cspan class=\"hljs-attr\">default\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> report;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">generateJSONReport\u003C/span>(\u003Cspan class=\"hljs-params\">report, timestamp\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\">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\">reportPath\u003C/span>, \u003Cspan class=\"hljs-string\">`qa-report-\u003Cspan class=\"hljs-subst\">${timestamp}\u003C/span>.json`\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\">reportPath\u003C/span>, { \u003Cspan class=\"hljs-attr\">recursive\u003C/span>: \u003Cspan class=\"hljs-literal\">true\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>(report, \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-number\">2\u003C/span>));\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">format\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;json&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">path\u003C/span>: reportPath, \u003Cspan class=\"hljs-attr\">data\u003C/span>: report };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">generateHTMLReport\u003C/span>(\u003Cspan class=\"hljs-params\">report, timestamp\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\">const\u003C/span> html = \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;Markdown QA Report - \u003Cspan class=\"hljs-subst\">${timestamp}\u003C/span>&lt;/title&gt;\n    &lt;style&gt;\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, &#x27;Segoe UI&#x27;, system-ui, sans-serif;\n            line-height: 1.6;\n            color: #333;\n            max-width: 1200px;\n            margin: 0 auto;\n            padding: 20px;\n        }\n        .summary {\n            background: #f8f9fa;\n            padding: 20px;\n            border-radius: 8px;\n            margin-bottom: 30px;\n        }\n        .metric {\n            display: inline-block;\n            margin: 10px 15px 10px 0;\n            padding: 10px 15px;\n            background: white;\n            border-radius: 4px;\n            border-left: 4px solid #007bff;\n        }\n        .error { border-left-color: #dc3545; }\n        .warning { border-left-color: #ffc107; }\n        .success { border-left-color: #28a745; }\n        .file-result {\n            margin: 20px 0;\n            padding: 15px;\n            border: 1px solid #dee2e6;\n            border-radius: 4px;\n        }\n        .file-result.failed { border-color: #dc3545; }\n        .file-result.passed { border-color: #28a745; }\n        .issue {\n            margin: 5px 0;\n            padding: 8px 12px;\n            border-radius: 4px;\n            font-size: 14px;\n        }\n        .issue.error { background: #f8d7da; color: #721c24; }\n        .issue.warning { background: #fff3cd; color: #856404; }\n        .recommendations {\n            background: #e7f3ff;\n            padding: 20px;\n            border-radius: 8px;\n            margin-top: 30px;\n        }\n    &lt;/style&gt;\n&lt;/head&gt;\n&lt;body&gt;\n    &lt;h1&gt;Markdown Quality Assurance Report&lt;/h1&gt;\n    &lt;p&gt;Generated: \u003Cspan class=\"hljs-subst\">${report.metadata.timestamp}\u003C/span>&lt;/p&gt;\n    \n    &lt;div class=&quot;summary&quot;&gt;\n        &lt;h2&gt;Summary&lt;/h2&gt;\n        &lt;div class=&quot;metric success&quot;&gt;\n            &lt;strong&gt;\u003Cspan class=\"hljs-subst\">${report.summary.totalFiles}\u003C/span>&lt;/strong&gt;&lt;br&gt;\n            Total Files\n        &lt;/div&gt;\n        &lt;div class=&quot;metric \u003Cspan class=\"hljs-subst\">${report.summary.passedFiles === report.summary.totalFiles ? \u003Cspan class=\"hljs-string\">&#x27;success&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>}\u003C/span>&quot;&gt;\n            &lt;strong&gt;\u003Cspan class=\"hljs-subst\">${report.summary.passedFiles}\u003C/span>&lt;/strong&gt;&lt;br&gt;\n            Passed\n        &lt;/div&gt;\n        &lt;div class=&quot;metric \u003Cspan class=\"hljs-subst\">${report.summary.failedFiles === \u003Cspan class=\"hljs-number\">0\u003C/span> ? \u003Cspan class=\"hljs-string\">&#x27;success&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>}\u003C/span>&quot;&gt;\n            &lt;strong&gt;\u003Cspan class=\"hljs-subst\">${report.summary.failedFiles}\u003C/span>&lt;/strong&gt;&lt;br&gt;\n            Failed\n        &lt;/div&gt;\n        &lt;div class=&quot;metric error&quot;&gt;\n            &lt;strong&gt;\u003Cspan class=\"hljs-subst\">${report.summary.errors}\u003C/span>&lt;/strong&gt;&lt;br&gt;\n            Errors\n        &lt;/div&gt;\n        &lt;div class=&quot;metric warning&quot;&gt;\n            &lt;strong&gt;\u003Cspan class=\"hljs-subst\">${report.summary.warnings}\u003C/span>&lt;/strong&gt;&lt;br&gt;\n            Warnings\n        &lt;/div&gt;\n    &lt;/div&gt;\n    \n    &lt;h2&gt;File Results&lt;/h2&gt;\n    \u003Cspan class=\"hljs-subst\">${report.files.map(file =&gt; \u003Cspan class=\"hljs-string\">`\n        &lt;div class=&quot;file-result \u003Cspan class=\"hljs-subst\">${file.status}\u003C/span>&quot;&gt;\n            &lt;h3&gt;\u003Cspan class=\"hljs-subst\">${file.filePath}\u003C/span>&lt;/h3&gt;\n            &lt;p&gt;Status: &lt;strong&gt;\u003Cspan class=\"hljs-subst\">${file.status}\u003C/span>&lt;/strong&gt; | Size: \u003Cspan class=\"hljs-subst\">${file.size}\u003C/span> bytes&lt;/p&gt;\n            \u003Cspan class=\"hljs-subst\">${file.issues &amp;&amp; file.issues.length &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \u003Cspan class=\"hljs-string\">`\n                &lt;div class=&quot;issues&quot;&gt;\n                    \u003Cspan class=\"hljs-subst\">${file.issues.map(issue =&gt; \u003Cspan class=\"hljs-string\">`\n                        &lt;div class=&quot;issue \u003Cspan class=\"hljs-subst\">${issue.type}\u003C/span>&quot;&gt;\n                            &lt;strong&gt;Line \u003Cspan class=\"hljs-subst\">${issue.line}\u003C/span>:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${issue.message}\u003C/span>\n                            &lt;small&gt;(\u003Cspan class=\"hljs-subst\">${issue.category}\u003C/span>/\u003Cspan class=\"hljs-subst\">${issue.rule}\u003C/span>)&lt;/small&gt;\n                        &lt;/div&gt;\n                    `\u003C/span>).join(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)}\u003C/span>\n                &lt;/div&gt;\n            `\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&lt;p&gt;No issues found.&lt;/p&gt;&#x27;\u003C/span>}\u003C/span>\n        &lt;/div&gt;\n    `\u003C/span>).join(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)}\u003C/span>\n    \n    \u003Cspan class=\"hljs-subst\">${report.recommendations.length &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \u003Cspan class=\"hljs-string\">`\n        &lt;div class=&quot;recommendations&quot;&gt;\n            &lt;h2&gt;Recommendations&lt;/h2&gt;\n            &lt;ul&gt;\n                \u003Cspan class=\"hljs-subst\">${report.recommendations.map(rec =&gt; \u003Cspan class=\"hljs-string\">`\n                    &lt;li&gt;&lt;strong&gt;\u003Cspan class=\"hljs-subst\">${rec.priority}\u003C/span>:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${rec.message}\u003C/span>&lt;/li&gt;\n                `\u003C/span>).join(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)}\u003C/span>\n            &lt;/ul&gt;\n        &lt;/div&gt;\n    `\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>\n&lt;/body&gt;\n&lt;/html&gt;`\u003C/span>;\n        \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\">reportPath\u003C/span>, \u003Cspan class=\"hljs-string\">`qa-report-\u003Cspan class=\"hljs-subst\">${timestamp}\u003C/span>.html`\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\">reportPath\u003C/span>, { \u003Cspan class=\"hljs-attr\">recursive\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> });\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">writeFile\u003C/span>(reportPath, html);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">format\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;html&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">path\u003C/span>: reportPath, \u003Cspan class=\"hljs-attr\">content\u003C/span>: html };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateRecommendations\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> recommendations = [];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> summary = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (summary.\u003Cspan class=\"hljs-property\">errors\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;High&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;errors&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${summary.errors}\u003C/span> errors found across \u003Cspan class=\"hljs-subst\">${summary.failedFiles}\u003C/span> files. Address syntax errors and broken links first.`\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (summary.\u003Cspan class=\"hljs-property\">warnings\u003C/span> &gt; summary.\u003Cspan class=\"hljs-property\">errors\u003C/span> * \u003Cspan class=\"hljs-number\">2\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\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warnings&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`High warning count (\u003Cspan class=\"hljs-subst\">${summary.warnings}\u003C/span>). Consider implementing stricter style guidelines.`\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> passRate = (summary.\u003Cspan class=\"hljs-property\">passedFiles\u003C/span> / summary.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span>) * \u003Cspan class=\"hljs-number\">100\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (passRate &lt; \u003Cspan class=\"hljs-number\">80\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\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;quality&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Low pass rate (\u003Cspan class=\"hljs-subst\">${passRate.toFixed(\u003Cspan class=\"hljs-number\">1\u003C/span>)}\u003C/span>%). Review content creation processes and validation rules.`\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Analyze common issue patterns\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> allIssues = \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">files\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>())\n            .\u003Cspan class=\"hljs-title function_\">flatMap\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">file\u003C/span> =&gt;\u003C/span> file.\u003Cspan class=\"hljs-property\">issues\u003C/span> || []);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> issueTypes = allIssues.\u003Cspan class=\"hljs-title function_\">reduce\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">acc, issue\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> key = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${issue.category}\u003C/span>/\u003Cspan class=\"hljs-subst\">${issue.rule}\u003C/span>`\u003C/span>;\n            acc[key] = (acc[key] || \u003Cspan class=\"hljs-number\">0\u003C/span>) + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> acc;\n        }, {});\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> topIssues = \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(issueTypes)\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 - a)\n            .\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">3\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (topIssues.\u003Cspan class=\"hljs-property\">length\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;Medium&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;patterns&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Most common issues: \u003Cspan class=\"hljs-subst\">${topIssues.map(([type, count]) =&gt; \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${type}\u003C/span> (\u003Cspan class=\"hljs-subst\">${count}\u003C/span>)`\u003C/span>).join(\u003Cspan class=\"hljs-string\">&#x27;, &#x27;\u003C/span>)}\u003C/span>. Focus on these patterns for maximum impact.`\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> recommendations;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">chunkArray\u003C/span>(\u003Cspan class=\"hljs-params\">array, chunkSize\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> chunks = [];\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; array.\u003Cspan class=\"hljs-property\">length\u003C/span>; i += chunkSize) {\n            chunks.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(array.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(i, i + chunkSize));\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> chunks;\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">// Supporting classes would be defined here...\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">StyleChecker\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> = options;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">checkStyle\u003C/span>(\u003Cspan class=\"hljs-params\">content, filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">violations\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">metrics\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">lineCount\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">avgLineLength\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">consistency\u003C/span>: \u003Cspan class=\"hljs-number\">100\u003C/span>\n            }\n        };\n    }\n}\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">SpellChecker\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> = options;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">checkContent\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">suggestions\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">metrics\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">wordsChecked\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">misspellings\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>\n            }\n        };\n    }\n}\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">PerformanceAnalyzer\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> = options;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">analyze\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">metrics\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">size\u003C/span>: content.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">complexity\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">readabilityScore\u003C/span>: \u003Cspan class=\"hljs-number\">80\u003C/span>\n            },\n            \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">suggestions\u003C/span>: []\n        };\n    }\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = { \u003Cspan class=\"hljs-title class_\">MarkdownQAPipeline\u003C/span>, \u003Cspan class=\"hljs-title class_\">MarkdownValidator\u003C/span>, \u003Cspan class=\"hljs-title class_\">LinkValidator\u003C/span> };\n\u003C/code>\u003C/pre>\u003Ch2 id=\"integration-with-development-workflows\">Integration with Development Workflows\u003C/h2>\n\u003Ch3 id=\"cicd-pipeline-integration\">CI/CD Pipeline Integration\u003C/h3>\n\u003Cp>Seamless integration with continuous integration and deployment systems:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-yaml\">\u003Cspan class=\"hljs-comment\"># .github/workflows/markdown-qa.yml\u003C/span>\n\u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Markdown\u003C/span> \u003Cspan class=\"hljs-string\">Quality\u003C/span> \u003Cspan class=\"hljs-string\">Assurance\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">on:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">push:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;**/*.md&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">pull_request:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;**/*.md&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">jobs:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">markdown-qa:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">repository\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;18&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;npm&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        npm install -g markdown-qa-tools\n        npm install\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Run\u003C/span> \u003Cspan class=\"hljs-string\">Markdown\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        markdown-qa validate \\\n          --config .markdown-qa.json \\\n          --output-format json \\\n          --report-path ./qa-reports \\\n          --fail-on-error \\\n          docs/**/*.md\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Upload\u003C/span> \u003Cspan class=\"hljs-string\">QA\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/upload-artifact@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">markdown-qa-report\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">qa-reports/\u003C/span>\n        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Comment\u003C/span> \u003Cspan class=\"hljs-string\">PR\u003C/span> \u003Cspan class=\"hljs-string\">with\u003C/span> \u003Cspan class=\"hljs-string\">results\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.event_name\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;pull_request&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/github-script@v7\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">script:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          const fs = require(&#x27;fs&#x27;);\n          const path = require(&#x27;path&#x27;);\n\u003C/span>          \n          \u003Cspan class=\"hljs-string\">//\u003C/span> \u003Cspan class=\"hljs-string\">Read\u003C/span> \u003Cspan class=\"hljs-string\">QA\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n          \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">reportFile\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">fs.readdirSync(&#x27;./qa-reports&#x27;)\u003C/span>\n            \u003Cspan class=\"hljs-string\">.find(file\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> \u003Cspan class=\"hljs-string\">file.endsWith(&#x27;.json&#x27;));\u003C/span>\n          \n          \u003Cspan class=\"hljs-string\">if\u003C/span> \u003Cspan class=\"hljs-string\">(reportFile)\u003C/span> {\n            \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">JSON.parse(\u003C/span>\n              \u003Cspan class=\"hljs-string\">fs.readFileSync(path.join(&#x27;./qa-reports&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">reportFile)\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>\u003Cspan class=\"hljs-string\">)\u003C/span>\n            \u003Cspan class=\"hljs-string\">);\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">summary\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">report.summary;\u003C/span>\n            \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">`##\u003C/span> \u003Cspan class=\"hljs-string\">Markdown\u003C/span> \u003Cspan class=\"hljs-string\">QA\u003C/span> \u003Cspan class=\"hljs-string\">Report\u003C/span>\n            \n\u003Cspan class=\"hljs-string\">**Summary:**\u003C/span>\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">📁\u003C/span> \u003Cspan class=\"hljs-attr\">Files processed:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">summary.totalFiles\u003C/span>}\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">✅\u003C/span> \u003Cspan class=\"hljs-attr\">Passed:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">summary.passedFiles\u003C/span>}\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">❌\u003C/span> \u003Cspan class=\"hljs-attr\">Failed:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">summary.failedFiles\u003C/span>}\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">🚨\u003C/span> \u003Cspan class=\"hljs-attr\">Errors:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">summary.errors\u003C/span>}\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">⚠️\u003C/span> \u003Cspan class=\"hljs-attr\">Warnings:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">summary.warnings\u003C/span>}\n\n\u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">summary.errors\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-string\">?\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;❌ Quality check failed - please fix errors before merging.&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;✅ All quality checks passed!&#x27;\u003C/span>}\n\n\u003Cspan class=\"hljs-string\">&lt;details&gt;\u003C/span>\n\u003Cspan class=\"hljs-string\">&lt;summary&gt;Detailed\u003C/span> \u003Cspan class=\"hljs-string\">Results&lt;/summary&gt;\u003C/span>\n\n\u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.files.filter(f\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> \u003Cspan class=\"hljs-string\">f.issues\u003C/span> \u003Cspan class=\"hljs-string\">&amp;&amp;\u003C/span> \u003Cspan class=\"hljs-string\">f.issues.length\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\u003Cspan class=\"hljs-string\">).map(file\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> \u003Cspan class=\"hljs-string\">`\u003C/span>\n\u003Cspan class=\"hljs-string\">**$\u003C/span>{\u003Cspan class=\"hljs-string\">file.filePath\u003C/span>}\u003Cspan class=\"hljs-string\">**\u003C/span>\n\u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">file.issues.map(issue\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-string\">Line\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">issue.line\u003C/span>}\u003Cspan class=\"hljs-string\">:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">issue.message\u003C/span>} \u003Cspan class=\"hljs-string\">($\u003C/span>{\u003Cspan class=\"hljs-string\">issue.rule\u003C/span>}\u003Cspan class=\"hljs-string\">)`).join(&#x27;\\n&#x27;)\u003C/span>}\n\u003Cspan class=\"hljs-string\">`).join(&#x27;\\n&#x27;)\u003C/span>}\n\n\u003Cspan class=\"hljs-string\">&lt;/details&gt;`;\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">github.rest.issues.createComment(\u003C/span>{\n              \u003Cspan class=\"hljs-attr\">issue_number:\u003C/span> \u003Cspan class=\"hljs-string\">context.issue.number\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">owner:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.owner\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">repo:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.repo\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">body:\u003C/span> \u003Cspan class=\"hljs-string\">comment\u003C/span>\n            }\u003Cspan class=\"hljs-string\">);\u003C/span>\n          }\n\u003C/code>\u003C/pre>\u003Ch3 id=\"pre-commit-hook-configuration\">Pre-commit Hook Configuration\u003C/h3>\n\u003Cp>Automated validation before commits:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-meta\">#!/bin/bash\u003C/span>\n\u003Cspan class=\"hljs-comment\"># .git/hooks/pre-commit - Markdown validation pre-commit hook\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Configuration\u003C/span>\nMARKDOWN_QA_CONFIG=\u003Cspan class=\"hljs-string\">&quot;.markdown-qa.json&quot;\u003C/span>\nSTAGED_MD_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep \u003Cspan class=\"hljs-string\">&#x27;\\.md$&#x27;\u003C/span>)\n\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> [ -z \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$STAGED_MD_FILES\u003C/span>&quot;\u003C/span> ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;No Markdown files staged for commit.&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">exit\u003C/span> 0\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Running Markdown quality assurance on staged files...&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Create temporary directory for staged files\u003C/span>\nTEMP_DIR=$(\u003Cspan class=\"hljs-built_in\">mktemp\u003C/span> -d)\n\u003Cspan class=\"hljs-built_in\">trap\u003C/span> \u003Cspan class=\"hljs-string\">&quot;rm -rf \u003Cspan class=\"hljs-variable\">$TEMP_DIR\u003C/span>&quot;\u003C/span> EXIT\n\n\u003Cspan class=\"hljs-comment\"># Copy staged files to temporary directory\u003C/span>\n\u003Cspan class=\"hljs-keyword\">for\u003C/span> file \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-variable\">$STAGED_MD_FILES\u003C/span>; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n    git show \u003Cspan class=\"hljs-string\">&quot;:\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> &gt; \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$TEMP_DIR\u003C/span>/\u003Cspan class=\"hljs-subst\">$(basename \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>)\u003C/span>&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">done\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Run validation\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">command\u003C/span> -v markdown-qa &amp;&gt; /dev/null; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    markdown-qa validate \\\n        --config \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$MARKDOWN_QA_CONFIG\u003C/span>&quot;\u003C/span> \\\n        --fail-on-error \\\n        --quiet \\\n        \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$TEMP_DIR\u003C/span>&quot;\u003C/span>/*.md\n    \n    QA_EXIT_CODE=$?\n    \n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [ \u003Cspan class=\"hljs-variable\">$QA_EXIT_CODE\u003C/span> -ne 0 ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;❌ Markdown QA failed. Commit aborted.&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;   Fix the issues above or run with --no-verify to skip validation.&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">exit\u003C/span> \u003Cspan class=\"hljs-variable\">$QA_EXIT_CODE\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✅ All Markdown files passed quality assurance.&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\u003Cspan class=\"hljs-keyword\">else\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;⚠️  markdown-qa not found. Skipping validation.&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;   Install with: npm install -g markdown-qa-tools&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\n\u003Cspan class=\"hljs-built_in\">exit\u003C/span> 0\n\u003C/code>\u003C/pre>\u003Ch2 id=\"integration-with-documentation-systems\">Integration with Documentation Systems\u003C/h2>\n\u003Cp>Markdown content validation integrates seamlessly with comprehensive documentation workflows. When combined with \u003Ca href=\"/blog/markdown-automation-workflows-complete-guide\">automated workflow systems and content processing pipelines\u003C/a>, validation becomes part of the continuous integration process, ensuring that content quality checks are automatically performed before publication and deployment.\u003C/p>\n\u003Cp>For sophisticated content architectures, validation works effectively with \u003Ca href=\"/blog/markdown-version-control-git-integration-complete-guide\">version control and Git integration systems\u003C/a> to ensure that content validation rules are consistently applied across different branches, merge requests, and deployment environments, maintaining quality standards throughout the entire development lifecycle.\u003C/p>\n\u003Cp>When building scalable documentation platforms, content validation complements \u003Ca href=\"/blog/markdown-performance-optimization-rendering-speed-guide\">performance optimization and rendering speed improvements\u003C/a> by ensuring that validated content is optimized for both human readability and machine processing efficiency, creating documentation systems that deliver both high quality and high performance user experiences.\u003C/p>\n\u003Ch2 id=\"advanced-configuration-and-customization\">Advanced Configuration and Customization\u003C/h2>\n\u003Ch3 id=\"custom-validation-rule-development\">Custom Validation Rule Development\u003C/h3>\n\u003Cp>Creating specialized validation rules for specific requirements:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// custom-validators.js - Specialized validation rules\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">CustomValidationRules\u003C/span> {\n    \u003Cspan class=\"hljs-keyword\">static\u003C/span> \u003Cspan class=\"hljs-title function_\">createTechnicalDocumentationRules\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;api-documentation&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Validate API documentation structure&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">validator\u003C/span>: \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = [];\n                    \n                    \u003Cspan class=\"hljs-comment\">// Check for required sections\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> requiredSections = [\n                        \u003Cspan class=\"hljs-string\">&#x27;Overview&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Authentication&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Endpoints&#x27;\u003C/span>, \n                        \u003Cspan class=\"hljs-string\">&#x27;Examples&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Error Codes&#x27;\u003C/span>\n                    ];\n                    \n                    requiredSections.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">section\u003C/span> =&gt;\u003C/span> {\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> sectionPattern = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">RegExp\u003C/span>(\u003Cspan class=\"hljs-string\">`^#+\\\\s+\u003Cspan class=\"hljs-subst\">${section}\u003C/span>`\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;im&#x27;\u003C/span>);\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!sectionPattern.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(content)) {\n                            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                                \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;api-documentation&#x27;\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Missing required section: \u003Cspan class=\"hljs-subst\">${section}\u003C/span>`\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                            });\n                        }\n                    });\n                    \n                    \u003Cspan class=\"hljs-comment\">// Validate code examples have language specified\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> codeBlockPattern = \u003Cspan class=\"hljs-regexp\">/^```(?!\\w)/gm\u003C/span>;\n                    \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n                    \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = codeBlockPattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(content)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lineNumber = content.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, match.\u003Cspan class=\"hljs-property\">index\u003C/span>).\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                        issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;api-documentation&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Code block should specify language for syntax highlighting&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">line\u003C/span>: lineNumber,\n                            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                        });\n                    }\n                    \n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues;\n                }\n            },\n            \n            \u003Cspan class=\"hljs-string\">&#x27;security-content&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Validate security-sensitive content&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">validator\u003C/span>: \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = [];\n                    \n                    \u003Cspan class=\"hljs-comment\">// Check for potential security leaks\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> sensitivePatterns = [\n                        { \u003Cspan class=\"hljs-attr\">pattern\u003C/span>: \u003Cspan class=\"hljs-regexp\">/(?:password|secret|key|token)\\s*[:=]\\s*[\\w\\-]{8,}/gi\u003C/span>, \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Potential credential exposure&#x27;\u003C/span> },\n                        { \u003Cspan class=\"hljs-attr\">pattern\u003C/span>: \u003Cspan class=\"hljs-regexp\">/\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g\u003C/span>, \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;IP address found - verify if safe to expose&#x27;\u003C/span> },\n                        { \u003Cspan class=\"hljs-attr\">pattern\u003C/span>: \u003Cspan class=\"hljs-regexp\">/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g\u003C/span>, \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Email address found - consider privacy implications&#x27;\u003C/span> }\n                    ];\n                    \n                    sensitivePatterns.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">{ pattern, message }\u003C/span>) =&gt;\u003C/span> {\n                        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n                        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = pattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(content)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n                            \u003Cspan class=\"hljs-keyword\">const\u003C/span> lineNumber = content.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, match.\u003Cspan class=\"hljs-property\">index\u003C/span>).\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                                \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;security-content&#x27;\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">message\u003C/span>: message,\n                                \u003Cspan class=\"hljs-attr\">line\u003C/span>: lineNumber,\n                                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                            });\n                        }\n                    });\n                    \n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues;\n                }\n            },\n            \n            \u003Cspan class=\"hljs-string\">&#x27;brand-consistency&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Enforce brand and terminology consistency&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">validator\u003C/span>: \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = [];\n                    \n                    \u003Cspan class=\"hljs-comment\">// Define brand-specific terminology\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> brandTerms = {\n                        \u003Cspan class=\"hljs-string\">&#x27;javascript&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;JavaScript&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-string\">&#x27;github&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;GitHub&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-string\">&#x27;markdown&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Markdown&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-string\">&#x27;api&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;API&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-string\">&#x27;json&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;JSON&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-string\">&#x27;html&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;HTML&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-string\">&#x27;css&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;CSS&#x27;\u003C/span>\n                    };\n                    \n                    \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(brandTerms).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[incorrect, correct]\u003C/span>) =&gt;\u003C/span> {\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> pattern = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">RegExp\u003C/span>(\u003Cspan class=\"hljs-string\">`\\\\b\u003Cspan class=\"hljs-subst\">${incorrect}\u003C/span>\\\\b`\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;gi&#x27;\u003C/span>);\n                        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n                        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = pattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(content)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n                            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (match[\u003Cspan class=\"hljs-number\">0\u003C/span>] !== correct) {\n                                \u003Cspan class=\"hljs-keyword\">const\u003C/span> lineNumber = content.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, match.\u003Cspan class=\"hljs-property\">index\u003C/span>).\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                                issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                                    \u003Cspan class=\"hljs-attr\">rule\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;brand-consistency&#x27;\u003C/span>,\n                                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Use &quot;\u003Cspan class=\"hljs-subst\">${correct}\u003C/span>&quot; instead of &quot;\u003Cspan class=\"hljs-subst\">${match[\u003Cspan class=\"hljs-number\">0\u003C/span>]}\u003C/span>&quot; for consistency`\u003C/span>,\n                                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: lineNumber,\n                                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>\n                                });\n                            }\n                        }\n                    });\n                    \n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues;\n                }\n            }\n        };\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">// Integration example\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">ExtendedMarkdownValidator\u003C/span> \u003Cspan class=\"hljs-keyword\">extends\u003C/span> \u003Cspan class=\"hljs-title class_ inherited__\">MarkdownValidator\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">options = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">super\u003C/span>(options);\n        \n        \u003Cspan class=\"hljs-comment\">// Add custom rules\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> customRules = \u003Cspan class=\"hljs-title class_\">CustomValidationRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">createTechnicalDocumentationRules\u003C/span>();\n        \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(customRules).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[name, rule]\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(name, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">content, lines, filePath\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = rule.\u003Cspan class=\"hljs-title function_\">validator\u003C/span>(content, lines, filePath);\n                issues.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (issue.\u003Cspan class=\"hljs-property\">severity\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>) {\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(issue);\n                    } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (issue.\u003Cspan class=\"hljs-property\">severity\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>) {\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(issue);\n                    }\n                });\n            });\n        });\n    }\n}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"troubleshooting-and-performance-optimization\">Troubleshooting and Performance Optimization\u003C/h2>\n\u003Ch3 id=\"common-validation-issues-and-solutions\">Common Validation Issues and Solutions\u003C/h3>\n\u003Cp>\u003Cstrong>Problem\u003C/strong>: Large files causing validation timeouts\u003C/p>\n\u003Cp>\u003Cstrong>Solutions\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// performance-optimized-validator.js - Optimized validation for large files\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">OptimizedValidator\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\">chunkSize\u003C/span>: options.\u003Cspan class=\"hljs-property\">chunkSize\u003C/span> || \u003Cspan class=\"hljs-number\">1000\u003C/span>, \u003Cspan class=\"hljs-comment\">// lines per chunk\u003C/span>\n            \u003Cspan class=\"hljs-attr\">parallelValidation\u003C/span>: options.\u003Cspan class=\"hljs-property\">parallelValidation\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">cacheResults\u003C/span>: options.\u003Cspan class=\"hljs-property\">cacheResults\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">skipLargeFiles\u003C/span>: options.\u003Cspan class=\"hljs-property\">skipLargeFiles\u003C/span> || \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxFileSize\u003C/span>: options.\u003Cspan class=\"hljs-property\">maxFileSize\u003C/span> || \u003Cspan class=\"hljs-number\">1024\u003C/span> * \u003Cspan class=\"hljs-number\">1024\u003C/span>, \u003Cspan class=\"hljs-comment\">// 1MB\u003C/span>\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">cache\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_\">validateLargeContent\u003C/span>(\u003Cspan class=\"hljs-params\">content, filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Skip validation for very large files if configured\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">skipLargeFiles\u003C/span> &amp;&amp; content.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">maxFileSize\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">skipped\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">reason\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;File too large&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">size\u003C/span>: content.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            };\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check cache\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> contentHash = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateHash\u003C/span>(content);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">cacheResults\u003C/span> &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">cache\u003C/span>.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(contentHash)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">cache\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(contentHash);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = content.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> chunks = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">chunkArray\u003C/span>(lines, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">chunkSize\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> results = {\n            \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">totalLines\u003C/span>: lines.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">chunksProcessed\u003C/span>: chunks.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            }\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">parallelValidation\u003C/span>) {\n            \u003Cspan class=\"hljs-comment\">// Process chunks in parallel\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> promises = chunks.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">chunk, index\u003C/span>) =&gt;\u003C/span> \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateChunk\u003C/span>(chunk, index * \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">chunkSize\u003C/span>)\n            );\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> chunkResults = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>.\u003Cspan class=\"hljs-title function_\">all\u003C/span>(promises);\n            chunkResults.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">chunkResult\u003C/span> =&gt;\u003C/span> {\n                results.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...chunkResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>);\n                results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...chunkResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>);\n            });\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Process chunks sequentially\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; chunks.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> chunkResult = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateChunk\u003C/span>(chunks[i], i * \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">chunkSize\u003C/span>);\n                results.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...chunkResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>);\n                results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...chunkResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Cache result\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">cacheResults\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">cache\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(contentHash, results);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> results;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateHash\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Simple hash function for caching\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> hash = \u003Cspan class=\"hljs-number\">0\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; content.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> char = content.\u003Cspan class=\"hljs-title function_\">charCodeAt\u003C/span>(i);\n            hash = ((hash &lt;&lt; \u003Cspan class=\"hljs-number\">5\u003C/span>) - hash) + char;\n            hash = hash &amp; hash; \u003Cspan class=\"hljs-comment\">// Convert to 32-bit integer\u003C/span>\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> hash.\u003Cspan class=\"hljs-title function_\">toString\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">chunkArray\u003C/span>(\u003Cspan class=\"hljs-params\">array, chunkSize\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> chunks = [];\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; array.\u003Cspan class=\"hljs-property\">length\u003C/span>; i += chunkSize) {\n            chunks.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(array.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(i, i + chunkSize));\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> chunks;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateChunk\u003C/span>(\u003Cspan class=\"hljs-params\">lines, startLineNumber\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Implement chunk-specific validation logic\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: []\n        };\n    }\n}\n\u003C/code>\u003C/pre>\u003Cp>\u003Cstrong>Problem\u003C/strong>: False positives in link validation\u003C/p>\n\u003Cp>\u003Cstrong>Solutions\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// Enhanced link validation with better error handling\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">RobustLinkValidator\u003C/span> \u003Cspan class=\"hljs-keyword\">extends\u003C/span> \u003Cspan class=\"hljs-title class_ inherited__\">LinkValidator\u003C/span> {\n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateExternalLink\u003C/span>(\u003Cspan class=\"hljs-params\">url, linkData\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> maxRetries = \u003Cspan class=\"hljs-number\">3\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> attempt = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> (attempt &lt; maxRetries) {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">super\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateExternalLink\u003C/span>(url, linkData);\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> result;\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                attempt++;\n                \n                \u003Cspan class=\"hljs-comment\">// Skip validation for known problematic domains\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isKnownProblematicDomain\u003C/span>(url)) {\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                        \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;skipped&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">reason\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Known problematic domain&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">domain\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title function_\">URL\u003C/span>(url).\u003Cspan class=\"hljs-property\">hostname\u003C/span>\n                    };\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Retry with exponential backoff\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (attempt &lt; maxRetries) {\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">delay\u003C/span>(\u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">pow\u003C/span>(\u003Cspan class=\"hljs-number\">2\u003C/span>, attempt) * \u003Cspan class=\"hljs-number\">1000\u003C/span>);\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">throw\u003C/span> error;\n                }\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isKnownProblematicDomain\u003C/span>(\u003Cspan class=\"hljs-params\">url\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> problematicDomains = [\n            \u003Cspan class=\"hljs-string\">&#x27;localhost&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;127.0.0.1&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;example.com&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;test.example&#x27;\u003C/span>\n        ];\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> hostname = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title function_\">URL\u003C/span>(url).\u003Cspan class=\"hljs-property\">hostname\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> problematicDomains.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">domain\u003C/span> =&gt;\u003C/span> \n                hostname.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(domain)\n            );\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">delay\u003C/span>(\u003Cspan class=\"hljs-params\">ms\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">resolve\u003C/span> =&gt;\u003C/span> \u003Cspan class=\"hljs-built_in\">setTimeout\u003C/span>(resolve, ms));\n    }\n}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Advanced Markdown content validation and automated quality assurance systems represent a comprehensive approach to maintaining documentation integrity that scales effectively with growing content repositories and distributed development teams. By implementing sophisticated validation workflows that combine syntax checking, link verification, accessibility compliance, and style enforcement, development organizations can create robust documentation systems that automatically maintain high quality standards while reducing manual review overhead and enabling faster content publishing cycles.\u003C/p>\n\u003Cp>The key to successful validation implementation lies in balancing comprehensiveness with performance, ensuring that validation rules are thorough enough to catch meaningful issues without creating excessive false positives or processing delays that impede development workflows. Whether you&#39;re building technical documentation platforms, content management systems, or collaborative writing environments, the techniques covered in this guide provide the foundation for creating reliable, maintainable validation systems that serve both content creators and end users effectively.\u003C/p>\n\u003Cp>Remember to continuously refine your validation rules based on real-world usage patterns, implement proper caching and optimization strategies for large content repositories, and maintain clear documentation about validation requirements and troubleshooting procedures. With proper implementation of advanced content validation systems, your Markdown-based documentation can deliver consistently high quality experiences that maintain professional standards while preserving the efficiency and simplicity that makes Markdown such an effective content creation format.\u003C/p>\n",[15,19,22,25,28,31,34,37],{"id":16,"text":17,"level":18},"why-implement-markdown-content-validation","Why Implement Markdown Content Validation?",2,{"id":20,"text":21,"level":18},"foundation-validation-concepts","Foundation Validation Concepts",{"id":23,"text":24,"level":18},"automated-quality-assurance-systems","Automated Quality Assurance Systems",{"id":26,"text":27,"level":18},"integration-with-development-workflows","Integration with Development Workflows",{"id":29,"text":30,"level":18},"integration-with-documentation-systems","Integration with Documentation Systems",{"id":32,"text":33,"level":18},"advanced-configuration-and-customization","Advanced Configuration and Customization",{"id":35,"text":36,"level":18},"troubleshooting-and-performance-optimization","Troubleshooting and Performance Optimization",{"id":38,"text":39,"level":18},"conclusion","Conclusion",[],[42,49,57],{"slug":43,"title":44,"description":45,"excerpt":46,"date":47,"category":9,"author":10,"keywords":48,"readingMinutes":12},"markdown-content-validation-automated-quality-assurance","Markdown Content Validation and Automated Quality Assurance: Complete Guide for Documentation Excellence and Team Workflows","Master automated Markdown content validation with comprehensive quality assurance systems. Learn validation rules, automated testing, CI/CD integration, and quality metrics for professional documentation workflows.","Automated Markdown content validation and quality assurance systems enable professional documentation teams to maintain consistency, accuracy, and excellence across large content repositories…","2025-10-11","markdown validation, content quality assurance, automated markdown testing, documentation QA, markdown linting, content validation tools, documentation quality metrics, markdown CI/CD",{"slug":50,"title":51,"description":52,"excerpt":53,"date":54,"category":9,"author":10,"keywords":55,"readingMinutes":56},"markdown-error-handling-validation-complete-guide","Markdown Error Handling and Validation: Complete Guide for Content Quality Assurance and Automated Checking","Master Markdown error handling, validation techniques, and automated quality assurance. Learn syntax checking, link validation, content linting, and comprehensive testing strategies for robust Markdown workflows.","Markdown error handling and validation techniques enable content teams to maintain high-quality documentation through automated quality assurance processes that catch syntax errors, validate…","2025-12-04","markdown validation, markdown error handling, markdown linting, content quality assurance, markdown syntax checking, automated markdown testing, markdown workflow validation",28,{"slug":58,"title":59,"description":60,"excerpt":61,"date":62,"category":9,"author":10,"keywords":63,"readingMinutes":64},"markdown-table-data-validation-quality-assurance-complete-guide","Markdown Table Data Validation and Quality Assurance: Complete Guide for Automated Table Content Verification","Master comprehensive table data validation techniques in Markdown for automated quality assurance, content verification, and structural integrity checking. Learn advanced validation patterns and automated testing workflows.","Markdown table data validation and quality assurance ensure accurate, consistent, and reliable table content across documentation systems through automated verification, structural integrity…","2025-11-09","markdown table validation, data quality assurance, table content verification, automated markdown testing, table structure validation, data integrity checking, markdown quality control, table validation tools",22,1792184942920]