[{"data":1,"prerenderedAt":56},["Reactive",2],{"blog-post-markdown-syntax-validation-error-detection-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":31,"related":32},"markdown-syntax-validation-error-detection-complete-guide","Markdown Syntax Validation and Error Detection: Complete Guide for Professional Quality Control","Master comprehensive Markdown syntax validation techniques with automated error detection, linting rules, and quality assurance workflows. Learn professional validation strategies for maintaining consistent, error-free documentation.","Comprehensive Markdown syntax validation and error detection ensure professional documentation quality by implementing automated checking systems that identify syntax errors, formatting…","2025-10-05","Tutorial","Matthew Rathbone","markdown validation, markdown linting, markdown error detection, markdown syntax checking, markdown quality control, documentation validation, markdown parser validation, markdown syntax errors",22,"\u003Cp>Comprehensive Markdown syntax validation and error detection ensure professional documentation quality by implementing automated checking systems that identify syntax errors, formatting inconsistencies, and structural problems before content reaches production environments. By establishing robust validation workflows with intelligent error detection algorithms and comprehensive linting rules, technical teams can maintain consistent documentation standards while preventing common syntax errors that could break rendering or compromise content accessibility across different Markdown processors and platforms.\u003C/p>\n\u003Ch2 id=\"why-implement-markdown-validation\">Why Implement Markdown Validation?\u003C/h2>\n\u003Cp>Professional Markdown validation provides essential benefits for documentation quality control:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Consistency Enforcement\u003C/strong>: Automated validation ensures uniform formatting and structure across all documentation\u003C/li>\n\u003Cli>\u003Cstrong>Error Prevention\u003C/strong>: Early detection of syntax errors prevents rendering failures and broken content\u003C/li>\n\u003Cli>\u003Cstrong>Quality Assurance\u003C/strong>: Systematic checks maintain professional standards and improve content reliability\u003C/li>\n\u003Cli>\u003Cstrong>Team Collaboration\u003C/strong>: Standardized validation rules enable consistent contributions from multiple authors\u003C/li>\n\u003Cli>\u003Cstrong>Platform Compatibility\u003C/strong>: Validation ensures content works correctly across different Markdown processors and renderers\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"foundation-validation-techniques\">Foundation Validation Techniques\u003C/h2>\n\u003Ch3 id=\"basic-syntax-validation\">Basic Syntax Validation\u003C/h3>\n\u003Cp>Understanding core Markdown syntax validation patterns and common error detection strategies:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// markdown-validator.js - Comprehensive syntax validation system\u003C/span>\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> fs = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;fs&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">promises\u003C/span>;\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> path = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;path&#x27;\u003C/span>);\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">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\">checkLinks\u003C/span>: options.\u003Cspan class=\"hljs-property\">checkLinks\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validateImages\u003C/span>: options.\u003Cspan class=\"hljs-property\">validateImages\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enforceLineEndings\u003C/span>: options.\u003Cspan class=\"hljs-property\">enforceLineEndings\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;lf&#x27;\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\">requireFrontmatter\u003C/span>: options.\u003Cspan class=\"hljs-property\">requireFrontmatter\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\">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\">customRules\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_\">initializeDefaultRules\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">initializeDefaultRules\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Header 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;headers&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Header Structure Validation&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Validates header hierarchy and formatting&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validate\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateHeaders\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Link 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;links&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Link Format Validation&#x27;\u003C/span>, \n            \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Checks link syntax and accessibility&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validate\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateLinks\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Code block validation\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;codeBlocks&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Code Block Validation&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Validates code block syntax and language specifications&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validate\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        });\n        \n        \u003Cspan class=\"hljs-comment\">// List formatting validation\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;lists&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;List Structure Validation&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Ensures consistent list formatting and nesting&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, \n            \u003Cspan class=\"hljs-attr\">validate\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateLists\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Table validation\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;tables&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Table Format Validation&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Validates table structure and alignment&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validate\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateTables\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Frontmatter validation\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;frontmatter&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Frontmatter Validation&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Validates YAML frontmatter syntax and required fields&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validate\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateFrontmatter\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Line length validation\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;lineLength&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Line Length Validation&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Enforces maximum line length limits&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validate\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        });\n        \n        \u003Cspan class=\"hljs-comment\">// Whitespace validation\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;whitespace&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Whitespace Validation&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Checks for trailing whitespace and line ending consistency&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validate\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateWhitespace\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">addRule\u003C/span>(\u003Cspan class=\"hljs-params\">name, rule\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!rule.\u003Cspan class=\"hljs-property\">validate\u003C/span> || \u003Cspan class=\"hljs-keyword\">typeof\u003C/span> rule.\u003Cspan class=\"hljs-property\">validate\u003C/span> !== \u003Cspan class=\"hljs-string\">&#x27;function&#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\">`Rule \u003Cspan class=\"hljs-subst\">${name}\u003C/span> must have a validate function`\u003C/span>);\n        }\n        \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, {\n            \u003Cspan class=\"hljs-attr\">name\u003C/span>: rule.\u003Cspan class=\"hljs-property\">name\u003C/span> || name,\n            \u003Cspan class=\"hljs-attr\">description\u003C/span>: rule.\u003Cspan class=\"hljs-property\">description\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: rule.\u003Cspan class=\"hljs-property\">severity\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enabled\u003C/span>: rule.\u003Cspan class=\"hljs-property\">enabled\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validate\u003C/span>: rule.\u003Cspan class=\"hljs-property\">validate\u003C/span>\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateFile\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-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>(filePath, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateContent\u003C/span>(content, { filePath });\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">valid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [{\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;file-access&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Cannot read file: \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\">column\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                \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: []\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateContent\u003C/span>(\u003Cspan class=\"hljs-params\">content, context = {}\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        \u003Cspan class=\"hljs-keyword\">const\u003C/span> validationContext = {\n            content,\n            lines,\n            \u003Cspan class=\"hljs-attr\">filePath\u003C/span>: context.\u003Cspan class=\"hljs-property\">filePath\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;unknown&#x27;\u003C/span>,\n            ...context\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Run all enabled validation rules\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> [ruleName, rule] \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\">if\u003C/span> (rule.\u003Cspan class=\"hljs-property\">enabled\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                    rule.\u003Cspan class=\"hljs-title function_\">validate\u003C/span>(validationContext);\n                } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;validation-error&#x27;\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 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\">column\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>\n                    });\n                }\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Run custom rules\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> [ruleName, rule] \u003Cspan class=\"hljs-keyword\">of\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">customRules\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (rule.\u003Cspan class=\"hljs-property\">enabled\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                    rule.\u003Cspan class=\"hljs-title function_\">validate\u003C/span>(validationContext);\n                } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;custom-validation-error&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">rule\u003C/span>: ruleName,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Custom rule 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\">column\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>\n                    });\n                }\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">valid\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\">stats\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateValidationStats\u003C/span>(validationContext)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateHeaders\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { lines } = context;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> headerPattern = \u003Cspan class=\"hljs-regexp\">/^(#{1,6})\\s+(.+)$/\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> headerLevels = [];\n        \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; lines.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> line = lines[i];\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> match = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(headerPattern);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (match) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> level = match[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> title = match[\u003Cspan class=\"hljs-number\">2\u003C/span>].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n                \n                \u003Cspan class=\"hljs-comment\">// Check for empty headers\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!title) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;empty-header&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Header cannot be empty&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: match[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span> + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                    });\n                    \u003Cspan class=\"hljs-keyword\">continue\u003C/span>;\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Check for header hierarchy issues\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headerLevels.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> lastLevel = headerLevels[headerLevels.\u003Cspan class=\"hljs-property\">length\u003C/span> - \u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">level\u003C/span>;\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (level &gt; lastLevel + \u003Cspan class=\"hljs-number\">1\u003C/span>) {\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;header-hierarchy&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Header level \u003Cspan class=\"hljs-subst\">${level}\u003C/span> skips levels (previous was \u003Cspan class=\"hljs-subst\">${lastLevel}\u003C/span>)`\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">line\u003C/span>: i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                        });\n                    }\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Check for duplicate headers\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> existingHeader = headerLevels.\u003Cspan class=\"hljs-title function_\">find\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">h\u003C/span> =&gt;\u003C/span> \n                    h.\u003Cspan class=\"hljs-property\">title\u003C/span>.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>() === title.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>() &amp;&amp; h.\u003Cspan class=\"hljs-property\">level\u003C/span> === level\n                );\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (existingHeader) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;duplicate-header&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Duplicate header &quot;\u003Cspan class=\"hljs-subst\">${title}\u003C/span>&quot; at level \u003Cspan class=\"hljs-subst\">${level}\u003C/span>`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                    });\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Check for trailing hash symbols\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (title.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>)) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;trailing-hash&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Header should not end with hash symbols&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: line.\u003Cspan class=\"hljs-property\">length\u003C/span>\n                    });\n                }\n                \n                headerLevels.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({ level, title, \u003Cspan class=\"hljs-attr\">line\u003C/span>: i + \u003Cspan class=\"hljs-number\">1\u003C/span> });\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for missing top-level header\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headerLevels.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> &amp;&amp; !headerLevels.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">h\u003C/span> =&gt;\u003C/span> h.\u003Cspan class=\"hljs-property\">level\u003C/span> === \u003Cspan class=\"hljs-number\">1\u003C/span>)) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;missing-h1&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Document should have at least one top-level header (# H1)&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateLinks\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { content, lines } = context;\n        \n        \u003Cspan class=\"hljs-comment\">// Match different link formats\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> linkPatterns = [\n            \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]*)\\]\\(([^)]+)\\)/g\u003C/span>,  \u003Cspan class=\"hljs-comment\">// [text](url)\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]*)\\]\\[([^\\]]*)\\]/g\u003C/span>, \u003Cspan class=\"hljs-comment\">// [text][ref]\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/&lt;([^&gt;]+@[^&gt;]+)&gt;/g\u003C/span>,          \u003Cspan class=\"hljs-comment\">// &lt;email@domain.com&gt;\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/&lt;(https?:\\/\\/[^&gt;]+)&gt;/g\u003C/span>      \u003Cspan class=\"hljs-comment\">// &lt;http://example.com&gt;\u003C/span>\n        ];\n        \n        linkPatterns.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">pattern, patternIndex\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> linkText = match[\u003Cspan class=\"hljs-number\">1\u003C/span>] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> linkUrl = match[\u003Cspan class=\"hljs-number\">2\u003C/span>] || match[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n                \n                \u003Cspan class=\"hljs-comment\">// Find line number\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> beforeMatch = content.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, match.\u003Cspan class=\"hljs-property\">index\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> lineNumber = beforeMatch.\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-keyword\">const\u003C/span> lineStart = beforeMatch.\u003Cspan class=\"hljs-title function_\">lastIndexOf\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>) + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> columnNumber = match.\u003Cspan class=\"hljs-property\">index\u003C/span> - lineStart + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                \n                \u003Cspan class=\"hljs-comment\">// Validate link text\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (patternIndex === \u003Cspan class=\"hljs-number\">0\u003C/span> &amp;&amp; !linkText.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;empty-link-text&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Link text should not be empty&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: lineNumber,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: columnNumber\n                    });\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Validate URL format\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (linkUrl) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateLinkUrl\u003C/span>(linkUrl, lineNumber, columnNumber);\n                }\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Check for reference links without definitions\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateReferenceLinks\u003C/span>(content);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateLinkUrl\u003C/span>(\u003Cspan class=\"hljs-params\">url, line, column\u003C/span>) {\n        url = url.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!url) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;empty-link-url&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Link URL cannot be empty&#x27;\u003C/span>,\n                line,\n                column\n            });\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for common URL issues\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (url.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27; &#x27;\u003C/span>) &amp;&amp; !url.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;mailto:&#x27;\u003C/span>)) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;invalid-url-spaces&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;URL contains spaces (should be encoded)&#x27;\u003C/span>,\n                line,\n                column\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for relative paths that might be broken\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (url.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;./&#x27;\u003C/span>) || url.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;../&#x27;\u003C/span>)) {\n            \u003Cspan class=\"hljs-comment\">// Could add file existence checking here\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;relative-link&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Relative link detected - verify path exists&#x27;\u003C/span>,\n                line,\n                column\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for protocol-relative URLs\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (url.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;//&#x27;\u003C/span>)) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;protocol-relative-url&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Protocol-relative URL may cause issues in some contexts&#x27;\u003C/span>,\n                line,\n                column\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Validate email links\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (url.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;mailto:&#x27;\u003C/span>)) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> email = url.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">7\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isValidEmail\u003C/span>(email.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;?&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">0\u003C/span>])) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;invalid-email&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Invalid email address in mailto link&#x27;\u003C/span>,\n                    line,\n                    column\n                });\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateReferenceLinks\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> refLinkPattern = \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]*)\\]\\[([^\\]]*)\\]/g\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> refDefPattern = \u003Cspan class=\"hljs-regexp\">/^\\s*\\[([^\\]]+)\\]:\\s*(.+)$/gm\u003C/span>;\n        \n        \u003Cspan class=\"hljs-comment\">// Collect all reference definitions\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> definitions = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Set\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = refDefPattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(content)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n            definitions.\u003Cspan class=\"hljs-title function_\">add\u003C/span>(match[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>());\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check all reference links\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = refLinkPattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(content)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\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>]).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!definitions.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(refId)) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> beforeMatch = content.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, match.\u003Cspan class=\"hljs-property\">index\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> lineNumber = beforeMatch.\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-keyword\">const\u003C/span> lineStart = beforeMatch.\u003Cspan class=\"hljs-title function_\">lastIndexOf\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>) + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> columnNumber = match.\u003Cspan class=\"hljs-property\">index\u003C/span> - lineStart + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;missing-reference-definition&#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>: lineNumber,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: columnNumber\n                });\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateCodeBlocks\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { content, lines } = context;\n        \n        \u003Cspan class=\"hljs-comment\">// Find fenced code blocks\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> codeBlockPattern = \u003Cspan class=\"hljs-regexp\">/```([^\\n]*)\\n([\\s\\S]*?)```/g\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n        \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> language = match[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> code = match[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> beforeMatch = content.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, match.\u003Cspan class=\"hljs-property\">index\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> lineNumber = beforeMatch.\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            \u003Cspan class=\"hljs-comment\">// Check for language specification\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!language &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">strictMode\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;missing-code-language&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Code block should specify a language for syntax highlighting&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: lineNumber,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                });\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Check for unterminated code blocks\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!match[\u003Cspan class=\"hljs-number\">0\u003C/span>].\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;unterminated-code-block&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Code block is not properly terminated&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: lineNumber,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                });\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Validate specific language syntax (basic checks)\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (language &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">shouldValidateLanguage\u003C/span>(language)) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateCodeSyntax\u003C/span>(language, code, lineNumber);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for indented code blocks mixed with fenced blocks\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">checkMixedCodeBlockStyles\u003C/span>(lines);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">shouldValidateLanguage\u003C/span>(\u003Cspan class=\"hljs-params\">language\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> supportedLanguages = [\u003Cspan class=\"hljs-string\">&#x27;javascript&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;js&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;python&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;py&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;json&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;yaml&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;yml&#x27;\u003C/span>];\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> supportedLanguages.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(language.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>());\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateCodeSyntax\u003C/span>(\u003Cspan class=\"hljs-params\">language, code, startLine\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (language.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>()) {\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;json&#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>(code);\n                } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;invalid-json-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 + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                    });\n                }\n                \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;yaml&#x27;\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;yml&#x27;\u003C/span>:\n                \u003Cspan class=\"hljs-comment\">// Basic YAML validation\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (code.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\t&#x27;\u003C/span>)) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;yaml-tabs&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;YAML should use spaces, not tabs for indentation&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: startLine + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                    });\n                }\n                \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">checkMixedCodeBlockStyles\u003C/span>(\u003Cspan class=\"hljs-params\">lines\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> hasFenced = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> hasIndented = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \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; lines.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> line = lines[i];\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>)) {\n                hasFenced = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^    \\S/\u003C/span>) &amp;&amp; \n                       !lines[\u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, i - \u003Cspan class=\"hljs-number\">1\u003C/span>)].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() &amp;&amp; \n                       !lines[\u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">min\u003C/span>(lines.\u003Cspan class=\"hljs-property\">length\u003C/span> - \u003Cspan class=\"hljs-number\">1\u003C/span>, i + \u003Cspan class=\"hljs-number\">1\u003C/span>)].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()) {\n                hasIndented = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (hasFenced &amp;&amp; hasIndented) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;mixed-code-block-styles&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Document mixes fenced (```) and indented code blocks - use consistent style&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateLists\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { lines } = context;\n        \n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> inOrderedList = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> inUnorderedList = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> currentIndentLevel = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> lastOrderedNumber = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \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; lines.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> line = lines[i];\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> trimmedLine = line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n            \n            \u003Cspan class=\"hljs-comment\">// Check for list items\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) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> indent = orderedMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>;\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\">const\u003C/span> content = orderedMatch[\u003Cspan class=\"hljs-number\">3\u003C/span>];\n                \n                \u003Cspan class=\"hljs-comment\">// Check for inconsistent indentation\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inOrderedList &amp;&amp; indent !== currentIndentLevel) {\n                    \u003Cspan class=\"hljs-comment\">// Allow for nested lists\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (indent % \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-title function_\">addWarning\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;inconsistent-list-indentation&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;List item indentation should use 2 or 4 spaces consistently&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">line\u003C/span>: i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                        });\n                    }\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Check for incorrect numbering\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inOrderedList &amp;&amp; indent === currentIndentLevel &amp;&amp; number !== lastOrderedNumber + \u003Cspan class=\"hljs-number\">1\u003C/span>) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;incorrect-list-numbering&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`List item number \u003Cspan class=\"hljs-subst\">${number}\u003C/span> should be \u003Cspan class=\"hljs-subst\">${lastOrderedNumber + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: i + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: indent + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                    });\n                }\n                \n                inOrderedList = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                inUnorderedList = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                currentIndentLevel = indent;\n                lastOrderedNumber = number;\n                \n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (unorderedMatch) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> indent = unorderedMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> content = unorderedMatch[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n                \n                \u003Cspan class=\"hljs-comment\">// Check for mixed bullet styles in same list\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> bullet = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*)([*+-])/\u003C/span>)[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n                \u003Cspan class=\"hljs-comment\">// Could track and warn about mixed bullets here\u003C/span>\n                \n                inUnorderedList = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!inOrderedList) {\n                    currentIndentLevel = indent;\n                }\n                \n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (trimmedLine === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Empty line - potential end of list\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-comment\">// Reset list state if not a continuation\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^\\s{2,}/\u003C/span>)) {\n                    inOrderedList = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                    inUnorderedList = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                    currentIndentLevel = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n                    lastOrderedNumber = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n                }\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateTables\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { lines } = context;\n        \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; lines.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> line = lines[i];\n            \n            \u003Cspan class=\"hljs-comment\">// Check if line looks like a table row\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (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>) &amp;&amp; line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>().\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateTableRow\u003C/span>(line, i + \u003Cspan class=\"hljs-number\">1\u003C/span>);\n                \n                \u003Cspan class=\"hljs-comment\">// Check for header separator row\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (i + \u003Cspan class=\"hljs-number\">1\u003C/span> &lt; lines.\u003Cspan class=\"hljs-property\">length\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> nextLine = lines[i + \u003Cspan class=\"hljs-number\">1\u003C/span>];\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isTableSeparatorRow\u003C/span>(nextLine)) {\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateTableSeparator\u003C/span>(line, nextLine, i + \u003Cspan class=\"hljs-number\">1\u003C/span>);\n                    }\n                }\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isTableSeparatorRow\u003C/span>(\u003Cspan class=\"hljs-params\">line\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-regexp\">/^\\s*\\|?(\\s*:?-+:?\\s*\\|)+\\s*:?-+:?\\s*\\|?\\s*$/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(line);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateTableRow\u003C/span>(\u003Cspan class=\"hljs-params\">row, lineNumber\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> cells = row.\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>); \u003Cspan class=\"hljs-comment\">// Remove empty first/last elements\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\">// Check for empty cells (might be intentional, so warning only)\u003C/span>\n        cells.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">cell, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!cell.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;empty-table-cell&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Table cell \u003Cspan class=\"hljs-subst\">${index + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span> is empty`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: lineNumber,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: row.\u003Cspan class=\"hljs-title function_\">indexOf\u003C/span>(cell)\n                });\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateTableSeparator\u003C/span>(\u003Cspan class=\"hljs-params\">headerRow, separatorRow, lineNumber\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> headerCells = headerRow.\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        \u003Cspan class=\"hljs-keyword\">const\u003C/span> separatorCells = separatorRow.\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        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headerCells.\u003Cspan class=\"hljs-property\">length\u003C/span> !== separatorCells.\u003Cspan class=\"hljs-property\">length\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;table-column-mismatch&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Table header has \u003Cspan class=\"hljs-subst\">${headerCells.length}\u003C/span> columns but separator has \u003Cspan class=\"hljs-subst\">${separatorCells.length}\u003C/span>`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: lineNumber + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateFrontmatter\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { content } = context;\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\">requireFrontmatter\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> frontmatterPattern = \u003Cspan class=\"hljs-regexp\">/^---\\n([\\s\\S]*?)\\n---/\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> match = content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(frontmatterPattern);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!match) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;missing-frontmatter&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Document must include YAML frontmatter&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n            });\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> yamlContent = match[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n        \n        \u003Cspan class=\"hljs-comment\">// Basic YAML syntax validation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Would use a YAML parser in real implementation\u003C/span>\n            \u003Cspan class=\"hljs-comment\">// const yaml = require(&#x27;js-yaml&#x27;);\u003C/span>\n            \u003Cspan class=\"hljs-comment\">// yaml.load(yamlContent);\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\">// Check for required fields (example)\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> requiredFields = [\u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;author&#x27;\u003C/span>];\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = yamlContent.\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> fields = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Set\u003C/span>();\n            \n            lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">line\u003C/span> =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> fieldMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^([^:]+):/\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fieldMatch) {\n                    fields.\u003Cspan class=\"hljs-title function_\">add\u003C/span>(fieldMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>());\n                }\n            });\n            \n            requiredFields.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">field\u003C/span> =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!fields.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(field)) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;missing-frontmatter-field&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Frontmatter should include &#x27;\u003Cspan class=\"hljs-subst\">${field}\u003C/span>&#x27; field`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                    });\n                }\n            });\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addError\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;invalid-frontmatter-yaml&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Invalid YAML in frontmatter: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">2\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateLineLength\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { lines } = context;\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\">// Allow long lines in code blocks and URLs\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!line.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>) &amp;&amp; \n                    !line.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;http://&#x27;\u003C/span>) &amp;&amp; \n                    !line.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;https://&#x27;\u003C/span>) &amp;&amp;\n                    !line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^\\s*\\|.*\\|/\u003C/span>)) { \u003Cspan class=\"hljs-comment\">// Not a table row\u003C/span>\n                    \n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;line-too-long&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Line exceeds \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\">column\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-number\">1\u003C/span>\n                    });\n                }\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateWhitespace\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { lines, content } = context;\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 trailing whitespace\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\s+$/\u003C/span>)) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\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\">column\u003C/span>: line.\u003Cspan class=\"hljs-property\">length\u003C/span>\n                });\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Check for tabs in content (outside code blocks)\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\t&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;tab-character&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Line contains tab character - use spaces for consistency&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: line.\u003Cspan class=\"hljs-title function_\">indexOf\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\t&#x27;\u003C/span>) + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                });\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Check line endings\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\">enforceLineEndings\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> expectedEnding = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enforceLineEndings\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;crlf&#x27;\u003C/span> ? \u003Cspan class=\"hljs-string\">&#x27;\\r\\n&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> hasWrongEndings = content.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(expectedEnding === \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span> ? \u003Cspan class=\"hljs-string\">&#x27;\\r\\n&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (hasWrongEndings) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addWarning\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;inconsistent-line-endings&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Document has inconsistent line endings (expected \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.options.enforceLineEndings}\u003C/span>)`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                });\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">addError\u003C/span>(\u003Cspan class=\"hljs-params\">error\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            ...error,\n            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\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-title function_\">addWarning\u003C/span>(\u003Cspan class=\"hljs-params\">warning\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            ...warning,\n            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\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-title function_\">generateValidationStats\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { lines, content } = context;\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">lineCount\u003C/span>: lines.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">characterCount\u003C/span>: content.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">wordCount\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\s+/\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">headerCount\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^#{1,6}\\s/gm\u003C/span>)?.\u003Cspan class=\"hljs-property\">length\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">linkCount\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\[([^\\]]*)\\]\\(([^)]+)\\)/g\u003C/span>)?.\u003Cspan class=\"hljs-property\">length\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">codeBlockCount\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/```/g\u003C/span>)?.\u003Cspan class=\"hljs-property\">length\u003C/span> / \u003Cspan class=\"hljs-number\">2\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">listItemCount\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^\\s*[-*+]\\s|^\\s*\\d+\\.\\s/gm\u003C/span>)?.\u003Cspan class=\"hljs-property\">length\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">tableCount\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\|.*\\|/g\u003C/span>)?.\u003Cspan class=\"hljs-property\">length\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isValidEmail\u003C/span>(\u003Cspan class=\"hljs-params\">email\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> emailPattern = \u003Cspan class=\"hljs-regexp\">/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> emailPattern.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(email);\n    }\n    \n    \u003Cspan class=\"hljs-comment\">// Generate a comprehensive report\u003C/span>\n    \u003Cspan class=\"hljs-title function_\">generateReport\u003C/span>(\u003Cspan class=\"hljs-params\">results\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> report = {\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">valid\u003C/span>: results.\u003Cspan class=\"hljs-property\">valid\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">errorCount\u003C/span>: results.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">warningCount\u003C/span>: results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">stats\u003C/span>: results.\u003Cspan class=\"hljs-property\">stats\u003C/span>\n            },\n            \u003Cspan class=\"hljs-attr\">errors\u003C/span>: results.\u003Cspan class=\"hljs-property\">errors\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: results.\u003Cspan class=\"hljs-property\">warnings\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>(results)\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> report;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateRecommendations\u003C/span>(\u003Cspan class=\"hljs-params\">results\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> recommendations = [];\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (results.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\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\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Fix \u003Cspan class=\"hljs-subst\">${results.errors.length}\u003C/span> syntax errors before publishing`\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">5\u003C/span>) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\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\">`Consider addressing \u003Cspan class=\"hljs-subst\">${results.warnings.length}\u003C/span> warnings to improve quality`\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Add specific recommendations based on error types\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> errorTypes = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Set\u003C/span>(results.\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-property\">type\u003C/span>));\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> warningTypes = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Set\u003C/span>(results.\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-property\">type\u003C/span>));\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (errorTypes.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;unterminated-code-block&#x27;\u003C/span>)) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;syntax&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Ensure all code blocks are properly closed with ```&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (warningTypes.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;line-too-long&#x27;\u003C/span>)) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;formatting&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Consider breaking long lines to improve readability (max \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.options.maxLineLength}\u003C/span> chars)`\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> recommendations;\n    }\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\n\u003Cspan class=\"hljs-comment\">// CLI usage example\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-built_in\">require\u003C/span>.\u003Cspan class=\"hljs-property\">main\u003C/span> === \u003Cspan class=\"hljs-variable language_\">module\u003C/span>) {\n    \u003Cspan class=\"hljs-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\">requireFrontmatter\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    });\n    \n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> filePath = process.\u003Cspan class=\"hljs-property\">argv\u003C/span>[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!filePath) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Usage: node markdown-validator.js &lt;file.md&gt;&#x27;\u003C/span>);\n        process.\u003Cspan class=\"hljs-title function_\">exit\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span>);\n    }\n    \n    validator.\u003Cspan class=\"hljs-title function_\">validateFile\u003C/span>(filePath)\n        .\u003Cspan class=\"hljs-title function_\">then\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">results\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> report = validator.\u003Cspan class=\"hljs-title function_\">generateReport\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\">&#x27;\\n=== Markdown Validation Report ===&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`File: \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>`\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Status: \u003Cspan class=\"hljs-subst\">${results.valid ? \u003Cspan class=\"hljs-string\">&#x27;VALID&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;INVALID&#x27;\u003C/span>}\u003C/span>`\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Errors: \u003Cspan class=\"hljs-subst\">${results.errors.length}\u003C/span>`\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Warnings: \u003Cspan class=\"hljs-subst\">${results.warnings.length}\u003C/span>`\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (results.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n--- ERRORS ---&#x27;\u003C/span>);\n                results.\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_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Line \u003Cspan class=\"hljs-subst\">${error.line}\u003C/span>: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span> (\u003Cspan class=\"hljs-subst\">${error.type}\u003C/span>)`\u003C/span>);\n                });\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (results.\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_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n--- WARNINGS ---&#x27;\u003C/span>);\n                results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">warning\u003C/span> =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Line \u003Cspan class=\"hljs-subst\">${warning.line}\u003C/span>: \u003Cspan class=\"hljs-subst\">${warning.message}\u003C/span> (\u003Cspan class=\"hljs-subst\">${warning.type}\u003C/span>)`\u003C/span>);\n                });\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (report.\u003Cspan class=\"hljs-property\">recommendations\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n--- RECOMMENDATIONS ---&#x27;\u003C/span>);\n                report.\u003Cspan class=\"hljs-property\">recommendations\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">rec\u003C/span> =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${rec.type.toUpperCase()}\u003C/span>: \u003Cspan class=\"hljs-subst\">${rec.message}\u003C/span>`\u003C/span>);\n                });\n            }\n            \n            process.\u003Cspan class=\"hljs-title function_\">exit\u003C/span>(results.\u003Cspan class=\"hljs-property\">valid\u003C/span> ? \u003Cspan class=\"hljs-number\">0\u003C/span> : \u003Cspan class=\"hljs-number\">1\u003C/span>);\n        })\n        .\u003Cspan class=\"hljs-title function_\">catch\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">error\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Validation failed:&#x27;\u003C/span>, error);\n            process.\u003Cspan class=\"hljs-title function_\">exit\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span>);\n        });\n}\n\u003C/code>\u003C/pre>\u003Ch3 id=\"advanced-linting-configuration\">Advanced Linting Configuration\u003C/h3>\n\u003Cp>Implementing sophisticated linting rules for comprehensive quality control:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-yaml\">\u003Cspan class=\"hljs-comment\"># .markdownlint.yml - Comprehensive linting configuration\u003C/span>\n\u003Cspan class=\"hljs-comment\"># Header rules\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD001:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>  \u003Cspan class=\"hljs-comment\"># Header levels increment by one level at a time\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD002:\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span> \u003Cspan class=\"hljs-comment\"># First header should be a top level header (disabled - allow flexibility)\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD003:\u003C/span>       \u003Cspan class=\"hljs-comment\"># Header style\u003C/span>\n  \u003Cspan class=\"hljs-attr\">style:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;atx&quot;\u003C/span> \u003Cspan class=\"hljs-comment\"># Use # style headers, not underlined\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD004:\u003C/span>       \u003Cspan class=\"hljs-comment\"># Unordered list style\u003C/span>\n  \u003Cspan class=\"hljs-attr\">style:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;dash&quot;\u003C/span> \u003Cspan class=\"hljs-comment\"># Use - for unordered lists consistently\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD005:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>  \u003Cspan class=\"hljs-comment\"># No inconsistent indentation for list items\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Line length rules\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD013:\u003C/span>       \u003Cspan class=\"hljs-comment\"># Line length\u003C/span>\n  \u003Cspan class=\"hljs-attr\">line_length:\u003C/span> \u003Cspan class=\"hljs-number\">120\u003C/span>\n  \u003Cspan class=\"hljs-attr\">tables:\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>    \u003Cspan class=\"hljs-comment\"># Don&#x27;t check table line length\u003C/span>\n  \u003Cspan class=\"hljs-attr\">code_blocks:\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>\n  \u003Cspan class=\"hljs-attr\">headers:\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>\n  \n\u003Cspan class=\"hljs-comment\"># Whitespace rules  \u003C/span>\n\u003Cspan class=\"hljs-attr\">MD009:\u003C/span>       \u003Cspan class=\"hljs-comment\"># Trailing spaces\u003C/span>\n  \u003Cspan class=\"hljs-attr\">br_spaces:\u003C/span> \u003Cspan class=\"hljs-number\">2\u003C/span>     \u003Cspan class=\"hljs-comment\"># Allow 2 trailing spaces for line breaks\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD010:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>  \u003Cspan class=\"hljs-comment\"># No hard tabs\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD011:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>  \u003Cspan class=\"hljs-comment\"># No reversed link syntax\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD012:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>  \u003Cspan class=\"hljs-comment\"># No multiple consecutive blank lines\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Link rules\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD034:\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span> \u003Cspan class=\"hljs-comment\"># No bare URLs (disabled - sometimes useful)\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD035:\u003C/span>       \u003Cspan class=\"hljs-comment\"># Horizontal rule style\u003C/span>\n  \u003Cspan class=\"hljs-attr\">style:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;---&quot;\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD036:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>  \u003Cspan class=\"hljs-comment\"># No emphasis used instead of header\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Code block rules\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD040:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>  \u003Cspan class=\"hljs-comment\"># Fenced code blocks should have a language specified\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD041:\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span> \u003Cspan class=\"hljs-comment\"># First line in file should be a top level header (disabled)\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD042:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>  \u003Cspan class=\"hljs-comment\"># No empty links\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD043:\u003C/span>       \u003Cspan class=\"hljs-comment\"># Required headers (customize per project)\u003C/span>\n  \u003Cspan class=\"hljs-attr\">headers:\u003C/span> []\n\u003Cspan class=\"hljs-attr\">MD044:\u003C/span>       \u003Cspan class=\"hljs-comment\"># Proper names should have the correct capitalization\u003C/span>\n  \u003Cspan class=\"hljs-attr\">names:\u003C/span> [\u003Cspan class=\"hljs-string\">&quot;JavaScript&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;GitHub&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;Markdown&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;HTML&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;CSS&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;API&quot;\u003C/span>]\n\u003Cspan class=\"hljs-attr\">MD045:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>  \u003Cspan class=\"hljs-comment\"># Images should have alternate text\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># List rules\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD029:\u003C/span>       \u003Cspan class=\"hljs-comment\"># Ordered list item prefix\u003C/span>\n  \u003Cspan class=\"hljs-attr\">style:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;ordered&quot;\u003C/span> \u003Cspan class=\"hljs-comment\"># 1. 2. 3. not 1. 1. 1.\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD030:\u003C/span>       \u003Cspan class=\"hljs-comment\"># Spaces after list markers\u003C/span>\n  \u003Cspan class=\"hljs-attr\">ul_single:\u003C/span> \u003Cspan class=\"hljs-number\">1\u003C/span>\n  \u003Cspan class=\"hljs-attr\">ol_single:\u003C/span> \u003Cspan class=\"hljs-number\">1\u003C/span>\n  \u003Cspan class=\"hljs-attr\">ul_multi:\u003C/span> \u003Cspan class=\"hljs-number\">1\u003C/span>\n  \u003Cspan class=\"hljs-attr\">ol_multi:\u003C/span> \u003Cspan class=\"hljs-number\">1\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Table rules\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD047:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>  \u003Cspan class=\"hljs-comment\"># Files should end with a single newline character\u003C/span>\n\u003Cspan class=\"hljs-attr\">MD048:\u003C/span>       \u003Cspan class=\"hljs-comment\"># Code fence style  \u003C/span>\n  \u003Cspan class=\"hljs-attr\">style:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;backtick&quot;\u003C/span> \u003Cspan class=\"hljs-comment\"># Use ``` not ~~~\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Custom rules (would be implemented as plugins)\u003C/span>\n\u003Cspan class=\"hljs-attr\">custom-rules:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">check-frontmatter-fields:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">enabled:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \u003Cspan class=\"hljs-attr\">required_fields:\u003C/span> [\u003Cspan class=\"hljs-string\">&quot;title&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;date&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;author&quot;\u003C/span>]\n    \n  \u003Cspan class=\"hljs-attr\">validate-internal-links:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">enabled:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \u003Cspan class=\"hljs-attr\">check_fragments:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \n  \u003Cspan class=\"hljs-attr\">enforce-alt-text:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">enabled:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \u003Cspan class=\"hljs-attr\">allow_empty:\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>\n    \n  \u003Cspan class=\"hljs-attr\">check-code-language:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">enabled:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \u003Cspan class=\"hljs-attr\">allowed_languages:\u003C/span> \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">javascript\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">python\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">bash\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">yaml\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">json\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">html\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">css\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">markdown\u003C/span>\n      \n  \u003Cspan class=\"hljs-attr\">validate-email-links:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">enabled:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \u003Cspan class=\"hljs-attr\">check_format:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \n  \u003Cspan class=\"hljs-attr\">check-external-links:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">enabled:\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>  \u003Cspan class=\"hljs-comment\"># Expensive operation\u003C/span>\n    \u003Cspan class=\"hljs-attr\">timeout:\u003C/span> \u003Cspan class=\"hljs-number\">5000\u003C/span>\n    \n  \u003Cspan class=\"hljs-attr\">enforce-consistent-formatting:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">enabled:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \u003Cspan class=\"hljs-attr\">quote_style:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;double&quot;\u003C/span>\n    \u003Cspan class=\"hljs-attr\">emphasis_style:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;asterisk&quot;\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch3 id=\"automated-quality-assurance\">Automated Quality Assurance\u003C/h3>\n\u003Cp>Creating comprehensive QA workflows for documentation validation:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// markdown-qa-system.js - Automated quality assurance system\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\u003Cspan class=\"hljs-keyword\">const\u003C/span> { execSync } = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;child_process&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownValidator\u003C/span> = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;./markdown-validator&#x27;\u003C/span>);\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownQASystem\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\">sourceDir\u003C/span>: options.\u003Cspan class=\"hljs-property\">sourceDir\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;./docs&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">configFile\u003C/span>: options.\u003Cspan class=\"hljs-property\">configFile\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;.markdownlint.yml&#x27;\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\">parallelProcessing\u003C/span>: options.\u003Cspan class=\"hljs-property\">parallelProcessing\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxWorkers\u003C/span>: options.\u003Cspan class=\"hljs-property\">maxWorkers\u003C/span> || \u003Cspan class=\"hljs-number\">4\u003C/span>,\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validator\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownValidator\u003C/span>(options.\u003Cspan class=\"hljs-property\">validation\u003C/span> || {});\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\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\">overallStats\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">totalFiles\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validFiles\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">totalErrors\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">totalWarnings\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">processingTime\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>\n        };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">runQAProcess\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Starting Markdown QA process...&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> startTime = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Discover all markdown files\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> markdownFiles = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">discoverMarkdownFiles\u003C/span>();\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Found \u003Cspan class=\"hljs-subst\">${markdownFiles.length}\u003C/span> Markdown files`\u003C/span>);\n            \n            \u003Cspan class=\"hljs-comment\">// Validate files\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\">parallelProcessing\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateFilesInParallel\u003C/span>(markdownFiles);\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateFilesSequentially\u003C/span>(markdownFiles);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Generate comprehensive report\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> report = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateQAReport\u003C/span>();\n            \n            \u003Cspan class=\"hljs-comment\">// Save results\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">saveResults\u003C/span>(report);\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">overallStats\u003C/span>.\u003Cspan class=\"hljs-property\">processingTime\u003C/span> = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>() - startTime;\n            \n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`QA process completed in \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.overallStats.processingTime}\u003C/span>ms`\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> report;\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;QA process failed:&#x27;\u003C/span>, error);\n            \u003Cspan class=\"hljs-keyword\">throw\u003C/span> error;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">discoverMarkdownFiles\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> files = [];\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-title function_\">scanDirectory\u003C/span> = \u003Cspan class=\"hljs-keyword\">async\u003C/span> (\u003Cspan class=\"hljs-params\">dir\u003C/span>) =&gt; {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> entries = \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">readdir\u003C/span>(dir, { \u003Cspan class=\"hljs-attr\">withFileTypes\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> });\n                \n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> entry \u003Cspan class=\"hljs-keyword\">of\u003C/span> entries) {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> fullPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(dir, entry.\u003Cspan class=\"hljs-property\">name\u003C/span>);\n                    \n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (entry.\u003Cspan class=\"hljs-title function_\">isDirectory\u003C/span>() &amp;&amp; !\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">shouldSkipDirectory\u003C/span>(entry.\u003Cspan class=\"hljs-property\">name\u003C/span>)) {\n                        \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title function_\">scanDirectory\u003C/span>(fullPath);\n                    } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (entry.\u003Cspan class=\"hljs-title function_\">isFile\u003C/span>() &amp;&amp; entry.\u003Cspan class=\"hljs-property\">name\u003C/span>.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>)) {\n                        files.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(fullPath);\n                    }\n                }\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">warn\u003C/span>(\u003Cspan class=\"hljs-string\">`Cannot scan directory \u003Cspan class=\"hljs-subst\">${dir}\u003C/span>:`\u003C/span>, error.\u003Cspan class=\"hljs-property\">message\u003C/span>);\n            }\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title function_\">scanDirectory\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">sourceDir\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> files;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">shouldSkipDirectory\u003C/span>(\u003Cspan class=\"hljs-params\">dirname\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> skipDirs = [\u003Cspan class=\"hljs-string\">&#x27;.git&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;node_modules&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.next&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;dist&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;build&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;_site&#x27;\u003C/span>];\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> skipDirs.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(dirname) || dirname.\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_\">validateFilesInParallel\u003C/span>(\u003Cspan class=\"hljs-params\">files\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>(files, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">maxWorkers\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\u003C/span> =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateChunk\u003C/span>(chunk));\n        \n        \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    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateFilesSequentially\u003C/span>(\u003Cspan class=\"hljs-params\">files\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> file \u003Cspan class=\"hljs-keyword\">of\u003C/span> files) {\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateSingleFile\u003C/span>(file);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateChunk\u003C/span>(\u003Cspan class=\"hljs-params\">files\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> file \u003Cspan class=\"hljs-keyword\">of\u003C/span> files) {\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateSingleFile\u003C/span>(file);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateSingleFile\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Validating: \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>`\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validator\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateFile\u003C/span>(filePath);\n            \n            \u003Cspan class=\"hljs-comment\">// Add file-specific metadata\u003C/span>\n            result.\u003Cspan class=\"hljs-property\">filePath\u003C/span> = filePath;\n            result.\u003Cspan class=\"hljs-property\">relativePath\u003C/span> = path.\u003Cspan class=\"hljs-title function_\">relative\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">sourceDir\u003C/span>, filePath);\n            result.\u003Cspan class=\"hljs-property\">fileSize\u003C/span> = (\u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">stat\u003C/span>(filePath)).\u003Cspan class=\"hljs-property\">size\u003C/span>;\n            result.\u003Cspan class=\"hljs-property\">lastModified\u003C/span> = (\u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">stat\u003C/span>(filePath)).\u003Cspan class=\"hljs-property\">mtime\u003C/span>;\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(filePath, result);\n            \n            \u003Cspan class=\"hljs-comment\">// Update overall stats\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">overallStats\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span>++;\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (result.\u003Cspan class=\"hljs-property\">valid\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">overallStats\u003C/span>.\u003Cspan class=\"hljs-property\">validFiles\u003C/span>++;\n            }\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">overallStats\u003C/span>.\u003Cspan class=\"hljs-property\">totalErrors\u003C/span> += result.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">overallStats\u003C/span>.\u003Cspan class=\"hljs-property\">totalWarnings\u003C/span> += result.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">`Failed to validate \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>:`\u003C/span>, error);\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(filePath, {\n                \u003Cspan class=\"hljs-attr\">valid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [{\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;validation-failure&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>\n                }],\n                \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: [],\n                \u003Cspan class=\"hljs-attr\">stats\u003C/span>: {}\n            });\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_\">generateQAReport\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> report = {\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>: { ...\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">overallStats\u003C/span> },\n            \u003Cspan class=\"hljs-attr\">files\u003C/span>: {},\n            \u003Cspan class=\"hljs-attr\">categories\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">critical\u003C/span>: [],\n                \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [],\n                \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: [],\n                \u003Cspan class=\"hljs-attr\">passed\u003C/span>: []\n            },\n            \u003Cspan class=\"hljs-attr\">recommendations\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">trends\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeTrends\u003C/span>()\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Process each file result\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> [filePath, result] \u003Cspan class=\"hljs-keyword\">of\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>) {\n            report.\u003Cspan class=\"hljs-property\">files\u003C/span>[result.\u003Cspan class=\"hljs-property\">relativePath\u003C/span>] = {\n                \u003Cspan class=\"hljs-attr\">status\u003C/span>: result.\u003Cspan class=\"hljs-property\">valid\u003C/span> ? \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">errors\u003C/span>: result.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: result.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">stats\u003C/span>: result.\u003Cspan class=\"hljs-property\">stats\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">details\u003C/span>: {\n                    \u003Cspan class=\"hljs-attr\">errors\u003C/span>: result.\u003Cspan class=\"hljs-property\">errors\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: result.\u003Cspan class=\"hljs-property\">warnings\u003C/span>\n                }\n            };\n            \n            \u003Cspan class=\"hljs-comment\">// Categorize files\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (result.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> criticalErrors = result.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">e\u003C/span> =&gt;\u003C/span> \n                    [\u003Cspan class=\"hljs-string\">&#x27;unterminated-code-block&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;invalid-frontmatter-yaml&#x27;\u003C/span>].\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(e.\u003Cspan class=\"hljs-property\">type\u003C/span>)\n                );\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (criticalErrors.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                    report.\u003Cspan class=\"hljs-property\">categories\u003C/span>.\u003Cspan class=\"hljs-property\">critical\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(result.\u003Cspan class=\"hljs-property\">relativePath\u003C/span>);\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    report.\u003Cspan class=\"hljs-property\">categories\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(result.\u003Cspan class=\"hljs-property\">relativePath\u003C/span>);\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (result.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                report.\u003Cspan class=\"hljs-property\">categories\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(result.\u003Cspan class=\"hljs-property\">relativePath\u003C/span>);\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                report.\u003Cspan class=\"hljs-property\">categories\u003C/span>.\u003Cspan class=\"hljs-property\">passed\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(result.\u003Cspan class=\"hljs-property\">relativePath\u003C/span>);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Generate recommendations\u003C/span>\n        report.\u003Cspan class=\"hljs-property\">recommendations\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateRecommendations\u003C/span>(report);\n        \n        \u003Cspan class=\"hljs-comment\">// Calculate quality score\u003C/span>\n        report.\u003Cspan class=\"hljs-property\">qualityScore\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateQualityScore\u003C/span>(report);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> report;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">analyzeTrends\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// This would analyze historical data if available\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">qualityImprovement\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">commonIssues\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getCommonIssues\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">fileGrowth\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getCommonIssues\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> issueCounter = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> [, result] \u003Cspan class=\"hljs-keyword\">of\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>) {\n            [...result.\u003Cspan class=\"hljs-property\">errors\u003C/span>, ...result.\u003Cspan class=\"hljs-property\">warnings\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\">const\u003C/span> count = issueCounter.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(issue.\u003Cspan class=\"hljs-property\">type\u003C/span>) || \u003Cspan class=\"hljs-number\">0\u003C/span>;\n                issueCounter.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(issue.\u003Cspan class=\"hljs-property\">type\u003C/span>, count + \u003Cspan class=\"hljs-number\">1\u003C/span>);\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(issueCounter.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>())\n            .\u003Cspan class=\"hljs-title function_\">sort\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[,a], [,b]\u003C/span>) =&gt;\u003C/span> b - a)\n            .\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">5\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[type, count]\u003C/span>) =&gt;\u003C/span> ({ type, count }));\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateRecommendations\u003C/span>(\u003Cspan class=\"hljs-params\">report\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> recommendations = [];\n        \n        \u003Cspan class=\"hljs-comment\">// Critical issues\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (report.\u003Cspan class=\"hljs-property\">categories\u003C/span>.\u003Cspan class=\"hljs-property\">critical\u003C/span>.\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;critical&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Fix Critical Syntax Errors&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${report.categories.critical.length}\u003C/span> files have critical syntax errors that prevent proper rendering`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Review and fix syntax errors in: &#x27;\u003C/span> + report.\u003Cspan class=\"hljs-property\">categories\u003C/span>.\u003Cspan class=\"hljs-property\">critical\u003C/span>.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;, &#x27;\u003C/span>)\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Quality recommendations\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> errorRate = (report.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalErrors\u003C/span> / report.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span>) * \u003Cspan class=\"hljs-number\">100\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (errorRate &gt; \u003Cspan class=\"hljs-number\">10\u003C/span>) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;High Error Rate Detected&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${errorRate.toFixed(\u003Cspan class=\"hljs-number\">1\u003C/span>)}\u003C/span>% error rate indicates systematic issues`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Review validation rules and provide team training&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Common issues\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> commonIssues = report.\u003Cspan class=\"hljs-property\">trends\u003C/span>.\u003Cspan class=\"hljs-property\">commonIssues\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (commonIssues.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> topIssue = commonIssues[\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\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Address Common Issues&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">`&quot;\u003Cspan class=\"hljs-subst\">${topIssue.type}\u003C/span>&quot; appears \u003Cspan class=\"hljs-subst\">${topIssue.count}\u003C/span> times across files`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">`Create documentation or linting rule to prevent \u003Cspan class=\"hljs-subst\">${topIssue.type}\u003C/span>`\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Performance recommendations\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (report.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">processingTime\u003C/span> &gt; \u003Cspan class=\"hljs-number\">30000\u003C/span>) { \u003Cspan class=\"hljs-comment\">// 30 seconds\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;low&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Consider Performance Optimization&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;QA process is taking longer than expected&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Enable parallel processing or optimize validation rules&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> recommendations;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">calculateQualityScore\u003C/span>(\u003Cspan class=\"hljs-params\">report\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> totalIssues = report.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalErrors\u003C/span> + report.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalWarnings\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> totalFiles = report.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (totalFiles === \u003Cspan class=\"hljs-number\">0\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-number\">100\u003C/span>;\n        \n        \u003Cspan class=\"hljs-comment\">// Base score calculation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> errorPenalty = (report.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalErrors\u003C/span> / totalFiles) * \u003Cspan class=\"hljs-number\">50\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> warningPenalty = (report.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalWarnings\u003C/span> / totalFiles) * \u003Cspan class=\"hljs-number\">25\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> baseScore = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">100\u003C/span> - errorPenalty - warningPenalty);\n        \n        \u003Cspan class=\"hljs-comment\">// Bonus for consistency\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> passedRatio = report.\u003Cspan class=\"hljs-property\">categories\u003C/span>.\u003Cspan class=\"hljs-property\">passed\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> / totalFiles;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> consistencyBonus = passedRatio * \u003Cspan class=\"hljs-number\">10\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">min\u003C/span>(\u003Cspan class=\"hljs-number\">100\u003C/span>, baseScore + consistencyBonus);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">saveResults\u003C/span>(\u003Cspan class=\"hljs-params\">report\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> outputDir = \u003Cspan class=\"hljs-string\">&#x27;./qa-results&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">mkdir\u003C/span>(outputDir, { \u003Cspan class=\"hljs-attr\">recursive\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> });\n        \n        \u003Cspan class=\"hljs-comment\">// Save main report\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> reportPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(outputDir, \u003Cspan class=\"hljs-string\">&#x27;markdown-qa-report.json&#x27;\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        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`QA report saved to \u003Cspan class=\"hljs-subst\">${reportPath}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Generate human-readable summary\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> summaryPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(outputDir, \u003Cspan class=\"hljs-string\">&#x27;qa-summary.md&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> summaryContent = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateMarkdownSummary\u003C/span>(report);\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">writeFile\u003C/span>(summaryPath, summaryContent);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`QA summary saved to \u003Cspan class=\"hljs-subst\">${summaryPath}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Generate CI-friendly output\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (process.\u003Cspan class=\"hljs-property\">env\u003C/span>.\u003Cspan class=\"hljs-property\">CI\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> ciReportPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(outputDir, \u003Cspan class=\"hljs-string\">&#x27;ci-report.txt&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> ciContent = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateCIReport\u003C/span>(report);\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">writeFile\u003C/span>(ciReportPath, ciContent);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateMarkdownSummary\u003C/span>(\u003Cspan class=\"hljs-params\">report\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> summary = [\n            \u003Cspan class=\"hljs-string\">&#x27;# Markdown Quality Assurance Report&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">`\\nGenerated: \u003Cspan class=\"hljs-subst\">${report.timestamp}\u003C/span>`\u003C/span>,\n            \u003Cspan class=\"hljs-string\">`\\n## Overall Quality Score: \u003Cspan class=\"hljs-subst\">${report.qualityScore.toFixed(\u003Cspan class=\"hljs-number\">1\u003C/span>)}\u003C/span>/100`\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;\\n## Summary Statistics&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">`- **Total Files**: \u003Cspan class=\"hljs-subst\">${report.summary.totalFiles}\u003C/span>`\u003C/span>,\n            \u003Cspan class=\"hljs-string\">`- **Valid Files**: \u003Cspan class=\"hljs-subst\">${report.summary.validFiles}\u003C/span>`\u003C/span>,\n            \u003Cspan class=\"hljs-string\">`- **Files with Errors**: \u003Cspan class=\"hljs-subst\">${report.categories.errors.length + report.categories.critical.length}\u003C/span>`\u003C/span>,\n            \u003Cspan class=\"hljs-string\">`- **Files with Warnings**: \u003Cspan class=\"hljs-subst\">${report.categories.warnings.length}\u003C/span>`\u003C/span>,\n            \u003Cspan class=\"hljs-string\">`- **Total Errors**: \u003Cspan class=\"hljs-subst\">${report.summary.totalErrors}\u003C/span>`\u003C/span>,\n            \u003Cspan class=\"hljs-string\">`- **Total Warnings**: \u003Cspan class=\"hljs-subst\">${report.summary.totalWarnings}\u003C/span>`\u003C/span>,\n            \u003Cspan class=\"hljs-string\">`- **Processing Time**: \u003Cspan class=\"hljs-subst\">${report.summary.processingTime}\u003C/span>ms`\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>\n        ];\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (report.\u003Cspan class=\"hljs-property\">categories\u003C/span>.\u003Cspan class=\"hljs-property\">critical\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;## 🚨 Critical Issues&#x27;\u003C/span>);\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;The following files have critical syntax errors:&#x27;\u003C/span>);\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n            report.\u003Cspan class=\"hljs-property\">categories\u003C/span>.\u003Cspan class=\"hljs-property\">critical\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">file\u003C/span> =&gt;\u003C/span> {\n                summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`- \u003Cspan class=\"hljs-subst\">${file}\u003C/span>`\u003C/span>);\n            });\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (report.\u003Cspan class=\"hljs-property\">recommendations\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;## 📋 Recommendations&#x27;\u003C/span>);\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n            report.\u003Cspan class=\"hljs-property\">recommendations\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">rec, index\u003C/span>) =&gt;\u003C/span> {\n                summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`### \u003Cspan class=\"hljs-subst\">${index + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>. \u003Cspan class=\"hljs-subst\">${rec.title}\u003C/span> (\u003Cspan class=\"hljs-subst\">${rec.priority}\u003C/span>)`\u003C/span>);\n                summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${rec.description}\u003C/span>`\u003C/span>);\n                summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`**Action**: \u003Cspan class=\"hljs-subst\">${rec.action}\u003C/span>`\u003C/span>);\n                summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (report.\u003Cspan class=\"hljs-property\">trends\u003C/span>.\u003Cspan class=\"hljs-property\">commonIssues\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;## 📊 Common Issues&#x27;\u003C/span>);\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;| Issue Type | Occurrences |&#x27;\u003C/span>);\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|------------|-------------|&#x27;\u003C/span>);\n            report.\u003Cspan class=\"hljs-property\">trends\u003C/span>.\u003Cspan class=\"hljs-property\">commonIssues\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                summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`| \u003Cspan class=\"hljs-subst\">${issue.type}\u003C/span> | \u003Cspan class=\"hljs-subst\">${issue.count}\u003C/span> |`\u003C/span>);\n            });\n            summary.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> summary.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateCIReport\u003C/span>(\u003Cspan class=\"hljs-params\">report\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = [];\n        lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Quality Score: \u003Cspan class=\"hljs-subst\">${report.qualityScore.toFixed(\u003Cspan class=\"hljs-number\">1\u003C/span>)}\u003C/span>/100`\u003C/span>);\n        lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Files: \u003Cspan class=\"hljs-subst\">${report.summary.validFiles}\u003C/span>/\u003Cspan class=\"hljs-subst\">${report.summary.totalFiles}\u003C/span> passed`\u003C/span>);\n        lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`Issues: \u003Cspan class=\"hljs-subst\">${report.summary.totalErrors}\u003C/span> errors, \u003Cspan class=\"hljs-subst\">${report.summary.totalWarnings}\u003C/span> warnings`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (report.\u003Cspan class=\"hljs-property\">categories\u003C/span>.\u003Cspan class=\"hljs-property\">critical\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`\\nCRITICAL ISSUES (\u003Cspan class=\"hljs-subst\">${report.categories.critical.length}\u003C/span>):`\u003C/span>);\n            report.\u003Cspan class=\"hljs-property\">categories\u003C/span>.\u003Cspan class=\"hljs-property\">critical\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">file\u003C/span> =&gt;\u003C/span> {\n                lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">`  - \u003Cspan class=\"hljs-subst\">${file}\u003C/span>`\u003C/span>);\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> lines.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n    }\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">MarkdownQASystem\u003C/span>;\n\u003C/code>\u003C/pre>\u003Ch2 id=\"integration-with-development-workflows\">Integration with Development Workflows\u003C/h2>\n\u003Cp>Syntax validation systems integrate seamlessly with comprehensive development workflows. When combined with \u003Ca href=\"/blog/markdown-automation-workflows-complete-guide\">automation systems and CI/CD integration\u003C/a>, validation becomes part of the continuous development process, ensuring content quality is maintained as documentation scales and multiple contributors collaborate on content creation.\u003C/p>\n\u003Cp>For sophisticated content management, validation works effectively with \u003Ca href=\"/blog/markdown-version-control-git-integration-complete-guide\">version control and collaborative workflows\u003C/a> to provide pre-commit hooks and pull request validation, preventing syntax errors from entering the main documentation branch while maintaining collaborative efficiency.\u003C/p>\n\u003Cp>When building comprehensive documentation architectures, syntax validation complements \u003Ca href=\"/blog/markdown-performance-optimization-rendering-speed-guide\">performance optimization systems\u003C/a> by ensuring that validation processes don&#39;t become bottlenecks in content processing pipelines, implementing efficient validation algorithms that scale with large documentation repositories.\u003C/p>\n\u003Ch3 id=\"git-hooks-integration\">Git Hooks Integration\u003C/h3>\n\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-meta\">#!/bin/bash\u003C/span>\n\u003Cspan class=\"hljs-comment\"># .git/hooks/pre-commit - Git hook for markdown validation\u003C/span>\n\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;🔍 Running Markdown validation on staged files...&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Get staged markdown files\u003C/span>\nstaged_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_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 to validate&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-comment\"># Run validation on staged files\u003C/span>\nvalidation_failed=\u003Cspan class=\"hljs-literal\">false\u003C/span>\n\u003Cspan class=\"hljs-keyword\">for\u003C/span> file \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-variable\">$staged_files\u003C/span>; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Validating: \u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Run markdown validator\u003C/span>\n    node scripts/validate-markdown.js \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [ $? -ne 0 ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        validation_failed=\u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\u003Cspan class=\"hljs-keyword\">done\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Check overall result\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$validation_failed\u003C/span>&quot;\u003C/span> = \u003Cspan class=\"hljs-literal\">true\u003C/span> ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;❌ Markdown validation failed. Please fix errors before committing.&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Run &#x27;npm run lint:markdown&#x27; to see detailed error reports.&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">exit\u003C/span> 1\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✅ All Markdown files passed validation&quot;\u003C/span>\n\u003Cspan class=\"hljs-built_in\">exit\u003C/span> 0\n\u003C/code>\u003C/pre>\u003Ch3 id=\"cicd-pipeline-integration\">CI/CD Pipeline Integration\u003C/h3>\n\u003Cpre>\u003Ccode class=\"hljs language-yaml\">\u003Cspan class=\"hljs-comment\"># .github/workflows/markdown-quality.yml - CI validation pipeline\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\">Check\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">on:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">push:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">branches:\u003C/span> [ \u003Cspan class=\"hljs-string\">main\u003C/span>, \u003Cspan class=\"hljs-string\">develop\u003C/span> ]\n    \u003Cspan class=\"hljs-attr\">paths:\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\">branches:\u003C/span> [ \u003Cspan class=\"hljs-string\">main\u003C/span>, \u003Cspan class=\"hljs-string\">develop\u003C/span> ]\n    \u003Cspan class=\"hljs-attr\">paths:\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-quality:\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\">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\">npm\u003C/span> \u003Cspan class=\"hljs-string\">ci\u003C/span>\n    \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        npm run validate:markdown\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\">linting\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        npm run lint:markdown\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">quality\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\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        node scripts/generate-quality-report.js\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\">quality\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@v3\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">markdown-quality-report\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">qa-results/\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@v6\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\u003C/span>          \n          \u003Cspan class=\"hljs-string\">try\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(fs.readFileSync(&#x27;qa-results/markdown-qa-report.json&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>\u003Cspan class=\"hljs-string\">));\u003C/span>\n            \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>\n            \u003Cspan class=\"hljs-comment\">## 📝 Markdown Quality Report\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">**Quality\u003C/span> \u003Cspan class=\"hljs-string\">Score**:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.qualityScore.toFixed(1)\u003C/span>}\u003Cspan class=\"hljs-string\">/100\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\">### Summary\u003C/span>\n            \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">Files processed:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.summary.totalFiles\u003C/span>}\n            \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">Valid files:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.summary.validFiles\u003C/span>}\n            \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">Total errors:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.summary.totalErrors\u003C/span>}\n            \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">Total warnings:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.summary.totalWarnings\u003C/span>}\n            \n            \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.categories.critical.length\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-string\">?\u003C/span> \n              \u003Cspan class=\"hljs-string\">`###\u003C/span> \u003Cspan class=\"hljs-string\">🚨\u003C/span> \u003Cspan class=\"hljs-string\">Critical\u003C/span> \u003Cspan class=\"hljs-string\">Issues\\n$\u003C/span>{\u003Cspan class=\"hljs-string\">report.categories.critical.map(f\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">f\u003C/span>}\u003Cspan class=\"hljs-string\">`).join(&#x27;\\n&#x27;)\u003C/span>}\u003Cspan class=\"hljs-string\">\\n`\u003C/span> \u003Cspan class=\"hljs-string\">:\u003C/span> \n              \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\n            \n            \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.recommendations.length\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-string\">?\u003C/span> \n              \u003Cspan class=\"hljs-string\">`###\u003C/span> \u003Cspan class=\"hljs-string\">Recommendations\\n$\u003C/span>{\u003Cspan class=\"hljs-string\">report.recommendations.slice(0\u003C/span>, \u003Cspan class=\"hljs-number\">3\u003C/span>\u003Cspan class=\"hljs-string\">).map(r\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-string\">**$\u003C/span>{\u003Cspan class=\"hljs-string\">r.title\u003C/span>}\u003Cspan class=\"hljs-string\">**:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">r.description\u003C/span>}\u003Cspan class=\"hljs-string\">`).join(&#x27;\\n&#x27;)\u003C/span>}\u003Cspan class=\"hljs-string\">\\n`\u003C/span> \u003Cspan class=\"hljs-string\">:\u003C/span> \n              \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\n            \n            \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">report.qualityScore\u003C/span> \u003Cspan class=\"hljs-string\">&gt;=\u003C/span> \u003Cspan class=\"hljs-number\">90\u003C/span> \u003Cspan class=\"hljs-string\">?\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;✅ Excellent quality!&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">:\u003C/span> \n              \u003Cspan class=\"hljs-string\">report.qualityScore\u003C/span> \u003Cspan class=\"hljs-string\">&gt;=\u003C/span> \u003Cspan class=\"hljs-number\">70\u003C/span> \u003Cspan class=\"hljs-string\">?\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;⚠️ Good quality with room for improvement&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">:\u003C/span>\n              \u003Cspan class=\"hljs-string\">&#x27;❌ Quality improvements needed&#x27;\u003C/span>}\n            \u003Cspan class=\"hljs-string\">`;\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          } \u003Cspan class=\"hljs-string\">catch\u003C/span> \u003Cspan class=\"hljs-string\">(error)\u003C/span> {\n            \u003Cspan class=\"hljs-string\">console.error(&#x27;Failed\u003C/span> \u003Cspan class=\"hljs-string\">to\u003C/span> \u003Cspan class=\"hljs-string\">post\u003C/span> \u003Cspan class=\"hljs-string\">quality\u003C/span> \u003Cspan class=\"hljs-string\">report:&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">error);\u003C/span>\n          }\n\u003C/code>\u003C/pre>\u003Ch2 id=\"troubleshooting-common-validation-issues\">Troubleshooting Common Validation Issues\u003C/h2>\n\u003Ch3 id=\"performance-optimization-for-large-repositories\">Performance Optimization for Large Repositories\u003C/h3>\n\u003Cp>\u003Cstrong>Problem\u003C/strong>: Slow validation of large documentation repositories\u003C/p>\n\u003Cp>\u003Cstrong>Solution\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// optimized-validator.js - Performance-optimized validation\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">OptimizedValidator\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        \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        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fileHashes\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_\">validateFileWithCaching\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\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>(filePath);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> currentHash = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateFileHash\u003C/span>(filePath, stats.\u003Cspan class=\"hljs-property\">mtime\u003C/span>);\n            \n            \u003Cspan class=\"hljs-comment\">// Check if file hasn&#x27;t changed since last validation\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fileHashes\u003C/span>.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(filePath) &amp;&amp; \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fileHashes\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(filePath) === currentHash &amp;&amp;\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">cache\u003C/span>.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(filePath)) {\n                \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>(filePath);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Validate file and cache result\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateFile\u003C/span>(filePath);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">cache\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(filePath, result);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fileHashes\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(filePath, currentHash);\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> result;\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">`Validation failed for \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>:`\u003C/span>, error);\n            \u003Cspan class=\"hljs-keyword\">throw\u003C/span> error;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateFileHash\u003C/span>(\u003Cspan class=\"hljs-params\">filePath, mtime\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> crypto = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;crypto&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> crypto.\u003Cspan class=\"hljs-title function_\">createHash\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;md5&#x27;\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">update\u003C/span>(filePath + mtime.\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>())\n            .\u003Cspan class=\"hljs-title function_\">digest\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;hex&#x27;\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-comment\">// Batch validation with worker threads\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateFilesBatch\u003C/span>(\u003Cspan class=\"hljs-params\">files, batchSize = \u003Cspan class=\"hljs-number\">10\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> results = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \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; files.\u003Cspan class=\"hljs-property\">length\u003C/span>; i += batchSize) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> batch = files.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(i, i + batchSize);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> batchPromises = batch.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">file\u003C/span> =&gt;\u003C/span> \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateFileWithCaching\u003C/span>(file)\n                    .\u003Cspan class=\"hljs-title function_\">then\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">result\u003C/span> =&gt;\u003C/span> ({ file, result }))\n                    .\u003Cspan class=\"hljs-title function_\">catch\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">error\u003C/span> =&gt;\u003C/span> ({ file, error }))\n            );\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> batchResults = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>.\u003Cspan class=\"hljs-title function_\">all\u003C/span>(batchPromises);\n            batchResults.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">{ file, result, error }\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (error) {\n                    results.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(file, { \u003Cspan class=\"hljs-attr\">valid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>, \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span> });\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    results.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(file, result);\n                }\n            });\n            \n            \u003Cspan class=\"hljs-comment\">// Progress reporting\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Processed \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-built_in\">Math\u003C/span>.min(i + batchSize, files.length)}\u003C/span>/\u003Cspan class=\"hljs-subst\">${files.length}\u003C/span> files`\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> results;\n    }\n}\n\u003C/code>\u003C/pre>\u003Cp>\u003Cstrong>Problem\u003C/strong>: False positives from overly strict validation rules\u003C/p>\n\u003Cp>\u003Cstrong>Solution\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// Configure validation rules based on content type\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">ContextAwareValidator\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        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">contextRules\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-title function_\">setupContextualRules\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">setupContextualRules\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Different rules for different file types\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">contextRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;README.md&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">requireFrontmatter\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxLineLength\u003C/span>: \u003Cspan class=\"hljs-number\">80\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">allowLongLines\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">contextRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;blog&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">requireFrontmatter\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">strictHeaders\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxLineLength\u003C/span>: \u003Cspan class=\"hljs-number\">120\u003C/span>\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">contextRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;api-docs&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">requireCodeLanguages\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">validateCodeSyntax\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">strictTables\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">determineContext\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fileName = path.\u003Cspan class=\"hljs-title function_\">basename\u003C/span>(filePath);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> dirName = path.\u003Cspan class=\"hljs-title function_\">dirname\u003C/span>(filePath);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fileName === \u003Cspan class=\"hljs-string\">&#x27;README.md&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;README.md&#x27;\u003C/span>;\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (dirName.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;blog&#x27;\u003C/span>) || dirName.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;posts&#x27;\u003C/span>)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;blog&#x27;\u003C/span>;\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (dirName.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;api&#x27;\u003C/span>)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;api-docs&#x27;\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;default&#x27;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateContent\u003C/span>(\u003Cspan class=\"hljs-params\">content, context = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fileContext = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">determineContext\u003C/span>(context.\u003Cspan class=\"hljs-property\">filePath\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> contextRules = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">contextRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(fileContext) || {};\n        \n        \u003Cspan class=\"hljs-comment\">// Temporarily modify options based on context\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> originalOptions = { ...\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span> };\n        \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">assign\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>, contextRules);\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">super\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateContent\u003C/span>(content, context);\n        } \u003Cspan class=\"hljs-keyword\">finally\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Restore original options\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span> = originalOptions;\n        }\n    }\n}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Comprehensive Markdown syntax validation and error detection represent essential components of professional documentation quality assurance that ensure consistent, error-free content across large-scale documentation systems while supporting collaborative development workflows and maintaining high standards of technical accuracy. By implementing robust validation frameworks with intelligent error detection algorithms and automated quality assurance processes, technical teams can prevent common syntax errors from reaching production while enabling efficient content creation and maintenance workflows.\u003C/p>\n\u003Cp>The key to successful validation lies in balancing comprehensive error detection with practical usability, implementing contextual validation rules that adapt to different content types, and integrating validation seamlessly into existing development workflows without creating friction for content contributors. Whether you&#39;re building static documentation sites, collaborative wikis, or large-scale technical documentation platforms, the validation techniques covered in this guide provide the foundation for maintaining professional quality standards that enhance reader experience and content reliability.\u003C/p>\n\u003Cp>Remember to configure validation rules appropriately for your team&#39;s needs, implement caching strategies for large repositories to maintain performance, and continuously refine your validation criteria based on real-world usage patterns and contributor feedback. With proper implementation of advanced syntax validation and error detection systems, your Markdown documentation can achieve the consistency and quality that modern technical teams require for effective knowledge management and communication.\u003C/p>\n",[15,19,22,25,28],{"id":16,"text":17,"level":18},"why-implement-markdown-validation","Why Implement Markdown Validation?",2,{"id":20,"text":21,"level":18},"foundation-validation-techniques","Foundation Validation Techniques",{"id":23,"text":24,"level":18},"integration-with-development-workflows","Integration with Development Workflows",{"id":26,"text":27,"level":18},"troubleshooting-common-validation-issues","Troubleshooting Common Validation Issues",{"id":29,"text":30,"level":18},"conclusion","Conclusion",[],[33,41,49],{"slug":34,"title":35,"description":36,"excerpt":37,"date":38,"category":9,"author":10,"keywords":39,"readingMinutes":40},"markdown-code-block-validation-error-detection-complete-guide","Markdown Code Block Validation and Error Detection: Complete Guide for Automated Quality Assurance and Syntax Verification","Master advanced Markdown code block validation techniques for automated syntax checking, error detection, and quality assurance. Learn to build comprehensive validation systems that ensure code accuracy and prevent documentation errors.","Advanced Markdown code block validation and error detection systems enable automated quality assurance for technical documentation, ensuring code examples remain accurate, executable, and properly…","2025-10-22","markdown code validation, code block syntax checking, markdown error detection, code block validation tools, automated markdown testing, syntax verification markdown, code block quality assurance, markdown lint tools",28,{"slug":42,"title":43,"description":44,"excerpt":45,"date":46,"category":9,"author":10,"keywords":47,"readingMinutes":48},"markdown-debugging-error-detection-complete-guide","Markdown Debugging and Error Detection: Complete Guide for Troubleshooting Syntax Issues and Validation Problems","Master Markdown debugging techniques including syntax error detection, validation tools, common formatting problems, and automated error checking. Learn troubleshooting strategies for complex Markdown issues and parser inconsistencies.","Markdown debugging and error detection transforms frustrating formatting failures into systematic troubleshooting workflows that identify syntax issues, parser inconsistencies, and validation…","2026-01-08","markdown debugging, markdown validation, markdown error detection, markdown syntax errors, markdown troubleshooting, markdown parser issues, markdown linting, markdown quality assurance",26,{"slug":50,"title":51,"description":52,"excerpt":53,"date":54,"category":9,"author":10,"keywords":55,"readingMinutes":48},"markdown-table-data-validation-and-quality-assurance-complete-guide","Markdown Table Data Validation and Quality Assurance: Complete Guide for Automated Testing and Error Detection in Tabular Content","Master comprehensive data validation techniques for Markdown tables, implementing automated quality assurance, error detection systems, and data integrity checks for reliable tabular content management.","Advanced Markdown table data validation and quality assurance techniques enable systematic verification of tabular content accuracy, structural integrity, and formatting consistency across…","2025-12-18","markdown table validation, table data quality, automated table testing, markdown table errors, data validation markdown, table quality assurance, markdown table integrity, tabular data validation",1792184942658]