[{"data":1,"prerenderedAt":95},["Reactive",2],{"blog-post-markdown-debugging-error-detection-complete-guide":3},{"slug":4,"title":5,"description":6,"excerpt":7,"date":8,"category":9,"author":10,"keywords":11,"readingMinutes":12,"html":13,"headings":14,"tools":70,"related":71},"markdown-debugging-error-detection-complete-guide","Markdown Debugging and Error Detection: Complete Guide for Troubleshooting Syntax Issues and Validation Problems","Master Markdown debugging techniques including syntax error detection, validation tools, common formatting problems, and automated error checking. Learn troubleshooting strategies for complex Markdown issues and parser inconsistencies.","Markdown debugging and error detection transforms frustrating formatting failures into systematic troubleshooting workflows that identify syntax issues, parser inconsistencies, and validation…","2026-01-08","Tutorial","Matthew Rathbone","markdown debugging, markdown validation, markdown error detection, markdown syntax errors, markdown troubleshooting, markdown parser issues, markdown linting, markdown quality assurance",26,"\u003Cp>Markdown debugging and error detection transforms frustrating formatting failures into systematic troubleshooting workflows that identify syntax issues, parser inconsistencies, and validation problems across different Markdown processors. By implementing comprehensive debugging strategies, validation tools, and automated error checking systems, content creators can maintain document quality, prevent rendering failures, and ensure consistent output across platforms while minimizing time spent on manual error hunting and correction.\u003C/p>\n\u003Ch2 id=\"why-master-markdown-debugging\">Why Master Markdown Debugging?\u003C/h2>\n\u003Cp>Professional Markdown debugging provides essential benefits for content creators and technical teams:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Rapid Issue Resolution\u003C/strong>: Quickly identify and fix syntax errors that break document rendering\u003C/li>\n\u003Cli>\u003Cstrong>Cross-Platform Compatibility\u003C/strong>: Ensure documents render consistently across different Markdown processors\u003C/li>\n\u003Cli>\u003Cstrong>Quality Assurance\u003C/strong>: Maintain high documentation standards through systematic validation and testing\u003C/li>\n\u003Cli>\u003Cstrong>Development Efficiency\u003C/strong>: Reduce time spent troubleshooting by implementing automated error detection\u003C/li>\n\u003Cli>\u003Cstrong>Prevention Strategies\u003C/strong>: Identify common error patterns to prevent future formatting issues\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"common-markdown-syntax-errors\">Common Markdown Syntax Errors\u003C/h2>\n\u003Ch3 id=\"basic-formatting-issues\">Basic Formatting Issues\u003C/h3>\n\u003Cp>Understanding fundamental syntax problems that cause rendering failures:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\"># Common Markdown Syntax Errors and Solutions\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## Heading Problems\u003C/span>\n\u003Cspan class=\"hljs-section\">### Incorrect: Missing space after hash\u003C/span>\n\u003Cspan class=\"hljs-section\">###Also incorrect: No space after multiple hashes\u003C/span>\n\u003Cspan class=\"hljs-section\">#### Correct: Proper spacing after hashes\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## List Formatting Issues\u003C/span>\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> Incorrect list item\n\u003Cspan class=\"hljs-bullet\">  -\u003C/span> Missing space before dash\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> Another item\n\u003Cspan class=\"hljs-bullet\">  *\u003C/span> Inconsistent bullet styles within same list\n\n\u003Cspan class=\"hljs-bullet\">1.\u003C/span> Numbered list\n2.Missing space after number\n\u003Cspan class=\"hljs-bullet\">3.\u003C/span> Another item\n\u003Cspan class=\"hljs-bullet\">  1.\u003C/span> Incorrect indentation for sub-items\n\n\u003Cspan class=\"hljs-section\">## Code Block Errors\u003C/span>\n\u003Cspan class=\"hljs-code\">```javascript\n// Incorrect: Mismatched code fence lengths\u003C/span>\n\u003C/code>\u003C/pre>\u003Cpre>\u003Ccode class=\"hljs language-markdown\">// Correct: Using four backticks to escape three\n\u003Cspan class=\"hljs-code\">```javascript\nconsole.log(&#x27;Properly escaped code block&#x27;);\n```\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"link-and-image-formatting-problems\">Link and Image Formatting Problems\u003C/h2>\n\u003Cp>[Broken link]missing-parentheses\u003Cbr>\u003Ca href=\"https://example.com\">Correct link\u003C/a>\u003C/p>\n\u003Cp>\u003Cimg src=\"\" alt=\"Missing alt text\">\u003Cbr>\u003Cimg src=\"image.png\" alt=\"Proper image\" title=\"Optional title\">\u003C/p>\n\u003Ch2 id=\"table-structure-issues\">Table Structure Issues\u003C/h2>\n\u003Cdiv class=\"table-responsive\">\u003Ctable class=\"table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Header 1\u003C/th>\n\u003Cth>Header 2\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Missing pipe\u003C/td>\n\u003Ctd>at end\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Proper cell\u003C/td>\n\u003Ctd>Proper cell\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\u003C/div>\n\u003Ch2 id=\"quote-block-problems\">Quote Block Problems\u003C/h2>\n\u003Cblockquote>\n\u003Cp>Missing space after greater than\u003Cbr>Proper blockquote formatting\u003C/p>\n\u003C/blockquote>\n\u003Ch2 id=\"emphasis-and-strong-formatting\">Emphasis and Strong Formatting\u003C/h2>\n\u003Cp>*Unmatched emphasis\u003Cbr>**Unmatched strong emphasis\u003Cbr>\u003Cem>\u003Cstrong>Correct emphasis combination\u003C/strong>\u003C/em>\u003C/p>\n\u003Cpre>\u003Ccode>\n### Advanced Syntax Problems\n\nComplex formatting issues that require careful debugging:\n\n```markdown\n# Advanced Markdown Debugging Scenarios\n\n## Nested Code Block Issues\n````markdown\n```python\n# This code block is properly escaped\ndef hello_world():\n    print(&quot;Hello, World!&quot;)\n\u003C/code>\u003C/pre>\u003Cp>````\u003C/p>\n\u003Ch2 id=\"table-alignment-problems\">Table Alignment Problems\u003C/h2>\n\u003Cdiv class=\"table-responsive\">\u003Ctable class=\"table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth align=\"left\">Left\u003C/th>\n\u003Cth align=\"center\">Center\u003C/th>\n\u003Cth align=\"right\">Right\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd align=\"left\">Text\u003C/td>\n\u003Ctd align=\"center\">Text\u003C/td>\n\u003Ctd align=\"right\">Text\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd align=\"left\">More\u003C/td>\n\u003Ctd align=\"center\">More\u003C/td>\n\u003Ctd align=\"right\">More\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\u003C/div>\n\u003Ch2 id=\"definition-list-errors-extended-markdown\">Definition List Errors (Extended Markdown)\u003C/h2>\n\u003Cp>Term 1\u003Cbr>: Definition should be indented properly\u003C/p>\n\u003Cp>Term 2\u003Cbr>:Missing space after colon\u003C/p>\n\u003Ch2 id=\"footnote-reference-problems\">Footnote Reference Problems\u003C/h2>\n\u003Cp>Here&#39;s a text with footnote\u003Csup>\u003Ca id=\"footnote-ref-1\" href=\"#footnote-1\" data-footnote-ref aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>.\u003C/p>\n\u003Cp>Here&#39;s broken footnote[^missing].\u003C/p>\n\u003Ch2 id=\"task-list-formatting-issues\">Task List Formatting Issues\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cinput checked=\"\" disabled=\"\" type=\"checkbox\"> Completed task\u003C/li>\n\u003Cli>\u003Cinput disabled=\"\" type=\"checkbox\"> Incomplete task\u003C/li>\n\u003Cli>\u003Cinput checked=\"\" disabled=\"\" type=\"checkbox\"> Capital X works too\u003C/li>\n\u003Cli>[] Missing space in brackets\u003C/li>\n\u003Cli>[x ] Extra space breaks formatting\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"mathematical-expression-errors\">Mathematical Expression Errors\u003C/h2>\n\u003Cp>$$ \\frac{x^2}{y^2} $$ // Proper LaTeX math\u003C/p>\n\u003Cp>$$ \\frac{x^2}{y^2 $$ // Missing closing delimiter\u003C/p>\n\u003Ch2 id=\"html-integration-problems\">HTML Integration Problems\u003C/h2>\n\u003Cdiv class=\"container\">\n  \u003Cp>Proper HTML integration\u003C/p>\n\u003C/div>\n\n\u003Cdiv class=\"unclosed\">\n  \u003Cp>Missing closing tag causes issues\n\n\u003Ch2 id=\"escape-character-misuse\">Escape Character Misuse\u003C/h2>\n\u003Cp>*This should show asterisks*\u003Cbr>[This should show brackets]\u003Cbr>\\This shows a literal backslash\u003C/p>\n\u003Ch2 id=\"unicode-and-special-character-issues\">Unicode and Special Character Issues\u003C/h2>\n\u003Cp>Smart quotes &quot;break&quot; some parsers\u003Cbr>Straight quotes &quot;work&quot; universally\u003Cbr>Em dashes — may cause problems\u003Cbr>Regular hyphens - are safer\u003C/p>\n\u003Cpre>\u003Ccode>\n## Debugging Tools and Techniques\n\n### Browser Developer Tools\n\nUsing browser inspection to diagnose rendering issues:\n\n```javascript\n// markdown-debugger.js - Browser-based Markdown debugging tools\n\nclass MarkdownDebugger {\n  constructor() {\n    this.errors = [];\n    this.warnings = [];\n    this.debugMode = false;\n    \n    this.initializeDebugger();\n  }\n  \n  initializeDebugger() {\n    // Add debug panel to page\n    this.createDebugPanel();\n    \n    // Monitor for rendering issues\n    this.observeMarkdownContent();\n    \n    // Add debug keyboard shortcuts\n    this.addKeyboardShortcuts();\n  }\n  \n  createDebugPanel() {\n    const panel = document.createElement(&#39;div&#39;);\n    panel.id = &#39;markdown-debug-panel&#39;;\n    panel.style.cssText = `\n      position: fixed;\n      top: 10px;\n      right: 10px;\n      width: 300px;\n      background: white;\n      border: 2px solid #e5e7eb;\n      border-radius: 8px;\n      padding: 16px;\n      box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n      z-index: 10000;\n      font-family: monospace;\n      font-size: 12px;\n      max-height: 400px;\n      overflow-y: auto;\n      display: none;\n    `;\n    \n    panel.innerHTML = `\n      &lt;h3 style=&quot;margin: 0 0 10px 0;&quot;&gt;Markdown Debug Panel&lt;/h3&gt;\n      &lt;div id=&quot;debug-errors&quot;&gt;&lt;/div&gt;\n      &lt;div id=&quot;debug-warnings&quot;&gt;&lt;/div&gt;\n      &lt;div id=&quot;debug-stats&quot;&gt;&lt;/div&gt;\n      &lt;button onclick=&quot;markdownDebugger.exportDebugReport()&quot;&gt;Export Report&lt;/button&gt;\n    `;\n    \n    document.body.appendChild(panel);\n    this.debugPanel = panel;\n  }\n  \n  toggleDebugPanel() {\n    this.debugMode = !this.debugMode;\n    this.debugPanel.style.display = this.debugMode ? &#39;block&#39; : &#39;none&#39;;\n    \n    if (this.debugMode) {\n      this.runFullDiagnostic();\n    }\n  }\n  \n  observeMarkdownContent() {\n    // Monitor for dynamically loaded content\n    const observer = new MutationObserver((mutations) =&gt; {\n      mutations.forEach((mutation) =&gt; {\n        if (mutation.type === &#39;childList&#39;) {\n          this.analyzeNewContent(mutation.addedNodes);\n        }\n      });\n    });\n    \n    observer.observe(document.body, {\n      childList: true,\n      subtree: true\n    });\n  }\n  \n  addKeyboardShortcuts() {\n    document.addEventListener(&#39;keydown&#39;, (event) =&gt; {\n      // Ctrl+Shift+D to toggle debug panel\n      if (event.ctrlKey &amp;&amp; event.shiftKey &amp;&amp; event.key === &#39;D&#39;) {\n        event.preventDefault();\n        this.toggleDebugPanel();\n      }\n      \n      // Ctrl+Shift+V to validate current page\n      if (event.ctrlKey &amp;&amp; event.shiftKey &amp;&amp; event.key === &#39;V&#39;) {\n        event.preventDefault();\n        this.runFullDiagnostic();\n      }\n    });\n  }\n  \n  runFullDiagnostic() {\n    this.errors = [];\n    this.warnings = [];\n    \n    // Check for common rendering issues\n    this.checkEmptyCodeBlocks();\n    this.checkBrokenLinks();\n    this.checkInconsistentHeadings();\n    this.checkTableFormatting();\n    this.checkListFormatting();\n    this.checkImageAccessibility();\n    \n    // Update debug panel\n    this.updateDebugDisplay();\n  }\n  \n  checkEmptyCodeBlocks() {\n    const codeBlocks = document.querySelectorAll(&#39;pre code, code&#39;);\n    codeBlocks.forEach((block, index) =&gt; {\n      if (block.textContent.trim() === &#39;&#39;) {\n        this.warnings.push({\n          type: &#39;Empty Code Block&#39;,\n          element: block,\n          message: `Code block ${index + 1} is empty`,\n          suggestion: &#39;Add content or remove the code block&#39;\n        });\n      }\n      \n      // Check for unclosed code blocks (in source)\n      if (block.textContent.includes(&#39;```&#39;) &amp;&amp; !block.closest(&#39;pre&#39;)) {\n        this.errors.push({\n          type: &#39;Malformed Code Block&#39;,\n          element: block,\n          message: &#39;Code block contains backticks - possible formatting error&#39;,\n          suggestion: &#39;Check for unclosed or improperly nested code blocks&#39;\n        });\n      }\n    });\n  }\n  \n  checkBrokenLinks() {\n    const links = document.querySelectorAll(&#39;a[href]&#39;);\n    links.forEach((link, index) =&gt; {\n      const href = link.getAttribute(&#39;href&#39;);\n      \n      // Check for empty href\n      if (!href || href.trim() === &#39;&#39;) {\n        this.errors.push({\n          type: &#39;Empty Link&#39;,\n          element: link,\n          message: `Link ${index + 1} has empty href attribute`,\n          suggestion: &#39;Add proper URL or remove the link&#39;\n        });\n      }\n      \n      // Check for malformed internal links\n      if (href.startsWith(&#39;#&#39;) &amp;&amp; href.length === 1) {\n        this.errors.push({\n          type: &#39;Invalid Anchor&#39;,\n          element: link,\n          message: `Link ${index + 1} has empty anchor reference`,\n          suggestion: &#39;Specify target anchor or use proper URL&#39;\n        });\n      }\n      \n      // Check for suspicious link text\n      if (link.textContent.trim() === &#39;&#39; &amp;&amp; !link.querySelector(&#39;img&#39;)) {\n        this.warnings.push({\n          type: &#39;Empty Link Text&#39;,\n          element: link,\n          message: `Link ${index + 1} has no visible text or image`,\n          suggestion: &#39;Add descriptive link text for accessibility&#39;\n        });\n      }\n    });\n  }\n  \n  checkInconsistentHeadings() {\n    const headings = document.querySelectorAll(&#39;h1, h2, h3, h4, h5, h6&#39;);\n    let previousLevel = 0;\n    \n    headings.forEach((heading, index) =&gt; {\n      const level = parseInt(heading.tagName.slice(1));\n      \n      // Check for heading hierarchy skips\n      if (level &gt; previousLevel + 1) {\n        this.warnings.push({\n          type: &#39;Heading Hierarchy&#39;,\n          element: heading,\n          message: `Heading ${index + 1} skips from h${previousLevel} to h${level}`,\n          suggestion: &#39;Use sequential heading levels for proper document structure&#39;\n        });\n      }\n      \n      // Check for empty headings\n      if (heading.textContent.trim() === &#39;&#39;) {\n        this.errors.push({\n          type: &#39;Empty Heading&#39;,\n          element: heading,\n          message: `Heading ${index + 1} is empty`,\n          suggestion: &#39;Add heading text or remove the heading element&#39;\n        });\n      }\n      \n      previousLevel = level;\n    });\n  }\n  \n  checkTableFormatting() {\n    const tables = document.querySelectorAll(&#39;table&#39;);\n    tables.forEach((table, index) =&gt; {\n      const rows = table.querySelectorAll(&#39;tr&#39;);\n      let expectedColumns = 0;\n      \n      rows.forEach((row, rowIndex) =&gt; {\n        const cells = row.querySelectorAll(&#39;td, th&#39;);\n        \n        if (rowIndex === 0) {\n          expectedColumns = cells.length;\n        } else if (cells.length !== expectedColumns) {\n          this.warnings.push({\n            type: &#39;Table Structure&#39;,\n            element: row,\n            message: `Table ${index + 1}, row ${rowIndex + 1} has ${cells.length} cells, expected ${expectedColumns}`,\n            suggestion: &#39;Ensure all table rows have the same number of columns&#39;\n          });\n        }\n        \n        // Check for empty cells\n        cells.forEach((cell, cellIndex) =&gt; {\n          if (cell.textContent.trim() === &#39;&#39;) {\n            this.warnings.push({\n              type: &#39;Empty Table Cell&#39;,\n              element: cell,\n              message: `Table ${index + 1}, row ${rowIndex + 1}, cell ${cellIndex + 1} is empty`,\n              suggestion: &#39;Add content to empty cells or use non-breaking space (&amp;nbsp;)&#39;\n            });\n          }\n        });\n      });\n    });\n  }\n  \n  checkListFormatting() {\n    const lists = document.querySelectorAll(&#39;ul, ol&#39;);\n    lists.forEach((list, index) =&gt; {\n      const items = list.querySelectorAll(&#39;li&#39;);\n      \n      // Check for empty list items\n      items.forEach((item, itemIndex) =&gt; {\n        if (item.textContent.trim() === &#39;&#39;) {\n          this.warnings.push({\n            type: &#39;Empty List Item&#39;,\n            element: item,\n            message: `List ${index + 1}, item ${itemIndex + 1} is empty`,\n            suggestion: &#39;Add content to list items or remove empty items&#39;\n          });\n        }\n      });\n      \n      // Check for single-item lists\n      if (items.length === 1) {\n        this.warnings.push({\n          type: &#39;Single Item List&#39;,\n          element: list,\n          message: `List ${index + 1} contains only one item`,\n          suggestion: &#39;Consider using regular paragraph or adding more items&#39;\n        });\n      }\n    });\n  }\n  \n  checkImageAccessibility() {\n    const images = document.querySelectorAll(&#39;img&#39;);\n    images.forEach((img, index) =&gt; {\n      // Check for missing alt text\n      if (!img.hasAttribute(&#39;alt&#39;) || img.getAttribute(&#39;alt&#39;).trim() === &#39;&#39;) {\n        this.warnings.push({\n          type: &#39;Missing Alt Text&#39;,\n          element: img,\n          message: `Image ${index + 1} is missing alt text`,\n          suggestion: &#39;Add descriptive alt text for accessibility&#39;\n        });\n      }\n      \n      // Check for broken image sources\n      if (img.src === &#39;&#39;) {\n        this.errors.push({\n          type: &#39;Missing Image Source&#39;,\n          element: img,\n          message: `Image ${index + 1} has no source URL`,\n          suggestion: &#39;Add proper image source or remove the image element&#39;\n        });\n      }\n    });\n  }\n  \n  updateDebugDisplay() {\n    const errorsDiv = document.getElementById(&#39;debug-errors&#39;);\n    const warningsDiv = document.getElementById(&#39;debug-warnings&#39;);\n    const statsDiv = document.getElementById(&#39;debug-stats&#39;);\n    \n    // Display errors\n    errorsDiv.innerHTML = `&lt;strong&gt;Errors (${this.errors.length}):&lt;/strong&gt;`;\n    this.errors.forEach(error =&gt; {\n      const errorDiv = document.createElement(&#39;div&#39;);\n      errorDiv.style.cssText = &#39;color: #dc2626; margin: 4px 0; padding: 4px; border-left: 3px solid #dc2626;&#39;;\n      errorDiv.innerHTML = `\n        &lt;div&gt;&lt;strong&gt;${error.type}:&lt;/strong&gt; ${error.message}&lt;/div&gt;\n        &lt;div style=&quot;font-size: 10px; color: #666;&quot;&gt;${error.suggestion}&lt;/div&gt;\n      `;\n      errorDiv.addEventListener(&#39;click&#39;, () =&gt; {\n        error.element.scrollIntoView({ behavior: &#39;smooth&#39;, block: &#39;center&#39; });\n        this.highlightElement(error.element);\n      });\n      errorsDiv.appendChild(errorDiv);\n    });\n    \n    // Display warnings\n    warningsDiv.innerHTML = `&lt;strong&gt;Warnings (${this.warnings.length}):&lt;/strong&gt;`;\n    this.warnings.forEach(warning =&gt; {\n      const warningDiv = document.createElement(&#39;div&#39;);\n      warningDiv.style.cssText = &#39;color: #d97706; margin: 4px 0; padding: 4px; border-left: 3px solid #d97706;&#39;;\n      warningDiv.innerHTML = `\n        &lt;div&gt;&lt;strong&gt;${warning.type}:&lt;/strong&gt; ${warning.message}&lt;/div&gt;\n        &lt;div style=&quot;font-size: 10px; color: #666;&quot;&gt;${warning.suggestion}&lt;/div&gt;\n      `;\n      warningDiv.addEventListener(&#39;click&#39;, () =&gt; {\n        warning.element.scrollIntoView({ behavior: &#39;smooth&#39;, block: &#39;center&#39; });\n        this.highlightElement(warning.element);\n      });\n      warningsDiv.appendChild(warningDiv);\n    });\n    \n    // Display statistics\n    const totalIssues = this.errors.length + this.warnings.length;\n    statsDiv.innerHTML = `\n      &lt;strong&gt;Statistics:&lt;/strong&gt;&lt;br&gt;\n      Total Issues: ${totalIssues}&lt;br&gt;\n      Critical Errors: ${this.errors.length}&lt;br&gt;\n      Warnings: ${this.warnings.length}\n    `;\n  }\n  \n  highlightElement(element) {\n    // Remove existing highlights\n    document.querySelectorAll(&#39;.debug-highlight&#39;).forEach(el =&gt; {\n      el.classList.remove(&#39;debug-highlight&#39;);\n    });\n    \n    // Add highlight to current element\n    element.classList.add(&#39;debug-highlight&#39;);\n    \n    // Add highlight styles if not already present\n    if (!document.getElementById(&#39;debug-highlight-styles&#39;)) {\n      const style = document.createElement(&#39;style&#39;);\n      style.id = &#39;debug-highlight-styles&#39;;\n      style.textContent = `\n        .debug-highlight {\n          outline: 3px solid #dc2626 !important;\n          background: rgba(220, 38, 38, 0.1) !important;\n          animation: debug-pulse 1s ease-in-out 3;\n        }\n        \n        @keyframes debug-pulse {\n          0%, 100% { opacity: 1; }\n          50% { opacity: 0.7; }\n        }\n      `;\n      document.head.appendChild(style);\n    }\n    \n    // Remove highlight after delay\n    setTimeout(() =&gt; {\n      element.classList.remove(&#39;debug-highlight&#39;);\n    }, 3000);\n  }\n  \n  exportDebugReport() {\n    const report = {\n      timestamp: new Date().toISOString(),\n      url: window.location.href,\n      summary: {\n        total_issues: this.errors.length + this.warnings.length,\n        errors: this.errors.length,\n        warnings: this.warnings.length\n      },\n      errors: this.errors.map(error =&gt; ({\n        type: error.type,\n        message: error.message,\n        suggestion: error.suggestion,\n        element_tag: error.element.tagName,\n        element_text: error.element.textContent.substring(0, 50)\n      })),\n      warnings: this.warnings.map(warning =&gt; ({\n        type: warning.type,\n        message: warning.message,\n        suggestion: warning.suggestion,\n        element_tag: warning.element.tagName,\n        element_text: warning.element.textContent.substring(0, 50)\n      }))\n    };\n    \n    const blob = new Blob([JSON.stringify(report, null, 2)], { type: &#39;application/json&#39; });\n    const url = URL.createObjectURL(blob);\n    \n    const a = document.createElement(&#39;a&#39;);\n    a.href = url;\n    a.download = `markdown-debug-report-${Date.now()}.json`;\n    a.click();\n    \n    URL.revokeObjectURL(url);\n  }\n}\n\n// Initialize debugger when DOM is ready\ndocument.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {\n  window.markdownDebugger = new MarkdownDebugger();\n});\n\n// Export for external use\nif (typeof module !== &#39;undefined&#39; &amp;&amp; module.exports) {\n  module.exports = MarkdownDebugger;\n}\n\u003C/code>\u003C/pre>\u003Ch3 id=\"command-line-validation-tools\">Command Line Validation Tools\u003C/h3>\n\u003Cp>Professional command-line tools for systematic Markdown validation:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># markdown-validator.sh - Comprehensive Markdown validation script\u003C/span>\n\n\u003Cspan class=\"hljs-comment\">#!/bin/bash\u003C/span>\n\n\u003Cspan class=\"hljs-built_in\">set\u003C/span> -e\n\n\u003Cspan class=\"hljs-comment\"># Configuration\u003C/span>\nMARKDOWN_DIR=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${1:-.}\u003C/span>&quot;\u003C/span>\nOUTPUT_FORMAT=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${2:-console}\u003C/span>&quot;\u003C/span>\nVALIDATION_RULES=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${3:-strict}\u003C/span>&quot;\u003C/span>\nLOG_FILE=\u003Cspan class=\"hljs-string\">&quot;markdown-validation.log&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Color codes for output\u003C/span>\nRED=\u003Cspan class=\"hljs-string\">&#x27;\\033[0;31m&#x27;\u003C/span>\nYELLOW=\u003Cspan class=\"hljs-string\">&#x27;\\033[1;33m&#x27;\u003C/span>\nGREEN=\u003Cspan class=\"hljs-string\">&#x27;\\033[0;32m&#x27;\u003C/span>\nBLUE=\u003Cspan class=\"hljs-string\">&#x27;\\033[0;34m&#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\"># Validation counters\u003C/span>\nTOTAL_FILES=0\nERROR_COUNT=0\nWARNING_COUNT=0\nPASSED_COUNT=0\n\n\u003Cspan class=\"hljs-comment\"># Function to log messages\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">log_message\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> level=\u003Cspan class=\"hljs-variable\">$1\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> message=\u003Cspan class=\"hljs-variable\">$2\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> timestamp=$(\u003Cspan class=\"hljs-built_in\">date\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;+%Y-%m-%d %H:%M:%S&#x27;\u003C/span>)\n  \n  \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;[\u003Cspan class=\"hljs-variable\">$timestamp\u003C/span>] [\u003Cspan class=\"hljs-variable\">$level\u003C/span>] \u003Cspan class=\"hljs-variable\">$message\u003C/span>&quot;\u003C/span> &gt;&gt; \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$LOG_FILE\u003C/span>&quot;\u003C/span>\n  \n  \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-variable\">$level\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span>\n    \u003Cspan class=\"hljs-string\">&quot;ERROR&quot;\u003C/span>)\n      \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${RED}\u003C/span>[ERROR]\u003Cspan class=\"hljs-variable\">${NC}\u003C/span> \u003Cspan class=\"hljs-variable\">$message\u003C/span>&quot;\u003C/span>\n      ;;\n    \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span>)\n      \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${YELLOW}\u003C/span>[WARNING]\u003Cspan class=\"hljs-variable\">${NC}\u003C/span> \u003Cspan class=\"hljs-variable\">$message\u003C/span>&quot;\u003C/span>\n      ;;\n    \u003Cspan class=\"hljs-string\">&quot;INFO&quot;\u003C/span>)\n      \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${BLUE}\u003C/span>[INFO]\u003Cspan class=\"hljs-variable\">${NC}\u003C/span> \u003Cspan class=\"hljs-variable\">$message\u003C/span>&quot;\u003C/span>\n      ;;\n    \u003Cspan class=\"hljs-string\">&quot;SUCCESS&quot;\u003C/span>)\n      \u003Cspan class=\"hljs-built_in\">echo\u003C/span> -e \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${GREEN}\u003C/span>[SUCCESS]\u003Cspan class=\"hljs-variable\">${NC}\u003C/span> \u003Cspan class=\"hljs-variable\">$message\u003C/span>&quot;\u003C/span>\n      ;;\n  \u003Cspan class=\"hljs-keyword\">esac\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Function to validate individual file\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">validate_markdown_file\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file=\u003Cspan class=\"hljs-variable\">$1\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file_errors=0\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file_warnings=0\n  \n  log_message \u003Cspan class=\"hljs-string\">&quot;INFO&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Validating: \u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\"># Check file exists and is readable\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ ! -r \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    log_message \u003Cspan class=\"hljs-string\">&quot;ERROR&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Cannot read file: \u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">return\u003C/span> 1\n  \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\"># Check for basic syntax errors\u003C/span>\n  check_heading_syntax \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> || ((file_errors++))\n  check_list_syntax \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> || ((file_warnings++))\n  check_code_block_syntax \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> || ((file_errors++))\n  check_link_syntax \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> || ((file_warnings++))\n  check_image_syntax \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> || ((file_warnings++))\n  check_table_syntax \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> || ((file_warnings++))\n  \n  \u003Cspan class=\"hljs-comment\"># Check for advanced issues\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$VALIDATION_RULES\u003C/span>&quot;\u003C/span> == \u003Cspan class=\"hljs-string\">&quot;strict&quot;\u003C/span> ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    check_frontmatter \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> || ((file_warnings++))\n    check_line_length \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> || ((file_warnings++))\n    check_trailing_whitespace \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> || ((file_warnings++))\n  \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\"># Update global counters\u003C/span>\n  ((ERROR_COUNT += file_errors))\n  ((WARNING_COUNT += file_warnings))\n  \n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-variable\">$file_errors\u003C/span> -eq 0 ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    ((PASSED_COUNT++))\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-variable\">$file_warnings\u003C/span> -eq 0 ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;SUCCESS&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;File passed all checks: \u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;File passed with \u003Cspan class=\"hljs-variable\">$file_warnings\u003C/span> warnings: \u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n    log_message \u003Cspan class=\"hljs-string\">&quot;ERROR&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;File failed with \u003Cspan class=\"hljs-variable\">$file_errors\u003C/span> errors and \u003Cspan class=\"hljs-variable\">$file_warnings\u003C/span> warnings: \u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \n  \u003Cspan class=\"hljs-built_in\">return\u003C/span> \u003Cspan class=\"hljs-variable\">$file_errors\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Check heading syntax\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">check_heading_syntax\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file=\u003Cspan class=\"hljs-variable\">$1\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> issues=0\n  \n  \u003Cspan class=\"hljs-comment\"># Check for headings without space after #\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> grep -n \u003Cspan class=\"hljs-string\">&#x27;^#+[^# ]&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> &gt; /dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    log_message \u003Cspan class=\"hljs-string\">&quot;ERROR&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Headings without space after # in \u003Cspan class=\"hljs-variable\">$file\u003C/span>:&quot;\u003C/span>\n    grep -n \u003Cspan class=\"hljs-string\">&#x27;^#+[^# ]&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> | \u003Cspan class=\"hljs-keyword\">while\u003C/span> \u003Cspan class=\"hljs-built_in\">read\u003C/span> line; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;ERROR&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;  Line: \u003Cspan class=\"hljs-variable\">$line\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">done\u003C/span>\n    ((issues++))\n  \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\"># Check for heading hierarchy issues\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> prev_level=0\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> line_num=0\n  \u003Cspan class=\"hljs-keyword\">while\u003C/span> IFS= \u003Cspan class=\"hljs-built_in\">read\u003C/span> -r line; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n    ((line_num++))\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-variable\">$line\u003C/span> =~ ^(\u003Cspan class=\"hljs-comment\">#+)[[:space:]] ]]; then\u003C/span>\n      \u003Cspan class=\"hljs-built_in\">local\u003C/span> current_level=\u003Cspan class=\"hljs-variable\">${#BASH_REMATCH[1]}\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-variable\">$current_level\u003C/span> -gt $((prev_level + \u003Cspan class=\"hljs-number\">1\u003C/span>)) ]] &amp;&amp; [[ \u003Cspan class=\"hljs-variable\">$prev_level\u003C/span> -gt 0 ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Heading hierarchy skip at line \u003Cspan class=\"hljs-variable\">$line_num\u003C/span> in \u003Cspan class=\"hljs-variable\">$file\u003C/span> (h\u003Cspan class=\"hljs-variable\">$prev_level\u003C/span> to h\u003Cspan class=\"hljs-variable\">$current_level\u003C/span>)&quot;\u003C/span>\n        ((issues++))\n      \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n      prev_level=\u003Cspan class=\"hljs-variable\">$current_level\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">done\u003C/span> &lt; \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n  \n  \u003Cspan class=\"hljs-built_in\">return\u003C/span> \u003Cspan class=\"hljs-variable\">$issues\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Check list syntax\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">check_list_syntax\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file=\u003Cspan class=\"hljs-variable\">$1\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> issues=0\n  \n  \u003Cspan class=\"hljs-comment\"># Check for list items without space after marker\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> grep -n \u003Cspan class=\"hljs-string\">&#x27;^[[:space:]]*[-*+][^[:space:]]&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> &gt; /dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;List items without space after marker in \u003Cspan class=\"hljs-variable\">$file\u003C/span>:&quot;\u003C/span>\n    grep -n \u003Cspan class=\"hljs-string\">&#x27;^[[:space:]]*[-*+][^[:space:]]&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> | \u003Cspan class=\"hljs-keyword\">while\u003C/span> \u003Cspan class=\"hljs-built_in\">read\u003C/span> line; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;  Line: \u003Cspan class=\"hljs-variable\">$line\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">done\u003C/span>\n    ((issues++))\n  \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\"># Check for numbered lists without space after number\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> grep -n \u003Cspan class=\"hljs-string\">&#x27;^[[:space:]]*[0-9]\\+\\.[^[:space:]]&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> &gt; /dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Numbered list items without space after number in \u003Cspan class=\"hljs-variable\">$file\u003C/span>:&quot;\u003C/span>\n    grep -n \u003Cspan class=\"hljs-string\">&#x27;^[[:space:]]*[0-9]\\+\\.[^[:space:]]&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> | \u003Cspan class=\"hljs-keyword\">while\u003C/span> \u003Cspan class=\"hljs-built_in\">read\u003C/span> line; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;  Line: \u003Cspan class=\"hljs-variable\">$line\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">done\u003C/span>\n    ((issues++))\n  \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \n  \u003Cspan class=\"hljs-built_in\">return\u003C/span> \u003Cspan class=\"hljs-variable\">$issues\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Check code block syntax\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">check_code_block_syntax\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file=\u003Cspan class=\"hljs-variable\">$1\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> issues=0\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> fence_count=0\n  \n  \u003Cspan class=\"hljs-comment\"># Count code fences\u003C/span>\n  fence_count=$(grep -c \u003Cspan class=\"hljs-string\">&#x27;^[[:space:]]*```&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> || \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;0&quot;\u003C/span>)\n  \n  \u003Cspan class=\"hljs-comment\"># Check for unmatched code fences\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ $((fence_count % \u003Cspan class=\"hljs-number\">2\u003C/span>)) -ne 0 ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    log_message \u003Cspan class=\"hljs-string\">&quot;ERROR&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Unmatched code fences in \u003Cspan class=\"hljs-variable\">$file\u003C/span> (count: \u003Cspan class=\"hljs-variable\">$fence_count\u003C/span>)&quot;\u003C/span>\n    ((issues++))\n  \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\"># Check for nested code blocks without proper escaping\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> in_code_block=\u003Cspan class=\"hljs-literal\">false\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> line_num=0\n  \u003Cspan class=\"hljs-keyword\">while\u003C/span> IFS= \u003Cspan class=\"hljs-built_in\">read\u003C/span> -r line; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n    ((line_num++))\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-variable\">$line\u003C/span> =~ ^[[:space:]]*```+ ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-variable\">$in_code_block\u003C/span>; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        in_code_block=\u003Cspan class=\"hljs-literal\">false\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n        in_code_block=\u003Cspan class=\"hljs-literal\">true\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-variable\">$in_code_block\u003C/span> &amp;&amp; [[ \u003Cspan class=\"hljs-variable\">$line\u003C/span> =~ ``` ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;ERROR&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Possible nested code block at line \u003Cspan class=\"hljs-variable\">$line_num\u003C/span> in \u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n      ((issues++))\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">done\u003C/span> &lt; \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n  \n  \u003Cspan class=\"hljs-built_in\">return\u003C/span> \u003Cspan class=\"hljs-variable\">$issues\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Check link syntax\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">check_link_syntax\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file=\u003Cspan class=\"hljs-variable\">$1\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> issues=0\n  \n  \u003Cspan class=\"hljs-comment\"># Check for malformed links\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> grep -n \u003Cspan class=\"hljs-string\">&#x27;\\[[^\\]]*\\]([^)]*)&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> | grep -E \u003Cspan class=\"hljs-string\">&#x27;\\[\\]|\\(\\)&#x27;\u003C/span> &gt; /dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Empty link components in \u003Cspan class=\"hljs-variable\">$file\u003C/span>:&quot;\u003C/span>\n    grep -n \u003Cspan class=\"hljs-string\">&#x27;\\[[^\\]]*\\]([^)]*)&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> | grep -E \u003Cspan class=\"hljs-string\">&#x27;\\[\\]|\\(\\)&#x27;\u003C/span> | \u003Cspan class=\"hljs-keyword\">while\u003C/span> \u003Cspan class=\"hljs-built_in\">read\u003C/span> line; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;  Line: \u003Cspan class=\"hljs-variable\">$line\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">done\u003C/span>\n    ((issues++))\n  \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\"># Check for reference links without definitions\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> refs=($(grep -o \u003Cspan class=\"hljs-string\">&#x27;\\[[^\\]]*\\]\\[[^\\]]*\\]&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> | sed \u003Cspan class=\"hljs-string\">&#x27;s/.*\\[\\([^\\]]*\\)\\]$/\\1/&#x27;\u003C/span> | \u003Cspan class=\"hljs-built_in\">sort\u003C/span> -u))\n  \u003Cspan class=\"hljs-keyword\">for\u003C/span> ref \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${refs[@]}\u003C/span>&quot;\u003C/span>; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> ! grep -q \u003Cspan class=\"hljs-string\">&quot;^\\[\u003Cspan class=\"hljs-variable\">${ref}\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      log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Undefined reference link &#x27;\u003Cspan class=\"hljs-variable\">$ref\u003C/span>&#x27; in \u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n      ((issues++))\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">done\u003C/span>\n  \n  \u003Cspan class=\"hljs-built_in\">return\u003C/span> \u003Cspan class=\"hljs-variable\">$issues\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Check image syntax\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">check_image_syntax\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file=\u003Cspan class=\"hljs-variable\">$1\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> issues=0\n  \n  \u003Cspan class=\"hljs-comment\"># Check for images without alt text\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> grep -n \u003Cspan class=\"hljs-string\">&#x27;!\\[\\]\\(&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> &gt; /dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Images without alt text in \u003Cspan class=\"hljs-variable\">$file\u003C/span>:&quot;\u003C/span>\n    grep -n \u003Cspan class=\"hljs-string\">&#x27;!\\[\\]\\(&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> | \u003Cspan class=\"hljs-keyword\">while\u003C/span> \u003Cspan class=\"hljs-built_in\">read\u003C/span> line; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;  Line: \u003Cspan class=\"hljs-variable\">$line\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">done\u003C/span>\n    ((issues++))\n  \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \n  \u003Cspan class=\"hljs-built_in\">return\u003C/span> \u003Cspan class=\"hljs-variable\">$issues\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Check table syntax\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">check_table_syntax\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file=\u003Cspan class=\"hljs-variable\">$1\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> issues=0\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> in_table=\u003Cspan class=\"hljs-literal\">false\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> expected_columns=0\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> line_num=0\n  \n  \u003Cspan class=\"hljs-keyword\">while\u003C/span> IFS= \u003Cspan class=\"hljs-built_in\">read\u003C/span> -r line; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n    ((line_num++))\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-variable\">$line\u003C/span> =~ ^\\|.*\\|$ ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n      \u003Cspan class=\"hljs-built_in\">local\u003C/span> column_count=$(\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$line\u003C/span>&quot;\u003C/span> | \u003Cspan class=\"hljs-built_in\">tr\u003C/span> -\u003Cspan class=\"hljs-built_in\">cd\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span> | \u003Cspan class=\"hljs-built_in\">wc\u003C/span> -c)\n      ((column_count--)) \u003Cspan class=\"hljs-comment\"># Subtract 1 for trailing pipe\u003C/span>\n      \n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> ! \u003Cspan class=\"hljs-variable\">$in_table\u003C/span>; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        in_table=\u003Cspan class=\"hljs-literal\">true\u003C/span>\n        expected_columns=\u003Cspan class=\"hljs-variable\">$column_count\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">elif\u003C/span> [[ \u003Cspan class=\"hljs-variable\">$column_count\u003C/span> -ne \u003Cspan class=\"hljs-variable\">$expected_columns\u003C/span> ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Table column mismatch at line \u003Cspan class=\"hljs-variable\">$line_num\u003C/span> in \u003Cspan class=\"hljs-variable\">$file\u003C/span> (expected \u003Cspan class=\"hljs-variable\">$expected_columns\u003C/span>, got \u003Cspan class=\"hljs-variable\">$column_count\u003C/span>)&quot;\u003C/span>\n        ((issues++))\n      \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n      in_table=\u003Cspan class=\"hljs-literal\">false\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">done\u003C/span> &lt; \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n  \n  \u003Cspan class=\"hljs-built_in\">return\u003C/span> \u003Cspan class=\"hljs-variable\">$issues\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Check frontmatter\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">check_frontmatter\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file=\u003Cspan class=\"hljs-variable\">$1\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> issues=0\n  \n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ $(\u003Cspan class=\"hljs-built_in\">head\u003C/span> -1 \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>) == \u003Cspan class=\"hljs-string\">&quot;---&quot;\u003C/span> ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-comment\"># Count frontmatter delimiters\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> delimiter_count=$(grep -c \u003Cspan class=\"hljs-string\">&#x27;^---$&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> || \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;0&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-variable\">$delimiter_count\u003C/span> -lt 2 ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Incomplete frontmatter in \u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n      ((issues++))\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\">$issues\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Check line length\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">check_line_length\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file=\u003Cspan class=\"hljs-variable\">$1\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> issues=0\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> max_length=120\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> line_num=0\n  \n  \u003Cspan class=\"hljs-keyword\">while\u003C/span> IFS= \u003Cspan class=\"hljs-built_in\">read\u003C/span> -r line; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n    ((line_num++))\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-variable\">${#line}\u003C/span> -gt \u003Cspan class=\"hljs-variable\">$max_length\u003C/span> ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Long line (\u003Cspan class=\"hljs-subst\">$((${#line})\u003C/span>) chars) at line \u003Cspan class=\"hljs-variable\">$line_num\u003C/span> in \u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n      ((issues++))\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">done\u003C/span> &lt; \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n  \n  \u003Cspan class=\"hljs-built_in\">return\u003C/span> \u003Cspan class=\"hljs-variable\">$issues\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Check trailing whitespace\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">check_trailing_whitespace\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> file=\u003Cspan class=\"hljs-variable\">$1\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">local\u003C/span> issues=0\n  \n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> grep -n \u003Cspan class=\"hljs-string\">&#x27;[[:space:]]$&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> &gt; /dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Trailing whitespace in \u003Cspan class=\"hljs-variable\">$file\u003C/span>:&quot;\u003C/span>\n    grep -n \u003Cspan class=\"hljs-string\">&#x27;[[:space:]]$&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span> | \u003Cspan class=\"hljs-keyword\">while\u003C/span> \u003Cspan class=\"hljs-built_in\">read\u003C/span> line; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;WARNING&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;  Line: \u003Cspan class=\"hljs-variable\">$line\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">done\u003C/span>\n    ((issues++))\n  \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n  \n  \u003Cspan class=\"hljs-built_in\">return\u003C/span> \u003Cspan class=\"hljs-variable\">$issues\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Generate validation report\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">generate_report\u003C/span>\u003C/span>() {\n  log_message \u003Cspan class=\"hljs-string\">&quot;INFO&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Generating validation report...&quot;\u003C/span>\n  \n  \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-variable\">$OUTPUT_FORMAT\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span>\n    \u003Cspan class=\"hljs-string\">&quot;json&quot;\u003C/span>)\n      \u003Cspan class=\"hljs-built_in\">cat\u003C/span> &gt; \u003Cspan class=\"hljs-string\">&quot;validation-report.json&quot;\u003C/span> &lt;&lt;\u003Cspan class=\"hljs-string\">EOF\n{\n  &quot;timestamp&quot;: &quot;$(date -Iseconds)&quot;,\n  &quot;summary&quot;: {\n    &quot;total_files&quot;: $TOTAL_FILES,\n    &quot;passed&quot;: $PASSED_COUNT,\n    &quot;errors&quot;: $ERROR_COUNT,\n    &quot;warnings&quot;: $WARNING_COUNT,\n    &quot;validation_rules&quot;: &quot;$VALIDATION_RULES&quot;\n  },\n  &quot;details&quot;: &quot;See $LOG_FILE for detailed results&quot;\n}\nEOF\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;INFO&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;JSON report saved to validation-report.json&quot;\u003C/span>\n      ;;\n    \u003Cspan class=\"hljs-string\">&quot;markdown&quot;\u003C/span>)\n      \u003Cspan class=\"hljs-built_in\">cat\u003C/span> &gt; \u003Cspan class=\"hljs-string\">&quot;validation-report.md&quot;\u003C/span> &lt;&lt;\u003Cspan class=\"hljs-string\">EOF\n# Markdown Validation Report\n\n**Generated:** $(date)\n\n## Summary\n\n- **Total Files:** $TOTAL_FILES\n- **Passed:** $PASSED_COUNT\n- **Errors:** $ERROR_COUNT  \n- **Warnings:** $WARNING_COUNT\n- **Validation Rules:** $VALIDATION_RULES\n\n## Results\n\nSee \\`$LOG_FILE\\` for detailed validation results.\n\n### Status\n$(if [[ $ERROR_COUNT -eq 0 ]]; then echo &quot;✅ No critical errors found&quot;; else echo &quot;❌ $ERROR_COUNT critical errors require attention&quot;; fi)\n$(if [[ $WARNING_COUNT -eq 0 ]]; then echo &quot;✅ No warnings&quot;; else echo &quot;⚠️ $WARNING_COUNT warnings found&quot;; fi)\nEOF\u003C/span>\n      log_message \u003Cspan class=\"hljs-string\">&quot;INFO&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Markdown report saved to validation-report.md&quot;\u003C/span>\n      ;;\n    *)\n      \u003Cspan class=\"hljs-comment\"># Console output summary\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>\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>\n      \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Total Files:    \u003Cspan class=\"hljs-variable\">$TOTAL_FILES\u003C/span>&quot;\u003C/span>\n      \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Passed:         \u003Cspan class=\"hljs-variable\">$PASSED_COUNT\u003C/span>&quot;\u003C/span>\n      \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Errors:         \u003Cspan class=\"hljs-variable\">$ERROR_COUNT\u003C/span>&quot;\u003C/span>\n      \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Warnings:       \u003Cspan class=\"hljs-variable\">$WARNING_COUNT\u003C/span>&quot;\u003C/span>\n      \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Validation:     \u003Cspan class=\"hljs-variable\">$VALIDATION_RULES\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-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-variable\">$ERROR_COUNT\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>✅ No critical errors found\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\">$ERROR_COUNT\u003C/span> critical errors require attention\u003Cspan class=\"hljs-variable\">${NC}\u003C/span>&quot;\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n      \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Detailed log: \u003Cspan class=\"hljs-variable\">$LOG_FILE\u003C/span>&quot;\u003C/span>\n      ;;\n  \u003Cspan class=\"hljs-keyword\">esac\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Main validation loop\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">main\u003C/span>\u003C/span>() {\n  log_message \u003Cspan class=\"hljs-string\">&quot;INFO&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Starting Markdown validation in: \u003Cspan class=\"hljs-variable\">$MARKDOWN_DIR\u003C/span>&quot;\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\"># Clear previous log\u003C/span>\n  &gt; \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$LOG_FILE\u003C/span>&quot;\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\"># Find all Markdown files\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">mapfile\u003C/span> -t markdown_files &lt; &lt;(find \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$MARKDOWN_DIR\u003C/span>&quot;\u003C/span> -name \u003Cspan class=\"hljs-string\">&quot;*.md&quot;\u003C/span> -\u003Cspan class=\"hljs-built_in\">type\u003C/span> f)\n  TOTAL_FILES=\u003Cspan class=\"hljs-variable\">${#markdown_files[@]}\u003C/span>\n  \n  log_message \u003Cspan class=\"hljs-string\">&quot;INFO&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Found \u003Cspan class=\"hljs-variable\">$TOTAL_FILES\u003C/span> Markdown files&quot;\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\"># Validate each file\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">for\u003C/span> file \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${markdown_files[@]}\u003C/span>&quot;\u003C/span>; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n    validate_markdown_file \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file\u003C/span>&quot;\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">done\u003C/span>\n  \n  \u003Cspan class=\"hljs-comment\"># Generate report\u003C/span>\n  generate_report\n  \n  \u003Cspan class=\"hljs-comment\"># Exit with error if critical issues found\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-variable\">$ERROR_COUNT\u003C/span> -gt 0 ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">exit\u003C/span> 1\n  \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Show usage information\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">show_usage\u003C/span>\u003C/span>() {\n  \u003Cspan class=\"hljs-built_in\">cat\u003C/span> &lt;&lt;\u003Cspan class=\"hljs-string\">EOF\nMarkdown Validator\n\nUsage: $0 [directory] [output_format] [validation_rules]\n\nParameters:\n  directory         Directory to validate (default: current directory)\n  output_format     Output format: console, json, markdown (default: console)\n  validation_rules  Validation level: basic, strict (default: strict)\n\nExamples:\n  $0                          # Validate current directory\n  $0 ./docs json strict       # Validate docs with JSON output\n  $0 . markdown basic         # Basic validation with Markdown report\n\nEOF\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Handle command line arguments\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> [[ \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$1\u003C/span>&quot;\u003C/span> == \u003Cspan class=\"hljs-string\">&quot;-h&quot;\u003C/span> ]] || [[ \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$1\u003C/span>&quot;\u003C/span> == \u003Cspan class=\"hljs-string\">&quot;--help&quot;\u003C/span> ]]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n  show_usage\n  \u003Cspan class=\"hljs-built_in\">exit\u003C/span> 0\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Run main validation\u003C/span>\nmain\n\u003C/code>\u003C/pre>\u003Ch3 id=\"advanced-error-detection-patterns\">Advanced Error Detection Patterns\u003C/h3>\n\u003Cp>Sophisticated pattern matching for complex Markdown issues:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-comment\"># markdown_error_detector.py - Advanced error detection and reporting\u003C/span>\n\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> os\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> json\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> yaml\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> typing \u003Cspan class=\"hljs-keyword\">import\u003C/span> \u003Cspan class=\"hljs-type\">List\u003C/span>, \u003Cspan class=\"hljs-type\">Dict\u003C/span>, \u003Cspan class=\"hljs-type\">Tuple\u003C/span>, \u003Cspan class=\"hljs-type\">Optional\u003C/span>\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> dataclasses \u003Cspan class=\"hljs-keyword\">import\u003C/span> dataclass\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> pathlib \u003Cspan class=\"hljs-keyword\">import\u003C/span> Path\n\n\u003Cspan class=\"hljs-meta\">@dataclass\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">ValidationIssue\u003C/span>:\n    \u003Cspan class=\"hljs-built_in\">type\u003C/span>: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    severity: \u003Cspan class=\"hljs-built_in\">str\u003C/span>  \u003Cspan class=\"hljs-comment\"># &#x27;error&#x27;, &#x27;warning&#x27;, &#x27;info&#x27;\u003C/span>\n    line_number: \u003Cspan class=\"hljs-built_in\">int\u003C/span>\n    column: \u003Cspan class=\"hljs-built_in\">int\u003C/span>\n    message: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    suggestion: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    context: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">AdvancedMarkdownValidator\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">__init__\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        self.issues: \u003Cspan class=\"hljs-type\">List\u003C/span>[ValidationIssue] = []\n        \n        \u003Cspan class=\"hljs-comment\"># Compile regex patterns for efficiency\u003C/span>\n        self.patterns = {\n            \u003Cspan class=\"hljs-string\">&#x27;heading_no_space&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^(#{1,6})[^# ]&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;list_no_space&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^(\\s*)[-*+]([^\\s])&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;numbered_list_no_space&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^(\\s*)(\\d+\\.)([^\\s])&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;unclosed_code_fence&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^(\\s*)(```+)(.*)$&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;malformed_link&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;\\[([^\\]]*)\\]\\(([^)]*)\\)&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;malformed_image&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;!\\[([^\\]]*)\\]\\(([^)]*)\\)&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;empty_link&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;\\[\\]\\([^)]*\\)|\\[[^\\]]+\\]\\(\\)&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;table_row&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^\\|(.+\\|)+$&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;frontmatter_delimiter&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^---\\s*$&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;trailing_whitespace&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;\\s+$&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;multiple_blank_lines&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;\\n\\s*\\n\\s*\\n&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;mixed_list_markers&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^(\\s*)([*+-]).*\\n(\\s*)([*+-])&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;inconsistent_emphasis&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;(?&lt;!\\*)\\*(?!\\*)([^*]+)(?&lt;!\\*)\\*(?!\\*)|(?&lt;!\\*)\\*\\*([^*]+)\\*\\*(?!\\*)&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;html_tag&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;&lt;[^&gt;]+&gt;&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;suspicious_unicode&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;[&#x27;\u003C/span>\u003Cspan class=\"hljs-string\">&#x27;&quot;&quot;„‚‹›«»]&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;long_line&#x27;\u003C/span>: re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^.{121,}$&#x27;\u003C/span>),\n        }\n        \n        \u003Cspan class=\"hljs-comment\"># Load custom validation rules\u003C/span>\n        self.custom_rules = self.load_custom_rules()\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">load_custom_rules\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Load custom validation rules from config file.&quot;&quot;&quot;\u003C/span>\n        rules_file = Path(\u003Cspan class=\"hljs-string\">&#x27;markdown-validation-rules.yaml&#x27;\u003C/span>)\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> rules_file.exists():\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(rules_file, \u003Cspan class=\"hljs-string\">&#x27;r&#x27;\u003C/span>, encoding=\u003Cspan class=\"hljs-string\">&#x27;utf-8&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span> yaml.safe_load(f)\n            \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n                \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Warning: Could not load custom rules: \u003Cspan class=\"hljs-subst\">{e}\u003C/span>&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Default rules\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;max_line_length&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">120\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;max_heading_length&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">80\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;require_alt_text&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;require_frontmatter&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">False\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;enforce_heading_hierarchy&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;check_broken_links&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;allowed_html_tags&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;em&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;strong&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;code&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;span&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;div&#x27;\u003C/span>],\n            \u003Cspan class=\"hljs-string\">&#x27;forbidden_patterns&#x27;\u003C/span>: [\n                \u003Cspan class=\"hljs-string\">&#x27;TODO&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;FIXME&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;XXX&#x27;\u003C/span>\n            ]\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_file\u003C/span>(\u003Cspan class=\"hljs-params\">self, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[ValidationIssue]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate a single Markdown file and return list of issues.&quot;&quot;&quot;\u003C/span>\n        self.issues = []\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(file_path, \u003Cspan class=\"hljs-string\">&#x27;r&#x27;\u003C/span>, encoding=\u003Cspan class=\"hljs-string\">&#x27;utf-8&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n                content = f.read()\n                lines = content.split(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Perform various checks\u003C/span>\n            self.check_frontmatter(lines)\n            self.check_heading_syntax(lines)\n            self.check_list_formatting(lines)\n            self.check_code_blocks(lines, content)\n            self.check_links_and_images(lines)\n            self.check_table_structure(lines)\n            self.check_emphasis_formatting(lines)\n            self.check_html_usage(lines)\n            self.check_unicode_issues(lines)\n            self.check_line_length(lines)\n            self.check_whitespace_issues(content, lines)\n            self.check_custom_patterns(lines)\n            \n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> UnicodeDecodeError:\n            self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;file_encoding&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>, \n                          \u003Cspan class=\"hljs-string\">&#x27;File contains non-UTF-8 characters&#x27;\u003C/span>, \n                          \u003Cspan class=\"hljs-string\">&#x27;Convert file to UTF-8 encoding&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)\n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n            self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;file_read_error&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>, \n                          \u003Cspan class=\"hljs-string\">f&#x27;Error reading file: \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">str\u003C/span>(e)}\u003C/span>&#x27;\u003C/span>, \n                          \u003Cspan class=\"hljs-string\">&#x27;Check file permissions and format&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> self.issues\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">add_issue\u003C/span>(\u003Cspan class=\"hljs-params\">self, issue_type: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, severity: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, line_num: \u003Cspan class=\"hljs-built_in\">int\u003C/span>, \n                  col: \u003Cspan class=\"hljs-built_in\">int\u003C/span>, message: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, suggestion: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, context: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Add a validation issue to the list.&quot;&quot;&quot;\u003C/span>\n        issue = ValidationIssue(\n            \u003Cspan class=\"hljs-built_in\">type\u003C/span>=issue_type,\n            severity=severity,\n            line_number=line_num,\n            column=col,\n            message=message,\n            suggestion=suggestion,\n            context=context\n        )\n        self.issues.append(issue)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_frontmatter\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check YAML frontmatter structure and content.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> lines \u003Cspan class=\"hljs-keyword\">or\u003C/span> lines[\u003Cspan class=\"hljs-number\">0\u003C/span>].strip() != \u003Cspan class=\"hljs-string\">&#x27;---&#x27;\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.custom_rules.get(\u003Cspan class=\"hljs-string\">&#x27;require_frontmatter&#x27;\u003C/span>, \u003Cspan class=\"hljs-literal\">False\u003C/span>):\n                self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;missing_frontmatter&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">1\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">&#x27;No YAML frontmatter found&#x27;\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">&#x27;Add frontmatter with title, description, etc.&#x27;\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">&#x27;Document should start with --- frontmatter&#x27;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Find closing frontmatter delimiter\u003C/span>\n        closing_delimiter = -\u003Cspan class=\"hljs-number\">1\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines[\u003Cspan class=\"hljs-number\">1\u003C/span>:], \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> line.strip() == \u003Cspan class=\"hljs-string\">&#x27;---&#x27;\u003C/span>:\n                closing_delimiter = i\n                \u003Cspan class=\"hljs-keyword\">break\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> closing_delimiter == -\u003Cspan class=\"hljs-number\">1\u003C/span>:\n            self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;unclosed_frontmatter&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">1\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                          \u003Cspan class=\"hljs-string\">&#x27;Frontmatter is not properly closed&#x27;\u003C/span>,\n                          \u003Cspan class=\"hljs-string\">&#x27;Add closing --- delimiter&#x27;\u003C/span>,\n                          \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>.join(lines[:\u003Cspan class=\"hljs-number\">5\u003C/span>]))\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Parse frontmatter content\u003C/span>\n        frontmatter_content = \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(lines[\u003Cspan class=\"hljs-number\">1\u003C/span>:closing_delimiter])\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            frontmatter = yaml.safe_load(frontmatter_content)\n            \n            \u003Cspan class=\"hljs-comment\"># Check required fields\u003C/span>\n            required_fields = [\u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>]\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> field \u003Cspan class=\"hljs-keyword\">in\u003C/span> required_fields:\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> field \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> frontmatter:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;missing_frontmatter_field&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-number\">2\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-string\">f&#x27;Missing required field: \u003Cspan class=\"hljs-subst\">{field}\u003C/span>&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">f&#x27;Add \u003Cspan class=\"hljs-subst\">{field}\u003C/span> field to frontmatter&#x27;\u003C/span>,\n                                  frontmatter_content[:\u003Cspan class=\"hljs-number\">100\u003C/span>])\n            \n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> yaml.YAMLError \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n            self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;invalid_frontmatter_yaml&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">2\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                          \u003Cspan class=\"hljs-string\">f&#x27;Invalid YAML in frontmatter: \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">str\u003C/span>(e)}\u003C/span>&#x27;\u003C/span>,\n                          \u003Cspan class=\"hljs-string\">&#x27;Check YAML syntax and formatting&#x27;\u003C/span>,\n                          frontmatter_content[:\u003Cspan class=\"hljs-number\">100\u003C/span>])\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_heading_syntax\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check heading formatting and hierarchy.&quot;&quot;&quot;\u003C/span>\n        previous_level = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        heading_pattern = re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^(#{1,6})\\s+(.+)$&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            \u003Cspan class=\"hljs-comment\"># Check for headings without space\u003C/span>\n            no_space_match = self.patterns[\u003Cspan class=\"hljs-string\">&#x27;heading_no_space&#x27;\u003C/span>].\u003Cspan class=\"hljs-keyword\">match\u003C/span>(line)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> no_space_match:\n                self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;heading_no_space&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, line_num, \n                              \u003Cspan class=\"hljs-built_in\">len\u003C/span>(no_space_match.group(\u003Cspan class=\"hljs-number\">1\u003C/span>)),\n                              \u003Cspan class=\"hljs-string\">&#x27;Heading missing space after #&#x27;\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">&#x27;Add space after # characters&#x27;\u003C/span>,\n                              line.strip())\n            \n            \u003Cspan class=\"hljs-comment\"># Check proper headings\u003C/span>\n            heading_match = heading_pattern.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(line)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> heading_match:\n                current_level = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(heading_match.group(\u003Cspan class=\"hljs-number\">1\u003C/span>))\n                heading_text = heading_match.group(\u003Cspan class=\"hljs-number\">2\u003C/span>).strip()\n                \n                \u003Cspan class=\"hljs-comment\"># Check heading hierarchy\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (self.custom_rules.get(\u003Cspan class=\"hljs-string\">&#x27;enforce_heading_hierarchy&#x27;\u003C/span>, \u003Cspan class=\"hljs-literal\">True\u003C/span>) \u003Cspan class=\"hljs-keyword\">and\u003C/span>\n                    current_level &gt; previous_level + \u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">and\u003C/span> previous_level &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>):\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;heading_hierarchy_skip&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, line_num, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">f&#x27;Heading hierarchy skip: h\u003Cspan class=\"hljs-subst\">{previous_level}\u003C/span> to h\u003Cspan class=\"hljs-subst\">{current_level}\u003C/span>&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Use sequential heading levels&#x27;\u003C/span>,\n                                  line.strip())\n                \n                \u003Cspan class=\"hljs-comment\"># Check heading length\u003C/span>\n                max_heading_length = self.custom_rules.get(\u003Cspan class=\"hljs-string\">&#x27;max_heading_length&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">80\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(heading_text) &gt; max_heading_length:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;heading_too_long&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, line_num, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">f&#x27;Heading too long (\u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">len\u003C/span>(heading_text)}\u003C/span> chars)&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">f&#x27;Keep headings under \u003Cspan class=\"hljs-subst\">{max_heading_length}\u003C/span> characters&#x27;\u003C/span>,\n                                  heading_text[:\u003Cspan class=\"hljs-number\">50\u003C/span>] + \u003Cspan class=\"hljs-string\">&#x27;...&#x27;\u003C/span>)\n                \n                \u003Cspan class=\"hljs-comment\"># Check for empty headings\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> heading_text:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;empty_heading&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, line_num, current_level + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Empty heading&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Add heading text or remove heading&#x27;\u003C/span>,\n                                  line.strip())\n                \n                previous_level = current_level\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_list_formatting\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check list item formatting and consistency.&quot;&quot;&quot;\u003C/span>\n        in_list = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n        list_type = \u003Cspan class=\"hljs-literal\">None\u003C/span>  \u003Cspan class=\"hljs-comment\"># &#x27;unordered&#x27; or &#x27;ordered&#x27;\u003C/span>\n        list_markers = \u003Cspan class=\"hljs-built_in\">set\u003C/span>()\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            \u003Cspan class=\"hljs-comment\"># Unordered list items\u003C/span>\n            unordered_match = re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^(\\s*)([-*+])(\\s*)(.*)$&#x27;\u003C/span>, line)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> unordered_match:\n                indent, marker, space, content = unordered_match.groups()\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> space:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;list_no_space&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, line_num, \u003Cspan class=\"hljs-built_in\">len\u003C/span>(indent) + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;List item missing space after marker&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Add space after list marker&#x27;\u003C/span>,\n                                  line.strip())\n                \n                \u003Cspan class=\"hljs-comment\"># Track marker consistency\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> in_list \u003Cspan class=\"hljs-keyword\">or\u003C/span> list_type != \u003Cspan class=\"hljs-string\">&#x27;unordered&#x27;\u003C/span>:\n                    list_markers.clear()\n                    list_type = \u003Cspan class=\"hljs-string\">&#x27;unordered&#x27;\u003C/span>\n                    in_list = \u003Cspan class=\"hljs-literal\">True\u003C/span>\n                \n                list_markers.add(marker)\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(list_markers) &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;mixed_list_markers&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, line_num, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Mixed list markers in same list&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Use consistent markers (-, *, or +)&#x27;\u003C/span>,\n                                  line.strip())\n                \n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Ordered list items\u003C/span>\n            ordered_match = re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^(\\s*)(\\d+\\.)(\\s*)(.*)$&#x27;\u003C/span>, line)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> ordered_match:\n                indent, marker, space, content = ordered_match.groups()\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> space:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;ordered_list_no_space&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, line_num, \n                                  \u003Cspan class=\"hljs-built_in\">len\u003C/span>(indent) + \u003Cspan class=\"hljs-built_in\">len\u003C/span>(marker),\n                                  \u003Cspan class=\"hljs-string\">&#x27;Numbered list item missing space after number&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Add space after number and period&#x27;\u003C/span>,\n                                  line.strip())\n                \n                list_type = \u003Cspan class=\"hljs-string\">&#x27;ordered&#x27;\u003C/span>\n                in_list = \u003Cspan class=\"hljs-literal\">True\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Reset list tracking on non-list lines (except empty lines)\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> line.strip() \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^\\s*$&#x27;\u003C/span>, line):\n                in_list = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n                list_markers.clear()\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_code_blocks\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>], content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check code block syntax and nesting.&quot;&quot;&quot;\u003C/span>\n        code_fence_count = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        in_code_block = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n        code_fence_lengths = []\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            fence_match = re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^(\\s*)(```+)(.*)$&#x27;\u003C/span>, line)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> fence_match:\n                indent, fence, language = fence_match.groups()\n                fence_length = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(fence)\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> in_code_block:\n                    \u003Cspan class=\"hljs-comment\"># Opening fence\u003C/span>\n                    in_code_block = \u003Cspan class=\"hljs-literal\">True\u003C/span>\n                    code_fence_lengths.append(fence_length)\n                \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                    \u003Cspan class=\"hljs-comment\"># Closing fence\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> code_fence_lengths \u003Cspan class=\"hljs-keyword\">and\u003C/span> fence_length &gt;= code_fence_lengths[-\u003Cspan class=\"hljs-number\">1\u003C/span>]:\n                        in_code_block = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n                        code_fence_lengths.pop()\n                    \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                        self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;mismatched_code_fence&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, line_num, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                                      \u003Cspan class=\"hljs-string\">f&#x27;Code fence too short to close block (need \u003Cspan class=\"hljs-subst\">{code_fence_lengths[-\u003Cspan class=\"hljs-number\">1\u003C/span>]}\u003C/span> backticks)&#x27;\u003C/span>,\n                                      \u003Cspan class=\"hljs-string\">f&#x27;Use at least \u003Cspan class=\"hljs-subst\">{code_fence_lengths[-\u003Cspan class=\"hljs-number\">1\u003C/span>]}\u003C/span> backticks&#x27;\u003C/span>,\n                                      line.strip())\n                \n                code_fence_count += \u003Cspan class=\"hljs-number\">1\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> in_code_block \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> line:\n                \u003Cspan class=\"hljs-comment\"># Potential nested code block\u003C/span>\n                self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;nested_code_block&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, line_num, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">&#x27;Possible nested code block without proper escaping&#x27;\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">&#x27;Use more backticks for outer fence or escape inner backticks&#x27;\u003C/span>,\n                              line.strip())\n        \n        \u003Cspan class=\"hljs-comment\"># Check for unclosed code blocks\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> code_fence_count % \u003Cspan class=\"hljs-number\">2\u003C/span> != \u003Cspan class=\"hljs-number\">0\u003C/span>:\n            self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;unclosed_code_block&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, \u003Cspan class=\"hljs-built_in\">len\u003C/span>(lines), \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                          \u003Cspan class=\"hljs-string\">&#x27;Unclosed code block (unmatched fences)&#x27;\u003C/span>,\n                          \u003Cspan class=\"hljs-string\">&#x27;Add closing ``` to match opening fence&#x27;\u003C/span>,\n                          \u003Cspan class=\"hljs-string\">f&#x27;Total fences: \u003Cspan class=\"hljs-subst\">{code_fence_count}\u003C/span>&#x27;\u003C/span>)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_links_and_images\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check link and image syntax and accessibility.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            \u003Cspan class=\"hljs-comment\"># Check links\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> link_match \u003Cspan class=\"hljs-keyword\">in\u003C/span> re.finditer(\u003Cspan class=\"hljs-string\">r&#x27;\\[([^\\]]*)\\]\\(([^)]*)\\)&#x27;\u003C/span>, line):\n                text, url = link_match.groups()\n                col = link_match.start() + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> text \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> url:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;empty_link&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, line_num, col,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Empty link with no text or URL&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Add link text and URL or remove link&#x27;\u003C/span>,\n                                  link_match.group(\u003Cspan class=\"hljs-number\">0\u003C/span>))\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> text:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;empty_link_text&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, line_num, col,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Link missing descriptive text&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Add descriptive link text for accessibility&#x27;\u003C/span>,\n                                  link_match.group(\u003Cspan class=\"hljs-number\">0\u003C/span>))\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> url:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;empty_link_url&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, line_num, col,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Link missing URL&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Add valid URL to link&#x27;\u003C/span>,\n                                  link_match.group(\u003Cspan class=\"hljs-number\">0\u003C/span>))\n            \n            \u003Cspan class=\"hljs-comment\"># Check images\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> img_match \u003Cspan class=\"hljs-keyword\">in\u003C/span> re.finditer(\u003Cspan class=\"hljs-string\">r&#x27;!\\[([^\\]]*)\\]\\(([^)]*)\\)&#x27;\u003C/span>, line):\n                alt_text, url = img_match.groups()\n                col = img_match.start() + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.custom_rules.get(\u003Cspan class=\"hljs-string\">&#x27;require_alt_text&#x27;\u003C/span>, \u003Cspan class=\"hljs-literal\">True\u003C/span>) \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> alt_text:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;missing_alt_text&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, line_num, col,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Image missing alt text&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Add descriptive alt text for accessibility&#x27;\u003C/span>,\n                                  img_match.group(\u003Cspan class=\"hljs-number\">0\u003C/span>))\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> url:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;missing_image_url&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, line_num, col,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Image missing URL&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Add valid image URL&#x27;\u003C/span>,\n                                  img_match.group(\u003Cspan class=\"hljs-number\">0\u003C/span>))\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_table_structure\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check table formatting and structure.&quot;&quot;&quot;\u003C/span>\n        in_table = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n        expected_columns = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        table_start = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.patterns[\u003Cspan class=\"hljs-string\">&#x27;table_row&#x27;\u003C/span>].\u003Cspan class=\"hljs-keyword\">match\u003C/span>(line):\n                columns = \u003Cspan class=\"hljs-built_in\">len\u003C/span>([cell \u003Cspan class=\"hljs-keyword\">for\u003C/span> cell \u003Cspan class=\"hljs-keyword\">in\u003C/span> line.split(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">if\u003C/span> cell.strip()])\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> in_table:\n                    \u003Cspan class=\"hljs-comment\"># First row of table\u003C/span>\n                    in_table = \u003Cspan class=\"hljs-literal\">True\u003C/span>\n                    expected_columns = columns\n                    table_start = line_num\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> columns != expected_columns:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;table_column_mismatch&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, line_num, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">f&#x27;Table row has \u003Cspan class=\"hljs-subst\">{columns}\u003C/span> columns, expected \u003Cspan class=\"hljs-subst\">{expected_columns}\u003C/span>&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Ensure all table rows have same number of columns&#x27;\u003C/span>,\n                                  line.strip())\n                \n                \u003Cspan class=\"hljs-comment\"># Check for empty cells\u003C/span>\n                cells = [cell.strip() \u003Cspan class=\"hljs-keyword\">for\u003C/span> cell \u003Cspan class=\"hljs-keyword\">in\u003C/span> line.split(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">1\u003C/span>:-\u003Cspan class=\"hljs-number\">1\u003C/span>]]  \u003Cspan class=\"hljs-comment\"># Remove first/last empty\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> col, cell \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(cells):\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> cell:\n                        self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;empty_table_cell&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>, line_num, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                                      \u003Cspan class=\"hljs-string\">f&#x27;Empty table cell in column \u003Cspan class=\"hljs-subst\">{col + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>&#x27;\u003C/span>,\n                                      \u003Cspan class=\"hljs-string\">&#x27;Add content to empty cells or use &amp;nbsp;&#x27;\u003C/span>,\n                                      \u003Cspan class=\"hljs-string\">f&#x27;Column \u003Cspan class=\"hljs-subst\">{col + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>: &quot;\u003Cspan class=\"hljs-subst\">{cell}\u003C/span>&quot;&#x27;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                in_table = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_emphasis_formatting\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check emphasis and strong formatting.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            \u003Cspan class=\"hljs-comment\"># Check for unmatched emphasis markers\u003C/span>\n            asterisk_count = line.count(\u003Cspan class=\"hljs-string\">&#x27;*&#x27;\u003C/span>)\n            underscore_count = line.count(\u003Cspan class=\"hljs-string\">&#x27;_&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Simple check for unmatched asterisks\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> asterisk_count % \u003Cspan class=\"hljs-number\">2\u003C/span> != \u003Cspan class=\"hljs-number\">0\u003C/span>:\n                \u003Cspan class=\"hljs-comment\"># Find unmatched asterisks\u003C/span>\n                in_emphasis = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, char \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(line):\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> char == \u003Cspan class=\"hljs-string\">&#x27;*&#x27;\u003C/span>:\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> i &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-keyword\">and\u003C/span> line[i-\u003Cspan class=\"hljs-number\">1\u003C/span>] == \u003Cspan class=\"hljs-string\">&#x27;*&#x27;\u003C/span>:\n                            \u003Cspan class=\"hljs-keyword\">continue\u003C/span>  \u003Cspan class=\"hljs-comment\"># Part of ** pair\u003C/span>\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> i &lt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(line) - \u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">and\u003C/span> line[i+\u003Cspan class=\"hljs-number\">1\u003C/span>] == \u003Cspan class=\"hljs-string\">&#x27;*&#x27;\u003C/span>:\n                            \u003Cspan class=\"hljs-keyword\">continue\u003C/span>  \u003Cspan class=\"hljs-comment\"># Part of ** pair\u003C/span>\n                        \n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> in_emphasis:\n                            in_emphasis = \u003Cspan class=\"hljs-literal\">True\u003C/span>\n                        \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                            in_emphasis = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> in_emphasis:\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;unmatched_emphasis&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, line_num, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Possible unmatched emphasis marker&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Check for missing closing * or _ marker&#x27;\u003C/span>,\n                                  line.strip())\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_html_usage\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check HTML tag usage and validity.&quot;&quot;&quot;\u003C/span>\n        allowed_tags = self.custom_rules.get(\u003Cspan class=\"hljs-string\">&#x27;allowed_html_tags&#x27;\u003C/span>, [])\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> html_match \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.patterns[\u003Cspan class=\"hljs-string\">&#x27;html_tag&#x27;\u003C/span>].finditer(line):\n                tag_full = html_match.group(\u003Cspan class=\"hljs-number\">0\u003C/span>)\n                col = html_match.start() + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                \n                \u003Cspan class=\"hljs-comment\"># Extract tag name\u003C/span>\n                tag_match = re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;&lt;/?([a-zA-Z][a-zA-Z0-9]*)&#x27;\u003C/span>, tag_full)\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> tag_match:\n                    tag_name = tag_match.group(\u003Cspan class=\"hljs-number\">1\u003C/span>).lower()\n                    \n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> allowed_tags \u003Cspan class=\"hljs-keyword\">and\u003C/span> tag_name \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> allowed_tags:\n                        self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;disallowed_html_tag&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, line_num, col,\n                                      \u003Cspan class=\"hljs-string\">f&#x27;HTML tag &lt;\u003Cspan class=\"hljs-subst\">{tag_name}\u003C/span>&gt; may not be supported&#x27;\u003C/span>,\n                                      \u003Cspan class=\"hljs-string\">&#x27;Use Markdown syntax when possible&#x27;\u003C/span>,\n                                      tag_full)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_unicode_issues\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check for problematic Unicode characters.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            \u003Cspan class=\"hljs-comment\"># Check for curly quotes and similar\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> unicode_match \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.patterns[\u003Cspan class=\"hljs-string\">&#x27;suspicious_unicode&#x27;\u003C/span>].finditer(line):\n                char = unicode_match.group(\u003Cspan class=\"hljs-number\">0\u003C/span>)\n                col = unicode_match.start() + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                \n                replacements = {\n                    \u003Cspan class=\"hljs-string\">&#x27;&#x27;&#x27;: &quot;&#x27;&quot;, &#x27;&#x27;&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;&#x27;&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&quot;&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;&quot;&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&quot;&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;&quot;&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;„&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;&quot;&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;‚&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;&#x27;&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;‹&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;&lt;&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;›&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;&gt;&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;«&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;&quot;&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;»&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;&quot;&#x27;\u003C/span>\n                }\n                \n                suggested = replacements.get(char, char)\n                self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;suspicious_unicode&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>, line_num, col,\n                              \u003Cspan class=\"hljs-string\">f&#x27;Smart quote or special character: \u003Cspan class=\"hljs-subst\">{char}\u003C/span>&#x27;\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">f&#x27;Consider using standard character: \u003Cspan class=\"hljs-subst\">{suggested}\u003C/span>&#x27;\u003C/span>,\n                              line[\u003Cspan class=\"hljs-built_in\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, col-\u003Cspan class=\"hljs-number\">10\u003C/span>):col+\u003Cspan class=\"hljs-number\">10\u003C/span>])\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_line_length\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check for overly long lines.&quot;&quot;&quot;\u003C/span>\n        max_length = self.custom_rules.get(\u003Cspan class=\"hljs-string\">&#x27;max_line_length&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">120\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(line) &gt; max_length:\n                self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;line_too_long&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>, line_num, max_length + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">f&#x27;Line too long (\u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">len\u003C/span>(line)}\u003C/span> characters)&#x27;\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">f&#x27;Keep lines under \u003Cspan class=\"hljs-subst\">{max_length}\u003C/span> characters&#x27;\u003C/span>,\n                              line[:\u003Cspan class=\"hljs-number\">50\u003C/span>] + \u003Cspan class=\"hljs-string\">&#x27;...&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(line) &gt; \u003Cspan class=\"hljs-number\">50\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> line)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_whitespace_issues\u003C/span>(\u003Cspan class=\"hljs-params\">self, content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check for whitespace-related issues.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Check for trailing whitespace\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.patterns[\u003Cspan class=\"hljs-string\">&#x27;trailing_whitespace&#x27;\u003C/span>].search(line):\n                self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;trailing_whitespace&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>, line_num, \u003Cspan class=\"hljs-built_in\">len\u003C/span>(line.rstrip()) + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">&#x27;Trailing whitespace&#x27;\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">&#x27;Remove trailing spaces/tabs&#x27;\u003C/span>,\n                              \u003Cspan class=\"hljs-string\">f&#x27;Line ends with \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">len\u003C/span>(line) - \u003Cspan class=\"hljs-built_in\">len\u003C/span>(line.rstrip())}\u003C/span> whitespace chars&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Check for multiple consecutive blank lines\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.patterns[\u003Cspan class=\"hljs-string\">&#x27;multiple_blank_lines&#x27;\u003C/span>].search(content):\n            self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;multiple_blank_lines&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                          \u003Cspan class=\"hljs-string\">&#x27;Multiple consecutive blank lines&#x27;\u003C/span>,\n                          \u003Cspan class=\"hljs-string\">&#x27;Use single blank lines for separation&#x27;\u003C/span>,\n                          \u003Cspan class=\"hljs-string\">&#x27;Document contains multiple blank lines&#x27;\u003C/span>)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_custom_patterns\u003C/span>(\u003Cspan class=\"hljs-params\">self, lines: \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check for custom forbidden patterns.&quot;&quot;&quot;\u003C/span>\n        forbidden_patterns = self.custom_rules.get(\u003Cspan class=\"hljs-string\">&#x27;forbidden_patterns&#x27;\u003C/span>, [])\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> pattern_text \u003Cspan class=\"hljs-keyword\">in\u003C/span> forbidden_patterns:\n            pattern = re.\u003Cspan class=\"hljs-built_in\">compile\u003C/span>(pattern_text, re.IGNORECASE)\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> \u003Cspan class=\"hljs-keyword\">match\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> pattern.finditer(line):\n                    col = \u003Cspan class=\"hljs-keyword\">match\u003C/span>.start() + \u003Cspan class=\"hljs-number\">1\u003C/span>\n                    self.add_issue(\u003Cspan class=\"hljs-string\">&#x27;forbidden_pattern&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, line_num, col,\n                                  \u003Cspan class=\"hljs-string\">f&#x27;Forbidden pattern found: \u003Cspan class=\"hljs-subst\">{pattern_text}\u003C/span>&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-string\">&#x27;Remove or replace forbidden content&#x27;\u003C/span>,\n                                  \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">0\u003C/span>))\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_report\u003C/span>(\u003Cspan class=\"hljs-params\">self, issues: \u003Cspan class=\"hljs-type\">List\u003C/span>[ValidationIssue]\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Generate a comprehensive validation report.&quot;&quot;&quot;\u003C/span>\n        report = {\n            \u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;total_issues&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(issues),\n                \u003Cspan class=\"hljs-string\">&#x27;errors&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>([i \u003Cspan class=\"hljs-keyword\">for\u003C/span> i \u003Cspan class=\"hljs-keyword\">in\u003C/span> issues \u003Cspan class=\"hljs-keyword\">if\u003C/span> i.severity == \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>]),\n                \u003Cspan class=\"hljs-string\">&#x27;warnings&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>([i \u003Cspan class=\"hljs-keyword\">for\u003C/span> i \u003Cspan class=\"hljs-keyword\">in\u003C/span> issues \u003Cspan class=\"hljs-keyword\">if\u003C/span> i.severity == \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>]),\n                \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>([i \u003Cspan class=\"hljs-keyword\">for\u003C/span> i \u003Cspan class=\"hljs-keyword\">in\u003C/span> issues \u003Cspan class=\"hljs-keyword\">if\u003C/span> i.severity == \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>]),\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>: []\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue \u003Cspan class=\"hljs-keyword\">in\u003C/span> issues:\n            report[\u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>].append({\n                \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: issue.\u003Cspan class=\"hljs-built_in\">type\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>: issue.severity,\n                \u003Cspan class=\"hljs-string\">&#x27;line&#x27;\u003C/span>: issue.line_number,\n                \u003Cspan class=\"hljs-string\">&#x27;column&#x27;\u003C/span>: issue.column,\n                \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: issue.message,\n                \u003Cspan class=\"hljs-string\">&#x27;suggestion&#x27;\u003C/span>: issue.suggestion,\n                \u003Cspan class=\"hljs-string\">&#x27;context&#x27;\u003C/span>: issue.context\n            })\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> report\n\n\u003Cspan class=\"hljs-comment\"># Command line interface\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> __name__ == \u003Cspan class=\"hljs-string\">&quot;__main__&quot;\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">import\u003C/span> argparse\n    \n    parser = argparse.ArgumentParser(description=\u003Cspan class=\"hljs-string\">&#x27;Advanced Markdown Validator&#x27;\u003C/span>)\n    parser.add_argument(\u003Cspan class=\"hljs-string\">&#x27;file&#x27;\u003C/span>, \u003Cspan class=\"hljs-built_in\">help\u003C/span>=\u003Cspan class=\"hljs-string\">&#x27;Markdown file to validate&#x27;\u003C/span>)\n    parser.add_argument(\u003Cspan class=\"hljs-string\">&#x27;--output&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-o&#x27;\u003C/span>, choices=[\u003Cspan class=\"hljs-string\">&#x27;json&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>], \n                       default=\u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>, \u003Cspan class=\"hljs-built_in\">help\u003C/span>=\u003Cspan class=\"hljs-string\">&#x27;Output format&#x27;\u003C/span>)\n    parser.add_argument(\u003Cspan class=\"hljs-string\">&#x27;--config&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-c&#x27;\u003C/span>, \u003Cspan class=\"hljs-built_in\">help\u003C/span>=\u003Cspan class=\"hljs-string\">&#x27;Custom rules configuration file&#x27;\u003C/span>)\n    \n    args = parser.parse_args()\n    \n    validator = AdvancedMarkdownValidator()\n    \n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> args.config:\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(args.config, \u003Cspan class=\"hljs-string\">&#x27;r&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n                validator.custom_rules.update(yaml.safe_load(f))\n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n            \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Error loading config: \u003Cspan class=\"hljs-subst\">{e}\u003C/span>&quot;\u003C/span>)\n    \n    issues = validator.validate_file(args.file)\n    report = validator.generate_report(issues)\n    \n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> args.output == \u003Cspan class=\"hljs-string\">&#x27;json&#x27;\u003C/span>:\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(json.dumps(report, indent=\u003Cspan class=\"hljs-number\">2\u003C/span>))\n    \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Validation Results for \u003Cspan class=\"hljs-subst\">{args.file}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;=&quot;\u003C/span> * \u003Cspan class=\"hljs-number\">50\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Total Issues: \u003Cspan class=\"hljs-subst\">{report[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;total_issues&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Errors: \u003Cspan class=\"hljs-subst\">{report[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;errors&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Warnings: \u003Cspan class=\"hljs-subst\">{report[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;warnings&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Info: \u003Cspan class=\"hljs-subst\">{report[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>()\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue_data \u003Cspan class=\"hljs-keyword\">in\u003C/span> report[\u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>]:\n            severity_symbol = {\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;❌&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;⚠️&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;ℹ️&#x27;\u003C/span>}\n            \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{severity_symbol[issue_data[\u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>]]}\u003C/span> \u003Cspan class=\"hljs-subst\">{issue_data[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>]}\u003C/span> &quot;\u003C/span>\n                  \u003Cspan class=\"hljs-string\">f&quot;(Line \u003Cspan class=\"hljs-subst\">{issue_data[\u003Cspan class=\"hljs-string\">&#x27;line&#x27;\u003C/span>]}\u003C/span>, Col \u003Cspan class=\"hljs-subst\">{issue_data[\u003Cspan class=\"hljs-string\">&#x27;column&#x27;\u003C/span>]}\u003C/span>)&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;   \u003Cspan class=\"hljs-subst\">{issue_data[\u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;   💡 \u003Cspan class=\"hljs-subst\">{issue_data[\u003Cspan class=\"hljs-string\">&#x27;suggestion&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> issue_data[\u003Cspan class=\"hljs-string\">&#x27;context&#x27;\u003C/span>]:\n                \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;   Context: \u003Cspan class=\"hljs-subst\">{issue_data[\u003Cspan class=\"hljs-string\">&#x27;context&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-built_in\">print\u003C/span>()\n\u003C/code>\u003C/pre>\u003Ch2 id=\"parser-specific-debugging\">Parser-Specific Debugging\u003C/h2>\n\u003Ch3 id=\"github-flavored-markdown\">GitHub Flavored Markdown\u003C/h3>\n\u003Cp>Debugging issues specific to GitHub&#39;s Markdown processor:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// github-markdown-debugger.js - GitHub-specific validation\u003C/span>\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">GitHubMarkdownDebugger\u003C/span> {\n  \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">gfmFeatures\u003C/span> = {\n      \u003Cspan class=\"hljs-attr\">tables\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n      \u003Cspan class=\"hljs-attr\">strikethrough\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n      \u003Cspan class=\"hljs-attr\">taskLists\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n      \u003Cspan class=\"hljs-attr\">autolinks\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n      \u003Cspan class=\"hljs-attr\">disallowedRawHtml\u003C/span>: [\n        \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;textarea&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;style&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;xmp&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;iframe&#x27;\u003C/span>,\n        \u003Cspan class=\"hljs-string\">&#x27;noembed&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;noframes&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;script&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;plaintext&#x27;\u003C/span>\n      ]\n    };\n    \n    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">issues\u003C/span> = [];\n  }\n  \n  \u003Cspan class=\"hljs-title function_\">validateGitHubMarkdown\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = content.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n    \n    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">checkTaskLists\u003C/span>(lines);\n    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">checkTables\u003C/span>(lines);\n    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">checkStrikethrough\u003C/span>(lines);\n    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">checkAutolinks\u003C/span>(lines);\n    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">checkDisallowedHtml\u003C/span>(lines);\n    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">checkEmojiShortcodes\u003C/span>(lines);\n    \n    \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">issues\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-title function_\">checkTaskLists\u003C/span>(\u003Cspan class=\"hljs-params\">lines\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\">// GitHub task list pattern\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">const\u003C/span> taskListMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*[-*+]\\s+)\\[([xX\\s])\\]\\s+(.+)$/\u003C/span>);\n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> (taskListMatch) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> [, prefix, checkbox, content] = taskListMatch;\n        \n        \u003Cspan class=\"hljs-comment\">// Check for invalid checkbox characters\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (![\u003Cspan class=\"hljs-string\">&#x27; &#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;x&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;X&#x27;\u003C/span>].\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(checkbox)) {\n          \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;invalid_task_checkbox&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                       \u003Cspan class=\"hljs-string\">&#x27;Task list checkbox contains invalid character&#x27;\u003C/span>,\n                       \u003Cspan class=\"hljs-string\">&#x27;Use space, x, or X in task list checkboxes&#x27;\u003C/span>,\n                       line);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for missing space after checkbox\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!content.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()) {\n          \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;empty_task_content&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                       \u003Cspan class=\"hljs-string\">&#x27;Task list item has no content&#x27;\u003C/span>,\n                       \u003Cspan class=\"hljs-string\">&#x27;Add description after task list checkbox&#x27;\u003C/span>,\n                       line);\n        }\n      }\n      \n      \u003Cspan class=\"hljs-comment\">// Check for malformed task lists\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*[-*+]\\s+)\\[.*\\]/\u003C/span>) &amp;&amp; !taskListMatch) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;malformed_task_list&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                     \u003Cspan class=\"hljs-string\">&#x27;Malformed task list syntax&#x27;\u003C/span>,\n                     \u003Cspan class=\"hljs-string\">&#x27;Use format: - [ ] or - [x] for task lists&#x27;\u003C/span>,\n                     line);\n      }\n    });\n  }\n  \n  \u003Cspan class=\"hljs-title function_\">checkTables\u003C/span>(\u003Cspan class=\"hljs-params\">lines\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> headerRowFound = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n    \u003Cspan class=\"hljs-keyword\">let\u003C/span> alignmentRowFound = \u003Cspan class=\"hljs-literal\">false\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> tableRowMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^\\s*\\|(.+\\|)+\\s*$/\u003C/span>);\n      \u003Cspan class=\"hljs-keyword\">const\u003C/span> alignmentRowMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^\\s*\\|(\\s*:?-+:?\\s*\\|)+\\s*$/\u003C/span>);\n      \n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> (tableRowMatch) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> columns = line.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span> - \u003Cspan class=\"hljs-number\">2\u003C/span>; \u003Cspan class=\"hljs-comment\">// Exclude first/last empty\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!inTable) {\n          inTable = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n          headerRowFound = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n          expectedColumns = columns;\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (alignmentRowMatch) {\n          alignmentRowFound = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n          \n          \u003Cspan class=\"hljs-comment\">// Check alignment row column count\u003C/span>\n          \u003Cspan class=\"hljs-keyword\">if\u003C/span> (columns !== expectedColumns) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;table_alignment_mismatch&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                         \u003Cspan class=\"hljs-string\">`Table alignment row has \u003Cspan class=\"hljs-subst\">${columns}\u003C/span> columns, header has \u003Cspan class=\"hljs-subst\">${expectedColumns}\u003C/span>`\u003C/span>,\n                         \u003Cspan class=\"hljs-string\">&#x27;Ensure alignment row matches header column count&#x27;\u003C/span>,\n                         line);\n          }\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n          \u003Cspan class=\"hljs-comment\">// Data row\u003C/span>\n          \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!alignmentRowFound &amp;&amp; inTable) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;missing_table_alignment&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                         \u003Cspan class=\"hljs-string\">&#x27;Table missing alignment row&#x27;\u003C/span>,\n                         \u003Cspan class=\"hljs-string\">&#x27;Add alignment row (e.g., |---|---|) after header&#x27;\u003C/span>,\n                         \u003Cspan class=\"hljs-string\">&#x27;Previous line should be header&#x27;\u003C/span>);\n          }\n          \n          \u003Cspan class=\"hljs-keyword\">if\u003C/span> (columns !== expectedColumns) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;table_column_mismatch&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                         \u003Cspan class=\"hljs-string\">`Table row has \u003Cspan class=\"hljs-subst\">${columns}\u003C/span> columns, expected \u003Cspan class=\"hljs-subst\">${expectedColumns}\u003C/span>`\u003C/span>,\n                         \u003Cspan class=\"hljs-string\">&#x27;Ensure all table rows have same number of columns&#x27;\u003C/span>,\n                         line);\n          }\n        }\n      } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inTable &amp;&amp; line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() !== \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// End of table\u003C/span>\n        inTable = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        headerRowFound = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        alignmentRowFound = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        expectedColumns = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n      }\n    });\n  }\n  \n  \u003Cspan class=\"hljs-title function_\">checkStrikethrough\u003C/span>(\u003Cspan class=\"hljs-params\">lines\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 unmatched strikethrough\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">const\u003C/span> tildeCount = (line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/~~/g\u003C/span>) || []).\u003Cspan class=\"hljs-property\">length\u003C/span>;\n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> (tildeCount % \u003Cspan class=\"hljs-number\">2\u003C/span> !== \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;unmatched_strikethrough&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                     \u003Cspan class=\"hljs-string\">&#x27;Unmatched strikethrough markers&#x27;\u003C/span>,\n                     \u003Cspan class=\"hljs-string\">&#x27;Ensure strikethrough text is properly closed with ~~&#x27;\u003C/span>,\n                     line);\n      }\n      \n      \u003Cspan class=\"hljs-comment\">// Check for single tildes (not valid for strikethrough)\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">const\u003C/span> singleTildeMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/(?&lt;!~)~(?!~)/\u003C/span>);\n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> (singleTildeMatch) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;single_tilde_strikethrough&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>, index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                     \u003Cspan class=\"hljs-string\">&#x27;Single tilde found - use ~~ for strikethrough&#x27;\u003C/span>,\n                     \u003Cspan class=\"hljs-string\">&#x27;Use double tildes (~~) for strikethrough formatting&#x27;\u003C/span>,\n                     line);\n      }\n    });\n  }\n  \n  \u003Cspan class=\"hljs-title function_\">checkAutolinks\u003C/span>(\u003Cspan class=\"hljs-params\">lines\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 URLs that should be autolinked\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">const\u003C/span> urlPattern = \u003Cspan class=\"hljs-regexp\">/(?&lt;![\\[\\(])(https?:\\/\\/[^\\s\\)]+)(?![\\]\\)])/g\u003C/span>;\n      \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n      \n      \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = urlPattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(line)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> url = match[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> beforeChar = line[match.\u003Cspan class=\"hljs-property\">index\u003C/span> - \u003Cspan class=\"hljs-number\">1\u003C/span>];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> afterChar = line[match.\u003Cspan class=\"hljs-property\">index\u003C/span> + match[\u003Cspan class=\"hljs-number\">0\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>];\n        \n        \u003Cspan class=\"hljs-comment\">// Skip if already in link syntax\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (beforeChar === \u003Cspan class=\"hljs-string\">&#x27;]&#x27;\u003C/span> || beforeChar === \u003Cspan class=\"hljs-string\">&#x27;)&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">continue\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;potential_autolink&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>, index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                     \u003Cspan class=\"hljs-string\">&#x27;URL could be autolinked&#x27;\u003C/span>,\n                     \u003Cspan class=\"hljs-string\">&#x27;GitHub will automatically link this URL&#x27;\u003C/span>,\n                     \u003Cspan class=\"hljs-string\">`URL: \u003Cspan class=\"hljs-subst\">${url}\u003C/span>`\u003C/span>);\n      }\n    });\n  }\n  \n  \u003Cspan class=\"hljs-title function_\">checkDisallowedHtml\u003C/span>(\u003Cspan class=\"hljs-params\">lines\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-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">gfmFeatures\u003C/span>.\u003Cspan class=\"hljs-property\">disallowedRawHtml\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">tag\u003C/span> =&gt;\u003C/span> {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> tagPattern = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">RegExp\u003C/span>(\u003Cspan class=\"hljs-string\">`&lt;\u003Cspan class=\"hljs-subst\">${tag}\u003C/span>[^&gt;]*&gt;`\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;gi&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (tagPattern.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(line)) {\n          \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;disallowed_html_tag&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                       \u003Cspan class=\"hljs-string\">`Disallowed HTML tag: &lt;\u003Cspan class=\"hljs-subst\">${tag}\u003C/span>&gt;`\u003C/span>,\n                       \u003Cspan class=\"hljs-string\">&#x27;GitHub blocks this HTML tag for security&#x27;\u003C/span>,\n                       line);\n        }\n      });\n    });\n  }\n  \n  \u003Cspan class=\"hljs-title function_\">checkEmojiShortcodes\u003C/span>(\u003Cspan class=\"hljs-params\">lines\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 potential emoji shortcodes\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">const\u003C/span> emojiPattern = \u003Cspan class=\"hljs-regexp\">/:([a-zA-Z_]+):/g\u003C/span>;\n      \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n      \n      \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = emojiPattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(line)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> shortcode = match[\u003Cspan class=\"hljs-number\">1\u003C/span>];\n        \n        \u003Cspan class=\"hljs-comment\">// Skip time patterns like 12:30:45\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^\\d+$/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(shortcode)) \u003Cspan class=\"hljs-keyword\">continue\u003C/span>;\n        \n        \u003Cspan class=\"hljs-comment\">// Common invalid shortcodes\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (shortcode.\u003Cspan class=\"hljs-property\">length\u003C/span> &lt; \u003Cspan class=\"hljs-number\">2\u003C/span>) {\n          \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;invalid_emoji_shortcode&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;info&#x27;\u003C/span>, index + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                       \u003Cspan class=\"hljs-string\">`Potential invalid emoji shortcode: :\u003Cspan class=\"hljs-subst\">${shortcode}\u003C/span>:`\u003C/span>,\n                       \u003Cspan class=\"hljs-string\">&#x27;Check GitHub emoji shortcode list for valid emojis&#x27;\u003C/span>,\n                       match[\u003Cspan class=\"hljs-number\">0\u003C/span>]);\n        }\n      }\n    });\n  }\n  \n  \u003Cspan class=\"hljs-title function_\">addIssue\u003C/span>(\u003Cspan class=\"hljs-params\">type, severity, lineNumber, message, suggestion, context\u003C/span>) {\n    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n      type,\n      severity,\n      lineNumber,\n      message,\n      suggestion,\n      \u003Cspan class=\"hljs-attr\">context\u003C/span>: context.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">100\u003C/span> ? context.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">100\u003C/span>) + \u003Cspan class=\"hljs-string\">&#x27;...&#x27;\u003C/span> : context\n    });\n  }\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">GitHubMarkdownDebugger\u003C/span>;\n\u003C/code>\u003C/pre>\u003Ch2 id=\"automated-testing-and-ci-integration\">Automated Testing and CI Integration\u003C/h2>\n\u003Cp>Complete CI/CD pipeline integration for Markdown validation:\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\">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\">paths:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;**/*.md&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">pull_request:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;**/*.md&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">jobs:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">validate:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">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\">&#x27;18&#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\">validation\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 markdownlint-cli2\n        npm install -g markdown-link-check\n        pip install markdown-it-py\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Run\u003C/span> \u003Cspan class=\"hljs-string\">basic\u003C/span> \u003Cspan class=\"hljs-string\">syntax\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        markdownlint-cli2 &quot;**/*.md&quot;\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\">for\u003C/span> \u003Cspan class=\"hljs-string\">broken\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; -exec markdown-link-check {} \\;\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Run\u003C/span> \u003Cspan class=\"hljs-string\">custom\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python .github/scripts/advanced-markdown-validator.py\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\">report\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">failure()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/upload-artifact@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">validation-report\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          validation-report.*\n          markdown-validation.log\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"integration-with-documentation-workflows\">Integration with Documentation Workflows\u003C/h2>\n\u003Cp>Markdown debugging integrates seamlessly with comprehensive documentation workflows. When combined with \u003Ca href=\"/blog/markdown-automation-workflows-complete-guide\">automation systems and workflow optimization\u003C/a>, systematic error detection becomes part of the continuous integration process, ensuring document quality is maintained automatically throughout the development lifecycle.\u003C/p>\n\u003Cp>For comprehensive content management, debugging techniques work effectively with \u003Ca href=\"/blog/markdown-version-control-git-integration-complete-guide\">version control and collaborative editing workflows\u003C/a> to prevent syntax errors from propagating through collaborative editing processes and merge conflicts.\u003C/p>\n\u003Cp>When building sophisticated documentation platforms, error detection complements \u003Ca href=\"/blog/markdown-performance-optimization-complete-guide\">performance optimization strategies\u003C/a> by identifying syntax issues that can cause parsing delays and rendering failures, maintaining optimal performance across large documentation systems.\u003C/p>\n\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Markdown debugging and error detection transforms chaotic troubleshooting into systematic quality assurance that identifies, diagnoses, and resolves syntax issues efficiently while maintaining document quality across different platforms and processors. By implementing comprehensive validation tools, automated error checking systems, and systematic debugging workflows, content creators can maintain professional documentation standards while minimizing time spent on manual error correction.\u003C/p>\n\u003Cp>The key to successful Markdown debugging lies in combining automated tools with manual validation techniques, ensuring that error detection covers both common syntax issues and platform-specific requirements. Whether you&#39;re managing small documentation projects or large-scale content systems, the debugging strategies and tools covered in this guide provide the foundation for maintaining consistent, error-free Markdown that renders correctly across all target platforms.\u003C/p>\n\u003Cp>Remember to implement validation early in your content creation workflow, use automated tools to catch common errors, and maintain comprehensive error detection systems that evolve with your documentation needs. With proper debugging and validation processes in place, your Markdown content becomes more reliable, maintainable, and professional, supporting both content creators and end users effectively.\u003C/p>\n\u003Csection class=\"footnotes\" data-footnotes>\n\u003Ch2 id=\"footnote-label\" class=\"visually-hidden\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"footnote-1\">\n\u003Cp>This footnote is properly formatted. \u003Ca href=\"#footnote-ref-1\" data-footnote-backref aria-label=\"Back to reference 1\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>\n",[15,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67],{"id":16,"text":17,"level":18},"why-master-markdown-debugging","Why Master Markdown Debugging?",2,{"id":20,"text":21,"level":18},"common-markdown-syntax-errors","Common Markdown Syntax Errors",{"id":23,"text":24,"level":18},"link-and-image-formatting-problems","Link and Image Formatting Problems",{"id":26,"text":27,"level":18},"table-structure-issues","Table Structure Issues",{"id":29,"text":30,"level":18},"quote-block-problems","Quote Block Problems",{"id":32,"text":33,"level":18},"emphasis-and-strong-formatting","Emphasis and Strong Formatting",{"id":35,"text":36,"level":18},"table-alignment-problems","Table Alignment Problems",{"id":38,"text":39,"level":18},"definition-list-errors-extended-markdown","Definition List Errors (Extended Markdown)",{"id":41,"text":42,"level":18},"footnote-reference-problems","Footnote Reference Problems",{"id":44,"text":45,"level":18},"task-list-formatting-issues","Task List Formatting Issues",{"id":47,"text":48,"level":18},"mathematical-expression-errors","Mathematical Expression Errors",{"id":50,"text":51,"level":18},"html-integration-problems","HTML Integration Problems",{"id":53,"text":54,"level":18},"escape-character-misuse","Escape Character Misuse",{"id":56,"text":57,"level":18},"unicode-and-special-character-issues","Unicode and Special Character Issues",{"id":59,"text":60,"level":18},"parser-specific-debugging","Parser-Specific Debugging",{"id":62,"text":63,"level":18},"automated-testing-and-ci-integration","Automated Testing and CI Integration",{"id":65,"text":66,"level":18},"integration-with-documentation-workflows","Integration with Documentation Workflows",{"id":68,"text":69,"level":18},"conclusion","Conclusion",[],[72,80,88],{"slug":73,"title":74,"description":75,"excerpt":76,"date":77,"category":9,"author":10,"keywords":78,"readingMinutes":79},"markdown-syntax-validation-error-detection-complete-guide","Markdown Syntax Validation and Error Detection: Complete Guide for Professional Quality Control","Master comprehensive Markdown syntax validation techniques with automated error detection, linting rules, and quality assurance workflows. Learn professional validation strategies for maintaining consistent, error-free documentation.","Comprehensive Markdown syntax validation and error detection ensure professional documentation quality by implementing automated checking systems that identify syntax errors, formatting…","2025-10-05","markdown validation, markdown linting, markdown error detection, markdown syntax checking, markdown quality control, documentation validation, markdown parser validation, markdown syntax errors",22,{"slug":81,"title":82,"description":83,"excerpt":84,"date":85,"category":9,"author":10,"keywords":86,"readingMinutes":87},"markdown-code-block-validation-error-detection-complete-guide","Markdown Code Block Validation and Error Detection: Complete Guide for Automated Quality Assurance and Syntax Verification","Master advanced Markdown code block validation techniques for automated syntax checking, error detection, and quality assurance. Learn to build comprehensive validation systems that ensure code accuracy and prevent documentation errors.","Advanced Markdown code block validation and error detection systems enable automated quality assurance for technical documentation, ensuring code examples remain accurate, executable, and properly…","2025-10-22","markdown code validation, code block syntax checking, markdown error detection, code block validation tools, automated markdown testing, syntax verification markdown, code block quality assurance, markdown lint tools",28,{"slug":89,"title":90,"description":91,"excerpt":92,"date":93,"category":9,"author":10,"keywords":94,"readingMinutes":12},"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",1792184946608]