[{"data":1,"prerenderedAt":63},["Reactive",2],{"blog-post-markdown-error-handling-validation-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":37,"related":38},"markdown-error-handling-validation-complete-guide","Markdown Error Handling and Validation: Complete Guide for Content Quality Assurance and Automated Checking","Master Markdown error handling, validation techniques, and automated quality assurance. Learn syntax checking, link validation, content linting, and comprehensive testing strategies for robust Markdown workflows.","Markdown error handling and validation techniques enable content teams to maintain high-quality documentation through automated quality assurance processes that catch syntax errors, validate…","2025-12-04","Tutorial","Matthew Rathbone","markdown validation, markdown error handling, markdown linting, content quality assurance, markdown syntax checking, automated markdown testing, markdown workflow validation",28,"\u003Cp>Markdown error handling and validation techniques enable content teams to maintain high-quality documentation through automated quality assurance processes that catch syntax errors, validate links, enforce style guidelines, and ensure consistent formatting across large-scale content repositories. By implementing comprehensive validation workflows, syntax checking systems, and error prevention strategies, technical writers can build robust content pipelines that prevent publishing errors while maintaining editorial efficiency and collaborative workflows.\u003C/p>\n\u003Ch2 id=\"why-master-markdown-error-handling-and-validation\">Why Master Markdown Error Handling and Validation?\u003C/h2>\n\u003Cp>Professional content validation provides essential benefits for technical documentation teams:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Quality Assurance\u003C/strong>: Automated validation prevents syntax errors and formatting inconsistencies\u003C/li>\n\u003Cli>\u003Cstrong>Team Collaboration\u003C/strong>: Consistent validation standards improve multi-author workflows\u003C/li>\n\u003Cli>\u003Cstrong>Publishing Reliability\u003C/strong>: Pre-publication checking ensures error-free content delivery\u003C/li>\n\u003Cli>\u003Cstrong>Maintenance Efficiency\u003C/strong>: Early error detection reduces long-term content maintenance costs\u003C/li>\n\u003Cli>\u003Cstrong>User Experience\u003C/strong>: Validated content renders consistently across platforms and devices\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"foundation-validation-principles\">Foundation Validation Principles\u003C/h2>\n\u003Ch3 id=\"understanding-common-markdown-errors\">Understanding Common Markdown Errors\u003C/h3>\n\u003Cp>Identifying and categorizing the most frequent Markdown syntax and formatting issues:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\"># Common Markdown Error Patterns\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## Syntax Errors\u003C/span>\n\n\u003Cspan class=\"hljs-section\">### Malformed Headers\u003C/span>\n❌ \u003Cspan class=\"hljs-strong\">**Incorrect**\u003C/span>: Missing space after hash\n\u003Cspan class=\"hljs-section\">#Header Without Space\u003C/span>\n\u003Cspan class=\"hljs-section\">##Another Malformed Header\u003C/span>\n\n✅ \u003Cspan class=\"hljs-strong\">**Correct**\u003C/span>: Proper spacing and consistency\n\u003Cspan class=\"hljs-section\"># Header With Proper Space\u003C/span>\n\u003Cspan class=\"hljs-section\">## Properly Formatted Subheader\u003C/span>\n\n\u003Cspan class=\"hljs-section\">### Broken Link Syntax\u003C/span>\n❌ \u003Cspan class=\"hljs-strong\">**Incorrect**\u003C/span>: Malformed link structures\n[Broken link(https://example.com)\n[Another broken](https://example.com\n[\u003Cspan class=\"hljs-string\">Missing URL\u003C/span>](\u003Cspan class=\"hljs-link\">\u003C/span>)\n\n✅ \u003Cspan class=\"hljs-strong\">**Correct**\u003C/span>: Well-formed link syntax\n[\u003Cspan class=\"hljs-string\">Proper link\u003C/span>](\u003Cspan class=\"hljs-link\">https://example.com\u003C/span>)\n[\u003Cspan class=\"hljs-string\">Internal link\u003C/span>](\u003Cspan class=\"hljs-link\">#section-anchor\u003C/span>)\n[\u003Cspan class=\"hljs-string\">Reference link\u003C/span>][\u003Cspan class=\"hljs-symbol\">ref-id\u003C/span>]\n\n[\u003Cspan class=\"hljs-symbol\">ref-id\u003C/span>]: \u003Cspan class=\"hljs-link\">https://example.com &quot;Reference title&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-section\">### Inconsistent List Formatting\u003C/span>\n❌ \u003Cspan class=\"hljs-strong\">**Incorrect**\u003C/span>: Mixed indentation and markers\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> First item\n\u003Cspan class=\"hljs-bullet\">*\u003C/span> Second item with different marker\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> Inconsistent indentation\n\u003Cspan class=\"hljs-bullet\">    *\u003C/span> Yet another marker type\n\n✅ \u003Cspan class=\"hljs-strong\">**Correct**\u003C/span>: Consistent formatting\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> First item\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> Second item with same marker\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> Proper nested indentation\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> Another nested item with consistency\n\n\u003Cspan class=\"hljs-section\">### Code Block Issues\u003C/span>\n❌ \u003Cspan class=\"hljs-strong\">**Incorrect**\u003C/span>: Unterminated code blocks\n\u003Cspan class=\"hljs-code\">```javascript\nfunction example() {\n    return &quot;missing closing backticks&quot;;\n\n❌ **Incorrect**: Wrong language specification\n```\u003C/span>javascritp\nfunction example() {\n\u003Cspan class=\"hljs-code\">    return &quot;typo in language&quot;;\n}\u003C/span>\n\u003C/code>\u003C/pre>\u003Cp>✅ \u003Cstrong>Correct\u003C/strong>: Proper code block formatting\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-keyword\">function\u003C/span> \u003Cspan class=\"hljs-title function_\">example\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n    \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&quot;properly formatted&quot;\u003C/span>;\n}\n\u003C/code>\u003C/pre>\u003Ch3 id=\"nested-formatting-problems\">Nested Formatting Problems\u003C/h3>\n\u003Cp>❌ \u003Cstrong>Incorrect\u003C/strong>: Improperly nested elements\u003C/p>\n\u003Col>\n\u003Cli>First item\u003Cul>\n\u003Cli>Nested bullet\u003C/li>\n\u003C/ul>\n\u003C/li>\n\u003Cli>Second item\u003C/li>\n\u003Cli>Wrong nested numbering\u003Cbr>- Mixed nesting patterns\u003C/li>\n\u003C/ol>\n\u003Cp>✅ \u003Cstrong>Correct\u003C/strong>: Consistent nested structure\u003C/p>\n\u003Col>\n\u003Cli>First item\u003Cul>\n\u003Cli>Properly nested bullet\u003C/li>\n\u003Cli>Another nested item\u003C/li>\n\u003C/ul>\n\u003C/li>\n\u003Cli>Second item\u003Col>\n\u003Cli>Correct nested numbering\u003C/li>\n\u003Cli>Consistent indentation patterns\u003C/li>\n\u003C/ol>\n\u003C/li>\n\u003C/ol>\n\u003Cpre>\u003Ccode>\n### Content Structure Validation\n\nImplementing systematic approaches to document structure validation:\n\n```markdown\n# Document Structure Validation Patterns\n\n## Heading Hierarchy Validation\n\n### Proper Heading Sequence\n✅ **Correct**: Logical heading progression\n# Document Title (H1)\n## Major Section (H2)\n### Subsection (H3)\n#### Detail Level (H4)\n\n❌ **Incorrect**: Skipped heading levels\n# Document Title (H1)\n### Subsection (H3) ← Skips H2\n##### Detail (H5) ← Skips H4\n\n### Duplicate Heading Detection\n❌ **Problematic**: Duplicate headings create anchor conflicts\n## Getting Started\n[Content here]\n\n## Getting Started ← Duplicate heading\n[More content]\n\n✅ **Solution**: Unique, descriptive headings\n## Getting Started with Installation\n[Content here]\n\n## Getting Started with Configuration\n[Different content]\n\n## Table Structure Validation\n\n### Complete Table Formatting\n✅ **Correct**: Well-formed table structure\n| **Column 1** | **Column 2** | **Column 3** |\n|:-------------|:------------:|-------------:|\n| Left-aligned | Centered | Right-aligned |\n| Data row 1 | Data row 1 | Data row 1 |\n| Data row 2 | Data row 2 | Data row 2 |\n\n❌ **Incorrect**: Malformed table structure\n| Column 1 | Column 2 | Column 3\n|----------|----------|  ← Missing final pipe\n| Data | Missing cell  ← Incomplete row\n| Too many | cells | here | extra | ← Too many cells\n\n### Table Alignment Consistency\n❌ **Inconsistent**: Mixed alignment patterns\n| Item | Price | Description |\n|------|------:|:------------|  ← Mixed separator styles\n| Widget | $10 | Good widget |\n|Gadget|$20|Great gadget|  ← Inconsistent spacing\n\n✅ **Consistent**: Uniform alignment and spacing\n| **Item** | **Price** | **Description** |\n|:---------|----------:|:----------------|\n| Widget   | $10       | Good widget     |\n| Gadget   | $20       | Great gadget    |\n\u003C/code>\u003C/pre>\u003Ch2 id=\"automated-validation-systems\">Automated Validation Systems\u003C/h2>\n\u003Ch3 id=\"comprehensive-linting-configuration\">Comprehensive Linting Configuration\u003C/h3>\n\u003Cp>Building robust automated validation systems for Markdown content:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// markdown-validator.js - Comprehensive 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\u003Cspan class=\"hljs-keyword\">const\u003C/span> yaml = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;js-yaml&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> markdownIt = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;markdown-it&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> markdownLint = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;markdownlint&#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\">config\u003C/span> = {\n            \u003Cspan class=\"hljs-comment\">// Validation rules configuration\u003C/span>\n            \u003Cspan class=\"hljs-attr\">rules\u003C/span>: {\n                \u003Cspan class=\"hljs-comment\">// Heading validation\u003C/span>\n                \u003Cspan class=\"hljs-attr\">headings\u003C/span>: {\n                    \u003Cspan class=\"hljs-attr\">enforceHierarchy\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">requireH1\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">noDuplicates\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">maxLength\u003C/span>: \u003Cspan class=\"hljs-number\">60\u003C/span>\n                },\n                \n                \u003Cspan class=\"hljs-comment\">// Link validation  \u003C/span>\n                \u003Cspan class=\"hljs-attr\">links\u003C/span>: {\n                    \u003Cspan class=\"hljs-attr\">checkInternal\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">checkExternal\u003C/span>: options.\u003Cspan class=\"hljs-property\">checkExternalLinks\u003C/span> || \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">allowedDomains\u003C/span>: options.\u003Cspan class=\"hljs-property\">allowedDomains\u003C/span> || [],\n                    \u003Cspan class=\"hljs-attr\">timeout\u003C/span>: options.\u003Cspan class=\"hljs-property\">linkTimeout\u003C/span> || \u003Cspan class=\"hljs-number\">5000\u003C/span>\n                },\n                \n                \u003Cspan class=\"hljs-comment\">// Content validation\u003C/span>\n                \u003Cspan class=\"hljs-attr\">content\u003C/span>: {\n                    \u003Cspan class=\"hljs-attr\">enforceLineLength\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>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">validateCodeBlocks\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">checkImageAltText\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n                },\n                \n                \u003Cspan class=\"hljs-comment\">// Table validation\u003C/span>\n                \u003Cspan class=\"hljs-attr\">tables\u003C/span>: {\n                    \u003Cspan class=\"hljs-attr\">requireHeaders\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">enforceAlignment\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">validateStructure\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n                },\n                \n                \u003Cspan class=\"hljs-comment\">// List validation\u003C/span>\n                \u003Cspan class=\"hljs-attr\">lists\u003C/span>: {\n                    \u003Cspan class=\"hljs-attr\">consistentMarkers\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">properIndentation\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">validateNesting\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n                }\n            },\n            \n            \u003Cspan class=\"hljs-comment\">// Custom validation patterns\u003C/span>\n            \u003Cspan class=\"hljs-attr\">customRules\u003C/span>: options.\u003Cspan class=\"hljs-property\">customRules\u003C/span> || {},\n            \n            \u003Cspan class=\"hljs-comment\">// Output configuration\u003C/span>\n            \u003Cspan class=\"hljs-attr\">output\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">format\u003C/span>: options.\u003Cspan class=\"hljs-property\">outputFormat\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;detailed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">saveReport\u003C/span>: options.\u003Cspan class=\"hljs-property\">saveReport\u003C/span> || \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">reportPath\u003C/span>: options.\u003Cspan class=\"hljs-property\">reportPath\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;./validation-report.json&#x27;\u003C/span>\n            }\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Initialize Markdown parser\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">md\u003C/span> = \u003Cspan class=\"hljs-title function_\">markdownIt\u003C/span>({\n            \u003Cspan class=\"hljs-attr\">html\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">breaks\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">linkify\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Validation results storage\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">files\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">totalFiles\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">filesWithErrors\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            }\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Error tracking\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errorTypes\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_\">validateDirectory\u003C/span>(\u003Cspan class=\"hljs-params\">directoryPath, options = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`🔍 Starting validation of directory: \u003Cspan class=\"hljs-subst\">${directoryPath}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> files = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">findMarkdownFiles\u003C/span>(directoryPath, options.\u003Cspan class=\"hljs-property\">recursive\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span> = files.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`📁 Found \u003Cspan class=\"hljs-subst\">${files.length}\u003C/span> Markdown files to validate`\u003C/span>);\n            \n            \u003Cspan class=\"hljs-comment\">// Validate files in parallel with concurrency limit\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> concurrency = options.\u003Cspan class=\"hljs-property\">concurrency\u003C/span> || \u003Cspan class=\"hljs-number\">5\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, concurrency);\n            \n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> chunk \u003Cspan class=\"hljs-keyword\">of\u003C/span> chunks) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>.\u003Cspan class=\"hljs-title function_\">all\u003C/span>(\n                    chunk.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">file\u003C/span> =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateFile\u003C/span>(file))\n                );\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Generate summary\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateSummary\u003C/span>();\n            \n            \u003Cspan class=\"hljs-comment\">// Save report if configured\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">output\u003C/span>.\u003Cspan class=\"hljs-property\">saveReport\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">saveValidationReport\u003C/span>();\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\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\">&#x27;❌ Validation failed:&#x27;\u003C/span>, error.\u003Cspan class=\"hljs-property\">message\u003C/span>);\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_\">validateFile\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`📝 Validating: \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fileResult = {\n            \u003Cspan class=\"hljs-attr\">path\u003C/span>: filePath,\n            \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">info\u003C/span>: {},\n            \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> content = \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">readFile\u003C/span>(filePath, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> relativePath = path.\u003Cspan class=\"hljs-title function_\">relative\u003C/span>(process.\u003Cspan class=\"hljs-title function_\">cwd\u003C/span>(), filePath);\n            \n            \u003Cspan class=\"hljs-comment\">// Parse frontmatter and content\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> { frontmatter, markdown } = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">parseFrontmatter\u003C/span>(content);\n            \n            \u003Cspan class=\"hljs-comment\">// Store file info\u003C/span>\n            fileResult.\u003Cspan class=\"hljs-property\">info\u003C/span> = {\n                \u003Cspan class=\"hljs-attr\">size\u003C/span>: content.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">lines\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">words\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">countWords\u003C/span>(markdown),\n                \u003Cspan class=\"hljs-attr\">frontmatter\u003C/span>: frontmatter\n            };\n            \n            \u003Cspan class=\"hljs-comment\">// Run validation checks\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateSyntax\u003C/span>(fileResult, content, markdown);\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateStructure\u003C/span>(fileResult, markdown);\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateContent\u003C/span>(fileResult, markdown, frontmatter);\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateLinks\u003C/span>(fileResult, markdown, filePath);\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateImages\u003C/span>(fileResult, markdown, filePath);\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateCodeBlocks\u003C/span>(fileResult, markdown);\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateTables\u003C/span>(fileResult, markdown);\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateLists\u003C/span>(fileResult, markdown);\n            \n            \u003Cspan class=\"hljs-comment\">// Apply custom validation rules\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">keys\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">customRules\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">applyCustomRules\u003C/span>(fileResult, content, markdown);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Determine overall validity\u003C/span>\n            fileResult.\u003Cspan class=\"hljs-property\">isValid\u003C/span> = fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!fileResult.\u003Cspan class=\"hljs-property\">isValid\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">filesWithErrors\u003C/span>++;\n            }\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalErrors\u003C/span> += fileResult.\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\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalWarnings\u003C/span> += fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \n            \u003Cspan class=\"hljs-comment\">// Track error types for summary\u003C/span>\n            fileResult.\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-keyword\">const\u003C/span> count = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errorTypes\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(error.\u003Cspan class=\"hljs-property\">type\u003C/span>) || \u003Cspan class=\"hljs-number\">0\u003C/span>;\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errorTypes\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(error.\u003Cspan class=\"hljs-property\">type\u003C/span>, count + \u003Cspan class=\"hljs-number\">1\u003C/span>);\n            });\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;file_error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Failed to process file: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>\n            });\n            fileResult.\u003Cspan class=\"hljs-property\">isValid\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">filesWithErrors\u003C/span>++;\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalErrors\u003C/span>++;\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">files\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(fileResult);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> fileResult;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateSyntax\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, content, markdown\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Use markdownlint for basic syntax validation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lintConfig = {\n            \u003Cspan class=\"hljs-string\">&#x27;default&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;MD013&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>, \u003Cspan class=\"hljs-comment\">// Line length handled separately\u003C/span>\n            \u003Cspan class=\"hljs-string\">&#x27;MD033&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>, \u003Cspan class=\"hljs-comment\">// Allow HTML\u003C/span>\n            \u003Cspan class=\"hljs-string\">&#x27;MD041&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">headings\u003C/span>.\u003Cspan class=\"hljs-property\">requireH1\u003C/span>\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> lintResults = markdownLint.\u003Cspan class=\"hljs-title function_\">sync\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">strings\u003C/span>: {\n                    [fileResult.\u003Cspan class=\"hljs-property\">path\u003C/span>]: content\n                },\n                \u003Cspan class=\"hljs-attr\">config\u003C/span>: lintConfig\n            });\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> results = lintResults[fileResult.\u003Cspan class=\"hljs-property\">path\u003C/span>];\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (results &amp;&amp; results.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                results.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">result\u003C/span> =&gt;\u003C/span> {\n                    fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;syntax_error&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">rule\u003C/span>: result.\u003Cspan class=\"hljs-property\">ruleNames\u003C/span>[\u003Cspan class=\"hljs-number\">0\u003C/span>],\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: result.\u003Cspan class=\"hljs-property\">ruleDescription\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">detail\u003C/span>: result.\u003Cspan class=\"hljs-property\">errorDetail\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;&#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\">line\u003C/span>: result.\u003Cspan class=\"hljs-property\">lineNumber\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: result.\u003Cspan class=\"hljs-property\">errorRange\u003C/span> ? result.\u003Cspan class=\"hljs-property\">errorRange\u003C/span>[\u003Cspan class=\"hljs-number\">0\u003C/span>] : \u003Cspan class=\"hljs-literal\">null\u003C/span>\n                    });\n                });\n            }\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;syntax_validation_error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Syntax validation failed: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateStructure\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, markdown\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = markdown.\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> headings = [];\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> currentLevel = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        \u003Cspan class=\"hljs-comment\">// Extract headings and validate hierarchy\u003C/span>\n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> headingMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(#{1,6})\\s+(.+)$/\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headingMatch) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> level = headingMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> text = headingMatch[\u003Cspan class=\"hljs-number\">2\u003C/span>].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n                \n                headings.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    level,\n                    text,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                });\n                \n                \u003Cspan class=\"hljs-comment\">// Check heading hierarchy\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">headings\u003C/span>.\u003Cspan class=\"hljs-property\">enforceHierarchy\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (level &gt; currentLevel + \u003Cspan class=\"hljs-number\">1\u003C/span>) {\n                        fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heading_hierarchy_error&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Heading level \u003Cspan class=\"hljs-subst\">${level}\u003C/span> skips level \u003Cspan class=\"hljs-subst\">${currentLevel + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>`\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#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>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                        });\n                    }\n                }\n                \n                currentLevel = level;\n                \n                \u003Cspan class=\"hljs-comment\">// Check heading length\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">headings\u003C/span>.\u003Cspan class=\"hljs-property\">maxLength\u003C/span> &amp;&amp; \n                    text.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">headings\u003C/span>.\u003Cspan class=\"hljs-property\">maxLength\u003C/span>) {\n                    fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heading_length_warning&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Heading exceeds maximum length (\u003Cspan class=\"hljs-subst\">${text.length}\u003C/span> &gt; \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.config.rules.headings.maxLength}\u003C/span>)`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#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>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                    });\n                }\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Check for H1 requirement\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">headings\u003C/span>.\u003Cspan class=\"hljs-property\">requireH1\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> hasH1 = headings.\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-keyword\">if\u003C/span> (!hasH1) {\n                fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;missing_h1_error&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Document must contain at least one H1 heading&#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\">line\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>\n                });\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for duplicate headings\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">headings\u003C/span>.\u003Cspan class=\"hljs-property\">noDuplicates\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> headingTexts = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n            headings.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">heading\u003C/span> =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> normalized = heading.\u003Cspan class=\"hljs-property\">text\u003C/span>.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>().\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headingTexts.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(normalized)) {\n                    fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;duplicate_heading_error&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Duplicate heading: &quot;\u003Cspan class=\"hljs-subst\">${heading.text}\u003C/span>&quot;`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: heading.\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                    });\n                }\n                headingTexts.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(normalized, heading);\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateContent\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, markdown, frontmatter\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = markdown.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Validate frontmatter\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-property\">requireFrontmatter\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!frontmatter || \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">keys\u003C/span>(frontmatter).\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;missing_frontmatter_error&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Document must contain frontmatter&#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\">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-comment\">// Check line length\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-property\">enforceLineLength\u003C/span>) {\n            lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-property\">enforceLineLength\u003C/span>) {\n                    fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;line_length_warning&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Line exceeds maximum length (\u003Cspan class=\"hljs-subst\">${line.length}\u003C/span> &gt; \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.config.rules.content.enforceLineLength}\u003C/span>)`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#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>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-property\">enforceLineLength\u003C/span> + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                    });\n                }\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for common content issues\u003C/span>\n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Check for 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                fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;trailing_whitespace_warning&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Line contains trailing whitespace&#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\">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 multiple consecutive blank lines\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (index &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> &amp;&amp; line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span> &amp;&amp; lines[index - \u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">let\u003C/span> consecutiveBlankLines = \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = index - \u003Cspan class=\"hljs-number\">1\u003C/span>; i &gt;= \u003Cspan class=\"hljs-number\">0\u003C/span>; i--) {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (lines[i].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                        consecutiveBlankLines++;\n                    } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                        \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    }\n                }\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (consecutiveBlankLines &gt; \u003Cspan class=\"hljs-number\">2\u003C/span>) {\n                    fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;excessive_blank_lines_warning&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Too many consecutive blank lines (\u003Cspan class=\"hljs-subst\">${consecutiveBlankLines}\u003C/span>)`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#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>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                    });\n                }\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateLinks\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, markdown, filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">links\u003C/span>.\u003Cspan class=\"hljs-property\">checkInternal\u003C/span> &amp;&amp; \n            !\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">links\u003C/span>.\u003Cspan class=\"hljs-property\">checkExternal\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Extract all links\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> linkRegex = \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]*)\\]\\(([^)]+)\\)/g\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> links = [];\n        \n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = linkRegex.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(markdown)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> text = match[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> url = match[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> position = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getLineAndColumn\u003C/span>(markdown, match.\u003Cspan class=\"hljs-property\">index\u003C/span>);\n            \n            links.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                text,\n                url,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: position.\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: position.\u003Cspan class=\"hljs-property\">column\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">index\u003C/span>: match.\u003Cspan class=\"hljs-property\">index\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Validate each link\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> link \u003Cspan class=\"hljs-keyword\">of\u003C/span> links) {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (link.\u003Cspan class=\"hljs-property\">url\u003C/span>.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-comment\">// Internal anchor link\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">links\u003C/span>.\u003Cspan class=\"hljs-property\">checkInternal\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateAnchorLink\u003C/span>(fileResult, link, markdown);\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (link.\u003Cspan class=\"hljs-property\">url\u003C/span>.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;http://&#x27;\u003C/span>) || link.\u003Cspan class=\"hljs-property\">url\u003C/span>.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;https://&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-comment\">// External link\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">links\u003C/span>.\u003Cspan class=\"hljs-property\">checkExternal\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateExternalLink\u003C/span>(fileResult, link);\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (link.\u003Cspan class=\"hljs-property\">url\u003C/span>.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;./&#x27;\u003C/span>) || link.\u003Cspan class=\"hljs-property\">url\u003C/span>.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;../&#x27;\u003C/span>) || \n                      !link.\u003Cspan class=\"hljs-property\">url\u003C/span>.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;://&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-comment\">// Relative link\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">links\u003C/span>.\u003Cspan class=\"hljs-property\">checkInternal\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateRelativeLink\u003C/span>(fileResult, link, filePath);\n                }\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateAnchorLink\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, link, markdown\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> anchorId = link.\u003Cspan class=\"hljs-property\">url\u003C/span>.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span>).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n        \n        \u003Cspan class=\"hljs-comment\">// Check if anchor exists in document\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> headingRegex = \u003Cspan class=\"hljs-regexp\">/^#{1,6}\\s+(.+)$/gm\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> headings = [];\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n        \n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = headingRegex.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(markdown)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> headingText = match[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> generatedId = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateAnchorId\u003C/span>(headingText);\n            headings.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(generatedId);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Also check for custom anchor tags\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> customAnchorRegex = \u003Cspan class=\"hljs-regexp\">/&lt;a\\s+[^&gt;]*id\\s*=\\s*[&quot;&#x27;]([^&quot;&#x27;]+)[&quot;&#x27;][^&gt;]*&gt;/gi\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = customAnchorRegex.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(markdown)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n            headings.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(match[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>());\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!headings.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(anchorId)) {\n            fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;broken_anchor_link_error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Anchor link target not found: &quot;\u003Cspan class=\"hljs-subst\">${link.url}\u003C/span>&quot;`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: link.\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: link.\u003Cspan class=\"hljs-property\">column\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateExternalLink\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, link\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Simple URL format validation\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title function_\">URL\u003C/span>(link.\u003Cspan class=\"hljs-property\">url\u003C/span>);\n            \n            \u003Cspan class=\"hljs-comment\">// Check against allowed domains if specified\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">links\u003C/span>.\u003Cspan class=\"hljs-property\">allowedDomains\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> url = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title function_\">URL\u003C/span>(link.\u003Cspan class=\"hljs-property\">url\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> domain = url.\u003Cspan class=\"hljs-property\">hostname\u003C/span>;\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">links\u003C/span>.\u003Cspan class=\"hljs-property\">allowedDomains\u003C/span>.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(domain)) {\n                    fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;external_domain_warning&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`External link to non-allowed domain: \u003Cspan class=\"hljs-subst\">${domain}\u003C/span>`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: link.\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: link.\u003Cspan class=\"hljs-property\">column\u003C/span>\n                    });\n                }\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Note: Actual HTTP checking would be implemented here\u003C/span>\n            \u003Cspan class=\"hljs-comment\">// but is omitted for performance reasons in this example\u003C/span>\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;invalid_url_error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Invalid URL format: &quot;\u003Cspan class=\"hljs-subst\">${link.url}\u003C/span>&quot;`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: link.\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: link.\u003Cspan class=\"hljs-property\">column\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateRelativeLink\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, link, currentFilePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> basePath = path.\u003Cspan class=\"hljs-title function_\">dirname\u003C/span>(currentFilePath);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> fullPath = path.\u003Cspan class=\"hljs-title function_\">resolve\u003C/span>(basePath, link.\u003Cspan class=\"hljs-property\">url\u003C/span>);\n            \n            \u003Cspan class=\"hljs-comment\">// Check if file exists\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">access\u003C/span>(fullPath);\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;broken_relative_link_error&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Relative link target not found: &quot;\u003Cspan class=\"hljs-subst\">${link.url}\u003C/span>&quot;`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: link.\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: link.\u003Cspan class=\"hljs-property\">column\u003C/span>\n                });\n            }\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;invalid_relative_link_error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Invalid relative link format: &quot;\u003Cspan class=\"hljs-subst\">${link.url}\u003C/span>&quot;`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: link.\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: link.\u003Cspan class=\"hljs-property\">column\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateImages\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, markdown, filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> imageRegex = \u003Cspan class=\"hljs-regexp\">/!\\[([^\\]]*)\\]\\(([^)]+)\\)/g\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n        \n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = imageRegex.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(markdown)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> altText = match[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> src = match[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> position = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getLineAndColumn\u003C/span>(markdown, match.\u003Cspan class=\"hljs-property\">index\u003C/span>);\n            \n            \u003Cspan class=\"hljs-comment\">// Check for alt text if required\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-property\">checkImageAltText\u003C/span> &amp;&amp; !altText.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()) {\n                fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;missing_image_alt_warning&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Image missing alt text for accessibility&#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\">line\u003C/span>: position.\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: position.\u003Cspan class=\"hljs-property\">column\u003C/span>\n                });\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Check if local image file exists\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!src.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;http://&#x27;\u003C/span>) &amp;&amp; !src.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;https://&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> basePath = path.\u003Cspan class=\"hljs-title function_\">dirname\u003C/span>(filePath);\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> fullPath = path.\u003Cspan class=\"hljs-title function_\">resolve\u003C/span>(basePath, src);\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">access\u003C/span>(fullPath);\n                } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                    fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;missing_image_error&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Image file not found: &quot;\u003Cspan class=\"hljs-subst\">${src}\u003C/span>&quot;`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: position.\u003Cspan class=\"hljs-property\">line\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: position.\u003Cspan class=\"hljs-property\">column\u003C/span>\n                    });\n                }\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateCodeBlocks\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, markdown\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-property\">validateCodeBlocks\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = markdown.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> inCodeBlock = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> codeBlockStart = -\u003Cspan class=\"hljs-number\">1\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> language = \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> trimmedLine = line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (trimmedLine.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inCodeBlock) {\n                    \u003Cspan class=\"hljs-comment\">// Closing code block\u003C/span>\n                    inCodeBlock = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                    codeBlockStart = -\u003Cspan class=\"hljs-number\">1\u003C/span>;\n                    language = \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    \u003Cspan class=\"hljs-comment\">// Opening code block\u003C/span>\n                    inCodeBlock = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                    codeBlockStart = index + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                    language = trimmedLine.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">3\u003C/span>).\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n                    \n                    \u003Cspan class=\"hljs-comment\">// Validate 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-title function_\">isValidLanguage\u003C/span>(language)) {\n                        fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;invalid_code_language_warning&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Potentially invalid code language: &quot;\u003Cspan class=\"hljs-subst\">${language}\u003C/span>&quot;`\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#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>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                        });\n                    }\n                }\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Check for unterminated code block\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inCodeBlock) {\n            fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;unterminated_code_block_error&#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\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: codeBlockStart,\n                \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateTables\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, markdown\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = markdown.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> inTable = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> tableStart = -\u003Cspan class=\"hljs-number\">1\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> expectedColumns = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> trimmedLine = line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n            \n            \u003Cspan class=\"hljs-comment\">// Detect table start\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!inTable &amp;&amp; trimmedLine.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>) &amp;&amp; \n                index + \u003Cspan class=\"hljs-number\">1\u003C/span> &lt; lines.\u003Cspan class=\"hljs-property\">length\u003C/span> &amp;&amp; \n                lines[index + \u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>().\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^[\\|\\-\\:\\s]+$/\u003C/span>)) {\n                inTable = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                tableStart = index + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                expectedColumns = (trimmedLine.\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\">1\u003C/span>;\n                \n                \u003Cspan class=\"hljs-comment\">// Validate header row\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!trimmedLine.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>) || !trimmedLine.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>)) {\n                    fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;table_formatting_warning&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Table row should start and end with pipe character&#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\">line\u003C/span>: index + \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\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inTable) {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (trimmedLine.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>)) {\n                    \u003Cspan class=\"hljs-comment\">// Table row\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> columnCount = (trimmedLine.\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\">1\u003C/span>;\n                    \n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (columnCount !== expectedColumns) {\n                        fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;table_column_mismatch_error&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Table row has \u003Cspan class=\"hljs-subst\">${columnCount}\u003C/span> columns, expected \u003Cspan class=\"hljs-subst\">${expectedColumns}\u003C/span>`\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#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>: \u003Cspan class=\"hljs-number\">1\u003C/span>\n                        });\n                    }\n                    \n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!trimmedLine.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>) || !trimmedLine.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>)) {\n                        fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;table_formatting_warning&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Table row should start and end with pipe character&#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\">line\u003C/span>: index + \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\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (trimmedLine === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                    \u003Cspan class=\"hljs-comment\">// End of table\u003C/span>\n                    inTable = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                    tableStart = -\u003Cspan class=\"hljs-number\">1\u003C/span>;\n                    expectedColumns = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n                }\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateLists\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, markdown\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = markdown.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> listStack = [];\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> expectedMarker = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> listMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*)([\\-\\*\\+]|\\d+\\.)\\s/\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (listMatch) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> indent = listMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> marker = listMatch[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> level = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">floor\u003C/span>(indent.\u003Cspan class=\"hljs-property\">length\u003C/span> / \u003Cspan class=\"hljs-number\">2\u003C/span>); \u003Cspan class=\"hljs-comment\">// Assuming 2-space indentation\u003C/span>\n                \n                \u003Cspan class=\"hljs-comment\">// Check consistent markers\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">lists\u003C/span>.\u003Cspan class=\"hljs-property\">consistentMarkers\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (marker.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/[\\-\\*\\+]/\u003C/span>)) {\n                        \u003Cspan class=\"hljs-comment\">// Unordered list marker\u003C/span>\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (level &lt; listStack.\u003Cspan class=\"hljs-property\">length\u003C/span>) {\n                            \u003Cspan class=\"hljs-keyword\">const\u003C/span> expectedUnorderedMarker = listStack[level];\n                            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (expectedUnorderedMarker &amp;&amp; \n                                expectedUnorderedMarker !== marker &amp;&amp;\n                                expectedUnorderedMarker.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/[\\-\\*\\+]/\u003C/span>)) {\n                                fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;inconsistent_list_marker_warning&#x27;\u003C/span>,\n                                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Inconsistent list marker &quot;\u003Cspan class=\"hljs-subst\">${marker}\u003C/span>&quot;, expected &quot;\u003Cspan class=\"hljs-subst\">${expectedUnorderedMarker}\u003C/span>&quot;`\u003C/span>,\n                                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#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>: indent.\u003Cspan class=\"hljs-property\">length\u003C/span> + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                                });\n                            }\n                        }\n                    }\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Validate proper indentation\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">rules\u003C/span>.\u003Cspan class=\"hljs-property\">lists\u003C/span>.\u003Cspan class=\"hljs-property\">properIndentation\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (indent.\u003Cspan class=\"hljs-property\">length\u003C/span> % \u003Cspan class=\"hljs-number\">2\u003C/span> !== \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                        fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;list_indentation_warning&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;List indentation should be in multiples of 2 spaces&#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\">line\u003C/span>: index + \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\">// Update list stack\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">while\u003C/span> (listStack.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; level + \u003Cspan class=\"hljs-number\">1\u003C/span>) {\n                    listStack.\u003Cspan class=\"hljs-title function_\">pop\u003C/span>();\n                }\n                listStack[level] = marker;\n                \n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Empty line might end the list context\u003C/span>\n                \u003Cspan class=\"hljs-comment\">// Keep list stack for proper nesting validation\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>)) {\n                \u003Cspan class=\"hljs-comment\">// Non-indented line ends list\u003C/span>\n                listStack = [];\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">applyCustomRules\u003C/span>(\u003Cspan class=\"hljs-params\">fileResult, content, markdown\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Apply user-defined custom validation rules\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> [ruleName, ruleFunction] \u003Cspan class=\"hljs-keyword\">of\u003C/span> \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">customRules\u003C/span>)) {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> customResult = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title function_\">ruleFunction\u003C/span>(content, markdown, fileResult.\u003Cspan class=\"hljs-property\">path\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (customResult &amp;&amp; \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">isArray\u003C/span>(customResult)) {\n                    customResult.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> {\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (issue.\u003Cspan class=\"hljs-property\">severity\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>) {\n                            fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">`custom_rule_\u003Cspan class=\"hljs-subst\">${ruleName}\u003C/span>`\u003C/span>,\n                                ...issue\n                            });\n                        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                            fileResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">`custom_rule_\u003Cspan class=\"hljs-subst\">${ruleName}\u003C/span>`\u003C/span>,\n                                ...issue\n                            });\n                        }\n                    });\n                }\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                fileResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;custom_rule_error&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Custom rule &quot;\u003Cspan class=\"hljs-subst\">${ruleName}\u003C/span>&quot; failed: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>\n                });\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">findMarkdownFiles\u003C/span>(\u003Cspan class=\"hljs-params\">directory, recursive = \u003Cspan class=\"hljs-literal\">true\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> files = [];\n        \n        \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">function\u003C/span> \u003Cspan class=\"hljs-title function_\">scanDirectory\u003C/span>(\u003Cspan class=\"hljs-params\">dir\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> items = \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> item \u003Cspan class=\"hljs-keyword\">of\u003C/span> items) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> fullPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(dir, item.\u003Cspan class=\"hljs-property\">name\u003C/span>);\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (item.\u003Cspan class=\"hljs-title function_\">isDirectory\u003C/span>() &amp;&amp; recursive) {\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> (item.\u003Cspan class=\"hljs-title function_\">isFile\u003C/span>() &amp;&amp; \n                          (item.\u003Cspan class=\"hljs-property\">name\u003C/span>.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>) || item.\u003Cspan class=\"hljs-property\">name\u003C/span>.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.markdown&#x27;\u003C/span>))) {\n                    files.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(fullPath);\n                }\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title function_\">scanDirectory\u003C/span>(directory);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> files.\u003Cspan class=\"hljs-title function_\">sort\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">parseFrontmatter\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> frontmatterRegex = \u003Cspan class=\"hljs-regexp\">/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> match = content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(frontmatterRegex);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (match) {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> frontmatter = yaml.\u003Cspan class=\"hljs-title function_\">load\u003C/span>(match[\u003Cspan class=\"hljs-number\">1\u003C/span>]);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> markdown = match[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> { frontmatter, markdown };\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">frontmatter\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-attr\">markdown\u003C/span>: content };\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">frontmatter\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-attr\">markdown\u003C/span>: content };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">countWords\u003C/span>(\u003Cspan class=\"hljs-params\">text\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> text.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>().\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\s+/\u003C/span>).\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">word\u003C/span> =&gt;\u003C/span> word.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getLineAndColumn\u003C/span>(\u003Cspan class=\"hljs-params\">text, index\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> beforeIndex = text.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, index);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = beforeIndex.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">line\u003C/span>: lines.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">column\u003C/span>: lines[lines.\u003Cspan class=\"hljs-property\">length\u003C/span> - \u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span> + \u003Cspan class=\"hljs-number\">1\u003C/span>\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateAnchorId\u003C/span>(\u003Cspan class=\"hljs-params\">text\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> text\n            .\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>()\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/[^\\w\\s-]/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\s+/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/-+/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^-|-$/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isValidLanguage\u003C/span>(\u003Cspan class=\"hljs-params\">language\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Common programming languages and formats\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> validLanguages = [\n            \u003Cspan class=\"hljs-string\">&#x27;javascript&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;js&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;typescript&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;ts&#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;java&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;c&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;cpp&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;csharp&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;cs&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;php&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;ruby&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;go&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;rust&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;html&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;css&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;scss&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;sass&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;json&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;xml&#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-string\">&#x27;sql&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;bash&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;sh&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;shell&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;powershell&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;dockerfile&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;markdown&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;md&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;plaintext&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>\n        ];\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> validLanguages.\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_\">chunkArray\u003C/span>(\u003Cspan class=\"hljs-params\">array, size\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 += size) {\n            chunks.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(array.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(i, i + size));\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> chunks;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateSummary\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">errorsByType\u003C/span> = \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">fromEntries\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errorTypes\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Calculate health score\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> totalIssues = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalErrors\u003C/span> + \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalWarnings\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> maxPossibleScore = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span> * \u003Cspan class=\"hljs-number\">100\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> deductionPerError = \u003Cspan class=\"hljs-number\">10\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> deductionPerWarning = \u003Cspan class=\"hljs-number\">2\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> deductions = (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalErrors\u003C/span> * deductionPerError) +\n                          (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalWarnings\u003C/span> * deductionPerWarning);\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">healthScore\u003C/span> = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \n            \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">round\u003C/span>(((maxPossibleScore - deductions) / maxPossibleScore) * \u003Cspan class=\"hljs-number\">100\u003C/span>)\n        );\n        \n        \u003Cspan class=\"hljs-comment\">// Performance metrics\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">avgErrorsPerFile\u003C/span> = \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \n            (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalErrors\u003C/span> / \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span>).\u003Cspan class=\"hljs-title function_\">toFixed\u003C/span>(\u003Cspan class=\"hljs-number\">2\u003C/span>) : \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">cleanFiles\u003C/span> = \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span> - \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">filesWithErrors\u003C/span>;\n            \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">cleanFilePercentage\u003C/span> = \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \n            \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">round\u003C/span>((\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">cleanFiles\u003C/span> / \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalFiles\u003C/span>) * \u003Cspan class=\"hljs-number\">100\u003C/span>) : \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">saveValidationReport\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> reportData = {\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\">configuration\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">results\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">writeFile\u003C/span>(\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">output\u003C/span>.\u003Cspan class=\"hljs-property\">reportPath\u003C/span>,\n            \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">stringify\u003C/span>(reportData, \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-number\">2\u003C/span>)\n        );\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`📊 Validation report saved to: \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.config.output.reportPath}\u003C/span>`\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">printSummary\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> summary = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span> + \u003Cspan class=\"hljs-string\">&#x27;=&#x27;\u003C/span>.\u003Cspan class=\"hljs-title function_\">repeat\u003C/span>(\u003Cspan class=\"hljs-number\">60\u003C/span>));\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;📋 MARKDOWN VALIDATION SUMMARY&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;=&#x27;\u003C/span>.\u003Cspan class=\"hljs-title function_\">repeat\u003C/span>(\u003Cspan class=\"hljs-number\">60\u003C/span>));\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`📁 Total Files: \u003Cspan class=\"hljs-subst\">${summary.totalFiles}\u003C/span>`\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`✅ Clean Files: \u003Cspan class=\"hljs-subst\">${summary.cleanFiles}\u003C/span> (\u003Cspan class=\"hljs-subst\">${summary.cleanFilePercentage}\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\">`❌ Files with Errors: \u003Cspan class=\"hljs-subst\">${summary.filesWithErrors}\u003C/span>`\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`🚨 Total Errors: \u003Cspan class=\"hljs-subst\">${summary.totalErrors}\u003C/span>`\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`⚠️  Total Warnings: \u003Cspan class=\"hljs-subst\">${summary.totalWarnings}\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\">`🏥 Health Score: \u003Cspan class=\"hljs-subst\">${summary.healthScore}\u003C/span>%`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">keys\u003C/span>(summary.\u003Cspan class=\"hljs-property\">errorsByType\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📊 ERROR BREAKDOWN:&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> [type, count] \u003Cspan class=\"hljs-keyword\">of\u003C/span> \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(summary.\u003Cspan class=\"hljs-property\">errorsByType\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\">${type}\u003C/span>: \u003Cspan class=\"hljs-subst\">${count}\u003C/span>`\u003C/span>);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Show files with issues\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> filesWithIssues = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">files\u003C/span>.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">f\u003C/span> =&gt;\u003C/span> \n            f.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> || f.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>\n        );\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (filesWithIssues.\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🔍 FILES WITH ISSUES:&#x27;\u003C/span>);\n            filesWithIssues.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">file\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\">`\\n📄 \u003Cspan class=\"hljs-subst\">${file.path}\u003C/span>`\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (file.\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\">`   ❌ Errors: \u003Cspan class=\"hljs-subst\">${file.errors.length}\u003C/span>`\u003C/span>);\n                    file.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">3\u003C/span>).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">error\u003C/span> =&gt;\u003C/span> {\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> location = error.\u003Cspan class=\"hljs-property\">line\u003C/span> ? \u003Cspan class=\"hljs-string\">`:\u003Cspan class=\"hljs-subst\">${error.line}\u003C/span>`\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\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\">${error.message}\u003C/span>\u003Cspan class=\"hljs-subst\">${location}\u003C/span>`\u003C/span>);\n                    });\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (file.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">3\u003C/span>) {\n                        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`      • ... and \u003Cspan class=\"hljs-subst\">${file.errors.length - \u003Cspan class=\"hljs-number\">3\u003C/span>}\u003C/span> more`\u003C/span>);\n                    }\n                }\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (file.\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\">`   ⚠️  Warnings: \u003Cspan class=\"hljs-subst\">${file.warnings.length}\u003C/span>`\u003C/span>);\n                }\n            });\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span> + \u003Cspan class=\"hljs-string\">&#x27;=&#x27;\u003C/span>.\u003Cspan class=\"hljs-title function_\">repeat\u003C/span>(\u003Cspan class=\"hljs-number\">60\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_\">MarkdownValidator\u003C/span>;\n\n\u003Cspan class=\"hljs-comment\">// CLI interface\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-built_in\">require\u003C/span>.\u003Cspan class=\"hljs-property\">main\u003C/span> === \u003Cspan class=\"hljs-variable language_\">module\u003C/span>) {\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> args = process.\u003Cspan class=\"hljs-property\">argv\u003C/span>.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">2\u003C/span>);\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> directory = args[\u003Cspan class=\"hljs-number\">0\u003C/span>] || \u003Cspan class=\"hljs-string\">&#x27;./&#x27;\u003C/span>;\n    \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\">checkExternalLinks\u003C/span>: process.\u003Cspan class=\"hljs-property\">env\u003C/span>.\u003Cspan class=\"hljs-property\">CHECK_EXTERNAL_LINKS\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">outputFormat\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;detailed&#x27;\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">saveReport\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">reportPath\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;./markdown-validation-report.json&#x27;\u003C/span>\n    });\n    \n    validator.\u003Cspan class=\"hljs-title function_\">validateDirectory\u003C/span>(directory, { \u003Cspan class=\"hljs-attr\">recursive\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> })\n        .\u003Cspan class=\"hljs-title function_\">then\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">results\u003C/span> =&gt;\u003C/span> {\n            validator.\u003Cspan class=\"hljs-title function_\">printSummary\u003C/span>();\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> hasErrors = results.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalErrors\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>;\n            process.\u003Cspan class=\"hljs-title function_\">exit\u003C/span>(hasErrors ? \u003Cspan class=\"hljs-number\">1\u003C/span> : \u003Cspan class=\"hljs-number\">0\u003C/span>);\n        })\n        .\u003Cspan class=\"hljs-title function_\">catch\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">error\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;❌ Validation failed:&#x27;\u003C/span>, error);\n            process.\u003Cspan class=\"hljs-title function_\">exit\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span>);\n        });\n}\n\u003C/code>\u003C/pre>\u003Ch3 id=\"cicd-integration-patterns\">CI/CD Integration Patterns\u003C/h3>\n\u003Cp>Integrating validation into automated workflows:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-yaml\">\u003Cspan class=\"hljs-comment\"># .github/workflows/markdown-validation.yml\u003C/span>\n\u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Markdown\u003C/span> \u003Cspan class=\"hljs-string\">Content\u003C/span> \u003Cspan class=\"hljs-string\">Validation\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\">pull_request:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">branches:\u003C/span> [\u003Cspan class=\"hljs-string\">main\u003C/span>]\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span> \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;**/*.md&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;**/*.markdown&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">schedule:\u003C/span>\n    \u003Cspan class=\"hljs-comment\"># Weekly validation of all content\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">cron:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;0 2 * * 1&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">env:\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\">VALIDATION_CONFIG:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;.markdown-validation.json&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">jobs:\u003C/span>\n  \u003Cspan class=\"hljs-comment\"># Quick validation for PRs\u003C/span>\n  \u003Cspan class=\"hljs-attr\">quick-validation:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\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    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">code\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">fetch-depth:\u003C/span> \u003Cspan class=\"hljs-number\">0\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\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.NODE_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;npm&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        npm ci\n        npm install -g markdownlint-cli2\n        npm install -g markdown-link-check\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Get\u003C/span> \u003Cspan class=\"hljs-string\">changed\u003C/span> \u003Cspan class=\"hljs-string\">Markdown\u003C/span> \u003Cspan class=\"hljs-string\">files\u003C/span>\n      \u003Cspan class=\"hljs-attr\">id:\u003C/span> \u003Cspan class=\"hljs-string\">changed-files\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">tj-actions/changed-files@v39\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">files:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          **/*.md\n          **/*.markdown\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Lint\u003C/span> \u003Cspan class=\"hljs-string\">changed\u003C/span> \u003Cspan class=\"hljs-string\">Markdown\u003C/span> \u003Cspan class=\"hljs-string\">files\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changed-files.outputs.any_changed\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        echo &quot;Changed files: ${{ steps.changed-files.outputs.all_changed_files }}&quot;\n        markdownlint-cli2 ${{ steps.changed-files.outputs.all_changed_files }}\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Check\u003C/span> \u003Cspan class=\"hljs-string\">links\u003C/span> \u003Cspan class=\"hljs-string\">in\u003C/span> \u003Cspan class=\"hljs-string\">changed\u003C/span> \u003Cspan class=\"hljs-string\">files\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changed-files.outputs.any_changed\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        for file in ${{ steps.changed-files.outputs.all_changed_files }}; do\n          echo &quot;Checking links in: $file&quot;\n          markdown-link-check &quot;$file&quot; --config .markdown-link-check.json\n        done\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Validate\u003C/span> \u003Cspan class=\"hljs-string\">with\u003C/span> \u003Cspan class=\"hljs-string\">custom\u003C/span> \u003Cspan class=\"hljs-string\">rules\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changed-files.outputs.any_changed\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        node scripts/markdown-validator.js --files &quot;${{ steps.changed-files.outputs.all_changed_files }}&quot;\n\u003C/span>\n  \u003Cspan class=\"hljs-comment\"># Comprehensive validation for main branch and scheduled runs\u003C/span>\n  \u003Cspan class=\"hljs-attr\">comprehensive-validation:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.ref\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;refs/heads/main&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">||\u003C/span> \u003Cspan class=\"hljs-string\">github.event_name\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;schedule&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">code\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.NODE_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;npm&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        npm ci\n        npm install -g markdownlint-cli2\n        npm install -g markdown-link-check\n        npm install -g alex\n        npm install -g textlint\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Comprehensive\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        markdownlint-cli2 &quot;**/*.{md,markdown}&quot; --config .markdownlint.json\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Check\u003C/span> \u003Cspan class=\"hljs-string\">all\u003C/span> \u003Cspan class=\"hljs-string\">internal\u003C/span> \u003Cspan class=\"hljs-string\">links\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        find . -name &quot;*.md&quot; -o -name &quot;*.markdown&quot; | \\\n        xargs -I {} markdown-link-check {} --config .markdown-link-check.json\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Check\u003C/span> \u003Cspan class=\"hljs-string\">external\u003C/span> \u003Cspan class=\"hljs-string\">links\u003C/span> \u003Cspan class=\"hljs-string\">(with\u003C/span> \u003Cspan class=\"hljs-string\">retry)\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        find . -name &quot;*.md&quot; -o -name &quot;*.markdown&quot; | \\\n        xargs -I {} markdown-link-check {} --config .markdown-link-check-external.json || true\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Validate\u003C/span> \u003Cspan class=\"hljs-string\">content\u003C/span> \u003Cspan class=\"hljs-string\">quality\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Alex for inclusive language\n        find . -name &quot;*.md&quot; -exec alex {} \\; || true\n\u003C/span>        \n        \u003Cspan class=\"hljs-comment\"># TextLint for writing style\u003C/span>\n        \u003Cspan class=\"hljs-string\">find\u003C/span> \u003Cspan class=\"hljs-string\">.\u003C/span> \u003Cspan class=\"hljs-string\">-name\u003C/span> \u003Cspan class=\"hljs-string\">&quot;*.md&quot;\u003C/span> \u003Cspan class=\"hljs-string\">-exec\u003C/span> \u003Cspan class=\"hljs-string\">textlint\u003C/span> {} \u003Cspan class=\"hljs-string\">\\;\u003C/span> \u003Cspan class=\"hljs-string\">||\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Custom\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span> \u003Cspan class=\"hljs-string\">suite\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        node scripts/markdown-validator.js . --comprehensive\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\">validation\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        node scripts/generate-validation-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\">validation\u003C/span> \u003Cspan class=\"hljs-string\">artifacts\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\">validation-results\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          markdown-validation-report.json\n          validation-report.html\n          link-check-results/\n\u003C/span>    \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\">on\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> \u003Cspan class=\"hljs-string\">&amp;&amp;\u003C/span> \u003Cspan class=\"hljs-string\">failure()\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          const report = JSON.parse(fs.readFileSync(&#x27;markdown-validation-report.json&#x27;, &#x27;utf8&#x27;));\n\u003C/span>          \n          \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">errorCount\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">report.results.summary.totalErrors;\u003C/span>\n          \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">warningCount\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">report.results.summary.totalWarnings;\u003C/span>\n          \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">healthScore\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">report.results.summary.healthScore;\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 Validation Results\u003C/span>\n          \n          \u003Cspan class=\"hljs-string\">|\u003C/span> \u003Cspan class=\"hljs-string\">Metric\u003C/span> \u003Cspan class=\"hljs-string\">|\u003C/span> \u003Cspan class=\"hljs-string\">Value\u003C/span> \u003Cspan class=\"hljs-string\">|\n          |--------|-------|\n          | Health Score | ${healthScore}% |\n          | Errors | ${errorCount} |\n          | Warnings | ${warningCount} |\n          | Files Checked | ${report.results.summary.totalFiles} |\n\u003C/span>          \n          \u003Cspan class=\"hljs-string\">${errorCount\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-string\">?\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;❌ Validation failed. Please fix the errors before merging.&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;✅ All checks passed!&#x27;\u003C/span>\u003Cspan class=\"hljs-string\">}\u003C/span>\n          \n          \u003Cspan class=\"hljs-string\">&lt;details&gt;\u003C/span>\n          \u003Cspan class=\"hljs-string\">&lt;summary&gt;View\u003C/span> \u003Cspan class=\"hljs-string\">detailed\u003C/span> \u003Cspan class=\"hljs-string\">results&lt;/summary&gt;\u003C/span>\n          \n          \u003Cspan class=\"hljs-string\">\\`\\`\\`json\u003C/span>\n          \u003Cspan class=\"hljs-string\">${JSON.stringify(report.results.summary,\u003C/span> \u003Cspan class=\"hljs-literal\">null\u003C/span>\u003Cspan class=\"hljs-string\">,\u003C/span> \u003Cspan class=\"hljs-number\">2\u003C/span>\u003Cspan class=\"hljs-string\">)}\u003C/span>\n          \u003Cspan class=\"hljs-string\">\\`\\`\\`\u003C/span>\n          \n          \u003Cspan class=\"hljs-string\">&lt;/details&gt;\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\n  \u003Cspan class=\"hljs-comment\"># Accessibility and content quality checks\u003C/span>\n  \u003Cspan class=\"hljs-attr\">accessibility-validation:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">needs:\u003C/span> \u003Cspan class=\"hljs-string\">comprehensive-validation\u003C/span>\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">code\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.NODE_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\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\">accessibility\u003C/span> \u003Cspan class=\"hljs-string\">tools\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        npm install -g axe-core\n        npm install -g pa11y-ci\n        npm install -g lighthouse-ci\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Build\u003C/span> \u003Cspan class=\"hljs-string\">documentation\u003C/span> \u003Cspan class=\"hljs-string\">site\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Build your documentation site (Jekyll, Hugo, etc.)\n        bundle install\n        bundle exec jekyll build\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Test\u003C/span> \u003Cspan class=\"hljs-string\">accessibility\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Run accessibility tests on built site\n        pa11y-ci --sitemap http://localhost:4000/sitemap.xml \\\n                 --threshold 10\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Performance\u003C/span> \u003Cspan class=\"hljs-string\">audit\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Start local server\n        bundle exec jekyll serve --detach --port 4000\n        sleep 5\n\u003C/span>        \n        \u003Cspan class=\"hljs-comment\"># Run Lighthouse CI\u003C/span>\n        \u003Cspan class=\"hljs-string\">lhci\u003C/span> \u003Cspan class=\"hljs-string\">autorun\u003C/span> \u003Cspan class=\"hljs-string\">--config\u003C/span> \u003Cspan class=\"hljs-string\">.lighthouserc.js\u003C/span>\n    \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\">accessibility\u003C/span> \u003Cspan class=\"hljs-string\">results\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\">accessibility-results\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          pa11y-results/\n          lighthouse-results/\n\u003C/span>\n  \u003Cspan class=\"hljs-comment\"># Security scanning for Markdown content\u003C/span>\n  \u003Cspan class=\"hljs-attr\">security-validation:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\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;push&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">||\u003C/span> \u003Cspan class=\"hljs-string\">github.event_name\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;schedule&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">code\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Scan\u003C/span> \u003Cspan class=\"hljs-string\">for\u003C/span> \u003Cspan class=\"hljs-string\">secrets\u003C/span> \u003Cspan class=\"hljs-string\">in\u003C/span> \u003Cspan class=\"hljs-string\">Markdown\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">trufflesecurity/trufflehog@main\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">./\u003C/span>\n        \u003Cspan class=\"hljs-attr\">base:\u003C/span> \u003Cspan class=\"hljs-string\">main\u003C/span>\n        \u003Cspan class=\"hljs-attr\">head:\u003C/span> \u003Cspan class=\"hljs-string\">HEAD\u003C/span>\n        \u003Cspan class=\"hljs-attr\">extra_args:\u003C/span> \u003Cspan class=\"hljs-string\">--debug\u003C/span> \u003Cspan class=\"hljs-string\">--only-verified\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Check\u003C/span> \u003Cspan class=\"hljs-string\">for\u003C/span> \u003Cspan class=\"hljs-string\">sensitive\u003C/span> \u003Cspan class=\"hljs-string\">information\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Custom script to check for sensitive patterns\n        node scripts/check-sensitive-content.js\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Validate\u003C/span> \u003Cspan class=\"hljs-string\">external\u003C/span> \u003Cspan class=\"hljs-string\">link\u003C/span> \u003Cspan class=\"hljs-string\">security\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        # Check for potential security issues in external links\n        node scripts/validate-link-security.js\n\u003C/span>\n  \u003Cspan class=\"hljs-comment\"># Generate and deploy validation dashboard\u003C/span>\n  \u003Cspan class=\"hljs-attr\">deploy-dashboard:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">needs:\u003C/span> [\u003Cspan class=\"hljs-string\">comprehensive-validation\u003C/span>, \u003Cspan class=\"hljs-string\">accessibility-validation\u003C/span>]\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.ref\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;refs/heads/main&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&amp;&amp;\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">code\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Download\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span> \u003Cspan class=\"hljs-string\">artifacts\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/download-artifact@v3\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">validation-results\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">validation-results/\u003C/span>\n    \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\">validation\u003C/span> \u003Cspan class=\"hljs-string\">dashboard\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        node scripts/generate-dashboard.js\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Deploy\u003C/span> \u003Cspan class=\"hljs-string\">dashboard\u003C/span> \u003Cspan class=\"hljs-string\">to\u003C/span> \u003Cspan class=\"hljs-string\">GitHub\u003C/span> \u003Cspan class=\"hljs-string\">Pages\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">peaceiris/actions-gh-pages@v3\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">github_token:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.GITHUB_TOKEN\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">publish_dir:\u003C/span> \u003Cspan class=\"hljs-string\">./validation-dashboard\u003C/span>\n        \u003Cspan class=\"hljs-attr\">destination_dir:\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"error-prevention-strategies\">Error Prevention Strategies\u003C/h2>\n\u003Ch3 id=\"pre-commit-hooks-implementation\">Pre-commit Hooks Implementation\u003C/h3>\n\u003Cp>Setting up automated validation before content commits:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-meta\">#!/bin/bash\u003C/span>\n\u003Cspan class=\"hljs-comment\"># .git/hooks/pre-commit - Pre-commit validation hook\u003C/span>\n\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;🔍 Running Markdown validation before commit...&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Configuration\u003C/span>\nMARKDOWNLINT_CONFIG=\u003Cspan class=\"hljs-string\">&quot;.markdownlint.json&quot;\u003C/span>\nLINK_CHECK_CONFIG=\u003Cspan class=\"hljs-string\">&quot;.markdown-link-check.json&quot;\u003C/span>\nCUSTOM_VALIDATOR=\u003Cspan class=\"hljs-string\">&quot;scripts/markdown-validator.js&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Colors for output\u003C/span>\nRED=\u003Cspan class=\"hljs-string\">&#x27;\\033[0;31m&#x27;\u003C/span>\nGREEN=\u003Cspan class=\"hljs-string\">&#x27;\\033[0;32m&#x27;\u003C/span>\nYELLOW=\u003Cspan class=\"hljs-string\">&#x27;\\033[1;33m&#x27;\u003C/span>\nNC=\u003Cspan class=\"hljs-string\">&#x27;\\033[0m&#x27;\u003C/span> \u003Cspan class=\"hljs-comment\"># No Color\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Get staged Markdown files\u003C/span>\nSTAGED_MD_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E \u003Cspan class=\"hljs-string\">&#x27;\\.(md|markdown)$&#x27;\u003C/span>)\n\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> [ -z \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$STAGED_MD_FILES\u003C/span>&quot;\u003C/span> ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✅ No Markdown files 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-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;📄 Validating staged Markdown files:&quot;\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$STAGED_MD_FILES\u003C/span>&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Initialize validation results\u003C/span>\nVALIDATION_ERRORS=0\nVALIDATION_WARNINGS=0\n\n\u003Cspan class=\"hljs-comment\"># Function to validate a single file\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">validate_file\u003C/span>\u003C/span>() {\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$1\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> has_errors=0\n    \n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;🔍 Validating: \u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Basic syntax validation with markdownlint\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">command\u003C/span> -v markdownlint &gt;/dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> ! markdownlint -c \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$MARKDOWNLINT_CONFIG\u003C/span>&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ Syntax errors found in $file\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n            has_errors=1\n        \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ Syntax validation passed for $file\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${YELLOW}\u003C/span>⚠️  markdownlint not found, skipping syntax validation\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Link validation\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">command\u003C/span> -v markdown-link-check &gt;/dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> ! markdown-link-check \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> -c \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$LINK_CHECK_CONFIG\u003C/span>&quot;\u003C/span> -q; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ Link validation failed for $file\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n            has_errors=1\n        \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ Link validation passed for $file\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${YELLOW}\u003C/span>⚠️  markdown-link-check not found, skipping link validation\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Custom validation rules\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [ -f \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$CUSTOM_VALIDATOR\u003C/span>&quot;\u003C/span> ] &amp;&amp; \u003Cspan class=\"hljs-built_in\">command\u003C/span> -v node &gt;/dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> ! node \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$CUSTOM_VALIDATOR\u003C/span>&quot;\u003C/span> --file \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> --format concise; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ Custom validation failed for $file\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n            has_errors=1\n        \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ Custom validation passed for $file\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \n    \u003Cspan class=\"hljs-built_in\">return\u003C/span> \u003Cspan class=\"hljs-variable\">$has_errors\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Validate each staged file\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;🚀 Starting validation process...&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-keyword\">for\u003C/span> file \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-variable\">$STAGED_MD_FILES\u003C/span>; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> validate_file \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ \u003Cspan class=\"hljs-variable\">$file\u003C/span> passed all validations\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ \u003Cspan class=\"hljs-variable\">$file\u003C/span> has validation errors\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n        VALIDATION_ERRORS=$((VALIDATION_ERRORS + \u003Cspan class=\"hljs-number\">1\u003C/span>))\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\u003Cspan class=\"hljs-keyword\">done\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Summary and decision\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;=&quot;\u003C/span> * 50\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;📊 VALIDATION SUMMARY&quot;\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;=&quot;\u003C/span> * 50\n\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> [ \u003Cspan class=\"hljs-variable\">$VALIDATION_ERRORS\u003C/span> -eq 0 ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>✅ All Markdown files passed validation!\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;💚 Commit proceeding...&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">exit\u003C/span> 0\n\u003Cspan class=\"hljs-keyword\">else\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>❌ \u003Cspan class=\"hljs-variable\">$VALIDATION_ERRORS\u003C/span> file(s) failed validation\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;🛠️  To fix issues:&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;  • Run &#x27;markdownlint --fix&#x27; to auto-fix syntax issues&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;  • Check and fix broken links manually&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;  • Review custom validation output above&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;🚫 Commit blocked until validation passes&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;   Use &#x27;git commit --no-verify&#x27; to bypass (not recommended)&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">exit\u003C/span> 1\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch3 id=\"editor-integration-and-real-time-validation\">Editor Integration and Real-Time Validation\u003C/h3>\n\u003Cp>Configuring development environments for immediate feedback:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-json\">\u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n  \u003Cspan class=\"hljs-attr\">&quot;name&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;markdown-validation-workspace&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \u003Cspan class=\"hljs-attr\">&quot;version&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;1.0.0&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \u003Cspan class=\"hljs-attr\">&quot;description&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Workspace configuration for Markdown validation&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \n  \u003Cspan class=\"hljs-attr\">&quot;devDependencies&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;markdownlint&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;^0.29.0&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;markdownlint-cli2&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;^0.8.1&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;markdown-link-check&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;^3.11.0&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;remark&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;^14.0.3&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;remark-lint&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;^9.1.2&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;remark-preset-lint-recommended&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;^6.1.3&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;textlint&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;^13.3.2&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;alex&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;^11.0.1&quot;\u003C/span>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \n  \u003Cspan class=\"hljs-attr\">&quot;scripts&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;validate&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;node scripts/markdown-validator.js&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;validate:quick&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;markdownlint-cli2 **/*.md&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;validate:links&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;find . -name &#x27;*.md&#x27; | xargs markdown-link-check&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;validate:content&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;textlint **/*.md&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;validate:inclusive&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;alex **/*.md&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;fix&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;markdownlint-cli2-fix **/*.md&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;validate:watch&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;chokidar &#x27;**/*.md&#x27; -c &#x27;npm run validate:quick&#x27;&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;validate:pre-commit&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;lint-staged&quot;\u003C/span>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \n  \u003Cspan class=\"hljs-attr\">&quot;lint-staged&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;*.{md,markdown}&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">[\u003C/span>\n      \u003Cspan class=\"hljs-string\">&quot;markdownlint-cli2 --fix&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-string\">&quot;node scripts/markdown-validator.js --file&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-string\">&quot;git add&quot;\u003C/span>\n    \u003Cspan class=\"hljs-punctuation\">]\u003C/span>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \n  \u003Cspan class=\"hljs-attr\">&quot;remarkConfig&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;plugins&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">[\u003C/span>\n      \u003Cspan class=\"hljs-string\">&quot;remark-preset-lint-recommended&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-punctuation\">[\u003C/span>\u003Cspan class=\"hljs-string\">&quot;remark-lint-maximum-line-length&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span> \u003Cspan class=\"hljs-number\">120\u003C/span>\u003Cspan class=\"hljs-punctuation\">]\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-punctuation\">[\u003C/span>\u003Cspan class=\"hljs-string\">&quot;remark-lint-no-duplicate-headings&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">false\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">]\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-string\">&quot;remark-lint-no-empty-sections&quot;\u003C/span>\n    \u003Cspan class=\"hljs-punctuation\">]\u003C/span>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \n  \u003Cspan class=\"hljs-attr\">&quot;textlintConfig&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;rules&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n      \u003Cspan class=\"hljs-attr\">&quot;preset-ja-technical-writing&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">true\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-attr\">&quot;prh&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n        \u003Cspan class=\"hljs-attr\">&quot;rulePaths&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">[\u003C/span>\u003Cspan class=\"hljs-string\">&quot;./prh-rules/technical-terms.yml&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">]\u003C/span>\n      \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-attr\">&quot;write-good&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n        \u003Cspan class=\"hljs-attr\">&quot;passive&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">false\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n        \u003Cspan class=\"hljs-attr\">&quot;illusion&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">true\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n        \u003Cspan class=\"hljs-attr\">&quot;so&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">true\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n        \u003Cspan class=\"hljs-attr\">&quot;thereIs&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">true\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n        \u003Cspan class=\"hljs-attr\">&quot;weasel&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">true\u003C/span>\u003C/span>\n      \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\n    \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\n\u003Cspan class=\"hljs-punctuation\">}\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch3 id=\"vscode-configuration\">VSCode Configuration\u003C/h3>\n\u003Cpre>\u003Ccode class=\"hljs language-json\">\u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n  \u003Cspan class=\"hljs-comment\">// .vscode/settings.json\u003C/span>\n  \u003Cspan class=\"hljs-attr\">&quot;markdownlint.config&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;MD013&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">false\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;MD033&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">false\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;MD041&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">false\u003C/span>\u003C/span>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \n  \u003Cspan class=\"hljs-attr\">&quot;files.associations&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;*.md&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;markdown&quot;\u003C/span>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \n  \u003Cspan class=\"hljs-attr\">&quot;editor.rulers&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">[\u003C/span>\u003Cspan class=\"hljs-number\">80\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span> \u003Cspan class=\"hljs-number\">120\u003C/span>\u003Cspan class=\"hljs-punctuation\">]\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \u003Cspan class=\"hljs-attr\">&quot;editor.wordWrap&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;bounded&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \u003Cspan class=\"hljs-attr\">&quot;editor.wordWrapColumn&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-number\">120\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \n  \u003Cspan class=\"hljs-attr\">&quot;[markdown]&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;editor.defaultFormatter&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;DavidAnson.vscode-markdownlint&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;editor.formatOnSave&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">true\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;editor.codeActionsOnSave&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n      \u003Cspan class=\"hljs-attr\">&quot;source.fixAll.markdownlint&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">true\u003C/span>\u003C/span>\n    \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;editor.quickSuggestions&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n      \u003Cspan class=\"hljs-attr\">&quot;comments&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;off&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-attr\">&quot;strings&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;off&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-attr\">&quot;other&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;off&quot;\u003C/span>\n    \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \n  \u003Cspan class=\"hljs-attr\">&quot;markdownlint.run&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;onType&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \u003Cspan class=\"hljs-attr\">&quot;markdown-link-check.aliveStatusCodes&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">[\u003C/span>\u003Cspan class=\"hljs-number\">200\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span> \u003Cspan class=\"hljs-number\">206\u003C/span>\u003Cspan class=\"hljs-punctuation\">]\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\">// Extensions configuration\u003C/span>\n  \u003Cspan class=\"hljs-attr\">&quot;markdown.extension.toc.updateOnSave&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">true\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \u003Cspan class=\"hljs-attr\">&quot;markdown.extension.print.absoluteImgPath&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">false\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\">// Spell checking\u003C/span>\n  \u003Cspan class=\"hljs-attr\">&quot;cSpell.enabledLanguageIds&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">[\u003C/span>\n    \u003Cspan class=\"hljs-string\">&quot;markdown&quot;\u003C/span>\n  \u003Cspan class=\"hljs-punctuation\">]\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n  \u003Cspan class=\"hljs-attr\">&quot;cSpell.customDictionaries&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n    \u003Cspan class=\"hljs-attr\">&quot;project-terms&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-punctuation\">{\u003C/span>\n      \u003Cspan class=\"hljs-attr\">&quot;name&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;project-terms&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-attr\">&quot;path&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;./.vscode/project-dictionary.txt&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-attr\">&quot;addWords&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">true\u003C/span>\u003C/span>\u003Cspan class=\"hljs-punctuation\">,\u003C/span>\n      \u003Cspan class=\"hljs-attr\">&quot;scope&quot;\u003C/span>\u003Cspan class=\"hljs-punctuation\">:\u003C/span> \u003Cspan class=\"hljs-string\">&quot;workspace&quot;\u003C/span>\n    \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C/span>\n\u003Cspan class=\"hljs-punctuation\">}\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"integration-with-content-workflows\">Integration with Content Workflows\u003C/h2>\n\u003Cp>Markdown error handling and validation integrate seamlessly with comprehensive content management systems. When combined with \u003Ca href=\"/blog/markdown-automated-testing-validation-complete-guide\">automated testing and quality assurance workflows\u003C/a>, validation systems create robust content pipelines where errors are caught early, content quality remains consistent, and collaborative workflows maintain high editorial standards across distributed teams.\u003C/p>\n\u003Cp>For enterprise content operations, validation systems work effectively with \u003Ca href=\"/blog/markdown-performance-optimization-complete-guide\">performance optimization strategies\u003C/a> to ensure that quality assurance processes don&#39;t compromise publishing speed, where validation runs efficiently in CI/CD pipelines, and content delivery maintains both accuracy and performance standards.\u003C/p>\n\u003Cp>When building sophisticated documentation platforms, error handling complements \u003Ca href=\"/blog/markdown-automation-workflows-complete-guide\">workflow automation systems\u003C/a> by enabling intelligent content processing where validation results trigger automated fixes, content routing decisions, and quality score calculations that maintain editorial excellence at scale.\u003C/p>\n\u003Ch2 id=\"advanced-error-recovery-and-reporting\">Advanced Error Recovery and Reporting\u003C/h2>\n\u003Ch3 id=\"intelligent-error-resolution\">Intelligent Error Resolution\u003C/h3>\n\u003Cp>Creating systems that can automatically resolve common formatting issues:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// error-recovery.js - Automated error resolution 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_\">MarkdownErrorRecovery\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\">config\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">autoFix\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">headingSpaces\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">trailingWhitespace\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">consecutiveBlankLines\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">listIndentation\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">codeBlockTermination\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">linkFormatting\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">tableAlignment\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n            },\n            \n            \u003Cspan class=\"hljs-attr\">backup\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">enabled\u003C/span>: options.\u003Cspan class=\"hljs-property\">createBackups\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">directory\u003C/span>: options.\u003Cspan class=\"hljs-property\">backupDirectory\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;./.backup&#x27;\u003C/span>\n            },\n            \n            \u003Cspan class=\"hljs-attr\">reporting\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">enabled\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">format\u003C/span>: options.\u003Cspan class=\"hljs-property\">reportFormat\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;detailed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">outputPath\u003C/span>: options.\u003Cspan class=\"hljs-property\">reportPath\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;./error-recovery-report.json&#x27;\u003C/span>\n            }\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fixes\u003C/span> = [];\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span> = [];\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">processFile\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`🔧 Processing file for error recovery: \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> originalContent = \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\">let\u003C/span> fixedContent = originalContent;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> appliedFixes = [];\n            \n            \u003Cspan class=\"hljs-comment\">// Create backup if enabled\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">backup\u003C/span>.\u003Cspan class=\"hljs-property\">enabled\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">createBackup\u003C/span>(filePath, originalContent);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Apply fixes in order\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">autoFix\u003C/span>.\u003Cspan class=\"hljs-property\">headingSpaces\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">fixHeadingSpaces\u003C/span>(fixedContent);\n                fixedContent = result.\u003Cspan class=\"hljs-property\">content\u003C/span>;\n                appliedFixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...result.\u003Cspan class=\"hljs-property\">fixes\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">autoFix\u003C/span>.\u003Cspan class=\"hljs-property\">trailingWhitespace\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">fixTrailingWhitespace\u003C/span>(fixedContent);\n                fixedContent = result.\u003Cspan class=\"hljs-property\">content\u003C/span>;\n                appliedFixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...result.\u003Cspan class=\"hljs-property\">fixes\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">autoFix\u003C/span>.\u003Cspan class=\"hljs-property\">consecutiveBlankLines\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">fixConsecutiveBlankLines\u003C/span>(fixedContent);\n                fixedContent = result.\u003Cspan class=\"hljs-property\">content\u003C/span>;\n                appliedFixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...result.\u003Cspan class=\"hljs-property\">fixes\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">autoFix\u003C/span>.\u003Cspan class=\"hljs-property\">listIndentation\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">fixListIndentation\u003C/span>(fixedContent);\n                fixedContent = result.\u003Cspan class=\"hljs-property\">content\u003C/span>;\n                appliedFixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...result.\u003Cspan class=\"hljs-property\">fixes\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">autoFix\u003C/span>.\u003Cspan class=\"hljs-property\">codeBlockTermination\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">fixCodeBlockTermination\u003C/span>(fixedContent);\n                fixedContent = result.\u003Cspan class=\"hljs-property\">content\u003C/span>;\n                appliedFixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...result.\u003Cspan class=\"hljs-property\">fixes\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">autoFix\u003C/span>.\u003Cspan class=\"hljs-property\">linkFormatting\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">fixLinkFormatting\u003C/span>(fixedContent);\n                fixedContent = result.\u003Cspan class=\"hljs-property\">content\u003C/span>;\n                appliedFixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...result.\u003Cspan class=\"hljs-property\">fixes\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">autoFix\u003C/span>.\u003Cspan class=\"hljs-property\">tableAlignment\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">fixTableAlignment\u003C/span>(fixedContent);\n                fixedContent = result.\u003Cspan class=\"hljs-property\">content\u003C/span>;\n                appliedFixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...result.\u003Cspan class=\"hljs-property\">fixes\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Write fixed content if changes were made\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fixedContent !== originalContent) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">writeFile\u003C/span>(filePath, fixedContent);\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`✅ Applied \u003Cspan class=\"hljs-subst\">${appliedFixes.length}\u003C/span> fixes to \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>`\u003C/span>);\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`ℹ️  No fixes needed for \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>`\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Record results\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fixes\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">file\u003C/span>: filePath,\n                \u003Cspan class=\"hljs-attr\">appliedFixes\u003C/span>: appliedFixes,\n                \u003Cspan class=\"hljs-attr\">originalSize\u003C/span>: originalContent.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">fixedSize\u003C/span>: fixedContent.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            });\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">success\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">fixesApplied\u003C/span>: appliedFixes.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">content\u003C/span>: fixedContent\n            };\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">`❌ Error processing \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>:`\u003C/span>, error.\u003Cspan class=\"hljs-property\">message\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">file\u003C/span>: filePath,\n                \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>\n            });\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">success\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">fixHeadingSpaces\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixes = [];\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> fixedLines = lines.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> headingMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(#{1,6})([^\\s].*)/\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headingMatch) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> hashes = headingMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> text = headingMatch[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixed = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${hashes}\u003C/span> \u003Cspan class=\"hljs-subst\">${text}\u003C/span>`\u003C/span>;\n                \n                fixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heading_space_added&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">original\u003C/span>: line,\n                    \u003Cspan class=\"hljs-attr\">fixed\u003C/span>: fixed\n                });\n                \n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> fixed;\n            }\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> line;\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">content\u003C/span>: fixedLines.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>),\n            fixes\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">fixTrailingWhitespace\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixes = [];\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> fixedLines = lines.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\s+$/\u003C/span>)) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixed = line.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\s+$/\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n                fixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;trailing_whitespace_removed&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">charactersRemoved\u003C/span>: line.\u003Cspan class=\"hljs-property\">length\u003C/span> - fixed.\u003Cspan class=\"hljs-property\">length\u003C/span>\n                });\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> fixed;\n            }\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> line;\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">content\u003C/span>: fixedLines.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>),\n            fixes\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">fixConsecutiveBlankLines\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixes = [];\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> fixedLines = [];\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> consecutiveBlankLines = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> blankLineStart = -\u003Cspan class=\"hljs-number\">1\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_\">trim\u003C/span>() === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (consecutiveBlankLines === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                    blankLineStart = i;\n                }\n                consecutiveBlankLines++;\n                \n                \u003Cspan class=\"hljs-comment\">// Keep maximum 2 consecutive blank lines\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (consecutiveBlankLines &lt;= \u003Cspan class=\"hljs-number\">2\u003C/span>) {\n                    fixedLines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(line);\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (consecutiveBlankLines &gt; \u003Cspan class=\"hljs-number\">2\u003C/span>) {\n                    fixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;excessive_blank_lines_removed&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">startLine\u003C/span>: blankLineStart + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">endLine\u003C/span>: i,\n                        \u003Cspan class=\"hljs-attr\">removed\u003C/span>: consecutiveBlankLines - \u003Cspan class=\"hljs-number\">2\u003C/span>\n                    });\n                }\n                \n                consecutiveBlankLines = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n                fixedLines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(line);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">content\u003C/span>: fixedLines.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>),\n            fixes\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">fixListIndentation\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixes = [];\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> fixedLines = lines.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> listMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*)([\\-\\*\\+]|\\d+\\.)\\s/\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (listMatch) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> currentIndent = listMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> marker = listMatch[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> restOfLine = line.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(listMatch[\u003Cspan class=\"hljs-number\">0\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>);\n                \n                \u003Cspan class=\"hljs-comment\">// Calculate proper indentation (multiples of 2 spaces)\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> indentLevel = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">floor\u003C/span>(currentIndent.\u003Cspan class=\"hljs-property\">length\u003C/span> / \u003Cspan class=\"hljs-number\">2\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> properIndent = \u003Cspan class=\"hljs-string\">&#x27;  &#x27;\u003C/span>.\u003Cspan class=\"hljs-title function_\">repeat\u003C/span>(indentLevel);\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentIndent !== properIndent) {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixed = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${properIndent}\u003C/span>\u003Cspan class=\"hljs-subst\">${marker}\u003C/span> \u003Cspan class=\"hljs-subst\">${restOfLine}\u003C/span>`\u003C/span>;\n                    fixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;list_indentation_fixed&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">original\u003C/span>: line,\n                        \u003Cspan class=\"hljs-attr\">fixed\u003C/span>: fixed\n                    });\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span> fixed;\n                }\n            }\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> line;\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">content\u003C/span>: fixedLines.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>),\n            fixes\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">fixCodeBlockTermination\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixes = [];\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\">let\u003C/span> inCodeBlock = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> codeBlockStart = -\u003Cspan class=\"hljs-number\">1\u003C/span>;\n        \n        \u003Cspan class=\"hljs-comment\">// Check for unterminated code blocks\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = \u003Cspan class=\"hljs-number\">0\u003C/span>; i &lt; lines.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> line = lines[i].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\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                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inCodeBlock) {\n                    \u003Cspan class=\"hljs-comment\">// Closing code block\u003C/span>\n                    inCodeBlock = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                    codeBlockStart = -\u003Cspan class=\"hljs-number\">1\u003C/span>;\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    \u003Cspan class=\"hljs-comment\">// Opening code block\u003C/span>\n                    inCodeBlock = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                    codeBlockStart = i;\n                }\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Fix unterminated code block\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inCodeBlock &amp;&amp; codeBlockStart !== -\u003Cspan class=\"hljs-number\">1\u003C/span>) {\n            lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>);\n            fixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;code_block_terminated&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">startLine\u003C/span>: codeBlockStart + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">addedLine\u003C/span>: lines.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">content\u003C/span>: lines.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>),\n            fixes\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">fixLinkFormatting\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixes = [];\n        \n        \u003Cspan class=\"hljs-comment\">// Fix common link formatting issues\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> fixedContent = content;\n        \n        \u003Cspan class=\"hljs-comment\">// Fix missing closing parenthesis\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> missingClosingParen = \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]+)\\]\\(([^)]+)(?!\\))/g\u003C/span>;\n        fixedContent = fixedContent.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(missingClosingParen, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">match, text, url\u003C/span>) =&gt;\u003C/span> {\n            fixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;link_closing_paren_added&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">original\u003C/span>: match,\n                \u003Cspan class=\"hljs-attr\">fixed\u003C/span>: \u003Cspan class=\"hljs-string\">`[\u003Cspan class=\"hljs-subst\">${text}\u003C/span>](\u003Cspan class=\"hljs-subst\">${url}\u003C/span>)`\u003C/span>\n            });\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`[\u003Cspan class=\"hljs-subst\">${text}\u003C/span>](\u003Cspan class=\"hljs-subst\">${url}\u003C/span>)`\u003C/span>;\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Fix missing opening parenthesis after ]\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> missingOpeningParen = \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]+)\\]([^(\\s][^)]*)/g\u003C/span>;\n        fixedContent = fixedContent.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(missingOpeningParen, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">match, text, url\u003C/span>) =&gt;\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>)) { \u003Cspan class=\"hljs-comment\">// Not a reference link\u003C/span>\n                fixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;link_opening_paren_added&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">original\u003C/span>: match,\n                    \u003Cspan class=\"hljs-attr\">fixed\u003C/span>: \u003Cspan class=\"hljs-string\">`[\u003Cspan class=\"hljs-subst\">${text}\u003C/span>](\u003Cspan class=\"hljs-subst\">${url}\u003C/span>)`\u003C/span>\n                });\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`[\u003Cspan class=\"hljs-subst\">${text}\u003C/span>](\u003Cspan class=\"hljs-subst\">${url}\u003C/span>)`\u003C/span>;\n            }\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> match;\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">content\u003C/span>: fixedContent,\n            fixes\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">fixTableAlignment\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixes = [];\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> fixedLines = [];\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> inTable = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> tableRows = [];\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> tableStart = -\u003Cspan class=\"hljs-number\">1\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> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isTableRow\u003C/span>(line)) {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!inTable) {\n                    inTable = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                    tableStart = i;\n                    tableRows = [];\n                }\n                tableRows.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({ \u003Cspan class=\"hljs-attr\">index\u003C/span>: i, \u003Cspan class=\"hljs-attr\">content\u003C/span>: line });\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inTable) {\n                \u003Cspan class=\"hljs-comment\">// End of table - process and fix alignment\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixedTable = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">alignTable\u003C/span>(tableRows);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fixedTable.\u003Cspan class=\"hljs-property\">wasFixed\u003C/span>) {\n                    fixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;table_alignment_fixed&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">startLine\u003C/span>: tableStart + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">endLine\u003C/span>: i,\n                        \u003Cspan class=\"hljs-attr\">rowsFixed\u003C/span>: fixedTable.\u003Cspan class=\"hljs-property\">fixes\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>\n                    });\n                    fixedLines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...fixedTable.\u003Cspan class=\"hljs-property\">rows\u003C/span>);\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    fixedLines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...tableRows.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> row.\u003Cspan class=\"hljs-property\">content\u003C/span>));\n                }\n                \n                inTable = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                tableRows = [];\n                fixedLines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(line);\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                fixedLines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(line);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Handle table at end of file\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inTable &amp;&amp; tableRows.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixedTable = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">alignTable\u003C/span>(tableRows);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fixedTable.\u003Cspan class=\"hljs-property\">wasFixed\u003C/span>) {\n                fixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;table_alignment_fixed&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">startLine\u003C/span>: tableStart + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">endLine\u003C/span>: lines.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">rowsFixed\u003C/span>: fixedTable.\u003Cspan class=\"hljs-property\">fixes\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>\n                });\n                fixedLines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...fixedTable.\u003Cspan class=\"hljs-property\">rows\u003C/span>);\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                fixedLines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...tableRows.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> row.\u003Cspan class=\"hljs-property\">content\u003C/span>));\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">content\u003C/span>: fixedLines.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>),\n            fixes\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isTableRow\u003C/span>(\u003Cspan class=\"hljs-params\">line\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> trimmed = line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> trimmed.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>) &amp;&amp; \n               (trimmed.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>) || trimmed.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>));\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">alignTable\u003C/span>(\u003Cspan class=\"hljs-params\">tableRows\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (tableRows.\u003Cspan class=\"hljs-property\">length\u003C/span> &lt; \u003Cspan class=\"hljs-number\">2\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">rows\u003C/span>: tableRows.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">r\u003C/span> =&gt;\u003C/span> r.\u003Cspan class=\"hljs-property\">content\u003C/span>), \u003Cspan class=\"hljs-attr\">wasFixed\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>, \u003Cspan class=\"hljs-attr\">fixes\u003C/span>: [] };\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Parse all rows\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> parsedRows = tableRows.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> cells = row.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> cell.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>());\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> { ...row, cells };\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Find maximum width for each column\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> maxColumns = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(...parsedRows.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>));\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> columnWidths = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Array\u003C/span>(maxColumns).\u003Cspan class=\"hljs-title function_\">fill\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>);\n        \n        parsedRows.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> {\n            row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\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> (index &lt; columnWidths.\u003Cspan class=\"hljs-property\">length\u003C/span>) {\n                    columnWidths[index] = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(columnWidths[index], cell.\u003Cspan class=\"hljs-property\">length\u003C/span>);\n                }\n            });\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Rebuild rows with proper alignment\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixedRows = [];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixes = [];\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> wasFixed = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \n        parsedRows.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> alignedCells = row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\u003Cspan class=\"hljs-title function_\">map\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> (index &lt; columnWidths.\u003Cspan class=\"hljs-property\">length\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span> cell.\u003Cspan class=\"hljs-title function_\">padEnd\u003C/span>(columnWidths[index]);\n                }\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> cell;\n            });\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixedRow = \u003Cspan class=\"hljs-string\">`| \u003Cspan class=\"hljs-subst\">${alignedCells.join(\u003Cspan class=\"hljs-string\">&#x27; | &#x27;\u003C/span>)}\u003C/span> |`\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fixedRow !== row.\u003Cspan class=\"hljs-property\">content\u003C/span>) {\n                wasFixed = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                fixes.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: row.\u003Cspan class=\"hljs-property\">index\u003C/span> + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">original\u003C/span>: row.\u003Cspan class=\"hljs-property\">content\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">fixed\u003C/span>: fixedRow\n                });\n            }\n            \n            fixedRows.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(fixedRow);\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">rows\u003C/span>: fixedRows, wasFixed, fixes };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">createBackup\u003C/span>(\u003Cspan class=\"hljs-params\">filePath, content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">backup\u003C/span>.\u003Cspan class=\"hljs-property\">enabled\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> backupDir = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">backup\u003C/span>.\u003Cspan class=\"hljs-property\">directory\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> timestamp = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>().\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/[:.]/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>);\n        \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> backupFileName = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${fileName}\u003C/span>.\u003Cspan class=\"hljs-subst\">${timestamp}\u003C/span>.backup`\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> backupPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(backupDir, backupFileName);\n        \n        \u003Cspan class=\"hljs-comment\">// Ensure backup directory exists\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">mkdir\u003C/span>(backupDir, { \u003Cspan class=\"hljs-attr\">recursive\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> });\n        \n        \u003Cspan class=\"hljs-comment\">// Write backup file\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">writeFile\u003C/span>(backupPath, content);\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`📁 Backup created: \u003Cspan class=\"hljs-subst\">${backupPath}\u003C/span>`\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">generateReport\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>: {\n                \u003Cspan class=\"hljs-attr\">filesProcessed\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fixes\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">filesWithErrors\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">totalFixes\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fixes\u003C/span>.\u003Cspan class=\"hljs-title function_\">reduce\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">sum, f\u003C/span>) =&gt;\u003C/span> sum + f.\u003Cspan class=\"hljs-property\">appliedFixes\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>),\n                \u003Cspan class=\"hljs-attr\">successRate\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fixes\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> / (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fixes\u003C/span>.\u003Cspan class=\"hljs-property\">length\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\">100\u003C/span>\n            },\n            \u003Cspan class=\"hljs-attr\">fixes\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fixes\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\">configuration\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">reporting\u003C/span>.\u003Cspan class=\"hljs-property\">enabled\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">writeFile\u003C/span>(\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">config\u003C/span>.\u003Cspan class=\"hljs-property\">reporting\u003C/span>.\u003Cspan class=\"hljs-property\">outputPath\u003C/span>,\n                \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">stringify\u003C/span>(report, \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-number\">2\u003C/span>)\n            );\n            \n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`📊 Error recovery report saved: \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.config.reporting.outputPath}\u003C/span>`\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> report;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">printSummary\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> totalFixes = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fixes\u003C/span>.\u003Cspan class=\"hljs-title function_\">reduce\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">sum, f\u003C/span>) =&gt;\u003C/span> sum + f.\u003Cspan class=\"hljs-property\">appliedFixes\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>);\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span> + \u003Cspan class=\"hljs-string\">&#x27;=&#x27;\u003C/span>.\u003Cspan class=\"hljs-title function_\">repeat\u003C/span>(\u003Cspan class=\"hljs-number\">60\u003C/span>));\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;🔧 ERROR RECOVERY SUMMARY&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;=&#x27;\u003C/span>.\u003Cspan class=\"hljs-title function_\">repeat\u003C/span>(\u003Cspan class=\"hljs-number\">60\u003C/span>));\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`📁 Files processed: \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.fixes.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\">`✅ Total fixes applied: \u003Cspan class=\"hljs-subst\">${totalFixes}\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\">`❌ Files with errors: \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.errors.length}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fixes\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📋 FIXES BY TYPE:&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> fixTypes = {};\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">fixes\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                file.\u003Cspan class=\"hljs-property\">appliedFixes\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">fix\u003C/span> =&gt;\u003C/span> {\n                    fixTypes[fix.\u003Cspan class=\"hljs-property\">type\u003C/span>] = (fixTypes[fix.\u003Cspan class=\"hljs-property\">type\u003C/span>] || \u003Cspan class=\"hljs-number\">0\u003C/span>) + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                });\n            });\n            \n            \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(fixTypes).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[type, count]\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\">${type}\u003C/span>: \u003Cspan class=\"hljs-subst\">${count}\u003C/span>`\u003C/span>);\n            });\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span> + \u003Cspan class=\"hljs-string\">&#x27;=&#x27;\u003C/span>.\u003Cspan class=\"hljs-title function_\">repeat\u003C/span>(\u003Cspan class=\"hljs-number\">60\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_\">MarkdownErrorRecovery\u003C/span>;\n\n\u003Cspan class=\"hljs-comment\">// CLI usage\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> recovery = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownErrorRecovery\u003C/span>({\n        \u003Cspan class=\"hljs-attr\">createBackups\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">reportFormat\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;detailed&#x27;\u003C/span>\n    });\n    \n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> targetPath = process.\u003Cspan class=\"hljs-property\">argv\u003C/span>[\u003Cspan class=\"hljs-number\">2\u003C/span>] || \u003Cspan class=\"hljs-string\">&#x27;./&#x27;\u003C/span>;\n    \n    \u003Cspan class=\"hljs-comment\">// Process files recursively\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-title function_\">processDirectory\u003C/span> = \u003Cspan class=\"hljs-keyword\">async\u003C/span> (\u003Cspan class=\"hljs-params\">dirPath\u003C/span>) =&gt; {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> items = \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">readdir\u003C/span>(dirPath, { \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> item \u003Cspan class=\"hljs-keyword\">of\u003C/span> items) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> fullPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(dirPath, item.\u003Cspan class=\"hljs-property\">name\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (item.\u003Cspan class=\"hljs-title function_\">isDirectory\u003C/span>() &amp;&amp; !item.\u003Cspan class=\"hljs-property\">name\u003C/span>.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title function_\">processDirectory\u003C/span>(fullPath);\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (item.\u003Cspan class=\"hljs-title function_\">isFile\u003C/span>() &amp;&amp; \n                      (item.\u003Cspan class=\"hljs-property\">name\u003C/span>.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>) || item.\u003Cspan class=\"hljs-property\">name\u003C/span>.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.markdown&#x27;\u003C/span>))) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> recovery.\u003Cspan class=\"hljs-title function_\">processFile\u003C/span>(fullPath);\n            }\n        }\n    };\n    \n    \u003Cspan class=\"hljs-title function_\">processDirectory\u003C/span>(targetPath)\n        .\u003Cspan class=\"hljs-title function_\">then\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n            recovery.\u003Cspan class=\"hljs-title function_\">printSummary\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> recovery.\u003Cspan class=\"hljs-title function_\">generateReport\u003C/span>();\n        })\n        .\u003Cspan class=\"hljs-title function_\">then\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;🎉 Error recovery completed successfully!&#x27;\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;❌ Error recovery 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>\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Markdown error handling and validation represent essential components of professional content management systems that ensure consistent quality, reduce maintenance overhead, and enable confident collaborative workflows. By implementing comprehensive validation systems, automated error recovery, and integrated quality assurance processes, technical teams can build robust content pipelines that catch errors early, maintain editorial standards, and deliver reliable content experiences across all platforms and publishing contexts.\u003C/p>\n\u003Cp>The key to successful Markdown validation lies in balancing automated checking with editorial flexibility, implementing validation rules that serve content goals rather than hindering productivity, and creating feedback loops that help content creators learn and improve their Markdown skills over time. Whether you&#39;re managing technical documentation, educational content, or collaborative knowledge bases, the validation techniques and error handling strategies covered in this guide provide the foundation for building maintainable, high-quality content systems.\u003C/p>\n\u003Cp>Remember to tailor validation rules to your team&#39;s specific needs and content requirements, implement gradual rollouts of new validation standards to minimize disruption, and continuously monitor validation effectiveness to ensure that quality assurance processes enhance rather than impede content creation workflows. With proper implementation of comprehensive error handling and validation systems, your Markdown content can maintain professional quality standards while preserving the simplicity and collaborative benefits that make Markdown an ideal format for modern technical communication.\u003C/p>\n",[15,19,22,25,28,31,34],{"id":16,"text":17,"level":18},"why-master-markdown-error-handling-and-validation","Why Master Markdown Error Handling and Validation?",2,{"id":20,"text":21,"level":18},"foundation-validation-principles","Foundation Validation Principles",{"id":23,"text":24,"level":18},"automated-validation-systems","Automated Validation Systems",{"id":26,"text":27,"level":18},"error-prevention-strategies","Error Prevention Strategies",{"id":29,"text":30,"level":18},"integration-with-content-workflows","Integration with Content Workflows",{"id":32,"text":33,"level":18},"advanced-error-recovery-and-reporting","Advanced Error Recovery and Reporting",{"id":35,"text":36,"level":18},"conclusion","Conclusion",[],[39,47,55],{"slug":40,"title":41,"description":42,"excerpt":43,"date":44,"category":9,"author":10,"keywords":45,"readingMinutes":46},"markdown-data-validation-and-schema-checking-complete-guide","Markdown Data Validation and Schema Checking: Complete Guide for Content Quality Assurance and Automated Verification","Master advanced Markdown data validation techniques using schema checking, frontmatter validation, content structure verification, and automated quality assurance systems. Learn to implement robust validation workflows for documentation teams.","Advanced Markdown data validation and schema checking enables sophisticated content quality assurance systems that automatically verify document structure, validate metadata consistency, and…","2025-10-27","markdown data validation, schema checking markdown, frontmatter validation, markdown content verification, automated markdown quality, documentation validation, markdown schema, content structure validation",19,{"slug":48,"title":49,"description":50,"excerpt":51,"date":52,"category":9,"author":10,"keywords":53,"readingMinutes":54},"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",26,{"slug":56,"title":57,"description":58,"excerpt":59,"date":60,"category":9,"author":10,"keywords":61,"readingMinutes":62},"markdown-table-data-validation-quality-assurance-complete-guide","Markdown Table Data Validation and Quality Assurance: Complete Guide for Automated Table Content Verification","Master comprehensive table data validation techniques in Markdown for automated quality assurance, content verification, and structural integrity checking. Learn advanced validation patterns and automated testing workflows.","Markdown table data validation and quality assurance ensure accurate, consistent, and reliable table content across documentation systems through automated verification, structural integrity…","2025-11-09","markdown table validation, data quality assurance, table content verification, automated markdown testing, table structure validation, data integrity checking, markdown quality control, table validation tools",22,1792184945491]