[{"data":1,"prerenderedAt":68},["Reactive",2],{"blog-post-markdown-diff-and-patch-documentation-version-control-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":43,"related":44},"markdown-diff-and-patch-documentation-version-control-guide","Markdown Diff and Patch Documentation: Complete Guide for Version Control Integration and Change Tracking","Master Markdown diff tools, patch documentation, and version control integration for collaborative technical writing. Learn diff strategies, change tracking workflows, and automated documentation updates with Git integration.","Advanced Markdown diff and patch documentation techniques enable sophisticated version control workflows that track content changes, facilitate collaborative writing, and maintain comprehensive…","2025-12-07","Tutorial","Matthew Rathbone","markdown diff, markdown patch, version control markdown, git markdown diff, markdown change tracking, collaborative writing, technical documentation diff, markdown git workflow",16,"\u003Cp>Advanced Markdown diff and patch documentation techniques enable sophisticated version control workflows that track content changes, facilitate collaborative writing, and maintain comprehensive documentation histories. By implementing intelligent diff strategies, automated change tracking systems, and seamless Git integration, technical teams can build robust documentation workflows that preserve editorial context while enabling efficient collaboration across complex content repositories.\u003C/p>\n\u003Ch2 id=\"why-master-markdown-diff-and-patch-documentation\">Why Master Markdown Diff and Patch Documentation?\u003C/h2>\n\u003Cp>Professional diff and patch integration provides essential benefits for collaborative documentation:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Change Visualization\u003C/strong>: Track content evolution with semantic awareness of Markdown structure\u003C/li>\n\u003Cli>\u003Cstrong>Collaborative Workflows\u003C/strong>: Enable distributed teams to work simultaneously with clear change attribution\u003C/li>\n\u003Cli>\u003Cstrong>Quality Control\u003C/strong>: Implement review processes that understand Markdown formatting and content semantics\u003C/li>\n\u003Cli>\u003Cstrong>Automated Integration\u003C/strong>: Connect documentation changes directly with code releases and project milestones\u003C/li>\n\u003Cli>\u003Cstrong>Conflict Resolution\u003C/strong>: Resolve merge conflicts intelligently based on content structure rather than line-by-line text\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"foundation-diff-techniques-for-markdown\">Foundation Diff Techniques for Markdown\u003C/h2>\n\u003Ch3 id=\"semantic-markdown-diffing\">Semantic Markdown Diffing\u003C/h3>\n\u003Cp>Understanding content structure for more intelligent change tracking:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># Traditional line-based Git diff\u003C/span>\ngit diff --word-diff=color document.md\n\n\u003Cspan class=\"hljs-comment\"># Enhanced markdown-aware diffing\u003C/span>\ngit config diff.markdown.textconv \u003Cspan class=\"hljs-string\">&quot;pandoc --to=plain&quot;\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;*.md diff=markdown&quot;\u003C/span> &gt;&gt; .gitattributes\n\n\u003Cspan class=\"hljs-comment\"># Word-level diff for prose content\u003C/span>\ngit diff --word-diff=porcelain document.md\n\n\u003Cspan class=\"hljs-comment\"># Character-level diff for precise changes\u003C/span>\ngit diff --no-index --word-diff=color --word-diff-regex=. old.md new.md\n\u003C/code>\u003C/pre>\u003Ch3 id=\"custom-diff-drivers-for-markdown\">Custom Diff Drivers for Markdown\u003C/h3>\n\u003Cp>Implementing specialized diff handling for Markdown content:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-meta\">#!/bin/bash\u003C/span>\n\u003Cspan class=\"hljs-comment\"># markdown-diff.sh - Custom Markdown diff driver\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Configure Git to use custom diff driver\u003C/span>\ngit config diff.markdown.textconv markdown-to-text\ngit config diff.markdown.cachetextconv \u003Cspan class=\"hljs-literal\">true\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Set up .gitattributes\u003C/span>\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;*.md diff=markdown&quot;\u003C/span> &gt;&gt; .gitattributes\n\u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;*.markdown diff=markdown&quot;\u003C/span> &gt;&gt; .gitattributes\n\u003C/code>\u003C/pre>\u003Cp>Custom text conversion script:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-comment\">#!/usr/bin/env python3\u003C/span>\n\u003Cspan class=\"hljs-comment\"># markdown-to-text.py - Convert Markdown to normalized text for diffing\u003C/span>\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> sys\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> argparse\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> pathlib \u003Cspan class=\"hljs-keyword\">import\u003C/span> Path\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownDiffNormalizer\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">__init__\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        self.normalization_rules = {\n            \u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>: self.normalize_headers,\n            \u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>: self.normalize_links,\n            \u003Cspan class=\"hljs-string\">&#x27;emphasis&#x27;\u003C/span>: self.normalize_emphasis,\n            \u003Cspan class=\"hljs-string\">&#x27;lists&#x27;\u003C/span>: self.normalize_lists,\n            \u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>: self.normalize_code_blocks,\n            \u003Cspan class=\"hljs-string\">&#x27;whitespace&#x27;\u003C/span>: self.normalize_whitespace\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">normalize_headers\u003C/span>(\u003Cspan class=\"hljs-params\">self, text\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Normalize header syntax for consistent diffing&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Convert setext headers to atx headers\u003C/span>\n        text = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;^(.+)\\n=+\\s*$&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">r&#x27;# \\1&#x27;\u003C/span>, text, flags=re.MULTILINE)\n        text = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;^(.+)\\n-+\\s*$&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">r&#x27;## \\1&#x27;\u003C/span>, text, flags=re.MULTILINE)\n        \n        \u003Cspan class=\"hljs-comment\"># Normalize atx header spacing\u003C/span>\n        text = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;^(#{1,6})\\s*(.+?)\\s*#*\\s*$&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">r&#x27;\\1 \\2&#x27;\u003C/span>, text, flags=re.MULTILINE)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> text\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">normalize_links\u003C/span>(\u003Cspan class=\"hljs-params\">self, text\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Normalize link formats for consistent comparison&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Convert reference links to inline links for diffing\u003C/span>\n        references = {}\n        \n        \u003Cspan class=\"hljs-comment\"># Extract reference definitions\u003C/span>\n        ref_pattern = \u003Cspan class=\"hljs-string\">r&#x27;^\\s*\\[([^\\]]+)\\]:\\s*(.+)$&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> \u003Cspan class=\"hljs-keyword\">match\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> re.finditer(ref_pattern, text, re.MULTILINE):\n            ref_id = \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">1\u003C/span>).lower().strip()\n            ref_url = \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">2\u003C/span>).strip()\n            references[ref_id] = ref_url\n        \n        \u003Cspan class=\"hljs-comment\"># Remove reference definitions from text\u003C/span>\n        text = re.sub(ref_pattern, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>, text, flags=re.MULTILINE)\n        \n        \u003Cspan class=\"hljs-comment\"># Convert reference links to inline\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">replace_ref_link\u003C/span>(\u003Cspan class=\"hljs-params\">\u003Cspan class=\"hljs-keyword\">match\u003C/span>\u003C/span>):\n            link_text = \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">1\u003C/span>)\n            ref_id = \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">2\u003C/span>).lower().strip() \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">2\u003C/span>) \u003Cspan class=\"hljs-keyword\">else\u003C/span> link_text.lower().strip()\n            url = references.get(ref_id, \u003Cspan class=\"hljs-string\">f&quot;#\u003Cspan class=\"hljs-subst\">{ref_id}\u003C/span>&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">f&quot;[\u003Cspan class=\"hljs-subst\">{link_text}\u003C/span>](\u003Cspan class=\"hljs-subst\">{url}\u003C/span>)&quot;\u003C/span>\n        \n        text = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;\\[([^\\]]+)\\](?:\\s*\\[([^\\]]*)\\])?(?!\\()&#x27;\u003C/span>, replace_ref_link, text)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> text\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">normalize_emphasis\u003C/span>(\u003Cspan class=\"hljs-params\">self, text\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Normalize emphasis syntax&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Convert underscore emphasis to asterisk\u003C/span>\n        text = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;(?&lt;!\\w)_([^_\\n]+)_(?!\\w)&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">r&#x27;*\\1*&#x27;\u003C/span>, text)\n        text = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;(?&lt;!\\w)__([^_\\n]+)__(?!\\w)&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">r&#x27;**\\1**&#x27;\u003C/span>, text)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> text\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">normalize_lists\u003C/span>(\u003Cspan class=\"hljs-params\">self, text\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Normalize list formatting&quot;&quot;&quot;\u003C/span>\n        lines = text.split(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>)\n        normalized_lines = []\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> lines:\n            \u003Cspan class=\"hljs-comment\"># Normalize bullet list markers\u003C/span>\n            line = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;^(\\s*)[-+]\\s+&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">r&#x27;\\1- &#x27;\u003C/span>, line)\n            \n            \u003Cspan class=\"hljs-comment\"># Normalize ordered list markers\u003C/span>\n            line = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;^(\\s*)\\d+\\.\\s+&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">r&#x27;\\11. &#x27;\u003C/span>, line)\n            \n            normalized_lines.append(line)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(normalized_lines)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">normalize_code_blocks\u003C/span>(\u003Cspan class=\"hljs-params\">self, text\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Normalize code block syntax&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Convert indented code blocks to fenced code blocks\u003C/span>\n        lines = text.split(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>)\n        in_code_block = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n        normalized_lines = []\n        \n        i = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> i &lt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(lines):\n            line = lines[i]\n            \n            \u003Cspan class=\"hljs-comment\"># Check for indented code block start\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^    \\S&#x27;\u003C/span>, line) \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> in_code_block:\n                \u003Cspan class=\"hljs-comment\"># Start of indented code block\u003C/span>\n                normalized_lines.append(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>)\n                in_code_block = \u003Cspan class=\"hljs-literal\">True\u003C/span>\n                \n                \u003Cspan class=\"hljs-comment\"># Process indented code block\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">while\u003C/span> i &lt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(lines) \u003Cspan class=\"hljs-keyword\">and\u003C/span> (lines[i].startswith(\u003Cspan class=\"hljs-string\">&#x27;    &#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">or\u003C/span> lines[i].strip() == \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>):\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> lines[i].startswith(\u003Cspan class=\"hljs-string\">&#x27;    &#x27;\u003C/span>):\n                        normalized_lines.append(lines[i][\u003Cspan class=\"hljs-number\">4\u003C/span>:])  \u003Cspan class=\"hljs-comment\"># Remove indent\u003C/span>\n                    \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                        normalized_lines.append(lines[i])\n                    i += \u003Cspan class=\"hljs-number\">1\u003C/span>\n                \n                normalized_lines.append(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>)\n                in_code_block = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n                i -= \u003Cspan class=\"hljs-number\">1\u003C/span>  \u003Cspan class=\"hljs-comment\"># Adjust for outer loop increment\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                normalized_lines.append(line)\n            \n            i += \u003Cspan class=\"hljs-number\">1\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(normalized_lines)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">normalize_whitespace\u003C/span>(\u003Cspan class=\"hljs-params\">self, text\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Normalize whitespace patterns&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Normalize line endings\u003C/span>\n        text = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;\\r\\n|\\r&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>, text)\n        \n        \u003Cspan class=\"hljs-comment\"># Remove trailing whitespace\u003C/span>\n        text = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;[ \\t]+$&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>, text, flags=re.MULTILINE)\n        \n        \u003Cspan class=\"hljs-comment\"># Normalize multiple blank lines to single blank line\u003C/span>\n        text = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;\\n{3,}&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;\\n\\n&#x27;\u003C/span>, text)\n        \n        \u003Cspan class=\"hljs-comment\"># Remove leading/trailing blank lines\u003C/span>\n        text = text.strip()\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> text\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">normalize\u003C/span>(\u003Cspan class=\"hljs-params\">self, text, rules=\u003Cspan class=\"hljs-literal\">None\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Apply normalization rules to text&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> rules \u003Cspan class=\"hljs-keyword\">is\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>:\n            rules = \u003Cspan class=\"hljs-built_in\">list\u003C/span>(self.normalization_rules.keys())\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> rule \u003Cspan class=\"hljs-keyword\">in\u003C/span> rules:\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> rule \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.normalization_rules:\n                text = self.normalization_rules[rule](text)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> text\n\n\u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">main\u003C/span>():\n    parser = argparse.ArgumentParser(description=\u003Cspan class=\"hljs-string\">&#x27;Normalize Markdown for improved diffing&#x27;\u003C/span>)\n    parser.add_argument(\u003Cspan class=\"hljs-string\">&#x27;file&#x27;\u003C/span>, \u003Cspan class=\"hljs-built_in\">help\u003C/span>=\u003Cspan class=\"hljs-string\">&#x27;Markdown file to normalize&#x27;\u003C/span>)\n    parser.add_argument(\u003Cspan class=\"hljs-string\">&#x27;--rules&#x27;\u003C/span>, nargs=\u003Cspan class=\"hljs-string\">&#x27;*&#x27;\u003C/span>, \n                       choices=[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;emphasis&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;lists&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;whitespace&#x27;\u003C/span>],\n                       \u003Cspan class=\"hljs-built_in\">help\u003C/span>=\u003Cspan class=\"hljs-string\">&#x27;Normalization rules to apply&#x27;\u003C/span>)\n    \n    args = parser.parse_args()\n    \n    \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n        \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(args.file, \u003Cspan class=\"hljs-string\">&#x27;r&#x27;\u003C/span>, encoding=\u003Cspan class=\"hljs-string\">&#x27;utf-8&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n            content = f.read()\n        \n        normalizer = MarkdownDiffNormalizer()\n        normalized = normalizer.normalize(content, args.rules)\n        \n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(normalized)\n    \n    \u003Cspan class=\"hljs-keyword\">except\u003C/span> FileNotFoundError:\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Error: File &#x27;\u003Cspan class=\"hljs-subst\">{args.file}\u003C/span>&#x27; not found&quot;\u003C/span>, file=sys.stderr)\n        sys.exit(\u003Cspan class=\"hljs-number\">1\u003C/span>)\n    \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Error: \u003Cspan class=\"hljs-subst\">{e}\u003C/span>&quot;\u003C/span>, file=sys.stderr)\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    main()\n\u003C/code>\u003C/pre>\u003Ch3 id=\"comprehensive-diff-strategy-implementation\">Comprehensive Diff Strategy Implementation\u003C/h3>\n\u003Cp>Building intelligent diff systems for Markdown content workflows:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-comment\"># markdown_diff_engine.py - Advanced Markdown diff and patch system\u003C/span>\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> difflib\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> hashlib\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> json\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> typing \u003Cspan class=\"hljs-keyword\">import\u003C/span> \u003Cspan class=\"hljs-type\">List\u003C/span>, \u003Cspan class=\"hljs-type\">Dict\u003C/span>, \u003Cspan class=\"hljs-type\">Tuple\u003C/span>, \u003Cspan class=\"hljs-type\">Optional\u003C/span>, \u003Cspan class=\"hljs-type\">Union\u003C/span>\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> dataclasses \u003Cspan class=\"hljs-keyword\">import\u003C/span> dataclass\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> enum \u003Cspan class=\"hljs-keyword\">import\u003C/span> Enum\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> pathlib \u003Cspan class=\"hljs-keyword\">import\u003C/span> Path\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> subprocess\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">ChangeType\u003C/span>(\u003Cspan class=\"hljs-title class_ inherited__\">Enum\u003C/span>):\n    ADDITION = \u003Cspan class=\"hljs-string\">&quot;addition&quot;\u003C/span>\n    DELETION = \u003Cspan class=\"hljs-string\">&quot;deletion&quot;\u003C/span>\n    MODIFICATION = \u003Cspan class=\"hljs-string\">&quot;modification&quot;\u003C/span>\n    MOVE = \u003Cspan class=\"hljs-string\">&quot;move&quot;\u003C/span>\n    RENAME = \u003Cspan class=\"hljs-string\">&quot;rename&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-meta\">@dataclass\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownChange\u003C/span>:\n    change_type: ChangeType\n    line_number: \u003Cspan class=\"hljs-built_in\">int\u003C/span>\n    content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    context: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\n    semantic_meaning: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    author: \u003Cspan class=\"hljs-built_in\">str\u003C/span> = \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n    timestamp: \u003Cspan class=\"hljs-built_in\">str\u003C/span> = \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n    commit_hash: \u003Cspan class=\"hljs-built_in\">str\u003C/span> = \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownDiffEngine\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">__init__\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        self.structural_patterns = {\n            \u003Cspan class=\"hljs-string\">&#x27;header&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^(#{1,6})\\s+(.+)$&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;list_item&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;code_block&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^```(\\w*)\\s*$&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;code_block_end&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^```\\s*$&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;blockquote&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^&gt;\\s*(.+)$&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;table_row&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^\\|.+\\|$&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;horizontal_rule&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^(-{3,}|\\*{3,}|_{3,})\\s*$&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;link_def&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^\\s*\\[([^\\]]+)\\]:\\s*(.+)$&#x27;\u003C/span>\n        }\n        \n        self.semantic_groupings = {\n            \u003Cspan class=\"hljs-string\">&#x27;frontmatter&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;yaml_block&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;toml_block&#x27;\u003C/span>],\n            \u003Cspan class=\"hljs-string\">&#x27;content_structure&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;header&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;horizontal_rule&#x27;\u003C/span>],\n            \u003Cspan class=\"hljs-string\">&#x27;text_formatting&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;emphasis&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;strong&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;inline_code&#x27;\u003C/span>],\n            \u003Cspan class=\"hljs-string\">&#x27;content_blocks&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;blockquote&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;code_block&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;list&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>],\n            \u003Cspan class=\"hljs-string\">&#x27;references&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;link&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;image&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;link_def&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;footnote&#x27;\u003C/span>]\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_structural_changes\u003C/span>(\u003Cspan class=\"hljs-params\">self, old_content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, new_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;Analyze changes with awareness of Markdown structure&quot;&quot;&quot;\u003C/span>\n        old_structure = self.parse_document_structure(old_content)\n        new_structure = self.parse_document_structure(new_content)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;structure_diff&#x27;\u003C/span>: self.compare_structures(old_structure, new_structure),\n            \u003Cspan class=\"hljs-string\">&#x27;content_diff&#x27;\u003C/span>: self.compare_content_semantically(old_content, new_content),\n            \u003Cspan class=\"hljs-string\">&#x27;impact_analysis&#x27;\u003C/span>: self.analyze_change_impact(old_structure, new_structure)\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">parse_document_structure\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;Parse document into structural components&quot;&quot;&quot;\u003C/span>\n        lines = content.split(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>)\n        structure = {\n            \u003Cspan class=\"hljs-string\">&#x27;frontmatter&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">None\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;lists&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;tables&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;images&#x27;\u003C/span>: []\n        }\n        \n        current_section = \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        in_frontmatter = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n        in_code_block = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n        current_list = \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line_num, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines, \u003Cspan class=\"hljs-number\">1\u003C/span>):\n            \u003Cspan class=\"hljs-comment\"># Check for frontmatter\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> line_num == \u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">and\u003C/span> line.strip() == \u003Cspan class=\"hljs-string\">&#x27;---&#x27;\u003C/span>:\n                in_frontmatter = \u003Cspan class=\"hljs-literal\">True\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> in_frontmatter \u003Cspan class=\"hljs-keyword\">and\u003C/span> line.strip() == \u003Cspan class=\"hljs-string\">&#x27;---&#x27;\u003C/span>:\n                in_frontmatter = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> in_frontmatter:\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> structure[\u003Cspan class=\"hljs-string\">&#x27;frontmatter&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">is\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>:\n                    structure[\u003Cspan class=\"hljs-string\">&#x27;frontmatter&#x27;\u003C/span>] = []\n                structure[\u003Cspan class=\"hljs-string\">&#x27;frontmatter&#x27;\u003C/span>].append((line_num, line))\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Parse structural elements\u003C/span>\n            self.parse_line_structure(line, line_num, structure)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> structure\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">parse_line_structure\u003C/span>(\u003Cspan class=\"hljs-params\">self, line: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, line_num: \u003Cspan class=\"hljs-built_in\">int\u003C/span>, structure: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Parse individual line for structural elements&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Headers\u003C/span>\n        header_match = re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(self.structural_patterns[\u003Cspan class=\"hljs-string\">&#x27;header&#x27;\u003C/span>], line)\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> header_match:\n            level = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(header_match.group(\u003Cspan class=\"hljs-number\">1\u003C/span>))\n            text = header_match.group(\u003Cspan class=\"hljs-number\">2\u003C/span>).strip()\n            structure[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>].append({\n                \u003Cspan class=\"hljs-string\">&#x27;line&#x27;\u003C/span>: line_num,\n                \u003Cspan class=\"hljs-string\">&#x27;level&#x27;\u003C/span>: level,\n                \u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>: text,\n                \u003Cspan class=\"hljs-string\">&#x27;id&#x27;\u003C/span>: self.generate_header_id(text)\n            })\n        \n        \u003Cspan class=\"hljs-comment\"># Code blocks\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(self.structural_patterns[\u003Cspan class=\"hljs-string\">&#x27;code_block&#x27;\u003C/span>], line):\n            lang = re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(self.structural_patterns[\u003Cspan class=\"hljs-string\">&#x27;code_block&#x27;\u003C/span>], line).group(\u003Cspan class=\"hljs-number\">1\u003C/span>)\n            structure[\u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>].append({\n                \u003Cspan class=\"hljs-string\">&#x27;start_line&#x27;\u003C/span>: line_num,\n                \u003Cspan class=\"hljs-string\">&#x27;language&#x27;\u003C/span>: lang,\n                \u003Cspan class=\"hljs-string\">&#x27;end_line&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">None\u003C/span>\n            })\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(self.structural_patterns[\u003Cspan class=\"hljs-string\">&#x27;code_block_end&#x27;\u003C/span>], line) \u003Cspan class=\"hljs-keyword\">and\u003C/span> structure[\u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>]:\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> structure[\u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>][-\u003Cspan class=\"hljs-number\">1\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;end_line&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">is\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>:\n                structure[\u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>][-\u003Cspan class=\"hljs-number\">1\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;end_line&#x27;\u003C/span>] = line_num\n        \n        \u003Cspan class=\"hljs-comment\"># Lists\u003C/span>\n        list_match = re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(self.structural_patterns[\u003Cspan class=\"hljs-string\">&#x27;list_item&#x27;\u003C/span>], line)\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> list_match:\n            indent = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(list_match.group(\u003Cspan class=\"hljs-number\">1\u003C/span>))\n            marker = list_match.group(\u003Cspan class=\"hljs-number\">2\u003C/span>)\n            text = list_match.group(\u003Cspan class=\"hljs-number\">3\u003C/span>)\n            \n            structure[\u003Cspan class=\"hljs-string\">&#x27;lists&#x27;\u003C/span>].append({\n                \u003Cspan class=\"hljs-string\">&#x27;line&#x27;\u003C/span>: line_num,\n                \u003Cspan class=\"hljs-string\">&#x27;indent&#x27;\u003C/span>: indent,\n                \u003Cspan class=\"hljs-string\">&#x27;marker&#x27;\u003C/span>: marker,\n                \u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>: text,\n                \u003Cspan class=\"hljs-string\">&#x27;ordered&#x27;\u003C/span>: marker.endswith(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C/span>)\n            })\n        \n        \u003Cspan class=\"hljs-comment\"># Links and images\u003C/span>\n        link_pattern = \u003Cspan class=\"hljs-string\">r&#x27;\\[([^\\]]+)\\]\\(([^)]+)\\)&#x27;\u003C/span>\n        image_pattern = \u003Cspan class=\"hljs-string\">r&#x27;!\\[([^\\]]*)\\]\\(([^)]+)\\)&#x27;\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> \u003Cspan class=\"hljs-keyword\">match\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> re.finditer(image_pattern, line):\n            structure[\u003Cspan class=\"hljs-string\">&#x27;images&#x27;\u003C/span>].append({\n                \u003Cspan class=\"hljs-string\">&#x27;line&#x27;\u003C/span>: line_num,\n                \u003Cspan class=\"hljs-string\">&#x27;alt_text&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">1\u003C/span>),\n                \u003Cspan class=\"hljs-string\">&#x27;url&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">2\u003C/span>),\n                \u003Cspan class=\"hljs-string\">&#x27;position&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">match\u003C/span>.start()\n            })\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> \u003Cspan class=\"hljs-keyword\">match\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> re.finditer(link_pattern, line):\n            structure[\u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>].append({\n                \u003Cspan class=\"hljs-string\">&#x27;line&#x27;\u003C/span>: line_num,\n                \u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">1\u003C/span>),\n                \u003Cspan class=\"hljs-string\">&#x27;url&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">match\u003C/span>.group(\u003Cspan class=\"hljs-number\">2\u003C/span>),\n                \u003Cspan class=\"hljs-string\">&#x27;position&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">match\u003C/span>.start()\n            })\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_header_id\u003C/span>(\u003Cspan class=\"hljs-params\">self, header_text: \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;Generate a stable ID for headers&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Simple slug generation\u003C/span>\n        slug = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;[^\\w\\s-]&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>, header_text.lower())\n        slug = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;[-\\s]+&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>, slug)\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> slug.strip(\u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">compare_structures\u003C/span>(\u003Cspan class=\"hljs-params\">self, old_structure: \u003Cspan class=\"hljs-type\">Dict\u003C/span>, new_structure: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Compare document structures for high-level changes&quot;&quot;&quot;\u003C/span>\n        changes = {}\n        \n        \u003Cspan class=\"hljs-comment\"># Compare headers (document outline changes)\u003C/span>\n        old_headers = [h[\u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">for\u003C/span> h \u003Cspan class=\"hljs-keyword\">in\u003C/span> old_structure[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>]]\n        new_headers = [h[\u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">for\u003C/span> h \u003Cspan class=\"hljs-keyword\">in\u003C/span> new_structure[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>]]\n        \n        header_changes = \u003Cspan class=\"hljs-built_in\">list\u003C/span>(difflib.unified_diff(\n            old_headers, new_headers, lineterm=\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>, n=\u003Cspan class=\"hljs-number\">0\u003C/span>\n        ))\n        \n        changes[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>] = {\n            \u003Cspan class=\"hljs-string\">&#x27;outline_changed&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(header_changes) &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;additions&#x27;\u003C/span>: [h \u003Cspan class=\"hljs-keyword\">for\u003C/span> h \u003Cspan class=\"hljs-keyword\">in\u003C/span> new_headers \u003Cspan class=\"hljs-keyword\">if\u003C/span> h \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> old_headers],\n            \u003Cspan class=\"hljs-string\">&#x27;deletions&#x27;\u003C/span>: [h \u003Cspan class=\"hljs-keyword\">for\u003C/span> h \u003Cspan class=\"hljs-keyword\">in\u003C/span> old_headers \u003Cspan class=\"hljs-keyword\">if\u003C/span> h \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> new_headers],\n            \u003Cspan class=\"hljs-string\">&#x27;structure_diff&#x27;\u003C/span>: header_changes\n        }\n        \n        \u003Cspan class=\"hljs-comment\"># Compare code blocks\u003C/span>\n        old_code_langs = [cb.get(\u003Cspan class=\"hljs-string\">&#x27;language&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">for\u003C/span> cb \u003Cspan class=\"hljs-keyword\">in\u003C/span> old_structure[\u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>]]\n        new_code_langs = [cb.get(\u003Cspan class=\"hljs-string\">&#x27;language&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">for\u003C/span> cb \u003Cspan class=\"hljs-keyword\">in\u003C/span> new_structure[\u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>]]\n        \n        changes[\u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>] = {\n            \u003Cspan class=\"hljs-string\">&#x27;count_changed&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_code_langs) != \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_code_langs),\n            \u003Cspan class=\"hljs-string\">&#x27;old_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_code_langs),\n            \u003Cspan class=\"hljs-string\">&#x27;new_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_code_langs),\n            \u003Cspan class=\"hljs-string\">&#x27;language_changes&#x27;\u003C/span>: old_code_langs != new_code_langs\n        }\n        \n        \u003Cspan class=\"hljs-comment\"># Compare links and images\u003C/span>\n        changes[\u003Cspan class=\"hljs-string\">&#x27;references&#x27;\u003C/span>] = {\n            \u003Cspan class=\"hljs-string\">&#x27;links_changed&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_structure[\u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>]) != \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_structure[\u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>]),\n            \u003Cspan class=\"hljs-string\">&#x27;images_changed&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_structure[\u003Cspan class=\"hljs-string\">&#x27;images&#x27;\u003C/span>]) != \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_structure[\u003Cspan class=\"hljs-string\">&#x27;images&#x27;\u003C/span>]),\n            \u003Cspan class=\"hljs-string\">&#x27;old_link_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_structure[\u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>]),\n            \u003Cspan class=\"hljs-string\">&#x27;new_link_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_structure[\u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>]),\n            \u003Cspan class=\"hljs-string\">&#x27;old_image_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_structure[\u003Cspan class=\"hljs-string\">&#x27;images&#x27;\u003C/span>]),\n            \u003Cspan class=\"hljs-string\">&#x27;new_image_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_structure[\u003Cspan class=\"hljs-string\">&#x27;images&#x27;\u003C/span>])\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> changes\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">compare_content_semantically\u003C/span>(\u003Cspan class=\"hljs-params\">self, old_content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, new_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;Perform semantic content comparison&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Break content into semantic blocks\u003C/span>\n        old_blocks = self.extract_semantic_blocks(old_content)\n        new_blocks = self.extract_semantic_blocks(new_content)\n        \n        \u003Cspan class=\"hljs-comment\"># Compare blocks with context awareness\u003C/span>\n        block_changes = []\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, (old_block, new_block) \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(\u003Cspan class=\"hljs-built_in\">zip\u003C/span>(old_blocks, new_blocks)):\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> old_block != new_block:\n                change_analysis = self.analyze_block_change(old_block, new_block, i)\n                block_changes.append(change_analysis)\n        \n        \u003Cspan class=\"hljs-comment\"># Handle added/removed blocks\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_blocks) &gt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_blocks):\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> i \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">range\u003C/span>(\u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_blocks), \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_blocks)):\n                block_changes.append({\n                    \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;addition&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;block_index&#x27;\u003C/span>: i,\n                    \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span>: new_blocks[i],\n                    \u003Cspan class=\"hljs-string\">&#x27;semantic_type&#x27;\u003C/span>: self.classify_block_type(new_blocks[i])\n                })\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_blocks) &gt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_blocks):\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> i \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">range\u003C/span>(\u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_blocks), \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_blocks)):\n                block_changes.append({\n                    \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;deletion&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;block_index&#x27;\u003C/span>: i,\n                    \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span>: old_blocks[i],\n                    \u003Cspan class=\"hljs-string\">&#x27;semantic_type&#x27;\u003C/span>: self.classify_block_type(old_blocks[i])\n                })\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;total_blocks_old&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_blocks),\n            \u003Cspan class=\"hljs-string\">&#x27;total_blocks_new&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_blocks),\n            \u003Cspan class=\"hljs-string\">&#x27;changed_blocks&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(block_changes),\n            \u003Cspan class=\"hljs-string\">&#x27;block_changes&#x27;\u003C/span>: block_changes\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">extract_semantic_blocks\u003C/span>(\u003Cspan class=\"hljs-params\">self, content: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[\u003Cspan class=\"hljs-built_in\">str\u003C/span>]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Extract content into semantic blocks for comparison&quot;&quot;&quot;\u003C/span>\n        lines = content.split(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>)\n        blocks = []\n        current_block = []\n        in_code_block = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> line \u003Cspan class=\"hljs-keyword\">in\u003C/span> lines:\n            \u003Cspan class=\"hljs-comment\"># Code block handling\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> line.strip().startswith(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>):\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> in_code_block:\n                    current_block.append(line)\n                    blocks.append(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(current_block))\n                    current_block = []\n                    in_code_block = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> current_block:\n                        blocks.append(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(current_block))\n                        current_block = []\n                    current_block.append(line)\n                    in_code_block = \u003Cspan class=\"hljs-literal\">True\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> in_code_block:\n                current_block.append(line)\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Regular content block detection\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> line.strip() == \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> current_block:\n                    blocks.append(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(current_block))\n                    current_block = []\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                current_block.append(line)\n        \n        \u003Cspan class=\"hljs-comment\"># Don&#x27;t forget the last block\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> current_block:\n            blocks.append(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>.join(current_block))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> blocks\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_block_change\u003C/span>(\u003Cspan class=\"hljs-params\">self, old_block: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, new_block: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, block_index: \u003Cspan class=\"hljs-built_in\">int\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Analyze the nature of changes in a content block&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Calculate similarity metrics\u003C/span>\n        similarity = difflib.SequenceMatcher(\u003Cspan class=\"hljs-literal\">None\u003C/span>, old_block, new_block).ratio()\n        \n        \u003Cspan class=\"hljs-comment\"># Analyze change patterns\u003C/span>\n        old_words = old_block.split()\n        new_words = new_block.split()\n        \n        word_changes = \u003Cspan class=\"hljs-built_in\">list\u003C/span>(difflib.unified_diff(old_words, new_words, lineterm=\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>, n=\u003Cspan class=\"hljs-number\">0\u003C/span>))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;modification&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;block_index&#x27;\u003C/span>: block_index,\n            \u003Cspan class=\"hljs-string\">&#x27;similarity&#x27;\u003C/span>: similarity,\n            \u003Cspan class=\"hljs-string\">&#x27;old_word_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_words),\n            \u003Cspan class=\"hljs-string\">&#x27;new_word_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_words),\n            \u003Cspan class=\"hljs-string\">&#x27;semantic_type&#x27;\u003C/span>: self.classify_block_type(new_block),\n            \u003Cspan class=\"hljs-string\">&#x27;change_magnitude&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;major&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> similarity &lt; \u003Cspan class=\"hljs-number\">0.5\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;minor&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> similarity &lt; \u003Cspan class=\"hljs-number\">0.8\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;minimal&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;word_level_diff&#x27;\u003C/span>: word_changes[:\u003Cspan class=\"hljs-number\">10\u003C/span>]  \u003Cspan class=\"hljs-comment\"># Limit for performance\u003C/span>\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">classify_block_type\u003C/span>(\u003Cspan class=\"hljs-params\">self, block: \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;Classify the semantic type of a content block&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> block.strip().startswith(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;code_block&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^#{1,6}\\s&#x27;\u003C/span>, block.strip()):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;header&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^[-*+]\\s&#x27;\u003C/span>, block.strip()) \u003Cspan class=\"hljs-keyword\">or\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^\\d+\\.\\s&#x27;\u003C/span>, block.strip()):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;list&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> block.strip().startswith(\u003Cspan class=\"hljs-string\">&#x27;&gt;&#x27;\u003C/span>):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;blockquote&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^\\|.+\\|&#x27;\u003C/span>, block.strip()):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^---\\s*$&#x27;\u003C/span>, block.strip()):\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;frontmatter&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;paragraph&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_change_impact\u003C/span>(\u003Cspan class=\"hljs-params\">self, old_structure: \u003Cspan class=\"hljs-type\">Dict\u003C/span>, new_structure: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Analyze the impact of structural changes&quot;&quot;&quot;\u003C/span>\n        impact = {\n            \u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;affected_sections&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;reader_impact&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;minimal&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;recommendations&#x27;\u003C/span>: []\n        }\n        \n        \u003Cspan class=\"hljs-comment\"># Analyze header changes impact\u003C/span>\n        old_headers = [h[\u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">for\u003C/span> h \u003Cspan class=\"hljs-keyword\">in\u003C/span> old_structure[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>]]\n        new_headers = [h[\u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">for\u003C/span> h \u003Cspan class=\"hljs-keyword\">in\u003C/span> new_structure[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>]]\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> old_headers != new_headers:\n            impact[\u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>] = \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>\n            impact[\u003Cspan class=\"hljs-string\">&#x27;affected_sections&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;document_structure&#x27;\u003C/span>)\n            impact[\u003Cspan class=\"hljs-string\">&#x27;reader_impact&#x27;\u003C/span>] = \u003Cspan class=\"hljs-string\">&#x27;moderate&#x27;\u003C/span>\n            impact[\u003Cspan class=\"hljs-string\">&#x27;recommendations&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;Review table of contents and internal links&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Analyze link changes impact\u003C/span>\n        old_link_count = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_structure[\u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>])\n        new_link_count = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_structure[\u003Cspan class=\"hljs-string\">&#x27;links&#x27;\u003C/span>])\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">abs\u003C/span>(old_link_count - new_link_count) &gt; \u003Cspan class=\"hljs-number\">5\u003C/span>:\n            impact[\u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>] = \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>\n            impact[\u003Cspan class=\"hljs-string\">&#x27;affected_sections&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;external_references&#x27;\u003C/span>)\n            impact[\u003Cspan class=\"hljs-string\">&#x27;recommendations&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;Verify all external links are functional&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Code block changes\u003C/span>\n        old_code_count = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(old_structure[\u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>])\n        new_code_count = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(new_structure[\u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>])\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">abs\u003C/span>(old_code_count - new_code_count) &gt; \u003Cspan class=\"hljs-number\">3\u003C/span>:\n            impact[\u003Cspan class=\"hljs-string\">&#x27;affected_sections&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;technical_content&#x27;\u003C/span>)\n            impact[\u003Cspan class=\"hljs-string\">&#x27;recommendations&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;Review code examples for accuracy and completeness&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> impact\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_change_summary\u003C/span>(\u003Cspan class=\"hljs-params\">self, diff_analysis: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Generate human-readable summary of changes&quot;&quot;&quot;\u003C/span>\n        summary_parts = []\n        \n        \u003Cspan class=\"hljs-comment\"># Structure changes\u003C/span>\n        structure_diff = diff_analysis[\u003Cspan class=\"hljs-string\">&#x27;structure_diff&#x27;\u003C/span>]\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> structure_diff[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;outline_changed&#x27;\u003C/span>]:\n            header_changes = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(structure_diff[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;additions&#x27;\u003C/span>]) + \u003Cspan class=\"hljs-built_in\">len\u003C/span>(structure_diff[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;deletions&#x27;\u003C/span>])\n            summary_parts.append(\u003Cspan class=\"hljs-string\">f&quot;Document structure modified (\u003Cspan class=\"hljs-subst\">{header_changes}\u003C/span> header changes)&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Content changes\u003C/span>\n        content_diff = diff_analysis[\u003Cspan class=\"hljs-string\">&#x27;content_diff&#x27;\u003C/span>]\n        changed_blocks = content_diff[\u003Cspan class=\"hljs-string\">&#x27;changed_blocks&#x27;\u003C/span>]\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> changed_blocks &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>:\n            summary_parts.append(\u003Cspan class=\"hljs-string\">f&quot;Content updated (\u003Cspan class=\"hljs-subst\">{changed_blocks}\u003C/span> sections modified)&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Impact assessment\u003C/span>\n        impact = diff_analysis[\u003Cspan class=\"hljs-string\">&#x27;impact_analysis&#x27;\u003C/span>]\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> impact[\u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>] != \u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>:\n            summary_parts.append(\u003Cspan class=\"hljs-string\">f&quot;Impact level: \u003Cspan class=\"hljs-subst\">{impact[\u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> summary_parts:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Minor textual changes&quot;\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&quot;; &quot;\u003C/span>.join(summary_parts)\n\n\u003Cspan class=\"hljs-comment\"># Git integration utilities\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">GitMarkdownIntegration\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">__init__\u003C/span>(\u003Cspan class=\"hljs-params\">self, repo_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span> = \u003Cspan class=\"hljs-string\">&quot;.&quot;\u003C/span>\u003C/span>):\n        self.repo_path = Path(repo_path)\n        self.diff_engine = MarkdownDiffEngine()\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">setup_markdown_diff_driver\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Configure Git to use advanced Markdown diffing&quot;&quot;&quot;\u003C/span>\n        commands = [\n            \u003Cspan class=\"hljs-string\">&quot;git config diff.markdown.textconv &#x27;python3 markdown-to-text.py&#x27;&quot;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&quot;git config diff.markdown.cachetextconv true&quot;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&quot;echo &#x27;*.md diff=markdown&#x27; &gt;&gt; .gitattributes&quot;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&quot;echo &#x27;*.markdown diff=markdown&#x27; &gt;&gt; .gitattributes&quot;\u003C/span>\n        ]\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> cmd \u003Cspan class=\"hljs-keyword\">in\u003C/span> commands:\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n                subprocess.run(cmd, shell=\u003Cspan class=\"hljs-literal\">True\u003C/span>, cwd=self.repo_path, check=\u003Cspan class=\"hljs-literal\">True\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">except\u003C/span> subprocess.CalledProcessError \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n                \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Warning: Failed to execute \u003Cspan class=\"hljs-subst\">{cmd}\u003C/span>: \u003Cspan class=\"hljs-subst\">{e}\u003C/span>&quot;\u003C/span>)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">get_file_changes\u003C/span>(\u003Cspan class=\"hljs-params\">self, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, commit_range: \u003Cspan class=\"hljs-built_in\">str\u003C/span> = \u003Cspan class=\"hljs-string\">&quot;HEAD~1..HEAD&quot;\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Get detailed changes for a specific Markdown file&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-comment\"># Get the old and new versions\u003C/span>\n            old_content = self.get_file_at_commit(file_path, \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{commit_range.split(\u003Cspan class=\"hljs-string\">&#x27;..&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">0\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n            new_content = self.get_file_at_commit(file_path, \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{commit_range.split(\u003Cspan class=\"hljs-string\">&#x27;..&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">1\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-comment\"># Analyze changes\u003C/span>\n            diff_analysis = self.diff_engine.analyze_structural_changes(old_content, new_content)\n            \n            \u003Cspan class=\"hljs-comment\"># Get Git metadata\u003C/span>\n            git_info = self.get_commit_info(commit_range.split(\u003Cspan class=\"hljs-string\">&#x27;..&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">1\u003C/span>])\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-string\">&#x27;file_path&#x27;\u003C/span>: file_path,\n                \u003Cspan class=\"hljs-string\">&#x27;commit_range&#x27;\u003C/span>: commit_range,\n                \u003Cspan class=\"hljs-string\">&#x27;git_info&#x27;\u003C/span>: git_info,\n                \u003Cspan class=\"hljs-string\">&#x27;diff_analysis&#x27;\u003C/span>: diff_analysis,\n                \u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>: self.diff_engine.generate_change_summary(diff_analysis)\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;error&#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_\">get_file_at_commit\u003C/span>(\u003Cspan class=\"hljs-params\">self, file_path: \u003Cspan class=\"hljs-built_in\">str\u003C/span>, commit: \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;Get file content at specific commit&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            result = subprocess.run(\n                [\u003Cspan class=\"hljs-string\">&quot;git&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;show&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{commit}\u003C/span>:\u003Cspan class=\"hljs-subst\">{file_path}\u003C/span>&quot;\u003C/span>],\n                capture_output=\u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                text=\u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                cwd=self.repo_path,\n                check=\u003Cspan class=\"hljs-literal\">True\u003C/span>\n            )\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> result.stdout\n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> subprocess.CalledProcessError:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">get_commit_info\u003C/span>(\u003Cspan class=\"hljs-params\">self, commit: \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;Get commit metadata&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            result = subprocess.run(\n                [\u003Cspan class=\"hljs-string\">&quot;git&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;show&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;--format=%H|%an|%ae|%ad|%s&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;--no-patch&quot;\u003C/span>, commit],\n                capture_output=\u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                text=\u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                cwd=self.repo_path,\n                check=\u003Cspan class=\"hljs-literal\">True\u003C/span>\n            )\n            \n            parts = result.stdout.strip().split(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-string\">&#x27;hash&#x27;\u003C/span>: parts[\u003Cspan class=\"hljs-number\">0\u003C/span>],\n                \u003Cspan class=\"hljs-string\">&#x27;author&#x27;\u003C/span>: parts[\u003Cspan class=\"hljs-number\">1\u003C/span>],\n                \u003Cspan class=\"hljs-string\">&#x27;email&#x27;\u003C/span>: parts[\u003Cspan class=\"hljs-number\">2\u003C/span>],\n                \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>: parts[\u003Cspan class=\"hljs-number\">3\u003C/span>],\n                \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: parts[\u003Cspan class=\"hljs-number\">4\u003C/span>] \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(parts) &gt; \u003Cspan class=\"hljs-number\">4\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>\n            }\n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> subprocess.CalledProcessError:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {}\n\n\u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">demonstrate_markdown_diff\u003C/span>():\n    \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Demonstrate advanced Markdown diffing capabilities&quot;&quot;&quot;\u003C/span>\n    \u003Cspan class=\"hljs-comment\"># Sample old content\u003C/span>\n    old_content = \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;---\ntitle: &quot;Sample Document&quot;\ndate: 2024-01-01\n---\n\n# Introduction\n\nThis is the original content.\n\n## Features\n\n- Original feature 1\n- Original feature 2\n\n```python\ndef old_function():\n    return &quot;old implementation&quot;\u003C/span>\n\u003C/code>\u003C/pre>\u003Cp>\u003Ca href=\"https://old-example.com\">Old Link\u003C/a>\u003Cbr>&quot;&quot;&quot;\u003C/p>\n\u003Cpre>\u003Ccode># Sample new content\nnew_content = &quot;&quot;&quot;---\n\u003C/code>\u003C/pre>\u003Ch2 id=\"title-sample-document---updateddate-2024-12-07author-documentation-team\">title: &quot;Sample Document - Updated&quot;\u003Cbr>date: 2024-12-07\u003Cbr>author: &quot;Documentation Team&quot;\u003C/h2>\n\u003Ch1 id=\"introduction\">Introduction\u003C/h1>\n\u003Cp>This is the updated content with improvements.\u003C/p>\n\u003Ch2 id=\"enhanced-features\">Enhanced Features\u003C/h2>\n\u003Cul>\n\u003Cli>Enhanced feature 1\u003C/li>\n\u003Cli>Enhanced feature 2  \u003C/li>\n\u003Cli>New feature 3\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"implementation\">Implementation\u003C/h2>\n\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">enhanced_function\u003C/span>():\n    \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Enhanced implementation with documentation&quot;&quot;&quot;\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&quot;improved implementation&quot;\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"resources\">Resources\u003C/h2>\n\u003Cp>\u003Ca href=\"https://new-example.com\">Updated Link\u003C/a>\u003Cbr>\u003Ca href=\"https://additional-resource.com\">Additional Resource\u003C/a>\u003Cbr>&quot;&quot;&quot;\u003C/p>\n\u003Cpre>\u003Ccode># Analyze changes\nengine = MarkdownDiffEngine()\nanalysis = engine.analyze_structural_changes(old_content, new_content)\n\nprint(&quot;=== Markdown Diff Analysis ===&quot;)\nprint(f&quot;Summary: {engine.generate_change_summary(analysis)}&quot;)\nprint(f&quot;Impact Severity: {analysis[&#39;impact_analysis&#39;][&#39;severity&#39;]}&quot;)\nprint(f&quot;Affected Sections: {&#39;, &#39;.join(analysis[&#39;impact_analysis&#39;][&#39;affected_sections&#39;])}&quot;)\n\nif analysis[&#39;structure_diff&#39;][&#39;headers&#39;][&#39;outline_changed&#39;]:\n    print(&quot;\\nHeader Changes:&quot;)\n    print(f&quot;  Added: {analysis[&#39;structure_diff&#39;][&#39;headers&#39;][&#39;additions&#39;]}&quot;)\n    print(f&quot;  Removed: {analysis[&#39;structure_diff&#39;][&#39;headers&#39;][&#39;deletions&#39;]}&quot;)\n\nprint(f&quot;\\nContent Analysis:&quot;)\nprint(f&quot;  Blocks changed: {analysis[&#39;content_diff&#39;][&#39;changed_blocks&#39;]}&quot;)\nprint(f&quot;  Total blocks: {analysis[&#39;content_diff&#39;][&#39;total_blocks_new&#39;]}&quot;)\n\u003C/code>\u003C/pre>\u003Cp>if \u003Cstrong>name\u003C/strong> == &quot;\u003Cstrong>main\u003C/strong>&quot;:\u003Cbr>    demonstrate_markdown_diff()\u003C/p>\n\u003Cpre>\u003Ccode>\n## Automated Patch Management\n\n### Intelligent Patch Application\n\nAdvanced patch handling that understands Markdown structure:\n\n```bash\n#!/bin/bash\n# apply-markdown-patch.sh - Intelligent Markdown patch application\n\nset -e\n\nPATCH_FILE=&quot;$1&quot;\nTARGET_FILE=&quot;$2&quot;\n\nif [ ! -f &quot;$PATCH_FILE&quot; ]; then\n    echo &quot;Error: Patch file not found: $PATCH_FILE&quot;\n    exit 1\nfi\n\nif [ ! -f &quot;$TARGET_FILE&quot; ]; then\n    echo &quot;Error: Target file not found: $TARGET_FILE&quot;\n    exit 1\nfi\n\necho &quot;Applying Markdown-aware patch to $TARGET_FILE...&quot;\n\n# Create backup\ncp &quot;$TARGET_FILE&quot; &quot;${TARGET_FILE}.backup&quot;\n\n# Try standard patch first\nif patch --dry-run -p1 &lt; &quot;$PATCH_FILE&quot; &gt;/dev/null 2&gt;&amp;1; then\n    patch -p1 &lt; &quot;$PATCH_FILE&quot;\n    echo &quot;✅ Patch applied successfully&quot;\nelse\n    echo &quot;⚠️  Standard patch failed, attempting intelligent merge...&quot;\n    \n    # Use custom merge logic\n    python3 - &lt;&lt; EOF\nimport sys\nimport re\nfrom pathlib import Path\n\ndef intelligent_patch_merge():\n    # Implementation of smart merge logic\n    # This would include the MarkdownDiffEngine logic\n    pass\n\nintelligent_patch_merge()\nEOF\nfi\n\n# Validate result\nif python3 -c &quot;\nimport markdown\ntry:\n    with open(&#39;$TARGET_FILE&#39;, &#39;r&#39;) as f:\n        content = f.read()\n    markdown.markdown(content)\n    print(&#39;✅ Markdown validation passed&#39;)\nexcept Exception as e:\n    print(f&#39;❌ Markdown validation failed: {e}&#39;)\n    sys.exit(1)\n&quot;; then\n    # Clean up backup\n    rm &quot;${TARGET_FILE}.backup&quot;\nelse\n    # Restore backup\n    mv &quot;${TARGET_FILE}.backup&quot; &quot;$TARGET_FILE&quot;\n    echo &quot;❌ Patch application failed, file restored&quot;\n    exit 1\nfi\n\u003C/code>\u003C/pre>\u003Ch3 id=\"collaborative-patch-workflows\">Collaborative Patch Workflows\u003C/h3>\n\u003Cp>Implementing team-based patch management systems:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-yaml\">\u003Cspan class=\"hljs-comment\"># .github/workflows/markdown-patch-review.yml - Automated patch review workflow\u003C/span>\n\u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Markdown\u003C/span> \u003Cspan class=\"hljs-string\">Patch\u003C/span> \u003Cspan class=\"hljs-string\">Review\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">on:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">pull_request:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;**/*.md&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;**/*.markdown&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">jobs:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">analyze-markdown-changes:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">code\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \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\">Python\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-python@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\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-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        pip install markdown difflib pathlib\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Analyze\u003C/span> \u003Cspan class=\"hljs-string\">Markdown\u003C/span> \u003Cspan class=\"hljs-string\">changes\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python3 scripts/analyze-pr-changes.py \\\n          --base-ref ${{ github.event.pull_request.base.sha }} \\\n          --head-ref ${{ github.event.pull_request.head.sha }} \\\n          --output-format json &gt; changes-analysis.json\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\">change\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python3 scripts/generate-change-report.py \\\n          --analysis changes-analysis.json \\\n          --template templates/change-report.md \\\n          --output pr-change-report.md\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Comment\u003C/span> \u003Cspan class=\"hljs-string\">on\u003C/span> \u003Cspan class=\"hljs-string\">PR\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/github-script@v6\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">script:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          const fs = require(&#x27;fs&#x27;);\n          const report = fs.readFileSync(&#x27;pr-change-report.md&#x27;, &#x27;utf8&#x27;);\n\u003C/span>          \n          \u003Cspan class=\"hljs-string\">github.rest.issues.createComment({\u003C/span>\n            \u003Cspan class=\"hljs-attr\">issue_number:\u003C/span> \u003Cspan class=\"hljs-string\">context.issue.number,\u003C/span>\n            \u003Cspan class=\"hljs-attr\">owner:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.owner,\u003C/span>\n            \u003Cspan class=\"hljs-attr\">repo:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.repo,\u003C/span>\n            \u003Cspan class=\"hljs-attr\">body:\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n          \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\">Check\u003C/span> \u003Cspan class=\"hljs-string\">for\u003C/span> \u003Cspan class=\"hljs-string\">breaking\u003C/span> \u003Cspan class=\"hljs-string\">changes\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        if python3 scripts/check-breaking-changes.py changes-analysis.json; then\n          echo &quot;✅ No breaking changes detected&quot;\n        else\n          echo &quot;⚠️ Potential breaking changes detected&quot;\n          echo &quot;breaking_changes=true&quot; &gt;&gt; $GITHUB_OUTPUT\n        fi\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\">analysis\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\">markdown-change-analysis\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          changes-analysis.json\n          pr-change-report.md\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"integration-with-documentation-systems\">Integration with Documentation Systems\u003C/h2>\n\u003Cp>Markdown diff and patch techniques integrate seamlessly with modern documentation workflows. When combined with \u003Ca href=\"/blog/markdown-automation-workflows-complete-guide\">automation systems and CI/CD pipelines\u003C/a>, intelligent diff processing ensures that content changes maintain quality and consistency across large documentation repositories while providing detailed change tracking for editorial review processes.\u003C/p>\n\u003Cp>For comprehensive content management, diff strategies work effectively with \u003Ca href=\"/blog/markdown-link-management-cross-referencing-complete-guide\">link management and cross-referencing systems\u003C/a> to detect when structural changes affect internal navigation, cross-references, and content relationships, enabling automated updates to maintain content integrity across complex document hierarchies.\u003C/p>\n\u003Cp>When building sophisticated documentation platforms, version control integration complements \u003Ca href=\"/blog/markdown-progressive-web-app-documentation-complete-guide\">Progressive Web App documentation systems\u003C/a> by enabling automated deployment pipelines that track content changes, update offline caches intelligently based on change significance, and coordinate releases between content updates and application functionality.\u003C/p>\n\u003Ch2 id=\"advanced-workflow-integration\">Advanced Workflow Integration\u003C/h2>\n\u003Ch3 id=\"automated-change-classification\">Automated Change Classification\u003C/h3>\n\u003Cp>Implementing intelligent change categorization for documentation workflows:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-comment\"># change_classifier.py - Automated change classification system\u003C/span>\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> json\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\">Tuple\u003C/span>\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> dataclasses \u003Cspan class=\"hljs-keyword\">import\u003C/span> dataclass\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> enum \u003Cspan class=\"hljs-keyword\">import\u003C/span> Enum\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">ChangeCategory\u003C/span>(\u003Cspan class=\"hljs-title class_ inherited__\">Enum\u003C/span>):\n    EDITORIAL = \u003Cspan class=\"hljs-string\">&quot;editorial&quot;\u003C/span>  \u003Cspan class=\"hljs-comment\"># Grammar, style, formatting\u003C/span>\n    STRUCTURAL = \u003Cspan class=\"hljs-string\">&quot;structural&quot;\u003C/span>  \u003Cspan class=\"hljs-comment\"># Headers, organization, layout\u003C/span>\n    CONTENT = \u003Cspan class=\"hljs-string\">&quot;content&quot;\u003C/span>  \u003Cspan class=\"hljs-comment\"># New information, facts, examples\u003C/span>\n    TECHNICAL = \u003Cspan class=\"hljs-string\">&quot;technical&quot;\u003C/span>  \u003Cspan class=\"hljs-comment\"># Code, APIs, technical details\u003C/span>\n    REFERENCE = \u003Cspan class=\"hljs-string\">&quot;reference&quot;\u003C/span>  \u003Cspan class=\"hljs-comment\"># Links, citations, external resources\u003C/span>\n    BREAKING = \u003Cspan class=\"hljs-string\">&quot;breaking&quot;\u003C/span>  \u003Cspan class=\"hljs-comment\"># Changes that affect functionality/understanding\u003C/span>\n\n\u003Cspan class=\"hljs-meta\">@dataclass\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">ClassifiedChange\u003C/span>:\n    category: ChangeCategory\n    confidence: \u003Cspan class=\"hljs-built_in\">float\u003C/span>\n    description: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    impact_level: \u003Cspan class=\"hljs-built_in\">str\u003C/span>\n    review_required: \u003Cspan class=\"hljs-built_in\">bool\u003C/span>\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownChangeClassifier\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">__init__\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        self.classification_rules = {\n            ChangeCategory.EDITORIAL: {\n                \u003Cspan class=\"hljs-string\">&#x27;patterns&#x27;\u003C/span>: [\n                    \u003Cspan class=\"hljs-string\">r&#x27;\\b(typo|grammar|spelling|punctuation)\\b&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;\\b(formatting|style|appearance)\\b&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;(fix|correct|improve) (text|wording|language)&#x27;\u003C/span>\n                ],\n                \u003Cspan class=\"hljs-string\">&#x27;indicators&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;punctuation_change&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;case_change&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;whitespace_only&#x27;\u003C/span>]\n            },\n            ChangeCategory.STRUCTURAL: {\n                \u003Cspan class=\"hljs-string\">&#x27;patterns&#x27;\u003C/span>: [\n                    \u003Cspan class=\"hljs-string\">r&#x27;(add|remove|move|reorganize) (section|header|chapter)&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;(restructure|reorder|rearrange)&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;(table of contents|navigation|outline)&#x27;\u003C/span>\n                ],\n                \u003Cspan class=\"hljs-string\">&#x27;indicators&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;header_level_change&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;section_move&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;toc_update&#x27;\u003C/span>]\n            },\n            ChangeCategory.CONTENT: {\n                \u003Cspan class=\"hljs-string\">&#x27;patterns&#x27;\u003C/span>: [\n                    \u003Cspan class=\"hljs-string\">r&#x27;(add|include|introduce) (new|additional) (information|content)&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;(update|revise|modify) (content|information)&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;(expand|elaborate|detail)&#x27;\u003C/span>\n                ],\n                \u003Cspan class=\"hljs-string\">&#x27;indicators&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;paragraph_addition&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;list_expansion&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;content_block_new&#x27;\u003C/span>]\n            },\n            ChangeCategory.TECHNICAL: {\n                \u003Cspan class=\"hljs-string\">&#x27;patterns&#x27;\u003C/span>: [\n                    \u003Cspan class=\"hljs-string\">r&#x27;(code|function|method|API|endpoint)&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;(algorithm|implementation|solution)&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;(version|update|deprecated|compatibility)&#x27;\u003C/span>\n                ],\n                \u003Cspan class=\"hljs-string\">&#x27;indicators&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;code_block_change&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;api_reference&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;version_number&#x27;\u003C/span>]\n            },\n            ChangeCategory.REFERENCE: {\n                \u003Cspan class=\"hljs-string\">&#x27;patterns&#x27;\u003C/span>: [\n                    \u003Cspan class=\"hljs-string\">r&#x27;(link|URL|reference|citation)&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;(source|documentation|external)&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;(footnote|bibliography|appendix)&#x27;\u003C/span>\n                ],\n                \u003Cspan class=\"hljs-string\">&#x27;indicators&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;link_addition&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;link_removal&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;reference_update&#x27;\u003C/span>]\n            },\n            ChangeCategory.BREAKING: {\n                \u003Cspan class=\"hljs-string\">&#x27;patterns&#x27;\u003C/span>: [\n                    \u003Cspan class=\"hljs-string\">r&#x27;(remove|delete|deprecate) (feature|method|section)&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;(breaking|incompatible|major) change&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">r&#x27;(no longer|not supported|discontinued)&#x27;\u003C/span>\n                ],\n                \u003Cspan class=\"hljs-string\">&#x27;indicators&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;api_removal&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;major_restructure&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;compatibility_break&#x27;\u003C/span>]\n            }\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">classify_changes\u003C/span>(\u003Cspan class=\"hljs-params\">self, change_analysis: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[ClassifiedChange]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Classify changes based on analysis results&quot;&quot;&quot;\u003C/span>\n        classifications = []\n        \n        \u003Cspan class=\"hljs-comment\"># Analyze structure changes\u003C/span>\n        structure_changes = self.classify_structure_changes(change_analysis.get(\u003Cspan class=\"hljs-string\">&#x27;structure_diff&#x27;\u003C/span>, {}))\n        classifications.extend(structure_changes)\n        \n        \u003Cspan class=\"hljs-comment\"># Analyze content changes\u003C/span>\n        content_changes = self.classify_content_changes(change_analysis.get(\u003Cspan class=\"hljs-string\">&#x27;content_diff&#x27;\u003C/span>, {}))\n        classifications.extend(content_changes)\n        \n        \u003Cspan class=\"hljs-comment\"># Analyze impact\u003C/span>\n        impact_changes = self.classify_impact_changes(change_analysis.get(\u003Cspan class=\"hljs-string\">&#x27;impact_analysis&#x27;\u003C/span>, {}))\n        classifications.extend(impact_changes)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> classifications\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">classify_structure_changes\u003C/span>(\u003Cspan class=\"hljs-params\">self, structure_diff: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[ClassifiedChange]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Classify structural changes&quot;&quot;&quot;\u003C/span>\n        changes = []\n        \n        \u003Cspan class=\"hljs-comment\"># Header changes\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> structure_diff.get(\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>, {}).get(\u003Cspan class=\"hljs-string\">&#x27;outline_changed&#x27;\u003C/span>, \u003Cspan class=\"hljs-literal\">False\u003C/span>):\n            severity = self.calculate_header_change_severity(structure_diff[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>])\n            changes.append(ClassifiedChange(\n                category=ChangeCategory.STRUCTURAL,\n                confidence=\u003Cspan class=\"hljs-number\">0.9\u003C/span>,\n                description=\u003Cspan class=\"hljs-string\">&quot;Document outline structure modified&quot;\u003C/span>,\n                impact_level=severity,\n                review_required=severity \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span>]\n            ))\n        \n        \u003Cspan class=\"hljs-comment\"># Code block changes\u003C/span>\n        code_changes = structure_diff.get(\u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>, {})\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> code_changes.get(\u003Cspan class=\"hljs-string\">&#x27;count_changed&#x27;\u003C/span>, \u003Cspan class=\"hljs-literal\">False\u003C/span>) \u003Cspan class=\"hljs-keyword\">or\u003C/span> code_changes.get(\u003Cspan class=\"hljs-string\">&#x27;language_changes&#x27;\u003C/span>, \u003Cspan class=\"hljs-literal\">False\u003C/span>):\n            changes.append(ClassifiedChange(\n                category=ChangeCategory.TECHNICAL,\n                confidence=\u003Cspan class=\"hljs-number\">0.85\u003C/span>,\n                description=\u003Cspan class=\"hljs-string\">&quot;Code examples or technical content updated&quot;\u003C/span>,\n                impact_level=\u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n                review_required=\u003Cspan class=\"hljs-literal\">True\u003C/span>\n            ))\n        \n        \u003Cspan class=\"hljs-comment\"># Reference changes\u003C/span>\n        ref_changes = structure_diff.get(\u003Cspan class=\"hljs-string\">&#x27;references&#x27;\u003C/span>, {})\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> ref_changes.get(\u003Cspan class=\"hljs-string\">&#x27;links_changed&#x27;\u003C/span>, \u003Cspan class=\"hljs-literal\">False\u003C/span>):\n            link_impact = \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">abs\u003C/span>(ref_changes.get(\u003Cspan class=\"hljs-string\">&#x27;old_link_count&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>) - ref_changes.get(\u003Cspan class=\"hljs-string\">&#x27;new_link_count&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>)) &gt; \u003Cspan class=\"hljs-number\">5\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>\n            changes.append(ClassifiedChange(\n                category=ChangeCategory.REFERENCE,\n                confidence=\u003Cspan class=\"hljs-number\">0.8\u003C/span>,\n                description=\u003Cspan class=\"hljs-string\">&quot;External references or links modified&quot;\u003C/span>,\n                impact_level=link_impact,\n                review_required=link_impact == \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>\n            ))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> changes\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">classify_content_changes\u003C/span>(\u003Cspan class=\"hljs-params\">self, content_diff: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[ClassifiedChange]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Classify content-level changes&quot;&quot;&quot;\u003C/span>\n        changes = []\n        \n        changed_blocks = content_diff.get(\u003Cspan class=\"hljs-string\">&#x27;changed_blocks&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>)\n        total_blocks = content_diff.get(\u003Cspan class=\"hljs-string\">&#x27;total_blocks_new&#x27;\u003C/span>, \u003Cspan class=\"hljs-number\">1\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> changed_blocks &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>:\n            change_ratio = changed_blocks / total_blocks\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> change_ratio &gt; \u003Cspan class=\"hljs-number\">0.7\u003C/span>:\n                changes.append(ClassifiedChange(\n                    category=ChangeCategory.CONTENT,\n                    confidence=\u003Cspan class=\"hljs-number\">0.9\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&quot;Major content revision - significant rewrite&quot;\u003C/span>,\n                    impact_level=\u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n                    review_required=\u003Cspan class=\"hljs-literal\">True\u003C/span>\n                ))\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> change_ratio &gt; \u003Cspan class=\"hljs-number\">0.3\u003C/span>:\n                changes.append(ClassifiedChange(\n                    category=ChangeCategory.CONTENT,\n                    confidence=\u003Cspan class=\"hljs-number\">0.8\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&quot;Moderate content updates&quot;\u003C/span>,\n                    impact_level=\u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n                    review_required=\u003Cspan class=\"hljs-literal\">True\u003C/span>\n                ))\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                changes.append(ClassifiedChange(\n                    category=ChangeCategory.EDITORIAL,\n                    confidence=\u003Cspan class=\"hljs-number\">0.7\u003C/span>,\n                    description=\u003Cspan class=\"hljs-string\">&quot;Minor content adjustments&quot;\u003C/span>,\n                    impact_level=\u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>,\n                    review_required=\u003Cspan class=\"hljs-literal\">False\u003C/span>\n                ))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> changes\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">classify_impact_changes\u003C/span>(\u003Cspan class=\"hljs-params\">self, impact_analysis: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">List\u003C/span>[ClassifiedChange]:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Classify changes based on impact analysis&quot;&quot;&quot;\u003C/span>\n        changes = []\n        \n        severity = impact_analysis.get(\u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>)\n        affected_sections = impact_analysis.get(\u003Cspan class=\"hljs-string\">&#x27;affected_sections&#x27;\u003C/span>, [])\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;document_structure&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> affected_sections:\n            changes.append(ClassifiedChange(\n                category=ChangeCategory.BREAKING \u003Cspan class=\"hljs-keyword\">if\u003C/span> severity == \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> ChangeCategory.STRUCTURAL,\n                confidence=\u003Cspan class=\"hljs-number\">0.85\u003C/span>,\n                description=\u003Cspan class=\"hljs-string\">&quot;Document structure changes may affect navigation&quot;\u003C/span>,\n                impact_level=severity,\n                review_required=severity != \u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>\n            ))\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;external_references&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> affected_sections:\n            changes.append(ClassifiedChange(\n                category=ChangeCategory.REFERENCE,\n                confidence=\u003Cspan class=\"hljs-number\">0.8\u003C/span>,\n                description=\u003Cspan class=\"hljs-string\">&quot;External references require validation&quot;\u003C/span>,\n                impact_level=\u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n                review_required=\u003Cspan class=\"hljs-literal\">True\u003C/span>\n            ))\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;technical_content&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> affected_sections:\n            changes.append(ClassifiedChange(\n                category=ChangeCategory.TECHNICAL,\n                confidence=\u003Cspan class=\"hljs-number\">0.9\u003C/span>,\n                description=\u003Cspan class=\"hljs-string\">&quot;Technical content changes need expert review&quot;\u003C/span>,\n                impact_level=\u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n                review_required=\u003Cspan class=\"hljs-literal\">True\u003C/span>\n            ))\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> changes\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">calculate_header_change_severity\u003C/span>(\u003Cspan class=\"hljs-params\">self, header_changes: \u003Cspan class=\"hljs-type\">Dict\u003C/span>\u003C/span>) -&gt; \u003Cspan class=\"hljs-built_in\">str\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Calculate severity of header structure changes&quot;&quot;&quot;\u003C/span>\n        additions = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(header_changes.get(\u003Cspan class=\"hljs-string\">&#x27;additions&#x27;\u003C/span>, []))\n        deletions = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(header_changes.get(\u003Cspan class=\"hljs-string\">&#x27;deletions&#x27;\u003C/span>, []))\n        \n        total_changes = additions + deletions\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> total_changes &gt; \u003Cspan class=\"hljs-number\">10\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> total_changes &gt; \u003Cspan class=\"hljs-number\">5\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> total_changes &gt; \u003Cspan class=\"hljs-number\">2\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_review_recommendations\u003C/span>(\u003Cspan class=\"hljs-params\">self, classifications: \u003Cspan class=\"hljs-type\">List\u003C/span>[ClassifiedChange]\u003C/span>) -&gt; \u003Cspan class=\"hljs-type\">Dict\u003C/span>:\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Generate actionable review recommendations&quot;&quot;&quot;\u003C/span>\n        recommendations = {\n            \u003Cspan class=\"hljs-string\">&#x27;required_reviews&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;automated_checks&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;priority_level&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;estimated_review_time&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;&lt; 15 minutes&#x27;\u003C/span>\n        }\n        \n        requires_review = [c \u003Cspan class=\"hljs-keyword\">for\u003C/span> c \u003Cspan class=\"hljs-keyword\">in\u003C/span> classifications \u003Cspan class=\"hljs-keyword\">if\u003C/span> c.review_required]\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(c.category == ChangeCategory.BREAKING \u003Cspan class=\"hljs-keyword\">for\u003C/span> c \u003Cspan class=\"hljs-keyword\">in\u003C/span> classifications):\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;priority_level&#x27;\u003C/span>] = \u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span>\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;estimated_review_time&#x27;\u003C/span>] = \u003Cspan class=\"hljs-string\">&#x27;&gt; 60 minutes&#x27;\u003C/span>\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;required_reviews&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;Breaking changes require senior review&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(c.impact_level == \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">for\u003C/span> c \u003Cspan class=\"hljs-keyword\">in\u003C/span> classifications):\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;priority_level&#x27;\u003C/span>] = \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;estimated_review_time&#x27;\u003C/span>] = \u003Cspan class=\"hljs-string\">&#x27;30-60 minutes&#x27;\u003C/span>\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;required_reviews&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;High-impact changes need careful review&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> requires_review:\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;priority_level&#x27;\u003C/span>] = \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;estimated_review_time&#x27;\u003C/span>] = \u003Cspan class=\"hljs-string\">&#x27;15-30 minutes&#x27;\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Add specific recommendations based on change types\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(c.category == ChangeCategory.TECHNICAL \u003Cspan class=\"hljs-keyword\">for\u003C/span> c \u003Cspan class=\"hljs-keyword\">in\u003C/span> classifications):\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;required_reviews&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;Technical expert review required&#x27;\u003C/span>)\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;automated_checks&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;Run code example validation&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(c.category == ChangeCategory.REFERENCE \u003Cspan class=\"hljs-keyword\">for\u003C/span> c \u003Cspan class=\"hljs-keyword\">in\u003C/span> classifications):\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;automated_checks&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;Verify external links&#x27;\u003C/span>)\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;automated_checks&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;Check citation formatting&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(c.category == ChangeCategory.STRUCTURAL \u003Cspan class=\"hljs-keyword\">for\u003C/span> c \u003Cspan class=\"hljs-keyword\">in\u003C/span> classifications):\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;automated_checks&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;Update table of contents&#x27;\u003C/span>)\n            recommendations[\u003Cspan class=\"hljs-string\">&#x27;automated_checks&#x27;\u003C/span>].append(\u003Cspan class=\"hljs-string\">&#x27;Validate internal links&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> recommendations\n\n\u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">demonstrate_change_classification\u003C/span>():\n    \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Demonstrate automated change classification&quot;&quot;&quot;\u003C/span>\n    \u003Cspan class=\"hljs-comment\"># Sample change analysis (would come from MarkdownDiffEngine)\u003C/span>\n    sample_analysis = {\n        \u003Cspan class=\"hljs-string\">&#x27;structure_diff&#x27;\u003C/span>: {\n            \u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;outline_changed&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;additions&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;New Feature Overview&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Implementation Guide&#x27;\u003C/span>],\n                \u003Cspan class=\"hljs-string\">&#x27;deletions&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;Legacy Information&#x27;\u003C/span>]\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;code_blocks&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;count_changed&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;old_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">3\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;new_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">5\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;language_changes&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;references&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;links_changed&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;old_link_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">8\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;new_link_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">12\u003C/span>\n            }\n        },\n        \u003Cspan class=\"hljs-string\">&#x27;content_diff&#x27;\u003C/span>: {\n            \u003Cspan class=\"hljs-string\">&#x27;total_blocks_old&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">15\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;total_blocks_new&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">20\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;changed_blocks&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">8\u003C/span>\n        },\n        \u003Cspan class=\"hljs-string\">&#x27;impact_analysis&#x27;\u003C/span>: {\n            \u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;affected_sections&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;document_structure&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;technical_content&#x27;\u003C/span>],\n            \u003Cspan class=\"hljs-string\">&#x27;reader_impact&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;moderate&#x27;\u003C/span>\n        }\n    }\n    \n    classifier = MarkdownChangeClassifier()\n    classifications = classifier.classify_changes(sample_analysis)\n    recommendations = classifier.generate_review_recommendations(classifications)\n    \n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;=== Change Classification Results ===&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-keyword\">for\u003C/span> classification \u003Cspan class=\"hljs-keyword\">in\u003C/span> classifications:\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Category: \u003Cspan class=\"hljs-subst\">{classification.category.value}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  Description: \u003Cspan class=\"hljs-subst\">{classification.description}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  Impact: \u003Cspan class=\"hljs-subst\">{classification.impact_level}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  Review Required: \u003Cspan class=\"hljs-subst\">{classification.review_required}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  Confidence: \u003Cspan class=\"hljs-subst\">{classification.confidence:\u003Cspan class=\"hljs-number\">.2\u003C/span>f}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>()\n    \n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;=== Review Recommendations ===&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Priority: \u003Cspan class=\"hljs-subst\">{recommendations[\u003Cspan class=\"hljs-string\">&#x27;priority_level&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Estimated Time: \u003Cspan class=\"hljs-subst\">{recommendations[\u003Cspan class=\"hljs-string\">&#x27;estimated_review_time&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;Required Reviews:&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-keyword\">for\u003C/span> review \u003Cspan class=\"hljs-keyword\">in\u003C/span> recommendations[\u003Cspan class=\"hljs-string\">&#x27;required_reviews&#x27;\u003C/span>]:\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  - \u003Cspan class=\"hljs-subst\">{review}\u003C/span>&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;Automated Checks:&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-keyword\">for\u003C/span> check \u003Cspan class=\"hljs-keyword\">in\u003C/span> recommendations[\u003Cspan class=\"hljs-string\">&#x27;automated_checks&#x27;\u003C/span>]:\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  - \u003Cspan class=\"hljs-subst\">{check}\u003C/span>&quot;\u003C/span>)\n\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> __name__ == \u003Cspan class=\"hljs-string\">&quot;__main__&quot;\u003C/span>:\n    demonstrate_change_classification()\n\u003C/code>\u003C/pre>\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Advanced Markdown diff and patch documentation represents a sophisticated approach to version control integration that transforms simple text comparison into intelligent content analysis capable of understanding document structure, semantic meaning, and collaborative context. Through semantic-aware diffing, automated change classification, and comprehensive workflow integration, technical teams can maintain high-quality documentation while enabling efficient collaboration and systematic change management.\u003C/p>\n\u003Cp>The key to successful diff and patch implementation lies in balancing automation with human oversight, ensuring that technical efficiency serves content quality and editorial standards. Whether you&#39;re building internal documentation systems, open-source project documentation, or comprehensive knowledge bases, the version control integration techniques covered in this guide provide the foundation for creating maintainable, collaborative documentation workflows that scale effectively with team growth and content complexity.\u003C/p>\n\u003Cp>Remember to implement validation systems that understand both technical correctness and content semantics, establish clear change classification criteria that match your team&#39;s workflow requirements, and continuously monitor and optimize your diff processing based on real-world collaboration patterns. With proper implementation of advanced diff and patch systems, your Markdown documentation can achieve the same level of sophistication, reliability, and collaborative efficiency that modern software development teams expect from their code repositories while maintaining the accessibility and simplicity that makes Markdown an ideal choice for technical documentation.\u003C/p>\n",[15,19,22,25,28,31,34,37,40],{"id":16,"text":17,"level":18},"why-master-markdown-diff-and-patch-documentation","Why Master Markdown Diff and Patch Documentation?",2,{"id":20,"text":21,"level":18},"foundation-diff-techniques-for-markdown","Foundation Diff Techniques for Markdown",{"id":23,"text":24,"level":18},"title-sample-document---updateddate-2024-12-07author-documentation-team","title: \"Sample Document - Updated\"date: 2024-12-07author: \"Documentation Team\"",{"id":26,"text":27,"level":18},"enhanced-features","Enhanced Features",{"id":29,"text":30,"level":18},"implementation","Implementation",{"id":32,"text":33,"level":18},"resources","Resources",{"id":35,"text":36,"level":18},"integration-with-documentation-systems","Integration with Documentation Systems",{"id":38,"text":39,"level":18},"advanced-workflow-integration","Advanced Workflow Integration",{"id":41,"text":42,"level":18},"conclusion","Conclusion",[],[45,53,61],{"slug":46,"title":47,"description":48,"excerpt":49,"date":50,"category":9,"author":10,"keywords":51,"readingMinutes":52},"markdown-version-control-git-integration-complete-guide","Markdown Version Control and Git Integration: Complete Guide for Documentation Workflows and Collaborative Content Management","Master Markdown version control with Git integration for collaborative documentation workflows, automated content management, and efficient technical writing processes. Learn Git hooks, merge strategies, and workflow optimization.","Advanced Markdown version control and Git integration enables sophisticated collaborative documentation workflows that maintain content quality, track changes systematically, and automate content…","2025-09-29","markdown version control, git markdown integration, documentation git workflows, markdown collaboration, git hooks markdown, version control documentation, markdown git best practices, collaborative writing git",22,{"slug":54,"title":55,"description":56,"excerpt":57,"date":58,"category":9,"author":10,"keywords":59,"readingMinutes":60},"markdown-document-versioning-change-tracking-complete-guide","Markdown Document Versioning and Change Tracking: Complete Guide for Professional Documentation Management","Master document versioning and change tracking in Markdown for professional documentation workflows. Learn version control integration, automated change detection, collaborative editing, and revision management for comprehensive documentation maintenance.","Markdown document versioning and change tracking enables professional documentation management through systematic revision control, collaborative editing workflows, and automated change detection…","2025-09-13","markdown versioning, document change tracking, markdown revision control, git documentation workflow, collaborative markdown editing, document history tracking, markdown diff tools, version control markdown",30,{"slug":62,"title":63,"description":64,"excerpt":65,"date":66,"category":9,"author":10,"keywords":67,"readingMinutes":12},"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",1792184945581]