[{"data":1,"prerenderedAt":59},["Reactive",2],{"blog-post-markdown-documentation-automation-deployment-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":34,"related":35},"markdown-documentation-automation-deployment-complete-guide","Markdown Documentation Automation and Deployment: Complete Guide for Streamlined Publishing and Continuous Integration","Master advanced Markdown documentation automation techniques for streamlined deployment, continuous integration workflows, and automated publishing. Learn to build robust documentation pipelines that ensure consistency and quality.","Advanced Markdown documentation automation and deployment systems enable seamless integration between content creation and publication workflows, ensuring that technical documentation remains…","2025-10-25","Tutorial","Matthew Rathbone","markdown automation deployment, documentation CI/CD, automated markdown publishing, documentation pipeline, markdown build automation, continuous deployment docs, automated documentation workflows, markdown integration systems",29,"\u003Cp>Advanced Markdown documentation automation and deployment systems enable seamless integration between content creation and publication workflows, ensuring that technical documentation remains current, accessible, and consistently formatted across all platforms. By implementing sophisticated automation pipelines, continuous integration frameworks, and intelligent deployment strategies, technical teams can create self-maintaining documentation ecosystems that scale efficiently while maintaining the highest standards of quality and user experience.\u003C/p>\n\u003Ch2 id=\"why-master-documentation-automation-and-deployment\">Why Master Documentation Automation and Deployment?\u003C/h2>\n\u003Cp>Professional documentation automation provides essential benefits for technical teams:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Streamlined Publishing\u003C/strong>: Automated workflows eliminate manual deployment steps and reduce time-to-publish\u003C/li>\n\u003Cli>\u003Cstrong>Consistency Assurance\u003C/strong>: Standardized build processes ensure uniform formatting and styling across all documentation\u003C/li>\n\u003Cli>\u003Cstrong>Quality Control\u003C/strong>: Automated validation and testing catch errors before they reach production environments\u003C/li>\n\u003Cli>\u003Cstrong>Scalability\u003C/strong>: Automation systems handle growing documentation needs without proportional increases in maintenance overhead\u003C/li>\n\u003Cli>\u003Cstrong>Integration Efficiency\u003C/strong>: Seamless connections between development workflows and documentation updates\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"foundation-automation-principles\">Foundation Automation Principles\u003C/h2>\n\u003Ch3 id=\"comprehensive-build-pipeline-architecture\">Comprehensive Build Pipeline Architecture\u003C/h3>\n\u003Cp>Creating robust automation systems that handle the complete documentation lifecycle:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-yaml\">\u003Cspan class=\"hljs-comment\"># .github/workflows/docs-automation.yml - Advanced documentation build and deployment pipeline\u003C/span>\n\u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Documentation\u003C/span> \u003Cspan class=\"hljs-string\">Automation\u003C/span> \u003Cspan class=\"hljs-string\">and\u003C/span> \u003Cspan class=\"hljs-string\">Deployment\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">on:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">push:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">branches:\u003C/span> [\u003Cspan class=\"hljs-string\">main\u003C/span>, \u003Cspan class=\"hljs-string\">develop\u003C/span>]\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span> \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;docs/**&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;_posts/**&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;_includes/**&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;_layouts/**&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;package.json&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;Gemfile&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">pull_request:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">branches:\u003C/span> [\u003Cspan class=\"hljs-string\">main\u003C/span>]\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;docs/**&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;_posts/**&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">schedule:\u003C/span>\n    \u003Cspan class=\"hljs-comment\"># Daily automation checks at 2 AM UTC\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">cron:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;0 2 * * *&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">workflow_dispatch:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">inputs:\u003C/span>\n      \u003Cspan class=\"hljs-attr\">deploy_environment:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">description:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;Target deployment environment&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">required:\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>\n        \u003Cspan class=\"hljs-attr\">default:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;staging&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">type:\u003C/span> \u003Cspan class=\"hljs-string\">choice\u003C/span>\n        \u003Cspan class=\"hljs-attr\">options:\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">staging\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">production\u003C/span>\n      \u003Cspan class=\"hljs-attr\">force_rebuild:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">description:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;Force complete rebuild&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">required:\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>\n        \u003Cspan class=\"hljs-attr\">default:\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>\n        \u003Cspan class=\"hljs-attr\">type:\u003C/span> \u003Cspan class=\"hljs-string\">boolean\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">env:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">NODE_VERSION:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;18.x&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">RUBY_VERSION:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;3.1&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">PYTHON_VERSION:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;3.9&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">jobs:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">validate-content:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Content\u003C/span> \u003Cspan class=\"hljs-string\">Validation\u003C/span> \u003Cspan class=\"hljs-string\">and\u003C/span> \u003Cspan class=\"hljs-string\">Quality\u003C/span> \u003Cspan class=\"hljs-string\">Checks\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">outputs:\u003C/span>\n      \u003Cspan class=\"hljs-attr\">content-changed:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">steps.changes.outputs.content\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n      \u003Cspan class=\"hljs-attr\">validation-passed:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">steps.validate.outputs.passed\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">Repository\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">fetch-depth:\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n          \u003Cspan class=\"hljs-attr\">token:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.GITHUB_TOKEN\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Detect\u003C/span> \u003Cspan class=\"hljs-string\">Content\u003C/span> \u003Cspan class=\"hljs-string\">Changes\u003C/span>\n        \u003Cspan class=\"hljs-attr\">id:\u003C/span> \u003Cspan class=\"hljs-string\">changes\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">dorny/paths-filter@v2\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">filters:\u003C/span> \u003Cspan class=\"hljs-string\">|\n            content:\n              - &#x27;docs/**/*.md&#x27;\n              - &#x27;_posts/**/*.md&#x27;\n              - &#x27;_includes/**&#x27;\n              - &#x27;_layouts/**&#x27;\n              - &#x27;_data/**&#x27;\n\u003C/span>      \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\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changes.outputs.content\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.NODE_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;npm&#x27;\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">Content\u003C/span> \u003Cspan class=\"hljs-string\">Validation\u003C/span> \u003Cspan class=\"hljs-string\">Tools\u003C/span>\n        \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changes.outputs.content\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          npm install -g markdownlint-cli2 @microsoft/markdown-linter remark-cli\n          pip install yamllint linkchecker\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Validate\u003C/span> \u003Cspan class=\"hljs-string\">Markdown\u003C/span> \u003Cspan class=\"hljs-string\">Syntax\u003C/span>\n        \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changes.outputs.content\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          markdownlint-cli2 &quot;**/*.md&quot; --config .markdownlint.json\n          remark . --use remark-lint --use remark-preset-lint-consistent\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Validate\u003C/span> \u003Cspan class=\"hljs-string\">YAML\u003C/span> \u003Cspan class=\"hljs-string\">Frontmatter\u003C/span>\n        \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changes.outputs.content\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          find . -name &quot;*.md&quot; -exec grep -l &quot;^---&quot; {} \\; | while read file; do\n            echo &quot;Validating frontmatter in $file&quot;\n            sed -n &#x27;1,/^---$/p&#x27; &quot;$file&quot; | sed &#x27;1d;$d&#x27; | yamllint -\n          done\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\">Internal\u003C/span> \u003Cspan class=\"hljs-string\">Links\u003C/span>\n        \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changes.outputs.content\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Custom script to validate internal markdown links\n          python scripts/validate-internal-links.py --directory docs --directory _posts\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Validate\u003C/span> \u003Cspan class=\"hljs-string\">Code\u003C/span> \u003Cspan class=\"hljs-string\">Blocks\u003C/span>\n        \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changes.outputs.content\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Run custom code block validation\n          node scripts/validate-code-blocks.js --path docs --path _posts\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\">Image\u003C/span> \u003Cspan class=\"hljs-string\">Assets\u003C/span>\n        \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changes.outputs.content\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Validate all referenced images exist\n          python scripts/validate-image-assets.py\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Spell\u003C/span> \u003Cspan class=\"hljs-string\">Check\u003C/span>\n        \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changes.outputs.content\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          npm install -g cspell\n          cspell &quot;**/*.md&quot; --config .cspell.json\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Content\u003C/span> \u003Cspan class=\"hljs-string\">Quality\u003C/span> \u003Cspan class=\"hljs-string\">Metrics\u003C/span>\n        \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">steps.changes.outputs.content\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">id:\u003C/span> \u003Cspan class=\"hljs-string\">validate\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Generate content quality report\n          python scripts/content-quality-metrics.py --output-format github-actions\n          echo &quot;passed=true&quot; &gt;&gt; $GITHUB_OUTPUT\n\u003C/span>\n  \u003Cspan class=\"hljs-attr\">build-documentation:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Build\u003C/span> \u003Cspan class=\"hljs-string\">Documentation\u003C/span> \u003Cspan class=\"hljs-string\">Sites\u003C/span>\n    \u003Cspan class=\"hljs-attr\">needs:\u003C/span> \u003Cspan class=\"hljs-string\">validate-content\u003C/span>\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">needs.validate-content.outputs.content-changed\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">strategy:\u003C/span>\n      \u003Cspan class=\"hljs-attr\">matrix:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">site:\u003C/span> [\u003Cspan class=\"hljs-string\">main-docs\u003C/span>, \u003Cspan class=\"hljs-string\">api-docs\u003C/span>, \u003Cspan class=\"hljs-string\">blog\u003C/span>]\n        \u003Cspan class=\"hljs-attr\">include:\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">site:\u003C/span> \u003Cspan class=\"hljs-string\">main-docs\u003C/span>\n            \u003Cspan class=\"hljs-attr\">source:\u003C/span> \u003Cspan class=\"hljs-string\">docs/\u003C/span>\n            \u003Cspan class=\"hljs-attr\">config:\u003C/span> \u003Cspan class=\"hljs-string\">_config.yml\u003C/span>\n            \u003Cspan class=\"hljs-attr\">output:\u003C/span> \u003Cspan class=\"hljs-string\">_site/\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">site:\u003C/span> \u003Cspan class=\"hljs-string\">api-docs\u003C/span>\n            \u003Cspan class=\"hljs-attr\">source:\u003C/span> \u003Cspan class=\"hljs-string\">api-docs/\u003C/span>\n            \u003Cspan class=\"hljs-attr\">config:\u003C/span> \u003Cspan class=\"hljs-string\">_config-api.yml\u003C/span>\n            \u003Cspan class=\"hljs-attr\">output:\u003C/span> \u003Cspan class=\"hljs-string\">_site-api/\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">site:\u003C/span> \u003Cspan class=\"hljs-string\">blog\u003C/span>\n            \u003Cspan class=\"hljs-attr\">source:\u003C/span> \u003Cspan class=\"hljs-string\">./\u003C/span>\n            \u003Cspan class=\"hljs-attr\">config:\u003C/span> \u003Cspan class=\"hljs-string\">_config-blog.yml\u003C/span>\n            \u003Cspan class=\"hljs-attr\">output:\u003C/span> \u003Cspan class=\"hljs-string\">_site-blog/\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">Repository\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">fetch-depth:\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Ruby\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">ruby/setup-ruby@v1\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">ruby-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.RUBY_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">bundler-cache:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">env.NODE_VERSION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;npm&#x27;\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">Dependencies\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          bundle install\n          npm ci\n\u003C/span>      \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\">Build\u003C/span> \u003Cspan class=\"hljs-string\">Environment\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Set build-specific environment variables\n          echo &quot;JEKYLL_ENV=production&quot; &gt;&gt; $GITHUB_ENV\n          echo &quot;BUILD_TIMESTAMP=$(date -u +%Y%m%d_%H%M%S)&quot; &gt;&gt; $GITHUB_ENV\n          echo &quot;COMMIT_SHA=${GITHUB_SHA:0:7}&quot; &gt;&gt; $GITHUB_ENV\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Pre-build\u003C/span> \u003Cspan class=\"hljs-string\">Asset\u003C/span> \u003Cspan class=\"hljs-string\">Processing\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Optimize images\n          npm run optimize-images\n\u003C/span>          \n          \u003Cspan class=\"hljs-comment\"># Process CSS/JS assets\u003C/span>\n          \u003Cspan class=\"hljs-string\">npm\u003C/span> \u003Cspan class=\"hljs-string\">run\u003C/span> \u003Cspan class=\"hljs-string\">build-assets\u003C/span>\n          \n          \u003Cspan class=\"hljs-comment\"># Generate sitemap data\u003C/span>\n          \u003Cspan class=\"hljs-string\">python\u003C/span> \u003Cspan class=\"hljs-string\">scripts/generate-sitemap-data.py\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Build\u003C/span> \u003Cspan class=\"hljs-string\">Jekyll\u003C/span> \u003Cspan class=\"hljs-string\">Site\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          bundle exec jekyll build \\\n            --config ${{ matrix.config }} \\\n            --source ${{ matrix.source }} \\\n            --destination ${{ matrix.output }} \\\n            --verbose \\\n            --trace\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Post-build\u003C/span> \u003Cspan class=\"hljs-string\">Optimization\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Minify HTML\n          npm run minify-html -- ${{ matrix.output }}\n\u003C/span>          \n          \u003Cspan class=\"hljs-comment\"># Optimize assets\u003C/span>\n          \u003Cspan class=\"hljs-string\">npm\u003C/span> \u003Cspan class=\"hljs-string\">run\u003C/span> \u003Cspan class=\"hljs-string\">optimize-assets\u003C/span> \u003Cspan class=\"hljs-string\">--\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">matrix.output\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \n          \u003Cspan class=\"hljs-comment\"># Generate PWA manifest and service worker\u003C/span>\n          \u003Cspan class=\"hljs-string\">python\u003C/span> \u003Cspan class=\"hljs-string\">scripts/generate-pwa-assets.py\u003C/span> \u003Cspan class=\"hljs-string\">--output\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">matrix.output\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">Build\u003C/span> \u003Cspan class=\"hljs-string\">Artifacts\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Create build information file\n          cat &gt; ${{ matrix.output }}/build-info.json &lt;&lt; EOF\n          {\n            &quot;buildTime&quot;: &quot;$(date -u +%Y-%m-%dT%H:%M:%SZ)&quot;,\n            &quot;commitSha&quot;: &quot;${{ env.COMMIT_SHA }}&quot;,\n            &quot;branch&quot;: &quot;${{ github.ref_name }}&quot;,\n            &quot;site&quot;: &quot;${{ matrix.site }}&quot;,\n            &quot;version&quot;: &quot;${{ env.BUILD_TIMESTAMP }}&quot;\n          }\n          EOF\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\">Build\u003C/span> \u003Cspan class=\"hljs-string\">Artifacts\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/upload-artifact@v3\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">matrix.site\u003C/span> \u003Cspan class=\"hljs-string\">}}-build\u003C/span>\n          \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">matrix.output\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">retention-days:\u003C/span> \u003Cspan class=\"hljs-number\">30\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Build\u003C/span> \u003Cspan class=\"hljs-string\">Performance\u003C/span> \u003Cspan class=\"hljs-string\">Metrics\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Analyze build performance\n          python scripts/analyze-build-performance.py \\\n            --site ${{ matrix.site }} \\\n            --output ${{ matrix.output }}\n\u003C/span>\n  \u003Cspan class=\"hljs-attr\">test-built-sites:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Test\u003C/span> \u003Cspan class=\"hljs-string\">Built\u003C/span> \u003Cspan class=\"hljs-string\">Documentation\u003C/span>\n    \u003Cspan class=\"hljs-attr\">needs:\u003C/span> \u003Cspan class=\"hljs-string\">build-documentation\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">strategy:\u003C/span>\n      \u003Cspan class=\"hljs-attr\">matrix:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">site:\u003C/span> [\u003Cspan class=\"hljs-string\">main-docs\u003C/span>, \u003Cspan class=\"hljs-string\">api-docs\u003C/span>, \u003Cspan class=\"hljs-string\">blog\u003C/span>]\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">Repository\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Download\u003C/span> \u003Cspan class=\"hljs-string\">Build\u003C/span> \u003Cspan class=\"hljs-string\">Artifacts\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/download-artifact@v3\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">matrix.site\u003C/span> \u003Cspan class=\"hljs-string\">}}-build\u003C/span>\n          \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">build-output/\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\">Testing\u003C/span> \u003Cspan class=\"hljs-string\">Environment\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          npm install -g lighthouse html5validator pa11y\n          pip install pytest requests beautifulsoup4\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">HTML\u003C/span> \u003Cspan class=\"hljs-string\">Validation\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Validate HTML5 compliance\n          find build-output -name &quot;*.html&quot; | head -10 | while read file; do\n            echo &quot;Validating $file&quot;\n            html5validator --root build-output &quot;$file&quot;\n          done\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Accessibility\u003C/span> \u003Cspan class=\"hljs-string\">Testing\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Test accessibility with pa11y\n          python scripts/accessibility-test.py --directory build-output\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Performance\u003C/span> \u003Cspan class=\"hljs-string\">Testing\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Start local server for testing\n          cd build-output &amp;&amp; python -m http.server 8080 &amp;\n          SERVER_PID=$!\n          sleep 5\n\u003C/span>          \n          \u003Cspan class=\"hljs-comment\"># Run Lighthouse tests\u003C/span>\n          \u003Cspan class=\"hljs-string\">lighthouse\u003C/span> \u003Cspan class=\"hljs-string\">http://localhost:8080\u003C/span> \u003Cspan class=\"hljs-string\">\\\u003C/span>\n            \u003Cspan class=\"hljs-string\">--output\u003C/span> \u003Cspan class=\"hljs-string\">json\u003C/span> \u003Cspan class=\"hljs-string\">\\\u003C/span>\n            \u003Cspan class=\"hljs-string\">--output-path\u003C/span> \u003Cspan class=\"hljs-string\">lighthouse-${{\u003C/span> \u003Cspan class=\"hljs-string\">matrix.site\u003C/span> \u003Cspan class=\"hljs-string\">}}.json\u003C/span> \u003Cspan class=\"hljs-string\">\\\u003C/span>\n            \u003Cspan class=\"hljs-string\">--chrome-flags=&quot;--headless\u003C/span> \u003Cspan class=\"hljs-string\">--no-sandbox&quot;\u003C/span>\n          \n          \u003Cspan class=\"hljs-comment\"># Cleanup\u003C/span>\n          \u003Cspan class=\"hljs-string\">kill\u003C/span> \u003Cspan class=\"hljs-string\">$SERVER_PID\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Link\u003C/span> \u003Cspan class=\"hljs-string\">Checking\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Check all links in built site\n          python scripts/check-all-links.py --directory build-output\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Content\u003C/span> \u003Cspan class=\"hljs-string\">Integrity\u003C/span> \u003Cspan class=\"hljs-string\">Tests\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Verify all expected pages exist\n          python scripts/verify-content-integrity.py \\\n            --site ${{ matrix.site }} \\\n            --directory build-output\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\">Test\u003C/span> \u003Cspan class=\"hljs-string\">Results\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/upload-artifact@v3\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">test-results-${{\u003C/span> \u003Cspan class=\"hljs-string\">matrix.site\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">|\n            lighthouse-*.json\n            accessibility-report.json\n            link-check-report.json\n\u003C/span>\n  \u003Cspan class=\"hljs-attr\">deploy-staging:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Deploy\u003C/span> \u003Cspan class=\"hljs-string\">to\u003C/span> \u003Cspan class=\"hljs-string\">Staging\u003C/span> \u003Cspan class=\"hljs-string\">Environment\u003C/span>\n    \u003Cspan class=\"hljs-attr\">needs:\u003C/span> [\u003Cspan class=\"hljs-string\">validate-content\u003C/span>, \u003Cspan class=\"hljs-string\">build-documentation\u003C/span>, \u003Cspan class=\"hljs-string\">test-built-sites\u003C/span>]\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.ref\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;refs/heads/develop&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">||\u003C/span> \u003Cspan class=\"hljs-string\">github.event.inputs.deploy_environment\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;staging&#x27;\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">environment:\u003C/span>\n      \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">staging\u003C/span>\n      \u003Cspan class=\"hljs-attr\">url:\u003C/span> \u003Cspan class=\"hljs-string\">https://staging-docs.example.com\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">Repository\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Download\u003C/span> \u003Cspan class=\"hljs-string\">All\u003C/span> \u003Cspan class=\"hljs-string\">Build\u003C/span> \u003Cspan class=\"hljs-string\">Artifacts\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/download-artifact@v3\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">artifacts/\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Prepare\u003C/span> \u003Cspan class=\"hljs-string\">Deployment\u003C/span> \u003Cspan class=\"hljs-string\">Package\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Combine all site builds into deployment package\n          mkdir -p deployment/\n          cp -r artifacts/main-docs-build/* deployment/\n          cp -r artifacts/api-docs-build/* deployment/api/\n          cp -r artifacts/blog-build/* deployment/blog/\n\u003C/span>          \n          \u003Cspan class=\"hljs-comment\"># Add deployment configuration\u003C/span>\n          \u003Cspan class=\"hljs-string\">cp\u003C/span> \u003Cspan class=\"hljs-string\">deploy/staging/*\u003C/span> \u003Cspan class=\"hljs-string\">deployment/\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Deploy\u003C/span> \u003Cspan class=\"hljs-string\">to\u003C/span> \u003Cspan class=\"hljs-string\">S3\u003C/span> \u003Cspan class=\"hljs-string\">Staging\u003C/span>\n        \u003Cspan class=\"hljs-attr\">env:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">AWS_ACCESS_KEY_ID:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.AWS_ACCESS_KEY_ID\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">AWS_SECRET_ACCESS_KEY:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.AWS_SECRET_ACCESS_KEY\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">AWS_REGION:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.AWS_REGION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Sync to S3 bucket with proper caching headers\n          aws s3 sync deployment/ s3://${{ secrets.STAGING_S3_BUCKET }} \\\n            --delete \\\n            --cache-control &quot;max-age=300&quot; \\\n            --metadata-directive REPLACE\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Invalidate\u003C/span> \u003Cspan class=\"hljs-string\">CloudFront\u003C/span> \u003Cspan class=\"hljs-string\">Cache\u003C/span>\n        \u003Cspan class=\"hljs-attr\">env:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">AWS_ACCESS_KEY_ID:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.AWS_ACCESS_KEY_ID\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">AWS_SECRET_ACCESS_KEY:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.AWS_SECRET_ACCESS_KEY\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Invalidate CloudFront distribution\n          aws cloudfront create-invalidation \\\n            --distribution-id ${{ secrets.STAGING_CLOUDFRONT_DISTRIBUTION }} \\\n            --paths &quot;/*&quot;\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Verify\u003C/span> \u003Cspan class=\"hljs-string\">Staging\u003C/span> \u003Cspan class=\"hljs-string\">Deployment\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Wait for deployment to be live and test\n          sleep 30\n          python scripts/verify-deployment.py \\\n            --url https://staging-docs.example.com \\\n            --environment staging\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Notify\u003C/span> \u003Cspan class=\"hljs-string\">Deployment\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">8398a7/action-slack@v3\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">status:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">job.status\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">channel:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;#docs-deployment&#x27;\u003C/span>\n          \u003Cspan class=\"hljs-attr\">text:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;Staging deployment completed for $\u003Cspan class=\"hljs-template-variable\">{{ github.ref_name }}\u003C/span>&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">env:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">SLACK_WEBHOOK_URL:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.SLACK_WEBHOOK\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n\n  \u003Cspan class=\"hljs-attr\">deploy-production:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Deploy\u003C/span> \u003Cspan class=\"hljs-string\">to\u003C/span> \u003Cspan class=\"hljs-string\">Production\u003C/span> \u003Cspan class=\"hljs-string\">Environment\u003C/span>\n    \u003Cspan class=\"hljs-attr\">needs:\u003C/span> [\u003Cspan class=\"hljs-string\">validate-content\u003C/span>, \u003Cspan class=\"hljs-string\">build-documentation\u003C/span>, \u003Cspan class=\"hljs-string\">test-built-sites\u003C/span>]\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.ref\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;refs/heads/main&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">||\u003C/span> \u003Cspan class=\"hljs-string\">github.event.inputs.deploy_environment\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;production&#x27;\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">environment:\u003C/span>\n      \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">production\u003C/span>\n      \u003Cspan class=\"hljs-attr\">url:\u003C/span> \u003Cspan class=\"hljs-string\">https://docs.example.com\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">Repository\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Download\u003C/span> \u003Cspan class=\"hljs-string\">All\u003C/span> \u003Cspan class=\"hljs-string\">Build\u003C/span> \u003Cspan class=\"hljs-string\">Artifacts\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/download-artifact@v3\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">artifacts/\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Prepare\u003C/span> \u003Cspan class=\"hljs-string\">Production\u003C/span> \u003Cspan class=\"hljs-string\">Package\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Create production-optimized deployment package\n          mkdir -p deployment/\n          cp -r artifacts/main-docs-build/* deployment/\n          cp -r artifacts/api-docs-build/* deployment/api/\n          cp -r artifacts/blog-build/* deployment/blog/\n\u003C/span>          \n          \u003Cspan class=\"hljs-comment\"># Add production configuration\u003C/span>\n          \u003Cspan class=\"hljs-string\">cp\u003C/span> \u003Cspan class=\"hljs-string\">deploy/production/*\u003C/span> \u003Cspan class=\"hljs-string\">deployment/\u003C/span>\n          \n          \u003Cspan class=\"hljs-comment\"># Final optimizations for production\u003C/span>\n          \u003Cspan class=\"hljs-string\">python\u003C/span> \u003Cspan class=\"hljs-string\">scripts/production-optimize.py\u003C/span> \u003Cspan class=\"hljs-string\">--directory\u003C/span> \u003Cspan class=\"hljs-string\">deployment/\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Security\u003C/span> \u003Cspan class=\"hljs-string\">Scan\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Scan for security issues in build output\n          python scripts/security-scan.py --directory deployment/\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Blue-Green\u003C/span> \u003Cspan class=\"hljs-string\">Deployment\u003C/span>\n        \u003Cspan class=\"hljs-attr\">env:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">AWS_ACCESS_KEY_ID:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.AWS_ACCESS_KEY_ID\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">AWS_SECRET_ACCESS_KEY:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.AWS_SECRET_ACCESS_KEY\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">AWS_REGION:\u003C/span> \u003Cspan class=\"hljs-string\">${{\u003C/span> \u003Cspan class=\"hljs-string\">secrets.AWS_REGION\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Deploy to blue environment first\n          aws s3 sync deployment/ s3://${{ secrets.PRODUCTION_BLUE_S3_BUCKET }} \\\n            --delete \\\n            --cache-control &quot;max-age=3600&quot;\n\u003C/span>          \n          \u003Cspan class=\"hljs-comment\"># Test blue environment\u003C/span>\n          \u003Cspan class=\"hljs-string\">python\u003C/span> \u003Cspan class=\"hljs-string\">scripts/verify-deployment.py\u003C/span> \u003Cspan class=\"hljs-string\">\\\u003C/span>\n            \u003Cspan class=\"hljs-string\">--url\u003C/span> \u003Cspan class=\"hljs-string\">https://blue-docs.example.com\u003C/span> \u003Cspan class=\"hljs-string\">\\\u003C/span>\n            \u003Cspan class=\"hljs-string\">--environment\u003C/span> \u003Cspan class=\"hljs-string\">production\u003C/span>\n          \n          \u003Cspan class=\"hljs-comment\"># Switch traffic to blue (becomes new green)\u003C/span>\n          \u003Cspan class=\"hljs-string\">python\u003C/span> \u003Cspan class=\"hljs-string\">scripts/switch-blue-green.py\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Post-deployment\u003C/span> \u003Cspan class=\"hljs-string\">Validation\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Comprehensive post-deployment checks\n          python scripts/post-deployment-validation.py \\\n            --url https://docs.example.com\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Update\u003C/span> \u003Cspan class=\"hljs-string\">Search\u003C/span> \u003Cspan class=\"hljs-string\">Index\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Update search service with new content\n          python scripts/update-search-index.py \\\n            --environment production \\\n            --api-key ${{ secrets.SEARCH_API_KEY }}\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">Deployment\u003C/span> \u003Cspan class=\"hljs-string\">Report\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Create deployment summary\n          python scripts/generate-deployment-report.py \\\n            --environment production \\\n            --commit ${{ github.sha }} \\\n            --output deployment-report.md\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Archive\u003C/span> \u003Cspan class=\"hljs-string\">Deployment\u003C/span> \u003Cspan class=\"hljs-string\">Artifacts\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/upload-artifact@v3\u003C/span>\n        \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n          \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">production-deployment-${{\u003C/span> \u003Cspan class=\"hljs-string\">github.run_id\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n          \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">|\n            deployment-report.md\n            deployment/build-info.json\n\u003C/span>\n  \u003Cspan class=\"hljs-attr\">monitor-deployment:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Post-Deployment\u003C/span> \u003Cspan class=\"hljs-string\">Monitoring\u003C/span>\n    \u003Cspan class=\"hljs-attr\">needs:\u003C/span> [\u003Cspan class=\"hljs-string\">deploy-production\u003C/span>]\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span> \u003Cspan class=\"hljs-string\">&amp;&amp;\u003C/span> \u003Cspan class=\"hljs-string\">(needs.deploy-production.result\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;success&#x27;\u003C/span>\u003Cspan class=\"hljs-string\">)\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">Repository\u003C/span>\n        \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Monitoring\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Install monitoring tools\n          pip install requests prometheus-client\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Health\u003C/span> \u003Cspan class=\"hljs-string\">Check\u003C/span> \u003Cspan class=\"hljs-string\">Monitoring\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Monitor site health for 10 minutes post-deployment\n          python scripts/post-deployment-monitoring.py \\\n            --url https://docs.example.com \\\n            --duration 600 \\\n            --metrics-endpoint ${{ secrets.METRICS_ENDPOINT }}\n\u003C/span>      \n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Performance\u003C/span> \u003Cspan class=\"hljs-string\">Baseline\u003C/span>\n        \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          # Establish new performance baseline\n          python scripts/performance-baseline.py \\\n            --url https://docs.example.com \\\n            --store-results\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch3 id=\"intelligent-content-processing-systems\">Intelligent Content Processing Systems\u003C/h3>\n\u003Cp>Advanced automation for content analysis and optimization:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// scripts/content-automation-processor.js - Automated content processing and optimization\u003C/span>\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> fs = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;fs&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">promises\u003C/span>;\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> path = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;path&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> yaml = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;js-yaml&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> sharp = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;sharp&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-title class_\">TurndownService\u003C/span> = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;turndown&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> { markdownlint } = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;markdownlint&#x27;\u003C/span>);\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">ContentAutomationProcessor\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">options = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">inputDirectories\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;docs&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;_posts&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;_includes&#x27;\u003C/span>],\n            \u003Cspan class=\"hljs-attr\">outputDirectory\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;_processed&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableImageOptimization\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableLinkValidation\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableSEOOptimization\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableContentAnalysis\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">parallelProcessing\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxConcurrency\u003C/span>: \u003Cspan class=\"hljs-number\">5\u003C/span>,\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">processingQueue\u003C/span> = [];\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">processed\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">optimizations\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">metrics\u003C/span>: {}\n        };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">processAllContent\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Starting automated content processing...&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Discover all content files\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> contentFiles = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">discoverContentFiles\u003C/span>();\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Found \u003Cspan class=\"hljs-subst\">${contentFiles.length}\u003C/span> content files to process`\u003C/span>);\n            \n            \u003Cspan class=\"hljs-comment\">// Process files in batches\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">parallelProcessing\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">processFilesBatch\u003C/span>(contentFiles);\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">processFilesSequential\u003C/span>(contentFiles);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Generate processing report\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateProcessingReport\u003C/span>();\n            \n            \u003Cspan class=\"hljs-comment\">// Optimize assets\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableImageOptimization\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">optimizeAllImages\u003C/span>();\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Validate and fix links\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableLinkValidation\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateAndFixLinks\u003C/span>();\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// SEO optimization\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableSEOOptimization\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">optimizeForSEO\u003C/span>();\n            }\n            \n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Processing completed: \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.results.processed}\u003C/span> files processed`\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>;\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Content processing failed:&#x27;\u003C/span>, error);\n            \u003Cspan class=\"hljs-keyword\">throw\u003C/span> error;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">discoverContentFiles\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> files = [];\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> directory \u003Cspan class=\"hljs-keyword\">of\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">inputDirectories\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">walkDirectory\u003C/span>(directory, files);\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">warn\u003C/span>(\u003Cspan class=\"hljs-string\">`Warning: Could not access directory \u003Cspan class=\"hljs-subst\">${directory}\u003C/span>:`\u003C/span>, error.\u003Cspan class=\"hljs-property\">message\u003C/span>);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Filter for markdown and related files\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> files.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">file\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> ext = path.\u003Cspan class=\"hljs-title function_\">extname\u003C/span>(file).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.markdown&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.html&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.yml&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.yaml&#x27;\u003C/span>].\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(ext);\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">walkDirectory\u003C/span>(\u003Cspan class=\"hljs-params\">dir, files\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> entries = \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">readdir\u003C/span>(dir, { \u003Cspan class=\"hljs-attr\">withFileTypes\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> });\n            \n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> entry \u003Cspan class=\"hljs-keyword\">of\u003C/span> entries) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> fullPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(dir, entry.\u003Cspan class=\"hljs-property\">name\u003C/span>);\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (entry.\u003Cspan class=\"hljs-title function_\">isDirectory\u003C/span>()) {\n                    \u003Cspan class=\"hljs-comment\">// Skip hidden directories and build outputs\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!entry.\u003Cspan class=\"hljs-property\">name\u003C/span>.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C/span>) &amp;&amp; \n                        ![\u003Cspan class=\"hljs-string\">&#x27;_site&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;node_modules&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;_processed&#x27;\u003C/span>].\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(entry.\u003Cspan class=\"hljs-property\">name\u003C/span>)) {\n                        \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">walkDirectory\u003C/span>(fullPath, files);\n                    }\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    files.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(fullPath);\n                }\n            }\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">warn\u003C/span>(\u003Cspan class=\"hljs-string\">`Warning: Could not read directory \u003Cspan class=\"hljs-subst\">${dir}\u003C/span>:`\u003C/span>, error.\u003Cspan class=\"hljs-property\">message\u003C/span>);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">processFilesBatch\u003C/span>(\u003Cspan class=\"hljs-params\">files\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> batches = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">createBatches\u003C/span>(files, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">maxConcurrency\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = \u003Cspan class=\"hljs-number\">0\u003C/span>; i &lt; batches.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> batch = batches[i];\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Processing batch \u003Cspan class=\"hljs-subst\">${i + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>/\u003Cspan class=\"hljs-subst\">${batches.length}\u003C/span> (\u003Cspan class=\"hljs-subst\">${batch.length}\u003C/span> files)`\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> batchPromises = batch.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">file\u003C/span> =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">processFile\u003C/span>(file));\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>.\u003Cspan class=\"hljs-title function_\">allSettled\u003C/span>(batchPromises);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">processFilesSequential\u003C/span>(\u003Cspan class=\"hljs-params\">files\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = \u003Cspan class=\"hljs-number\">0\u003C/span>; i &lt; files.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> file = files[i];\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Processing file \u003Cspan class=\"hljs-subst\">${i + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>/\u003Cspan class=\"hljs-subst\">${files.length}\u003C/span>: \u003Cspan class=\"hljs-subst\">${file}\u003C/span>`\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">processFile\u003C/span>(file);\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    file,\n                    \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;processing&#x27;\u003C/span>\n                });\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">createBatches\u003C/span>(\u003Cspan class=\"hljs-params\">items, batchSize\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> batches = [];\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = \u003Cspan class=\"hljs-number\">0\u003C/span>; i &lt; items.\u003Cspan class=\"hljs-property\">length\u003C/span>; i += batchSize) {\n            batches.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(items.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(i, i + batchSize));\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> batches;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">processFile\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> content = \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">readFile\u003C/span>(filePath, \u003Cspan class=\"hljs-string\">&#x27;utf-8&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> fileExtension = path.\u003Cspan class=\"hljs-title function_\">extname\u003C/span>(filePath).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n            \n            \u003Cspan class=\"hljs-keyword\">let\u003C/span> processedContent = content;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> fileMetadata = {\n                \u003Cspan class=\"hljs-attr\">originalSize\u003C/span>: content.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">processedSize\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">optimizations\u003C/span>: [],\n                \u003Cspan class=\"hljs-attr\">issues\u003C/span>: []\n            };\n            \n            \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (fileExtension) {\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;.markdown&#x27;\u003C/span>:\n                    processedContent = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">processMarkdownFile\u003C/span>(content, filePath, fileMetadata);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;.html&#x27;\u003C/span>:\n                    processedContent = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">processHTMLFile\u003C/span>(content, filePath, fileMetadata);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;.yml&#x27;\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;.yaml&#x27;\u003C/span>:\n                    processedContent = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">processYAMLFile\u003C/span>(content, filePath, fileMetadata);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-attr\">default\u003C/span>:\n                    \u003Cspan class=\"hljs-comment\">// No specific processing needed\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n            }\n            \n            fileMetadata.\u003Cspan class=\"hljs-property\">processedSize\u003C/span> = processedContent.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \n            \u003Cspan class=\"hljs-comment\">// Write processed file if changes were made\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (processedContent !== content) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> outputPath = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getOutputPath\u003C/span>(filePath);\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">ensureDirectoryExists\u003C/span>(path.\u003Cspan class=\"hljs-title function_\">dirname\u003C/span>(outputPath));\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">writeFile\u003C/span>(outputPath, processedContent, \u003Cspan class=\"hljs-string\">&#x27;utf-8&#x27;\u003C/span>);\n                \n                fileMetadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;content-optimized&#x27;\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">processed\u003C/span>++;\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">metrics\u003C/span>[filePath] = fileMetadata;\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">file\u003C/span>: filePath,\n                \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;processing&#x27;\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">processMarkdownFile\u003C/span>(\u003Cspan class=\"hljs-params\">content, filePath, metadata\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> processedContent = content;\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Parse frontmatter\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> { frontmatter, body } = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">parseFrontmatter\u003C/span>(content);\n            \n            \u003Cspan class=\"hljs-comment\">// Process frontmatter\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> optimizedFrontmatter = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">optimizeFrontmatter\u003C/span>(frontmatter, filePath, metadata);\n            \n            \u003Cspan class=\"hljs-comment\">// Process markdown body\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> optimizedBody = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">optimizeMarkdownBody\u003C/span>(body, filePath, metadata);\n            \n            \u003Cspan class=\"hljs-comment\">// Lint markdown\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> lintResults = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">lintMarkdown\u003C/span>(body);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (lintResults.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                metadata.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...lintResults);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Reconstruct file\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (optimizedFrontmatter || optimizedBody !== body) {\n                processedContent = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">reconstructMarkdownFile\u003C/span>(\n                    optimizedFrontmatter || frontmatter, \n                    optimizedBody\n                );\n            }\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">warn\u003C/span>(\u003Cspan class=\"hljs-string\">`Warning: Could not fully process markdown file \u003Cspan class=\"hljs-subst\">${filePath}\u003C/span>:`\u003C/span>, error.\u003Cspan class=\"hljs-property\">message\u003C/span>);\n            metadata.\u003Cspan class=\"hljs-property\">issues\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;processing-error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> processedContent;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">parseFrontmatter\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> frontmatterRegex = \u003Cspan class=\"hljs-regexp\">/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> match = content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(frontmatterRegex);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (match) {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> frontmatter = yaml.\u003Cspan class=\"hljs-title function_\">load\u003C/span>(match[\u003Cspan class=\"hljs-number\">1\u003C/span>]);\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> { frontmatter, \u003Cspan class=\"hljs-attr\">body\u003C/span>: match[\u003Cspan class=\"hljs-number\">2\u003C/span>] };\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">warn\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Warning: Could not parse frontmatter YAML:&#x27;\u003C/span>, error.\u003Cspan class=\"hljs-property\">message\u003C/span>);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">frontmatter\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-attr\">body\u003C/span>: content };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">optimizeFrontmatter\u003C/span>(\u003Cspan class=\"hljs-params\">frontmatter, filePath, metadata\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!frontmatter) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> optimized = { ...frontmatter };\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> hasChanges = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \n        \u003Cspan class=\"hljs-comment\">// Add missing required fields\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!optimized.\u003Cspan class=\"hljs-property\">title\u003C/span> &amp;&amp; path.\u003Cspan class=\"hljs-title function_\">basename\u003C/span>(filePath).\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>)) {\n            optimized.\u003Cspan class=\"hljs-property\">title\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateTitleFromFilename\u003C/span>(filePath);\n            hasChanges = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n            metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;added-title&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!optimized.\u003Cspan class=\"hljs-property\">date\u003C/span>) {\n            optimized.\u003Cspan class=\"hljs-property\">date\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractDateFromFilename\u003C/span>(filePath) || \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>().\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;T&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">0\u003C/span>];\n            hasChanges = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n            metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;added-date&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!optimized.\u003Cspan class=\"hljs-property\">description\u003C/span> &amp;&amp; optimized.\u003Cspan class=\"hljs-property\">title\u003C/span>) {\n            optimized.\u003Cspan class=\"hljs-property\">description\u003C/span> = \u003Cspan class=\"hljs-string\">`Learn about \u003Cspan class=\"hljs-subst\">${optimized.title.toLowerCase()}\u003C/span>`\u003C/span>;\n            hasChanges = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n            metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;added-description&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Optimize SEO fields\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!optimized.\u003Cspan class=\"hljs-property\">keywords\u003C/span> &amp;&amp; optimized.\u003Cspan class=\"hljs-property\">title\u003C/span>) {\n            optimized.\u003Cspan class=\"hljs-property\">keywords\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateKeywords\u003C/span>(optimized.\u003Cspan class=\"hljs-property\">title\u003C/span>);\n            hasChanges = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n            metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;added-keywords&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Ensure layout is set\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!optimized.\u003Cspan class=\"hljs-property\">layout\u003C/span>) {\n            optimized.\u003Cspan class=\"hljs-property\">layout\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">inferLayout\u003C/span>(filePath);\n            hasChanges = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n            metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;added-layout&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> hasChanges ? optimized : \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">optimizeMarkdownBody\u003C/span>(\u003Cspan class=\"hljs-params\">body, filePath, metadata\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> optimized = body;\n        \n        \u003Cspan class=\"hljs-comment\">// Fix common markdown issues\u003C/span>\n        optimized = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">fixCommonMarkdownIssues\u003C/span>(optimized, metadata);\n        \n        \u003Cspan class=\"hljs-comment\">// Optimize images\u003C/span>\n        optimized = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">optimizeMarkdownImages\u003C/span>(optimized, filePath, metadata);\n        \n        \u003Cspan class=\"hljs-comment\">// Fix links\u003C/span>\n        optimized = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">optimizeMarkdownLinks\u003C/span>(optimized, filePath, metadata);\n        \n        \u003Cspan class=\"hljs-comment\">// Improve headings structure\u003C/span>\n        optimized = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">optimizeHeadingStructure\u003C/span>(optimized, metadata);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> optimized;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">fixCommonMarkdownIssues\u003C/span>(\u003Cspan class=\"hljs-params\">content, metadata\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> fixed = content;\n        \n        \u003Cspan class=\"hljs-comment\">// Fix multiple consecutive blank lines\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> beforeBlankLines = fixed;\n        fixed = fixed.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\n\\n\\n+/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;\\n\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fixed !== beforeBlankLines) {\n            metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;fixed-blank-lines&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Fix trailing whitespace\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> beforeWhitespace = fixed;\n        fixed = fixed.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/[ \\t]+$/gm\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fixed !== beforeWhitespace) {\n            metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;removed-trailing-whitespace&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Fix inconsistent list formatting\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> beforeLists = fixed;\n        fixed = fixed.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*)-\\s+/gm\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;$1- &#x27;\u003C/span>); \u003Cspan class=\"hljs-comment\">// Ensure single space after dash\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fixed !== beforeLists) {\n            metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;fixed-list-formatting&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Fix code block language specifications\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> beforeCodeBlocks = fixed;\n        fixed = fixed.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/```(\\w+)?\\s*\\n/g\u003C/span>, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">match, lang\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!lang) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;```\\n&#x27;\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> normalizedLang = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">normalizeLanguageName\u003C/span>(lang);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> normalizedLang !== lang ? \u003Cspan class=\"hljs-string\">`\\`\\`\\`\u003Cspan class=\"hljs-subst\">${normalizedLang}\u003C/span>\\n`\u003C/span> : match;\n        });\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (fixed !== beforeCodeBlocks) {\n            metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;normalized-code-languages&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> fixed;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">optimizeMarkdownImages\u003C/span>(\u003Cspan class=\"hljs-params\">content, filePath, metadata\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> imageRegex = \u003Cspan class=\"hljs-regexp\">/!\\[(.*?)\\]\\((.*?)\\)/g\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> optimized = content;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n        \n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = imageRegex.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(content)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> [fullMatch, alt, src] = match;\n            \n            \u003Cspan class=\"hljs-comment\">// Skip external URLs\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (src.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;http://&#x27;\u003C/span>) || src.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;https://&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>;\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">let\u003C/span> optimizedMatch = fullMatch;\n            \n            \u003Cspan class=\"hljs-comment\">// Ensure alt text exists\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!alt.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> filename = path.\u003Cspan class=\"hljs-title function_\">basename\u003C/span>(src, path.\u003Cspan class=\"hljs-title function_\">extname\u003C/span>(src));\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> generatedAlt = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateImageAltText\u003C/span>(filename);\n                optimizedMatch = \u003Cspan class=\"hljs-string\">`![\u003Cspan class=\"hljs-subst\">${generatedAlt}\u003C/span>](\u003Cspan class=\"hljs-subst\">${src}\u003C/span>)`\u003C/span>;\n                metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;added-image-alt-text&#x27;\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Optimize image path\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> optimizedSrc = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">optimizeImagePath\u003C/span>(src, filePath);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (optimizedSrc !== src) {\n                optimizedMatch = optimizedMatch.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(src, optimizedSrc);\n                metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;optimized-image-path&#x27;\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (optimizedMatch !== fullMatch) {\n                optimized = optimized.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(fullMatch, optimizedMatch);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> optimized;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">optimizeMarkdownLinks\u003C/span>(\u003Cspan class=\"hljs-params\">content, filePath, metadata\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> linkRegex = \u003Cspan class=\"hljs-regexp\">/\\[(.*?)\\]\\((.*?)\\)/g\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> optimized = content;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n        \n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = linkRegex.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(content)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> [fullMatch, text, href] = match;\n            \n            \u003Cspan class=\"hljs-comment\">// Skip external URLs and anchors\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (href.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;http://&#x27;\u003C/span>) || href.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;https://&#x27;\u003C/span>) || href.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>;\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Optimize internal links\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> optimizedHref = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">optimizeInternalLink\u003C/span>(href, filePath);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (optimizedHref !== href) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> optimizedMatch = fullMatch.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(href, optimizedHref);\n                optimized = optimized.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(fullMatch, optimizedMatch);\n                metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;optimized-internal-link&#x27;\u003C/span>);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> optimized;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">optimizeHeadingStructure\u003C/span>(\u003Cspan class=\"hljs-params\">content, metadata\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        \u003Cspan class=\"hljs-keyword\">let\u003C/span> optimized = [];\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> headingLevels = [];\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> hasChanges = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = \u003Cspan class=\"hljs-number\">0\u003C/span>; i &lt; lines.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> line = lines[i];\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> headingMatch = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(#{1,6})\\s+(.+)/\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headingMatch) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> level = headingMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> title = headingMatch[\u003Cspan class=\"hljs-number\">2\u003C/span>];\n                \n                \u003Cspan class=\"hljs-comment\">// Check for heading level skipping\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headingLevels.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> lastLevel = headingLevels[headingLevels.\u003Cspan class=\"hljs-property\">length\u003C/span> - \u003Cspan class=\"hljs-number\">1\u003C/span>];\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (level &gt; lastLevel + \u003Cspan class=\"hljs-number\">1\u003C/span>) {\n                        \u003Cspan class=\"hljs-comment\">// Fix heading level skipping\u003C/span>\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> adjustedLevel = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">min\u003C/span>(level, lastLevel + \u003Cspan class=\"hljs-number\">1\u003C/span>);\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> adjustedLine = \u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>.\u003Cspan class=\"hljs-title function_\">repeat\u003C/span>(adjustedLevel) + \u003Cspan class=\"hljs-string\">&#x27; &#x27;\u003C/span> + title;\n                        optimized.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(adjustedLine);\n                        hasChanges = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                        metadata.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;fixed-heading-levels&#x27;\u003C/span>);\n                        headingLevels.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(adjustedLevel);\n                        \u003Cspan class=\"hljs-keyword\">continue\u003C/span>;\n                    }\n                }\n                \n                headingLevels.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(level);\n            }\n            \n            optimized.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(line);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (hasChanges) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> optimized.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> content;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">lintMarkdown\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">resolve\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> options = {\n                \u003Cspan class=\"hljs-attr\">strings\u003C/span>: {\n                    \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span>: content\n                },\n                \u003Cspan class=\"hljs-attr\">config\u003C/span>: {\n                    \u003Cspan class=\"hljs-string\">&#x27;default&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;MD013&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>, \u003Cspan class=\"hljs-comment\">// Line length\u003C/span>\n                    \u003Cspan class=\"hljs-string\">&#x27;MD033&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>, \u003Cspan class=\"hljs-comment\">// Allow HTML\u003C/span>\n                    \u003Cspan class=\"hljs-string\">&#x27;MD041&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span> \u003Cspan class=\"hljs-comment\">// First line doesn&#x27;t need to be h1\u003C/span>\n                }\n            };\n            \n            \u003Cspan class=\"hljs-title function_\">markdownlint\u003C/span>(options, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">err, result\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (err) {\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">warn\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Markdown lint error:&#x27;\u003C/span>, err);\n                    \u003Cspan class=\"hljs-title function_\">resolve\u003C/span>([]);\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n                }\n                \n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = result.\u003Cspan class=\"hljs-property\">content\u003C/span> || [];\n                \u003Cspan class=\"hljs-title function_\">resolve\u003C/span>(issues.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> ({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;markdown-lint&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: issue.\u003Cspan class=\"hljs-property\">lineNumber\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">rule\u003C/span>: issue.\u003Cspan class=\"hljs-property\">ruleNames\u003C/span>[\u003Cspan class=\"hljs-number\">0\u003C/span>],\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: issue.\u003Cspan class=\"hljs-property\">ruleDescription\u003C/span>\n                })));\n            });\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">reconstructMarkdownFile\u003C/span>(\u003Cspan class=\"hljs-params\">frontmatter, body\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> result = \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (frontmatter) {\n            result += \u003Cspan class=\"hljs-string\">&#x27;---\\n&#x27;\u003C/span>;\n            result += yaml.\u003Cspan class=\"hljs-title function_\">dump\u003C/span>(frontmatter);\n            result += \u003Cspan class=\"hljs-string\">&#x27;---\\n&#x27;\u003C/span>;\n        }\n        \n        result += body;\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> result;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateTitleFromFilename\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> basename = path.\u003Cspan class=\"hljs-title function_\">basename\u003C/span>(filePath, \u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-comment\">// Remove date prefix and convert dashes to spaces\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> basename\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^\\d{4}-\\d{2}-\\d{2}-/\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/-/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27; &#x27;\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\b\\w/g\u003C/span>, \u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">l\u003C/span> =&gt;\u003C/span> l.\u003Cspan class=\"hljs-title function_\">toUpperCase\u003C/span>());\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">extractDateFromFilename\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> basename = path.\u003Cspan class=\"hljs-title function_\">basename\u003C/span>(filePath);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> dateMatch = basename.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\d{4}-\\d{2}-\\d{2})/\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> dateMatch ? dateMatch[\u003Cspan class=\"hljs-number\">1\u003C/span>] : \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateKeywords\u003C/span>(\u003Cspan class=\"hljs-params\">title\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> title\n            .\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>()\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/[^\\w\\s]/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\s+/\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">word\u003C/span> =&gt;\u003C/span> word.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">2\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;, &#x27;\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">inferLayout\u003C/span>(\u003Cspan class=\"hljs-params\">filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (filePath.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;_posts&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;post&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (filePath.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;docs&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;page&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;default&#x27;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">normalizeLanguageName\u003C/span>(\u003Cspan class=\"hljs-params\">lang\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> normalizations = {\n            \u003Cspan class=\"hljs-string\">&#x27;js&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;javascript&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;ts&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;typescript&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;py&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;python&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;rb&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;ruby&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;sh&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;bash&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;shell&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;bash&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;yml&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;yaml&#x27;\u003C/span>\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> normalizations[lang.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>()] || lang.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateImageAltText\u003C/span>(\u003Cspan class=\"hljs-params\">filename\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> filename\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/[-_]/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27; &#x27;\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\b\\w/g\u003C/span>, \u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">l\u003C/span> =&gt;\u003C/span> l.\u003Cspan class=\"hljs-title function_\">toUpperCase\u003C/span>());\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">optimizeImagePath\u003C/span>(\u003Cspan class=\"hljs-params\">src, currentFilePath\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Convert relative paths to absolute paths from site root\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (src.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;./&#x27;\u003C/span>) || src.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;../&#x27;\u003C/span>)) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> currentDir = path.\u003Cspan class=\"hljs-title function_\">dirname\u003C/span>(currentFilePath);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> absolutePath = path.\u003Cspan class=\"hljs-title function_\">resolve\u003C/span>(currentDir, src);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> path.\u003Cspan class=\"hljs-title function_\">relative\u003C/span>(process.\u003Cspan class=\"hljs-title function_\">cwd\u003C/span>(), absolutePath);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> src;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">optimizeInternalLink\u003C/span>(\u003Cspan class=\"hljs-params\">href, currentFilePath\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Ensure .md files link to their HTML equivalents\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (href.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> href.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\.md$/\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.html&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> href;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getOutputPath\u003C/span>(\u003Cspan class=\"hljs-params\">inputPath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> relativePath = path.\u003Cspan class=\"hljs-title function_\">relative\u003C/span>(process.\u003Cspan class=\"hljs-title function_\">cwd\u003C/span>(), inputPath);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">outputDirectory\u003C/span>, relativePath);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">ensureDirectoryExists\u003C/span>(\u003Cspan class=\"hljs-params\">dirPath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">mkdir\u003C/span>(dirPath, { \u003Cspan class=\"hljs-attr\">recursive\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> });\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (error.\u003Cspan class=\"hljs-property\">code\u003C/span> !== \u003Cspan class=\"hljs-string\">&#x27;EEXIST&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">throw\u003C/span> error;\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">optimizeAllImages\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Optimizing images...&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> imageExtensions = [\u003Cspan class=\"hljs-string\">&#x27;.jpg&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.jpeg&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.png&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.webp&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.svg&#x27;\u003C/span>];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> imagePaths = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">findFilesByExtensions\u003C/span>(imageExtensions);\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> imagePath \u003Cspan class=\"hljs-keyword\">of\u003C/span> imagePaths) {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">optimizeImage\u003C/span>(imagePath);\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;image-optimization&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">file\u003C/span>: imagePath\n                });\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;image-optimization&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">file\u003C/span>: imagePath,\n                    \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span>\n                });\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">findFilesByExtensions\u003C/span>(\u003Cspan class=\"hljs-params\">extensions\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> files = [];\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> directory \u003Cspan class=\"hljs-keyword\">of\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">inputDirectories\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">walkDirectory\u003C/span>(directory, files);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> files.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">file\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> ext = path.\u003Cspan class=\"hljs-title function_\">extname\u003C/span>(file).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> extensions.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(ext);\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">optimizeImage\u003C/span>(\u003Cspan class=\"hljs-params\">imagePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> ext = path.\u003Cspan class=\"hljs-title function_\">extname\u003C/span>(imagePath).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n        \n        \u003Cspan class=\"hljs-comment\">// Skip SVG files (handle separately)\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (ext === \u003Cspan class=\"hljs-string\">&#x27;.svg&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> outputPath = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getOutputPath\u003C/span>(imagePath);\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">ensureDirectoryExists\u003C/span>(path.\u003Cspan class=\"hljs-title function_\">dirname\u003C/span>(outputPath));\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> image = \u003Cspan class=\"hljs-title function_\">sharp\u003C/span>(imagePath);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> metadata = \u003Cspan class=\"hljs-keyword\">await\u003C/span> image.\u003Cspan class=\"hljs-title function_\">metadata\u003C/span>();\n        \n        \u003Cspan class=\"hljs-comment\">// Optimize based on image type and size\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> optimizedImage = image;\n        \n        \u003Cspan class=\"hljs-comment\">// Resize large images\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (metadata.\u003Cspan class=\"hljs-property\">width\u003C/span> &gt; \u003Cspan class=\"hljs-number\">1920\u003C/span>) {\n            optimizedImage = optimizedImage.\u003Cspan class=\"hljs-title function_\">resize\u003C/span>(\u003Cspan class=\"hljs-number\">1920\u003C/span>, \u003Cspan class=\"hljs-literal\">null\u003C/span>, {\n                \u003Cspan class=\"hljs-attr\">withoutEnlargement\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Apply compression\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (ext) {\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;.jpg&#x27;\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;.jpeg&#x27;\u003C/span>:\n                optimizedImage = optimizedImage.\u003Cspan class=\"hljs-title function_\">jpeg\u003C/span>({ \n                    \u003Cspan class=\"hljs-attr\">quality\u003C/span>: \u003Cspan class=\"hljs-number\">85\u003C/span>, \n                    \u003Cspan class=\"hljs-attr\">progressive\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> \n                });\n                \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;.png&#x27;\u003C/span>:\n                optimizedImage = optimizedImage.\u003Cspan class=\"hljs-title function_\">png\u003C/span>({ \n                    \u003Cspan class=\"hljs-attr\">compressionLevel\u003C/span>: \u003Cspan class=\"hljs-number\">9\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">adaptiveFiltering\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n                });\n                \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;.webp&#x27;\u003C/span>:\n                optimizedImage = optimizedImage.\u003Cspan class=\"hljs-title function_\">webp\u003C/span>({ \n                    \u003Cspan class=\"hljs-attr\">quality\u003C/span>: \u003Cspan class=\"hljs-number\">85\u003C/span> \n                });\n                \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> optimizedImage.\u003Cspan class=\"hljs-title function_\">toFile\u003C/span>(outputPath);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateAndFixLinks\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Validating and fixing links...&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Implementation would include comprehensive link validation\u003C/span>\n        \u003Cspan class=\"hljs-comment\">// and automatic fixing of common link issues\u003C/span>\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">optimizeForSEO\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Optimizing for SEO...&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Implementation would include SEO optimization tasks\u003C/span>\n        \u003Cspan class=\"hljs-comment\">// like meta tag generation, structured data, etc.\u003C/span>\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">generateProcessingReport\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> report = {\n            \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>().\u003Cspan class=\"hljs-title function_\">toISOString\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">totalFiles\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">processed\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">errorsCount\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">warningsCount\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">optimizationsCount\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            },\n            \u003Cspan class=\"hljs-attr\">details\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">errors\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">errors\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">warnings\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">optimizations\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">optimizations\u003C/span>\n            },\n            \u003Cspan class=\"hljs-attr\">metrics\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">results\u003C/span>.\u003Cspan class=\"hljs-property\">metrics\u003C/span>\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> reportPath = path.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">outputDirectory\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;processing-report.json&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">ensureDirectoryExists\u003C/span>(path.\u003Cspan class=\"hljs-title function_\">dirname\u003C/span>(reportPath));\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> fs.\u003Cspan class=\"hljs-title function_\">writeFile\u003C/span>(reportPath, \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">stringify\u003C/span>(report, \u003Cspan class=\"hljs-literal\">null\u003C/span>, \u003Cspan class=\"hljs-number\">2\u003C/span>));\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Processing report generated: \u003Cspan class=\"hljs-subst\">${reportPath}\u003C/span>`\u003C/span>);\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">// Usage\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-built_in\">require\u003C/span>.\u003Cspan class=\"hljs-property\">main\u003C/span> === \u003Cspan class=\"hljs-variable language_\">module\u003C/span>) {\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> processor = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">ContentAutomationProcessor\u003C/span>({\n        \u003Cspan class=\"hljs-attr\">inputDirectories\u003C/span>: process.\u003Cspan class=\"hljs-property\">argv\u003C/span>.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">2\u003C/span>) || [\u003Cspan class=\"hljs-string\">&#x27;docs&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;_posts&#x27;\u003C/span>],\n        \u003Cspan class=\"hljs-attr\">enableImageOptimization\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">enableLinkValidation\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">enableSEOOptimization\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">parallelProcessing\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    });\n    \n    processor.\u003Cspan class=\"hljs-title function_\">processAllContent\u003C/span>()\n        .\u003Cspan class=\"hljs-title function_\">then\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">results\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Content processing completed successfully&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Processed: \u003Cspan class=\"hljs-subst\">${results.processed}\u003C/span> files`\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Errors: \u003Cspan class=\"hljs-subst\">${results.errors.length}\u003C/span>`\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Optimizations: \u003Cspan class=\"hljs-subst\">${results.optimizations.length}\u003C/span>`\u003C/span>);\n            process.\u003Cspan class=\"hljs-title function_\">exit\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>);\n        })\n        .\u003Cspan class=\"hljs-title function_\">catch\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">error\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Content processing failed:&#x27;\u003C/span>, error);\n            process.\u003Cspan class=\"hljs-title function_\">exit\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span>);\n        });\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">ContentAutomationProcessor\u003C/span>;\n\u003C/code>\u003C/pre>\u003Ch2 id=\"advanced-integration-with-documentation-systems\">Advanced Integration with Documentation Systems\u003C/h2>\n\u003Cp>Documentation automation integrates seamlessly with comprehensive content management workflows. When combined with \u003Ca href=\"/blog/markdown-automated-testing-validation-complete-guide\">automated testing and validation systems\u003C/a>, deployment pipelines ensure that all content meets quality standards before reaching production environments, creating reliable documentation that users can depend on.\u003C/p>\n\u003Cp>For sophisticated content workflows, automation systems work effectively with \u003Ca href=\"/blog/markdown-version-control-git-integration-complete-guide\">version control and Git integration\u003C/a> to create seamless publishing pipelines that automatically deploy approved changes while maintaining complete audit trails and rollback capabilities for maximum operational safety.\u003C/p>\n\u003Cp>When building enterprise-scale documentation systems, deployment automation complements \u003Ca href=\"/blog/markdown-performance-optimization-rendering-speed-guide\">performance optimization techniques\u003C/a> by implementing intelligent caching strategies, content delivery network integration, and progressive enhancement features that ensure fast, reliable access to documentation across global user bases.\u003C/p>\n\u003Ch2 id=\"continuous-integration-and-quality-assurance\">Continuous Integration and Quality Assurance\u003C/h2>\n\u003Ch3 id=\"comprehensive-testing-framework\">Comprehensive Testing Framework\u003C/h3>\n\u003Cp>Implementing automated quality assurance systems for documentation workflows:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-comment\"># scripts/documentation-testing-framework.py - Comprehensive documentation testing and validation\u003C/span>\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> os\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> sys\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> json\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> asyncio\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> aiohttp\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> subprocess\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> pathlib \u003Cspan class=\"hljs-keyword\">import\u003C/span> Path\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> typing \u003Cspan class=\"hljs-keyword\">import\u003C/span> \u003Cspan class=\"hljs-type\">Dict\u003C/span>, \u003Cspan class=\"hljs-type\">List\u003C/span>, \u003Cspan class=\"hljs-type\">Optional\u003C/span>, \u003Cspan class=\"hljs-type\">Tuple\u003C/span>\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> yaml\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> requests\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> bs4 \u003Cspan class=\"hljs-keyword\">import\u003C/span> BeautifulSoup\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> markdown\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> markdown.extensions \u003Cspan class=\"hljs-keyword\">import\u003C/span> codehilite, toc\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> pytest\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> selenium \u003Cspan class=\"hljs-keyword\">import\u003C/span> webdriver\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> selenium.webdriver.chrome.options \u003Cspan class=\"hljs-keyword\">import\u003C/span> Options\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> lighthouse \u003Cspan class=\"hljs-keyword\">import\u003C/span> LighthouseRunner\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> accessibility_checker\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> performance_analyzer\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">DocumentationTestingFramework\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">__init__\u003C/span>(\u003Cspan class=\"hljs-params\">self, config_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span> = \u003Cspan class=\"hljs-string\">&#x27;testing-config.yml&#x27;\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Initialize the testing framework with configuration.&quot;&quot;&quot;\u003C/span>\n        self.config = self.load_config(config_path)\n        self.test_results = {\n            \u003Cspan class=\"hljs-string\">&#x27;content_validation&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;link_validation&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;accessibility&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;performance&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;seo&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;security&#x27;\u003C/span>: []\n        }\n        \n        self.setup_browser()\n        \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">load_config\u003C/span>(\u003Cspan class=\"hljs-params\">self, config_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Load testing configuration from YAML file.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(config_path, \u003Cspan class=\"hljs-string\">&#x27;r&#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> FileNotFoundError:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> self.get_default_config()\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">get_default_config\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;Return default testing configuration.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;base_urls&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;staging&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;https://staging-docs.example.com&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;production&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;https://docs.example.com&#x27;\u003C/span>\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;content_directories&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;docs&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;_posts&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;_includes&#x27;\u003C/span>],\n            \u003Cspan class=\"hljs-string\">&#x27;test_pages&#x27;\u003C/span>: [\n                \u003Cspan class=\"hljs-string\">&#x27;/&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;/getting-started&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;/api/reference&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;/tutorials&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;/blog&#x27;\u003C/span>\n            ],\n            \u003Cspan class=\"hljs-string\">&#x27;accessibility&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;WCAG2AA&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;include_warnings&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;performance&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;desktop_threshold&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">90\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;mobile_threshold&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">80\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;metrics&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;performance&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;accessibility&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;best-practices&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;seo&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;link_checking&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;check_external&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;timeout&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">30\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;retry_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">3\u003C/span>\n            }\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">setup_browser\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Setup headless browser for testing.&quot;&quot;&quot;\u003C/span>\n        chrome_options = Options()\n        chrome_options.add_argument(\u003Cspan class=\"hljs-string\">&#x27;--headless&#x27;\u003C/span>)\n        chrome_options.add_argument(\u003Cspan class=\"hljs-string\">&#x27;--no-sandbox&#x27;\u003C/span>)\n        chrome_options.add_argument(\u003Cspan class=\"hljs-string\">&#x27;--disable-dev-shm-usage&#x27;\u003C/span>)\n        chrome_options.add_argument(\u003Cspan class=\"hljs-string\">&#x27;--disable-gpu&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            self.driver = webdriver.Chrome(options=chrome_options)\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 initialize Chrome driver: \u003Cspan class=\"hljs-subst\">{e}\u003C/span>&quot;\u003C/span>)\n            self.driver = \u003Cspan class=\"hljs-literal\">None\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">run_all_tests\u003C/span>(\u003Cspan class=\"hljs-params\">self, environment: \u003Cspan class=\"hljs-built_in\">str\u003C/span> = \u003Cspan class=\"hljs-string\">&#x27;staging&#x27;\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Run comprehensive test suite.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Starting comprehensive testing for \u003Cspan class=\"hljs-subst\">{environment}\u003C/span> environment...&quot;\u003C/span>)\n        \n        base_url = self.config[\u003Cspan class=\"hljs-string\">&#x27;base_urls&#x27;\u003C/span>][environment]\n        \n        \u003Cspan class=\"hljs-comment\"># Run different test categories\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.test_content_validation()\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.test_link_validation(base_url)\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.test_accessibility(base_url)\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.test_performance(base_url)\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.test_seo_optimization(base_url)\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.test_security(base_url)\n        \n        \u003Cspan class=\"hljs-comment\"># Generate comprehensive report\u003C/span>\n        test_report = self.generate_test_report(environment)\n        \n        \u003Cspan class=\"hljs-comment\"># Cleanup\u003C/span>\n        self.cleanup()\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> test_report\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">test_content_validation\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Test all content files for validity and quality.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;Running content validation tests...&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> directory \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.config[\u003Cspan class=\"hljs-string\">&#x27;content_directories&#x27;\u003C/span>]:\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> os.path.exists(directory):\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n                \n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.validate_directory_content(directory)\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_directory_content\u003C/span>(\u003Cspan class=\"hljs-params\">self, directory: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate all content in a directory.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> root, dirs, files \u003Cspan class=\"hljs-keyword\">in\u003C/span> os.walk(directory):\n            \u003Cspan class=\"hljs-comment\"># Skip hidden and build directories\u003C/span>\n            dirs[:] = [d \u003Cspan class=\"hljs-keyword\">for\u003C/span> d \u003Cspan class=\"hljs-keyword\">in\u003C/span> dirs \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> d.startswith(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">and\u003C/span> d \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;_site&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;node_modules&#x27;\u003C/span>]]\n            \n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> file \u003Cspan class=\"hljs-keyword\">in\u003C/span> files:\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> file.endswith((\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.markdown&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.html&#x27;\u003C/span>)):\n                    file_path = os.path.join(root, file)\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.validate_content_file(file_path)\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_content_file\u003C/span>(\u003Cspan class=\"hljs-params\">self, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate individual content file.&quot;&quot;&quot;\u003C/span>\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            \n            results = {\n                \u003Cspan class=\"hljs-string\">&#x27;file&#x27;\u003C/span>: file_path,\n                \u003Cspan class=\"hljs-string\">&#x27;tests&#x27;\u003C/span>: {}\n            }\n            \n            \u003Cspan class=\"hljs-comment\"># Test frontmatter if markdown\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> file_path.endswith((\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.markdown&#x27;\u003C/span>)):\n                results[\u003Cspan class=\"hljs-string\">&#x27;tests&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;frontmatter&#x27;\u003C/span>] = self.validate_frontmatter(content)\n                results[\u003Cspan class=\"hljs-string\">&#x27;tests&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;markdown&#x27;\u003C/span>] = self.validate_markdown_syntax(content)\n                results[\u003Cspan class=\"hljs-string\">&#x27;tests&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>] = self.validate_internal_links(content, file_path)\n                results[\u003Cspan class=\"hljs-string\">&#x27;tests&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;images&#x27;\u003C/span>] = self.validate_images(content, file_path)\n                results[\u003Cspan class=\"hljs-string\">&#x27;tests&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>] = self.validate_code_blocks(content)\n            \n            \u003Cspan class=\"hljs-comment\"># Test HTML structure\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> file_path.endswith(\u003Cspan class=\"hljs-string\">&#x27;.html&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">or\u003C/span> file_path.endswith((\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.markdown&#x27;\u003C/span>)):\n                html_content = self.convert_to_html(content) \u003Cspan class=\"hljs-keyword\">if\u003C/span> file_path.endswith((\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;.markdown&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">else\u003C/span> content\n                results[\u003Cspan class=\"hljs-string\">&#x27;tests&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;html&#x27;\u003C/span>] = self.validate_html_structure(html_content)\n            \n            self.test_results[\u003Cspan class=\"hljs-string\">&#x27;content_validation&#x27;\u003C/span>].append(results)\n            \n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n            self.test_results[\u003Cspan class=\"hljs-string\">&#x27;content_validation&#x27;\u003C/span>].append({\n                \u003Cspan class=\"hljs-string\">&#x27;file&#x27;\u003C/span>: file_path,\n                \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">str\u003C/span>(e),\n                \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>\n            })\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_frontmatter\u003C/span>(\u003Cspan class=\"hljs-params\">self, content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate YAML frontmatter.&quot;&quot;&quot;\u003C/span>\n        frontmatter_pattern = \u003Cspan class=\"hljs-string\">r&#x27;^---\\n(.*?)\\n---&#x27;\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n            \u003Cspan class=\"hljs-keyword\">match\u003C/span> = re.search(frontmatter_pattern, content, re.DOTALL)\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">match\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;No frontmatter found&#x27;\u003C/span>}\n            \n            frontmatter_content = \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">1\u003C/span>)\n            parsed = 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;date&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;layout&#x27;\u003C/span>]\n            missing_fields = [field \u003Cspan class=\"hljs-keyword\">for\u003C/span> field \u003Cspan class=\"hljs-keyword\">in\u003C/span> required_fields \u003Cspan class=\"hljs-keyword\">if\u003C/span> field \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> parsed]\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> missing_fields:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                    \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Missing required fields: \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-string\">&quot;, &quot;\u003C/span>.join(missing_fields)}\u003C/span>&#x27;\u003C/span>\n                }\n            \n            \u003Cspan class=\"hljs-comment\"># Check field formats\u003C/span>\n            issues = []\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> parsed:\n                \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">from\u003C/span> datetime \u003Cspan class=\"hljs-keyword\">import\u003C/span> datetime\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(parsed[\u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>], \u003Cspan class=\"hljs-built_in\">str\u003C/span>):\n                        datetime.strptime(parsed[\u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>], \u003Cspan class=\"hljs-string\">&#x27;%Y-%m-%d&#x27;\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">except\u003C/span> ValueError:\n                    issues.append(\u003Cspan class=\"hljs-string\">&#x27;Invalid date format&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> parsed \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(parsed[\u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>], \u003Cspan class=\"hljs-built_in\">str\u003C/span>):\n                issues.append(\u003Cspan class=\"hljs-string\">&#x27;Title must be a string&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> issues:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;; &#x27;\u003C/span>.join(issues)}\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;data&#x27;\u003C/span>: parsed}\n            \n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> yaml.YAMLError \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Invalid YAML: \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">str\u003C/span>(e)}\u003C/span>&#x27;\u003C/span>}\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_markdown_syntax\u003C/span>(\u003Cspan class=\"hljs-params\">self, content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate markdown syntax and structure.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-comment\"># Convert to HTML to test parsing\u003C/span>\n            md = markdown.Markdown(extensions=[\u003Cspan class=\"hljs-string\">&#x27;codehilite&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;toc&#x27;\u003C/span>])\n            html = md.convert(content)\n            \n            \u003Cspan class=\"hljs-comment\"># Check for common issues\u003C/span>\n            issues = []\n            \n            \u003Cspan class=\"hljs-comment\"># Check for heading structure\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n            headings = re.findall(\u003Cspan class=\"hljs-string\">r&#x27;^(#{1,6})\\s+(.+)$&#x27;\u003C/span>, content, re.MULTILINE)\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> headings:\n                previous_level = \u003Cspan class=\"hljs-number\">0\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> heading_match \u003Cspan class=\"hljs-keyword\">in\u003C/span> headings:\n                    level = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(heading_match[\u003Cspan class=\"hljs-number\">0\u003C/span>])\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> level &gt; previous_level + \u003Cspan class=\"hljs-number\">1\u003C/span>:\n                        issues.append(\u003Cspan class=\"hljs-string\">f&#x27;Heading level skip detected: \u003Cspan class=\"hljs-subst\">{heading_match[\u003Cspan class=\"hljs-number\">1\u003C/span>]}\u003C/span>&#x27;\u003C/span>)\n                    previous_level = level\n            \n            \u003Cspan class=\"hljs-comment\"># Check for broken markdown links\u003C/span>\n            broken_links = re.findall(\u003Cspan class=\"hljs-string\">r&#x27;\\]\\([^)]*$&#x27;\u003C/span>, content, re.MULTILINE)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> broken_links:\n                issues.append(\u003Cspan class=\"hljs-string\">f&#x27;Broken markdown links found: \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">len\u003C/span>(broken_links)}\u003C/span>&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Check for unmatched code blocks\u003C/span>\n            code_block_starts = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(re.findall(\u003Cspan class=\"hljs-string\">r&#x27;^```&#x27;\u003C/span>, content, re.MULTILINE))\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> code_block_starts % \u003Cspan class=\"hljs-number\">2\u003C/span> != \u003Cspan class=\"hljs-number\">0\u003C/span>:\n                issues.append(\u003Cspan class=\"hljs-string\">&#x27;Unmatched code block fences&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> issues:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>: issues}\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;html_length&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(html)}\n            \n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">str\u003C/span>(e)}\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_internal_links\u003C/span>(\u003Cspan class=\"hljs-params\">self, content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate internal links in content.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n        \n        \u003Cspan class=\"hljs-comment\"># Find all markdown links\u003C/span>\n        link_pattern = \u003Cspan class=\"hljs-string\">r&#x27;\\[([^\\]]+)\\]\\(([^)]+)\\)&#x27;\u003C/span>\n        links = re.findall(link_pattern, content)\n        \n        issues = []\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> link_text, link_url \u003Cspan class=\"hljs-keyword\">in\u003C/span> links:\n            \u003Cspan class=\"hljs-comment\"># Skip external links\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> link_url.startswith((\u003Cspan class=\"hljs-string\">&#x27;http://&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;https://&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;mailto:&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>)):\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Resolve relative path\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> link_url.startswith(\u003Cspan class=\"hljs-string\">&#x27;./&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">or\u003C/span> link_url.startswith(\u003Cspan class=\"hljs-string\">&#x27;../&#x27;\u003C/span>):\n                file_dir = os.path.dirname(file_path)\n                resolved_path = os.path.normpath(os.path.join(file_dir, link_url))\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                resolved_path = link_url.lstrip(\u003Cspan class=\"hljs-string\">&#x27;/&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Check if target exists\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> os.path.exists(resolved_path):\n                \u003Cspan class=\"hljs-comment\"># Try with .md extension\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> resolved_path.endswith(\u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>):\n                    md_path = resolved_path + \u003Cspan class=\"hljs-string\">&#x27;.md&#x27;\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> os.path.exists(md_path):\n                        issues.append(\u003Cspan class=\"hljs-string\">f&#x27;Broken internal link: \u003Cspan class=\"hljs-subst\">{link_url}\u003C/span>&#x27;\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                    issues.append(\u003Cspan class=\"hljs-string\">f&#x27;Broken internal link: \u003Cspan class=\"hljs-subst\">{link_url}\u003C/span>&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> issues \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;total_links&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(links),\n            \u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>: issues\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_images\u003C/span>(\u003Cspan class=\"hljs-params\">self, content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate image references and alt text.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n        \n        \u003Cspan class=\"hljs-comment\"># Find all markdown images\u003C/span>\n        image_pattern = \u003Cspan class=\"hljs-string\">r&#x27;!\\[([^\\]]*)\\]\\(([^)]+)\\)&#x27;\u003C/span>\n        images = re.findall(image_pattern, content)\n        \n        issues = []\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> alt_text, image_url \u003Cspan class=\"hljs-keyword\">in\u003C/span> images:\n            \u003Cspan class=\"hljs-comment\"># Skip external images\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> image_url.startswith((\u003Cspan class=\"hljs-string\">&#x27;http://&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;https://&#x27;\u003C/span>)):\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Check alt text\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> alt_text.strip():\n                issues.append(\u003Cspan class=\"hljs-string\">f&#x27;Missing alt text for image: \u003Cspan class=\"hljs-subst\">{image_url}\u003C/span>&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Check if image exists\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> image_url.startswith(\u003Cspan class=\"hljs-string\">&#x27;./&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">or\u003C/span> image_url.startswith(\u003Cspan class=\"hljs-string\">&#x27;../&#x27;\u003C/span>):\n                file_dir = os.path.dirname(file_path)\n                resolved_path = os.path.normpath(os.path.join(file_dir, image_url))\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                resolved_path = image_url.lstrip(\u003Cspan class=\"hljs-string\">&#x27;/&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> os.path.exists(resolved_path):\n                issues.append(\u003Cspan class=\"hljs-string\">f&#x27;Missing image file: \u003Cspan class=\"hljs-subst\">{image_url}\u003C/span>&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> issues \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;total_images&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(images),\n            \u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>: issues\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_code_blocks\u003C/span>(\u003Cspan class=\"hljs-params\">self, content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate code blocks for syntax and completeness.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n        \n        \u003Cspan class=\"hljs-comment\"># Find all fenced code blocks\u003C/span>\n        code_block_pattern = \u003Cspan class=\"hljs-string\">r&#x27;^```(\\w*)\\n(.*?)\\n```&#x27;\u003C/span>\n        code_blocks = re.findall(code_block_pattern, content, re.DOTALL | re.MULTILINE)\n        \n        issues = []\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> language, code \u003Cspan class=\"hljs-keyword\">in\u003C/span> code_blocks:\n            \u003Cspan class=\"hljs-comment\"># Check for empty code blocks\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> code.strip():\n                issues.append(\u003Cspan class=\"hljs-string\">&#x27;Empty code block found&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Basic syntax checking for common languages\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> language == \u003Cspan class=\"hljs-string\">&#x27;javascript&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">and\u003C/span> code.strip():\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> self.validate_javascript_syntax(code):\n                    issues.append(\u003Cspan class=\"hljs-string\">&#x27;JavaScript syntax error detected&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> language == \u003Cspan class=\"hljs-string\">&#x27;python&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">and\u003C/span> code.strip():\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> self.validate_python_syntax(code):\n                    issues.append(\u003Cspan class=\"hljs-string\">&#x27;Python syntax error detected&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> issues \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;total_blocks&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(code_blocks),\n            \u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>: issues\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_javascript_syntax\u003C/span>(\u003Cspan class=\"hljs-params\">self, code: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">bool\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Basic JavaScript syntax validation.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-comment\"># Use Node.js to check syntax if available\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">import\u003C/span> subprocess\n            result = subprocess.run(\n                [\u003Cspan class=\"hljs-string\">&#x27;node&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-c&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>],\n                \u003Cspan class=\"hljs-built_in\">input\u003C/span>=code,\n                text=\u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                capture_output=\u003Cspan class=\"hljs-literal\">True\u003C/span>\n            )\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> result.returncode == \u003Cspan class=\"hljs-number\">0\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> (subprocess.SubprocessError, FileNotFoundError):\n            \u003Cspan class=\"hljs-comment\"># Fallback to basic bracket matching\u003C/span>\n            brackets = {\u003Cspan class=\"hljs-string\">&#x27;(&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;)&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;[&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;]&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;{&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;}&#x27;\u003C/span>}\n            stack = []\n            \n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> char \u003Cspan class=\"hljs-keyword\">in\u003C/span> code:\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> char \u003Cspan class=\"hljs-keyword\">in\u003C/span> brackets:\n                    stack.append(brackets[char])\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> char \u003Cspan class=\"hljs-keyword\">in\u003C/span> brackets.values():\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> stack \u003Cspan class=\"hljs-keyword\">or\u003C/span> stack.pop() != char:\n                        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">False\u003C/span>\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(stack) == \u003Cspan class=\"hljs-number\">0\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_python_syntax\u003C/span>(\u003Cspan class=\"hljs-params\">self, code: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">bool\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Basic Python syntax validation.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">import\u003C/span> ast\n            ast.parse(code)\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">True\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> SyntaxError:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">False\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_html_structure\u003C/span>(\u003Cspan class=\"hljs-params\">self, html_content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate HTML structure and accessibility.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            soup = BeautifulSoup(html_content, \u003Cspan class=\"hljs-string\">&#x27;html.parser&#x27;\u003C/span>)\n            issues = []\n            \n            \u003Cspan class=\"hljs-comment\"># Check for basic structure issues\u003C/span>\n            imgs = soup.find_all(\u003Cspan class=\"hljs-string\">&#x27;img&#x27;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> img \u003Cspan class=\"hljs-keyword\">in\u003C/span> imgs:\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> img.get(\u003Cspan class=\"hljs-string\">&#x27;alt&#x27;\u003C/span>):\n                    issues.append(\u003Cspan class=\"hljs-string\">&#x27;Image missing alt attribute&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Check for proper heading hierarchy\u003C/span>\n            headings = soup.find_all([\u003Cspan class=\"hljs-string\">&#x27;h1&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;h2&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;h3&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;h4&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;h5&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;h6&#x27;\u003C/span>])\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> headings:\n                previous_level = \u003Cspan class=\"hljs-number\">0\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> heading \u003Cspan class=\"hljs-keyword\">in\u003C/span> headings:\n                    level = \u003Cspan class=\"hljs-built_in\">int\u003C/span>(heading.name[\u003Cspan class=\"hljs-number\">1\u003C/span>])\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> level &gt; previous_level + \u003Cspan class=\"hljs-number\">1\u003C/span>:\n                        issues.append(\u003Cspan class=\"hljs-string\">f&#x27;Heading hierarchy skip: \u003Cspan class=\"hljs-subst\">{heading.get_text()[:\u003Cspan class=\"hljs-number\">50\u003C/span>]}\u003C/span>...&#x27;\u003C/span>)\n                    previous_level = level\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> issues \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>: issues\n            }\n            \n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">str\u003C/span>(e)}\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">convert_to_html\u003C/span>(\u003Cspan class=\"hljs-params\">self, markdown_content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Convert markdown content to HTML.&quot;&quot;&quot;\u003C/span>\n        md = markdown.Markdown(extensions=[\u003Cspan class=\"hljs-string\">&#x27;codehilite&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;toc&#x27;\u003C/span>])\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> md.convert(markdown_content)\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">test_link_validation\u003C/span>(\u003Cspan class=\"hljs-params\">self, base_url: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Test all links on the website.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;Running link validation tests...&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">with\u003C/span> aiohttp.ClientSession() \u003Cspan class=\"hljs-keyword\">as\u003C/span> session:\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> test_page \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.config[\u003Cspan class=\"hljs-string\">&#x27;test_pages&#x27;\u003C/span>]:\n                url = \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{base_url.rstrip(\u003Cspan class=\"hljs-string\">&#x27;/&#x27;\u003C/span>)}\u003C/span>\u003Cspan class=\"hljs-subst\">{test_page}\u003C/span>&quot;\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.validate_page_links(session, url)\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">validate_page_links\u003C/span>(\u003Cspan class=\"hljs-params\">self, session: aiohttp.ClientSession, url: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Validate all links on a specific page.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">with\u003C/span> session.get(url) \u003Cspan class=\"hljs-keyword\">as\u003C/span> response:\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> response.status != \u003Cspan class=\"hljs-number\">200\u003C/span>:\n                    self.test_results[\u003Cspan class=\"hljs-string\">&#x27;link_validation&#x27;\u003C/span>].append({\n                        \u003Cspan class=\"hljs-string\">&#x27;page&#x27;\u003C/span>: url,\n                        \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Page returned \u003Cspan class=\"hljs-subst\">{response.status}\u003C/span>&#x27;\u003C/span>\n                    })\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span>\n                \n                html = \u003Cspan class=\"hljs-keyword\">await\u003C/span> response.text()\n                soup = BeautifulSoup(html, \u003Cspan class=\"hljs-string\">&#x27;html.parser&#x27;\u003C/span>)\n                \n                \u003Cspan class=\"hljs-comment\"># Find all links\u003C/span>\n                links = soup.find_all(\u003Cspan class=\"hljs-string\">&#x27;a&#x27;\u003C/span>, href=\u003Cspan class=\"hljs-literal\">True\u003C/span>)\n                broken_links = []\n                \n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> link \u003Cspan class=\"hljs-keyword\">in\u003C/span> links:\n                    href = link[\u003Cspan class=\"hljs-string\">&#x27;href&#x27;\u003C/span>]\n                    \n                    \u003Cspan class=\"hljs-comment\"># Skip anchors\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> href.startswith(\u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>):\n                        \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n                    \n                    \u003Cspan class=\"hljs-comment\"># Check internal links\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> href.startswith(\u003Cspan class=\"hljs-string\">&#x27;/&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">or\u003C/span> href.startswith(url):\n                        link_url = href \u003Cspan class=\"hljs-keyword\">if\u003C/span> href.startswith(\u003Cspan class=\"hljs-string\">&#x27;http&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{url.split(\u003Cspan class=\"hljs-string\">&#x27;/&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">0\u003C/span>]}\u003C/span>//\u003Cspan class=\"hljs-subst\">{url.split(\u003Cspan class=\"hljs-string\">&#x27;/&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">2\u003C/span>]}\u003C/span>\u003Cspan class=\"hljs-subst\">{href}\u003C/span>&quot;\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                        link_url = href\n                    \n                    \u003Cspan class=\"hljs-comment\"># Validate link\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.check_link(session, link_url):\n                        broken_links.append(href)\n                \n                self.test_results[\u003Cspan class=\"hljs-string\">&#x27;link_validation&#x27;\u003C/span>].append({\n                    \u003Cspan class=\"hljs-string\">&#x27;page&#x27;\u003C/span>: url,\n                    \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> broken_links \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;total_links&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(links),\n                    \u003Cspan class=\"hljs-string\">&#x27;broken_links&#x27;\u003C/span>: broken_links\n                })\n                \n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n            self.test_results[\u003Cspan class=\"hljs-string\">&#x27;link_validation&#x27;\u003C/span>].append({\n                \u003Cspan class=\"hljs-string\">&#x27;page&#x27;\u003C/span>: url,\n                \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">str\u003C/span>(e)\n            })\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_link\u003C/span>(\u003Cspan class=\"hljs-params\">self, session: aiohttp.ClientSession, url: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">bool\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check if a link is accessible.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">with\u003C/span> session.head(url, timeout=\u003Cspan class=\"hljs-number\">10\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> response:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> response.status &lt; \u003Cspan class=\"hljs-number\">400\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">except\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">with\u003C/span> session.get(url, timeout=\u003Cspan class=\"hljs-number\">10\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> response:\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span> response.status &lt; \u003Cspan class=\"hljs-number\">400\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">except\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">False\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">test_accessibility\u003C/span>(\u003Cspan class=\"hljs-params\">self, base_url: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Test accessibility compliance.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;Running accessibility tests...&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> self.driver:\n            \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;Skipping accessibility tests - no browser driver available&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> test_page \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.config[\u003Cspan class=\"hljs-string\">&#x27;test_pages&#x27;\u003C/span>]:\n            url = \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{base_url.rstrip(\u003Cspan class=\"hljs-string\">&#x27;/&#x27;\u003C/span>)}\u003C/span>\u003Cspan class=\"hljs-subst\">{test_page}\u003C/span>&quot;\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.test_page_accessibility(url)\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">test_page_accessibility\u003C/span>(\u003Cspan class=\"hljs-params\">self, url: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Test accessibility for a specific page.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            self.driver.get(url)\n            \n            \u003Cspan class=\"hljs-comment\"># Use axe-core for accessibility testing\u003C/span>\n            \u003Cspan class=\"hljs-comment\"># This would require additional setup and axe-core integration\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Placeholder for accessibility test results\u003C/span>\n            accessibility_result = {\n                \u003Cspan class=\"hljs-string\">&#x27;page&#x27;\u003C/span>: url,\n                \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;violations&#x27;\u003C/span>: [],\n                \u003Cspan class=\"hljs-string\">&#x27;warnings&#x27;\u003C/span>: []\n            }\n            \n            self.test_results[\u003Cspan class=\"hljs-string\">&#x27;accessibility&#x27;\u003C/span>].append(accessibility_result)\n            \n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n            self.test_results[\u003Cspan class=\"hljs-string\">&#x27;accessibility&#x27;\u003C/span>].append({\n                \u003Cspan class=\"hljs-string\">&#x27;page&#x27;\u003C/span>: url,\n                \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">str\u003C/span>(e)\n            })\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">test_performance\u003C/span>(\u003Cspan class=\"hljs-params\">self, base_url: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Test performance metrics using Lighthouse.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;Running performance tests...&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> test_page \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.config[\u003Cspan class=\"hljs-string\">&#x27;test_pages&#x27;\u003C/span>]:\n            url = \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{base_url.rstrip(\u003Cspan class=\"hljs-string\">&#x27;/&#x27;\u003C/span>)}\u003C/span>\u003Cspan class=\"hljs-subst\">{test_page}\u003C/span>&quot;\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.test_page_performance(url)\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">test_page_performance\u003C/span>(\u003Cspan class=\"hljs-params\">self, url: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Test performance for a specific page.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-comment\"># Placeholder for Lighthouse integration\u003C/span>\n            \u003Cspan class=\"hljs-comment\"># This would require proper Lighthouse setup\u003C/span>\n            \n            performance_result = {\n                \u003Cspan class=\"hljs-string\">&#x27;page&#x27;\u003C/span>: url,\n                \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;metrics&#x27;\u003C/span>: {\n                    \u003Cspan class=\"hljs-string\">&#x27;performance&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">95\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;accessibility&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">90\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;best_practices&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">88\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;seo&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">92\u003C/span>\n                }\n            }\n            \n            self.test_results[\u003Cspan class=\"hljs-string\">&#x27;performance&#x27;\u003C/span>].append(performance_result)\n            \n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n            self.test_results[\u003Cspan class=\"hljs-string\">&#x27;performance&#x27;\u003C/span>].append({\n                \u003Cspan class=\"hljs-string\">&#x27;page&#x27;\u003C/span>: url,\n                \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">str\u003C/span>(e)\n            })\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">test_seo_optimization\u003C/span>(\u003Cspan class=\"hljs-params\">self, base_url: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Test SEO optimization.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;Running SEO tests...&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> test_page \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.config[\u003Cspan class=\"hljs-string\">&#x27;test_pages&#x27;\u003C/span>]:\n            url = \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{base_url.rstrip(\u003Cspan class=\"hljs-string\">&#x27;/&#x27;\u003C/span>)}\u003C/span>\u003Cspan class=\"hljs-subst\">{test_page}\u003C/span>&quot;\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> self.test_page_seo(url)\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">test_page_seo\u003C/span>(\u003Cspan class=\"hljs-params\">self, url: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Test SEO for a specific page.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">with\u003C/span> aiohttp.ClientSession() \u003Cspan class=\"hljs-keyword\">as\u003C/span> session:\n                \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">with\u003C/span> session.get(url) \u003Cspan class=\"hljs-keyword\">as\u003C/span> response:\n                    html = \u003Cspan class=\"hljs-keyword\">await\u003C/span> response.text()\n                    soup = BeautifulSoup(html, \u003Cspan class=\"hljs-string\">&#x27;html.parser&#x27;\u003C/span>)\n                    \n                    issues = []\n                    \n                    \u003Cspan class=\"hljs-comment\"># Check meta tags\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> soup.find(\u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>):\n                        issues.append(\u003Cspan class=\"hljs-string\">&#x27;Missing title tag&#x27;\u003C/span>)\n                    \n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> soup.find(\u003Cspan class=\"hljs-string\">&#x27;meta&#x27;\u003C/span>, attrs={\u003Cspan class=\"hljs-string\">&#x27;name&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>}):\n                        issues.append(\u003Cspan class=\"hljs-string\">&#x27;Missing meta description&#x27;\u003C/span>)\n                    \n                    \u003Cspan class=\"hljs-comment\"># Check headings\u003C/span>\n                    h1_tags = soup.find_all(\u003Cspan class=\"hljs-string\">&#x27;h1&#x27;\u003C/span>)\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(h1_tags) == \u003Cspan class=\"hljs-number\">0\u003C/span>:\n                        issues.append(\u003Cspan class=\"hljs-string\">&#x27;No H1 tag found&#x27;\u003C/span>)\n                    \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(h1_tags) &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>:\n                        issues.append(\u003Cspan class=\"hljs-string\">&#x27;Multiple H1 tags found&#x27;\u003C/span>)\n                    \n                    self.test_results[\u003Cspan class=\"hljs-string\">&#x27;seo&#x27;\u003C/span>].append({\n                        \u003Cspan class=\"hljs-string\">&#x27;page&#x27;\u003C/span>: url,\n                        \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> issues \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>: issues\n                    })\n                    \n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n            self.test_results[\u003Cspan class=\"hljs-string\">&#x27;seo&#x27;\u003C/span>].append({\n                \u003Cspan class=\"hljs-string\">&#x27;page&#x27;\u003C/span>: url,\n                \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">str\u003C/span>(e)\n            })\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">test_security\u003C/span>(\u003Cspan class=\"hljs-params\">self, base_url: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Test security headers and configurations.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;Running security tests...&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">with\u003C/span> aiohttp.ClientSession() \u003Cspan class=\"hljs-keyword\">as\u003C/span> session:\n            \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">with\u003C/span> session.get(base_url) \u003Cspan class=\"hljs-keyword\">as\u003C/span> response:\n                headers = response.headers\n                issues = []\n                \n                \u003Cspan class=\"hljs-comment\"># Check security headers\u003C/span>\n                security_headers = [\n                    \u003Cspan class=\"hljs-string\">&#x27;X-Content-Type-Options&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;X-Frame-Options&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;X-XSS-Protection&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;Strict-Transport-Security&#x27;\u003C/span>\n                ]\n                \n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> header \u003Cspan class=\"hljs-keyword\">in\u003C/span> security_headers:\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> header \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> headers:\n                        issues.append(\u003Cspan class=\"hljs-string\">f&#x27;Missing security header: \u003Cspan class=\"hljs-subst\">{header}\u003C/span>&#x27;\u003C/span>)\n                \n                self.test_results[\u003Cspan class=\"hljs-string\">&#x27;security&#x27;\u003C/span>].append({\n                    \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> issues \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;passed&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;issues&#x27;\u003C/span>: issues\n                })\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_test_report\u003C/span>(\u003Cspan class=\"hljs-params\">self, environment: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Generate comprehensive test report.&quot;&quot;&quot;\u003C/span>\n        total_tests = \u003Cspan class=\"hljs-built_in\">sum\u003C/span>(\u003Cspan class=\"hljs-built_in\">len\u003C/span>(results) \u003Cspan class=\"hljs-keyword\">for\u003C/span> results \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.test_results.values())\n        failed_tests = \u003Cspan class=\"hljs-built_in\">sum\u003C/span>(\n            \u003Cspan class=\"hljs-built_in\">len\u003C/span>([r \u003Cspan class=\"hljs-keyword\">for\u003C/span> r \u003Cspan class=\"hljs-keyword\">in\u003C/span> results \u003Cspan class=\"hljs-keyword\">if\u003C/span> r.get(\u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>) == \u003Cspan class=\"hljs-string\">&#x27;failed&#x27;\u003C/span>])\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> results \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.test_results.values()\n        )\n        \n        report = {\n            \u003Cspan class=\"hljs-string\">&#x27;timestamp&#x27;\u003C/span>: asyncio.get_event_loop().time(),\n            \u003Cspan class=\"hljs-string\">&#x27;environment&#x27;\u003C/span>: environment,\n            \u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;total_tests&#x27;\u003C/span>: total_tests,\n                \u003Cspan class=\"hljs-string\">&#x27;passed_tests&#x27;\u003C/span>: total_tests - failed_tests,\n                \u003Cspan class=\"hljs-string\">&#x27;failed_tests&#x27;\u003C/span>: failed_tests,\n                \u003Cspan class=\"hljs-string\">&#x27;success_rate&#x27;\u003C/span>: ((total_tests - failed_tests) / total_tests * \u003Cspan class=\"hljs-number\">100\u003C/span>) \u003Cspan class=\"hljs-keyword\">if\u003C/span> total_tests &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;results&#x27;\u003C/span>: self.test_results\n        }\n        \n        \u003Cspan class=\"hljs-comment\"># Save report to file\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(\u003Cspan class=\"hljs-string\">f&#x27;test-report-\u003Cspan class=\"hljs-subst\">{environment}\u003C/span>.json&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;w&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n            json.dump(report, f, indent=\u003Cspan class=\"hljs-number\">2\u003C/span>, default=\u003Cspan class=\"hljs-built_in\">str\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> report\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">cleanup\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Clean up resources.&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.driver:\n            self.driver.quit()\n\n\u003Cspan class=\"hljs-comment\"># Usage\u003C/span>\n\u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">main\u003C/span>():\n    framework = DocumentationTestingFramework()\n    \n    environment = sys.argv[\u003Cspan class=\"hljs-number\">1\u003C/span>] \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(sys.argv) &gt; \u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;staging&#x27;\u003C/span>\n    results = \u003Cspan class=\"hljs-keyword\">await\u003C/span> framework.run_all_tests(environment)\n    \n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Testing completed for \u003Cspan class=\"hljs-subst\">{environment}\u003C/span>&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Success rate: \u003Cspan class=\"hljs-subst\">{results[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;success_rate&#x27;\u003C/span>]:\u003Cspan class=\"hljs-number\">.1\u003C/span>f}\u003C/span>%&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Total tests: \u003Cspan class=\"hljs-subst\">{results[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;total_tests&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Failed tests: \u003Cspan class=\"hljs-subst\">{results[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;failed_tests&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n    \n    \u003Cspan class=\"hljs-comment\"># Exit with error code if tests failed\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> results[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;failed_tests&#x27;\u003C/span>] &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>:\n        sys.exit(\u003Cspan class=\"hljs-number\">1\u003C/span>)\n\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> __name__ == \u003Cspan class=\"hljs-string\">&#x27;__main__&#x27;\u003C/span>:\n    asyncio.run(main())\n\u003C/code>\u003C/pre>\u003Ch2 id=\"deployment-strategy-and-environment-management\">Deployment Strategy and Environment Management\u003C/h2>\n\u003Ch3 id=\"multi-environment-deployment-pipeline\">Multi-Environment Deployment Pipeline\u003C/h3>\n\u003Cp>Creating sophisticated deployment strategies for different environments:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-terraform\"># infrastructure/documentation-deployment.tf - Infrastructure as Code for documentation deployment\nterraform {\n  required_version = &quot;&gt;= 1.0&quot;\n  required_providers {\n    aws = {\n      source  = &quot;hashicorp/aws&quot;\n      version = &quot;~&gt; 5.0&quot;\n    }\n    cloudflare = {\n      source  = &quot;cloudflare/cloudflare&quot;\n      version = &quot;~&gt; 4.0&quot;\n    }\n  }\n}\n\n# Variables for environment configuration\nvariable &quot;environment&quot; {\n  description = &quot;Deployment environment (staging/production)&quot;\n  type        = string\n  validation {\n    condition     = contains([&quot;staging&quot;, &quot;production&quot;], var.environment)\n    error_message = &quot;Environment must be staging or production.&quot;\n  }\n}\n\nvariable &quot;domain_name&quot; {\n  description = &quot;Domain name for the documentation site&quot;\n  type        = string\n}\n\nvariable &quot;subdomain&quot; {\n  description = &quot;Subdomain prefix (e.g., docs, staging-docs)&quot;\n  type        = string\n}\n\n# S3 Buckets for static site hosting\nresource &quot;aws_s3_bucket&quot; &quot;docs_primary&quot; {\n  bucket = &quot;${var.subdomain}-${var.domain_name}-${var.environment}&quot;\n  \n  tags = {\n    Name        = &quot;Documentation Site ${title(var.environment)}&quot;\n    Environment = var.environment\n    Purpose     = &quot;static-site-hosting&quot;\n  }\n}\n\nresource &quot;aws_s3_bucket&quot; &quot;docs_backup&quot; {\n  bucket = &quot;${var.subdomain}-${var.domain_name}-${var.environment}-backup&quot;\n  \n  tags = {\n    Name        = &quot;Documentation Backup ${title(var.environment)}&quot;\n    Environment = var.environment\n    Purpose     = &quot;backup-hosting&quot;\n  }\n}\n\n# S3 bucket configuration for static website hosting\nresource &quot;aws_s3_bucket_website_configuration&quot; &quot;docs_primary&quot; {\n  bucket = aws_s3_bucket.docs_primary.id\n\n  index_document {\n    suffix = &quot;index.html&quot;\n  }\n\n  error_document {\n    key = &quot;404.html&quot;\n  }\n\n  routing_rule {\n    condition {\n      key_prefix_equals = &quot;docs/&quot;\n    }\n    redirect {\n      replace_key_prefix_with = &quot;documentation/&quot;\n    }\n  }\n}\n\n# S3 bucket public access configuration\nresource &quot;aws_s3_bucket_public_access_block&quot; &quot;docs_primary&quot; {\n  bucket = aws_s3_bucket.docs_primary.id\n\n  block_public_acls       = false\n  block_public_policy     = false\n  ignore_public_acls      = false\n  restrict_public_buckets = false\n}\n\n# S3 bucket policy for public read access\nresource &quot;aws_s3_bucket_policy&quot; &quot;docs_primary&quot; {\n  bucket = aws_s3_bucket.docs_primary.id\n\n  policy = jsonencode({\n    Version = &quot;2012-10-17&quot;\n    Statement = [\n      {\n        Sid       = &quot;PublicReadGetObject&quot;\n        Effect    = &quot;Allow&quot;\n        Principal = &quot;*&quot;\n        Action    = &quot;s3:GetObject&quot;\n        Resource  = &quot;${aws_s3_bucket.docs_primary.arn}/*&quot;\n      },\n    ]\n  })\n\n  depends_on = [aws_s3_bucket_public_access_block.docs_primary]\n}\n\n# S3 bucket versioning\nresource &quot;aws_s3_bucket_versioning&quot; &quot;docs_primary&quot; {\n  bucket = aws_s3_bucket.docs_primary.id\n  versioning_configuration {\n    status = &quot;Enabled&quot;\n  }\n}\n\n# S3 bucket lifecycle configuration\nresource &quot;aws_s3_bucket_lifecycle_configuration&quot; &quot;docs_primary&quot; {\n  bucket = aws_s3_bucket.docs_primary.id\n\n  rule {\n    id     = &quot;cleanup_old_versions&quot;\n    status = &quot;Enabled&quot;\n\n    noncurrent_version_expiration {\n      noncurrent_days = var.environment == &quot;production&quot; ? 90 : 30\n    }\n\n    abort_incomplete_multipart_upload {\n      days_after_initiation = 7\n    }\n  }\n}\n\n# CloudFront distribution for CDN\nresource &quot;aws_cloudfront_distribution&quot; &quot;docs_distribution&quot; {\n  origin {\n    domain_name = aws_s3_bucket_website_configuration.docs_primary.website_endpoint\n    origin_id   = &quot;S3-${aws_s3_bucket.docs_primary.bucket}&quot;\n\n    custom_origin_config {\n      http_port              = 80\n      https_port             = 443\n      origin_protocol_policy = &quot;http-only&quot;\n      origin_ssl_protocols   = [&quot;TLSv1.2&quot;]\n    }\n  }\n\n  enabled             = true\n  is_ipv6_enabled     = true\n  comment             = &quot;Documentation site CDN for ${var.environment}&quot;\n  default_root_object = &quot;index.html&quot;\n\n  aliases = [\n    &quot;${var.subdomain}.${var.domain_name}&quot;\n  ]\n\n  default_cache_behavior {\n    allowed_methods        = [&quot;DELETE&quot;, &quot;GET&quot;, &quot;HEAD&quot;, &quot;OPTIONS&quot;, &quot;PATCH&quot;, &quot;POST&quot;, &quot;PUT&quot;]\n    cached_methods         = [&quot;GET&quot;, &quot;HEAD&quot;]\n    target_origin_id       = &quot;S3-${aws_s3_bucket.docs_primary.bucket}&quot;\n    compress               = true\n    viewer_protocol_policy = &quot;redirect-to-https&quot;\n\n    forwarded_values {\n      query_string = false\n      cookies {\n        forward = &quot;none&quot;\n      }\n    }\n\n    min_ttl     = 0\n    default_ttl = var.environment == &quot;production&quot; ? 3600 : 300\n    max_ttl     = var.environment == &quot;production&quot; ? 86400 : 1800\n  }\n\n  # Cache behavior for static assets\n  ordered_cache_behavior {\n    path_pattern           = &quot;/assets/*&quot;\n    allowed_methods        = [&quot;GET&quot;, &quot;HEAD&quot;, &quot;OPTIONS&quot;]\n    cached_methods         = [&quot;GET&quot;, &quot;HEAD&quot;]\n    target_origin_id       = &quot;S3-${aws_s3_bucket.docs_primary.bucket}&quot;\n    compress               = true\n    viewer_protocol_policy = &quot;redirect-to-https&quot;\n\n    forwarded_values {\n      query_string = false\n      cookies {\n        forward = &quot;none&quot;\n      }\n      headers = [&quot;Origin&quot;]\n    }\n\n    min_ttl     = 0\n    default_ttl = 86400  # 1 day\n    max_ttl     = 31536000  # 1 year\n  }\n\n  # Cache behavior for API documentation\n  ordered_cache_behavior {\n    path_pattern           = &quot;/api/*&quot;\n    allowed_methods        = [&quot;GET&quot;, &quot;HEAD&quot;, &quot;OPTIONS&quot;]\n    cached_methods         = [&quot;GET&quot;, &quot;HEAD&quot;]\n    target_origin_id       = &quot;S3-${aws_s3_bucket.docs_primary.bucket}&quot;\n    compress               = true\n    viewer_protocol_policy = &quot;redirect-to-https&quot;\n\n    forwarded_values {\n      query_string = true\n      cookies {\n        forward = &quot;none&quot;\n      }\n    }\n\n    min_ttl     = 0\n    default_ttl = var.environment == &quot;production&quot; ? 1800 : 300\n    max_ttl     = var.environment == &quot;production&quot; ? 7200 : 1800\n  }\n\n  price_class = var.environment == &quot;production&quot; ? &quot;PriceClass_All&quot; : &quot;PriceClass_100&quot;\n\n  restrictions {\n    geo_restriction {\n      restriction_type = &quot;none&quot;\n    }\n  }\n\n  viewer_certificate {\n    acm_certificate_arn      = aws_acm_certificate_validation.cert.certificate_arn\n    ssl_support_method       = &quot;sni-only&quot;\n    minimum_protocol_version = &quot;TLSv1.2_2021&quot;\n  }\n\n  # Custom error responses\n  custom_error_response {\n    error_caching_min_ttl = 300\n    error_code            = 404\n    response_code         = 404\n    response_page_path    = &quot;/404.html&quot;\n  }\n\n  custom_error_response {\n    error_caching_min_ttl = 300\n    error_code            = 403\n    response_code         = 404\n    response_page_path    = &quot;/404.html&quot;\n  }\n\n  tags = {\n    Environment = var.environment\n    Purpose     = &quot;documentation-cdn&quot;\n  }\n}\n\n# ACM Certificate for HTTPS\nresource &quot;aws_acm_certificate&quot; &quot;cert&quot; {\n  provider          = aws.us_east_1\n  domain_name       = &quot;${var.subdomain}.${var.domain_name}&quot;\n  validation_method = &quot;DNS&quot;\n\n  lifecycle {\n    create_before_destroy = true\n  }\n\n  tags = {\n    Name        = &quot;Documentation SSL Certificate&quot;\n    Environment = var.environment\n  }\n}\n\n# Route 53 DNS configuration\ndata &quot;aws_route53_zone&quot; &quot;main&quot; {\n  name         = var.domain_name\n  private_zone = false\n}\n\nresource &quot;aws_route53_record&quot; &quot;cert_validation&quot; {\n  for_each = {\n    for dvo in aws_acm_certificate.cert.domain_validation_options : dvo.domain_name =&gt; {\n      name   = dvo.resource_record_name\n      record = dvo.resource_record_value\n      type   = dvo.resource_record_type\n    }\n  }\n\n  allow_overwrite = true\n  name            = each.value.name\n  records         = [each.value.record]\n  ttl             = 60\n  type            = each.value.type\n  zone_id         = data.aws_route53_zone.main.zone_id\n}\n\nresource &quot;aws_acm_certificate_validation&quot; &quot;cert&quot; {\n  provider                = aws.us_east_1\n  certificate_arn         = aws_acm_certificate.cert.arn\n  validation_record_fqdns = [for record in aws_route53_record.cert_validation : record.fqdn]\n}\n\n# DNS record for the documentation site\nresource &quot;aws_route53_record&quot; &quot;docs&quot; {\n  zone_id = data.aws_route53_zone.main.zone_id\n  name    = var.subdomain\n  type    = &quot;A&quot;\n\n  alias {\n    name                   = aws_cloudfront_distribution.docs_distribution.domain_name\n    zone_id                = aws_cloudfront_distribution.docs_distribution.hosted_zone_id\n    evaluate_target_health = false\n  }\n}\n\n# Lambda function for deployment notifications\nresource &quot;aws_lambda_function&quot; &quot;deployment_notifier&quot; {\n  filename      = &quot;deployment-notifier.zip&quot;\n  function_name = &quot;docs-deployment-notifier-${var.environment}&quot;\n  role          = aws_iam_role.lambda_role.arn\n  handler       = &quot;index.handler&quot;\n  runtime       = &quot;python3.9&quot;\n  timeout       = 30\n\n  environment {\n    variables = {\n      ENVIRONMENT = var.environment\n      SLACK_WEBHOOK_URL = var.slack_webhook_url\n    }\n  }\n\n  tags = {\n    Environment = var.environment\n    Purpose     = &quot;deployment-notification&quot;\n  }\n}\n\n# IAM role for Lambda function\nresource &quot;aws_iam_role&quot; &quot;lambda_role&quot; {\n  name = &quot;docs-lambda-role-${var.environment}&quot;\n\n  assume_role_policy = jsonencode({\n    Version = &quot;2012-10-17&quot;\n    Statement = [\n      {\n        Action = &quot;sts:AssumeRole&quot;\n        Effect = &quot;Allow&quot;\n        Principal = {\n          Service = &quot;lambda.amazonaws.com&quot;\n        }\n      }\n    ]\n  })\n}\n\nresource &quot;aws_iam_role_policy_attachment&quot; &quot;lambda_basic&quot; {\n  policy_arn = &quot;arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole&quot;\n  role       = aws_iam_role.lambda_role.name\n}\n\n# CloudWatch alarms for monitoring\nresource &quot;aws_cloudwatch_metric_alarm&quot; &quot;high_error_rate&quot; {\n  alarm_name          = &quot;docs-high-error-rate-${var.environment}&quot;\n  comparison_operator = &quot;GreaterThanThreshold&quot;\n  evaluation_periods  = &quot;2&quot;\n  metric_name         = &quot;ErrorRate&quot;\n  namespace           = &quot;AWS/CloudFront&quot;\n  period              = &quot;300&quot;\n  statistic           = &quot;Average&quot;\n  threshold           = &quot;5&quot;\n  alarm_description   = &quot;This metric monitors error rate&quot;\n  alarm_actions       = [aws_sns_topic.alerts.arn]\n\n  dimensions = {\n    DistributionId = aws_cloudfront_distribution.docs_distribution.id\n  }\n\n  tags = {\n    Environment = var.environment\n  }\n}\n\nresource &quot;aws_cloudwatch_metric_alarm&quot; &quot;slow_response_time&quot; {\n  alarm_name          = &quot;docs-slow-response-${var.environment}&quot;\n  comparison_operator = &quot;GreaterThanThreshold&quot;\n  evaluation_periods  = &quot;3&quot;\n  metric_name         = &quot;ResponseTime&quot;\n  namespace           = &quot;AWS/CloudFront&quot;\n  period              = &quot;300&quot;\n  statistic           = &quot;Average&quot;\n  threshold           = &quot;3000&quot;\n  alarm_description   = &quot;This metric monitors response time&quot;\n  alarm_actions       = [aws_sns_topic.alerts.arn]\n\n  dimensions = {\n    DistributionId = aws_cloudfront_distribution.docs_distribution.id\n  }\n\n  tags = {\n    Environment = var.environment\n  }\n}\n\n# SNS topic for alerts\nresource &quot;aws_sns_topic&quot; &quot;alerts&quot; {\n  name = &quot;docs-alerts-${var.environment}&quot;\n\n  tags = {\n    Environment = var.environment\n  }\n}\n\n# Output values\noutput &quot;website_url&quot; {\n  description = &quot;URL of the documentation website&quot;\n  value       = &quot;https://${var.subdomain}.${var.domain_name}&quot;\n}\n\noutput &quot;cloudfront_distribution_id&quot; {\n  description = &quot;ID of the CloudFront distribution&quot;\n  value       = aws_cloudfront_distribution.docs_distribution.id\n}\n\noutput &quot;s3_bucket_name&quot; {\n  description = &quot;Name of the S3 bucket&quot;\n  value       = aws_s3_bucket.docs_primary.bucket\n}\n\noutput &quot;certificate_arn&quot; {\n  description = &quot;ARN of the SSL certificate&quot;\n  value       = aws_acm_certificate.cert.arn\n}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Advanced Markdown documentation automation and deployment systems represent the pinnacle of modern technical documentation practices, enabling teams to create, maintain, and deploy high-quality documentation at scale while minimizing manual overhead and maximizing consistency. By implementing sophisticated automation pipelines, comprehensive testing frameworks, and intelligent deployment strategies, organizations can build documentation ecosystems that truly serve both creators and consumers.\u003C/p>\n\u003Cp>The key to successful implementation lies in understanding that automation should enhance rather than replace human creativity and judgment, providing the tools and safeguards needed to focus on content quality and user experience rather than repetitive deployment tasks. Whether you&#39;re managing a small project&#39;s documentation or orchestrating enterprise-scale technical content systems, the automation techniques covered in this guide provide the foundation for building reliable, efficient, and maintainable documentation workflows.\u003C/p>\n\u003Cp>Remember to start with simple automation and gradually build complexity as your needs evolve, always prioritizing reliability and maintainability over feature richness. With proper implementation of documentation automation and deployment systems, your technical content can achieve the same level of operational excellence that your applications demand while maintaining the accessibility and clarity that makes great documentation truly valuable.\u003C/p>\n",[15,19,22,25,28,31],{"id":16,"text":17,"level":18},"why-master-documentation-automation-and-deployment","Why Master Documentation Automation and Deployment?",2,{"id":20,"text":21,"level":18},"foundation-automation-principles","Foundation Automation Principles",{"id":23,"text":24,"level":18},"advanced-integration-with-documentation-systems","Advanced Integration with Documentation Systems",{"id":26,"text":27,"level":18},"continuous-integration-and-quality-assurance","Continuous Integration and Quality Assurance",{"id":29,"text":30,"level":18},"deployment-strategy-and-environment-management","Deployment Strategy and Environment Management",{"id":32,"text":33,"level":18},"conclusion","Conclusion",[],[36,43,51],{"slug":37,"title":38,"description":39,"excerpt":40,"date":41,"category":9,"author":10,"keywords":42,"readingMinutes":12},"markdown-automation-workflows-complete-guide","Markdown Automation Workflows: Complete Guide for CI/CD, Publishing, and Documentation Generation","Master automated Markdown workflows for continuous documentation, publishing pipelines, and content generation. Learn GitHub Actions, automated testing, deployment strategies, and integration with modern development tools.","Automated Markdown workflows enable seamless integration of documentation and content creation into modern development processes, providing continuous integration capabilities for technical…","2025-09-25","markdown automation, markdown ci cd, automated documentation, markdown workflows, markdown publishing automation, documentation generation, markdown testing, automated content publishing",{"slug":44,"title":45,"description":46,"excerpt":47,"date":48,"category":9,"author":10,"keywords":49,"readingMinutes":50},"markdown-diagram-workflows-integration-complete-guide","Markdown Diagram Workflows and Integration: Complete Guide for Visual Documentation and Automated Diagram Generation","Master advanced Markdown diagram workflows with Mermaid, PlantUML, and D2. Learn automated diagram generation, version control integration, CI/CD pipelines, and cross-platform compatibility for professional visual documentation.","Advanced Markdown diagram workflows and integration techniques enable sophisticated visual documentation that combines the simplicity of text-based markup with powerful automated diagram…","2025-11-03","markdown diagrams, mermaid diagrams, plantuml markdown, d2 diagrams, diagram automation, visual documentation, markdown workflows, diagram version control, automated diagrams",16,{"slug":52,"title":53,"description":54,"excerpt":55,"date":56,"category":9,"author":10,"keywords":57,"readingMinutes":58},"markdown-automated-testing-validation-complete-guide","Markdown Automated Testing and Validation: Complete Guide for Quality Assurance and Continuous Integration","Master comprehensive Markdown testing strategies, automated validation systems, and CI/CD integration for maintaining high-quality documentation and content integrity across large-scale projects.","Automated testing and validation for Markdown content ensures consistency, quality, and reliability across documentation projects through comprehensive testing frameworks that verify syntax…","2025-10-17","markdown testing, markdown validation, automated testing markdown, CI/CD markdown, markdown quality assurance, content testing, documentation testing, markdown linting",22,1792184943849]