[{"data":1,"prerenderedAt":60},["Reactive",2],{"blog-post-markdown-table-data-validation-quality-assurance-guide":3},{"slug":4,"title":5,"description":6,"excerpt":7,"date":8,"category":9,"author":10,"keywords":11,"readingMinutes":12,"html":13,"headings":14,"tools":34,"related":35},"markdown-table-data-validation-quality-assurance-guide","Markdown Table Data Validation and Quality Assurance: Complete Guide for Content Integrity and Data Quality Management","Master advanced Markdown table data validation techniques for content integrity, quality assurance, and automated data verification. Learn validation rules, data quality checks, and error detection for professional documentation systems.","Advanced Markdown table data validation and quality assurance systems enable sophisticated content management workflows that ensure data integrity, maintain consistency standards, and provide…","2025-11-10","Tutorial","Matthew Rathbone","markdown table validation, data quality assurance, table content verification, markdown data integrity, table validation rules, content quality control, markdown table testing, data validation automation",31,"\u003Cp>Advanced Markdown table data validation and quality assurance systems enable sophisticated content management workflows that ensure data integrity, maintain consistency standards, and provide automated verification of tabular content across large documentation repositories. By implementing comprehensive validation rules, automated quality checks, and systematic error detection processes, technical teams can build robust content management systems that maintain high data quality standards while scaling efficiently across complex information architectures.\u003C/p>\n\u003Ch2 id=\"why-master-markdown-table-data-validation\">Why Master Markdown Table Data Validation?\u003C/h2>\n\u003Cp>Professional data validation provides essential benefits for content management systems:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Data Integrity\u003C/strong>: Ensure accuracy and consistency of tabular content across all documentation\u003C/li>\n\u003Cli>\u003Cstrong>Quality Assurance\u003C/strong>: Maintain professional standards through automated validation and verification\u003C/li>\n\u003Cli>\u003Cstrong>Error Prevention\u003C/strong>: Detect and prevent data quality issues before content publication\u003C/li>\n\u003Cli>\u003Cstrong>Compliance Standards\u003C/strong>: Meet data quality requirements for regulated industries and documentation standards\u003C/li>\n\u003Cli>\u003Cstrong>User Confidence\u003C/strong>: Provide reliable, accurate information that users can depend on for decision-making\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"foundation-validation-concepts\">Foundation Validation Concepts\u003C/h2>\n\u003Ch3 id=\"basic-table-structure-validation\">Basic Table Structure Validation\u003C/h3>\n\u003Cp>Understanding fundamental validation principles for Markdown table integrity:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\"># Basic Table Validation Examples\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## Well-Formed Table Structure\u003C/span>\n\n| Feature | Status | Version | Notes |\n|---------|--------|---------|-------|\n| Authentication | ✅ Active | 2.1.0 | OAuth 2.0 support |\n| Rate Limiting | ✅ Active | 2.0.5 | 1000 requests/hour |\n| Caching | 🚧 Beta | 2.2.0 | Redis implementation |\n| Monitoring | ❌ Planned | 3.0.0 | Grafana dashboard |\n\n\u003Cspan class=\"hljs-section\">## Validation Requirements\u003C/span>\n\n✅ \u003Cspan class=\"hljs-strong\">**Valid Structure:**\u003C/span>\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> Consistent column count across all rows\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> Proper header row with separator\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> Clean cell content without formatting conflicts\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> Appropriate data types for each column\n\n❌ \u003Cspan class=\"hljs-strong\">**Common Issues to Detect:**\u003C/span>\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> Inconsistent column counts\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> Missing separator rows\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> Malformed cell content\n\u003Cspan class=\"hljs-bullet\">-\u003C/span> Data type mismatches\n\u003C/code>\u003C/pre>\u003Ch3 id=\"advanced-data-type-validation\">Advanced Data Type Validation\u003C/h3>\n\u003Cp>Implementing sophisticated validation rules for different data types:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// table-data-validator.js - Advanced table data validation system\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownTableValidator\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">options = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">strictMode\u003C/span>: options.\u003Cspan class=\"hljs-property\">strictMode\u003C/span> || \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">allowEmptyCells\u003C/span>: options.\u003Cspan class=\"hljs-property\">allowEmptyCells\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxCellLength\u003C/span>: options.\u003Cspan class=\"hljs-property\">maxCellLength\u003C/span> || \u003Cspan class=\"hljs-number\">1000\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">customValidators\u003C/span>: options.\u003Cspan class=\"hljs-property\">customValidators\u003C/span> || {},\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">builtInValidators\u003C/span> = {\n            \u003Cspan class=\"hljs-string\">&#x27;string&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateString\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;number&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateNumber\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;integer&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateInteger\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;float&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateFloat\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;boolean&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateBoolean\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateDate\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;url&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateUrl\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;email&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateEmail\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;version&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateVersion\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateStatus\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;enum&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateEnum\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;regex&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateRegex\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;json&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateJson\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;markdown&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validateMarkdown\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">tables\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">totalTables\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">validTables\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">errorsFound\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">warningsFound\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>\n            }\n        };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateDocument\u003C/span>(\u003Cspan class=\"hljs-params\">markdownContent, filePath = \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Validating tables in \u003Cspan class=\"hljs-subst\">${filePath || \u003Cspan class=\"hljs-string\">&#x27;document&#x27;\u003C/span>}\u003C/span>...`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> tables = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractTables\u003C/span>(markdownContent);\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">totalTables\u003C/span> = tables.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = \u003Cspan class=\"hljs-number\">0\u003C/span>; i &lt; tables.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> table = tables[i];\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> tableResult = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateTable\u003C/span>(table, i, filePath);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-property\">tables\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(tableResult);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (tableResult.\u003Cspan class=\"hljs-property\">isValid\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">validTables\u003C/span>++;\n            }\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">errorsFound\u003C/span> += tableResult.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>.\u003Cspan class=\"hljs-property\">warningsFound\u003C/span> += tableResult.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">extractTables\u003C/span>(\u003Cspan class=\"hljs-params\">markdownContent\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> tables = [];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = markdownContent.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> currentTable = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> lineNumber = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = \u003Cspan class=\"hljs-number\">0\u003C/span>; i &lt; lines.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            lineNumber = i + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> line = lines[i].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n            \n            \u003Cspan class=\"hljs-comment\">// Check if this looks like a table row\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>) &amp;&amp; line.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!currentTable) {\n                    \u003Cspan class=\"hljs-comment\">// Start of new table\u003C/span>\n                    currentTable = {\n                        \u003Cspan class=\"hljs-attr\">startLine\u003C/span>: lineNumber,\n                        \u003Cspan class=\"hljs-attr\">endLine\u003C/span>: lineNumber,\n                        \u003Cspan class=\"hljs-attr\">headers\u003C/span>: [],\n                        \u003Cspan class=\"hljs-attr\">separatorLine\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">rows\u003C/span>: [],\n                        \u003Cspan class=\"hljs-attr\">rawLines\u003C/span>: []\n                    };\n                }\n                \n                currentTable.\u003Cspan class=\"hljs-property\">endLine\u003C/span> = lineNumber;\n                currentTable.\u003Cspan class=\"hljs-property\">rawLines\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">content\u003C/span>: line,\n                    \u003Cspan class=\"hljs-attr\">lineNumber\u003C/span>: lineNumber\n                });\n                \n                \u003Cspan class=\"hljs-comment\">// Parse the line\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> cells = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">parseCells\u003C/span>(line);\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentTable.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span> &amp;&amp; !\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isSeparatorLine\u003C/span>(line)) {\n                    \u003Cspan class=\"hljs-comment\">// First non-separator line is headers\u003C/span>\n                    currentTable.\u003Cspan class=\"hljs-property\">headers\u003C/span> = cells;\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isSeparatorLine\u003C/span>(line)) {\n                    \u003Cspan class=\"hljs-comment\">// Separator line\u003C/span>\n                    currentTable.\u003Cspan class=\"hljs-property\">separatorLine\u003C/span> = {\n                        \u003Cspan class=\"hljs-attr\">content\u003C/span>: line,\n                        \u003Cspan class=\"hljs-attr\">lineNumber\u003C/span>: lineNumber,\n                        \u003Cspan class=\"hljs-attr\">alignments\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">parseAlignments\u003C/span>(line)\n                    };\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentTable.\u003Cspan class=\"hljs-property\">separatorLine\u003C/span>) {\n                    \u003Cspan class=\"hljs-comment\">// Data row (only count after separator)\u003C/span>\n                    currentTable.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">cells\u003C/span>: cells,\n                        \u003Cspan class=\"hljs-attr\">lineNumber\u003C/span>: lineNumber,\n                        \u003Cspan class=\"hljs-attr\">rawContent\u003C/span>: line\n                    });\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentTable) {\n                \u003Cspan class=\"hljs-comment\">// End of current table\u003C/span>\n                tables.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(currentTable);\n                currentTable = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Add final table if exists\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentTable) {\n            tables.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(currentTable);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> tables;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">parseCells\u003C/span>(\u003Cspan class=\"hljs-params\">line\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Remove leading and trailing pipes, split on pipes\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> cleanLine = line.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^\\||\\|$/g\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> cleanLine.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> cell.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>());\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isSeparatorLine\u003C/span>(\u003Cspan class=\"hljs-params\">line\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Check if line contains only |, -, :, and whitespace\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-regexp\">/^[\\s\\|:\\-]+$/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(line) &amp;&amp; line.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;-&#x27;\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">parseAlignments\u003C/span>(\u003Cspan class=\"hljs-params\">separatorLine\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> cells = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">parseCells\u003C/span>(separatorLine);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> cells.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (cell.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;:&#x27;\u003C/span>) &amp;&amp; cell.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;:&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;center&#x27;\u003C/span>;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (cell.\u003Cspan class=\"hljs-title function_\">endsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;:&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;right&#x27;\u003C/span>;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;left&#x27;\u003C/span>;\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateTable\u003C/span>(\u003Cspan class=\"hljs-params\">table, tableIndex, filePath\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = {\n            tableIndex,\n            filePath,\n            \u003Cspan class=\"hljs-attr\">startLine\u003C/span>: table.\u003Cspan class=\"hljs-property\">startLine\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">endLine\u003C/span>: table.\u003Cspan class=\"hljs-property\">endLine\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">suggestions\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">structure\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeTableStructure\u003C/span>(table),\n            \u003Cspan class=\"hljs-attr\">dataQuality\u003C/span>: \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeDataQuality\u003C/span>(table)\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Validate table structure\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateTableStructure\u003C/span>(table, result);\n        \n        \u003Cspan class=\"hljs-comment\">// Validate data consistency\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateDataConsistency\u003C/span>(table, result);\n        \n        \u003Cspan class=\"hljs-comment\">// Validate cell content\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateCellContent\u003C/span>(table, result);\n        \n        \u003Cspan class=\"hljs-comment\">// Generate suggestions\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateSuggestions\u003C/span>(table, result);\n        \n        \u003Cspan class=\"hljs-comment\">// Determine overall validity\u003C/span>\n        result.\u003Cspan class=\"hljs-property\">isValid\u003C/span> = result.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> result;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">analyzeTableStructure\u003C/span>(\u003Cspan class=\"hljs-params\">table\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">headerCount\u003C/span>: table.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">rowCount\u003C/span>: table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">hasSeparator\u003C/span>: !!table.\u003Cspan class=\"hljs-property\">separatorLine\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">columnAlignments\u003C/span>: table.\u003Cspan class=\"hljs-property\">separatorLine\u003C/span> ? table.\u003Cspan class=\"hljs-property\">separatorLine\u003C/span>.\u003Cspan class=\"hljs-property\">alignments\u003C/span> : [],\n            \u003Cspan class=\"hljs-attr\">avgRowLength\u003C/span>: table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \n                table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">reduce\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">sum, row\u003C/span>) =&gt;\u003C/span> sum + row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>, \u003Cspan class=\"hljs-number\">0\u003C/span>) / table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> : \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxCellLength\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getMaxCellLength\u003C/span>(table),\n            \u003Cspan class=\"hljs-attr\">emptyRows\u003C/span>: table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\u003Cspan class=\"hljs-title function_\">every\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> !cell)).\u003Cspan class=\"hljs-property\">length\u003C/span>\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getMaxCellLength\u003C/span>(\u003Cspan class=\"hljs-params\">table\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> maxLength = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        \u003Cspan class=\"hljs-comment\">// Check headers\u003C/span>\n        table.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">header\u003C/span> =&gt;\u003C/span> {\n            maxLength = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(maxLength, header.\u003Cspan class=\"hljs-property\">length\u003C/span>);\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Check data rows\u003C/span>\n        table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> {\n            row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> {\n                maxLength = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(maxLength, cell.\u003Cspan class=\"hljs-property\">length\u003C/span>);\n            });\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> maxLength;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">analyzeDataQuality\u003C/span>(\u003Cspan class=\"hljs-params\">table\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> quality = {\n            \u003Cspan class=\"hljs-attr\">completeness\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">consistency\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">uniqueness\u003C/span>: {},\n            \u003Cspan class=\"hljs-attr\">patterns\u003C/span>: {},\n            \u003Cspan class=\"hljs-attr\">dataTypes\u003C/span>: {}\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> quality;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> totalCells = table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> * table.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> filledCells = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        \u003Cspan class=\"hljs-comment\">// Analyze each column\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> colIndex = \u003Cspan class=\"hljs-number\">0\u003C/span>; colIndex &lt; table.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>; colIndex++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> columnData = table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> row.\u003Cspan class=\"hljs-property\">cells\u003C/span>[colIndex] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> columnName = table.\u003Cspan class=\"hljs-property\">headers\u003C/span>[colIndex];\n            \n            \u003Cspan class=\"hljs-comment\">// Calculate completeness\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> nonEmptyCells = columnData.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> cell.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>().\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>);\n            filledCells += nonEmptyCells.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \n            \u003Cspan class=\"hljs-comment\">// Analyze uniqueness\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> uniqueValues = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Set\u003C/span>(columnData.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> cell.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()));\n            quality.\u003Cspan class=\"hljs-property\">uniqueness\u003C/span>[columnName] = {\n                \u003Cspan class=\"hljs-attr\">totalValues\u003C/span>: columnData.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">uniqueValues\u003C/span>: uniqueValues.\u003Cspan class=\"hljs-property\">size\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">duplicates\u003C/span>: columnData.\u003Cspan class=\"hljs-property\">length\u003C/span> - uniqueValues.\u003Cspan class=\"hljs-property\">size\u003C/span>\n            };\n            \n            \u003Cspan class=\"hljs-comment\">// Analyze patterns\u003C/span>\n            quality.\u003Cspan class=\"hljs-property\">patterns\u003C/span>[columnName] = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeColumnPatterns\u003C/span>(columnData);\n            \n            \u003Cspan class=\"hljs-comment\">// Detect data types\u003C/span>\n            quality.\u003Cspan class=\"hljs-property\">dataTypes\u003C/span>[columnName] = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">detectDataType\u003C/span>(columnData);\n        }\n        \n        quality.\u003Cspan class=\"hljs-property\">completeness\u003C/span> = (filledCells / totalCells) * \u003Cspan class=\"hljs-number\">100\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> quality;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">analyzeColumnPatterns\u003C/span>(\u003Cspan class=\"hljs-params\">columnData\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> patterns = {\n            \u003Cspan class=\"hljs-attr\">empty\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">numeric\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">alphabetic\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">alphanumeric\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">url\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">email\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">date\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">common\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>()\n        };\n        \n        columnData.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> trimmed = cell.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!trimmed) {\n                patterns.\u003Cspan class=\"hljs-property\">empty\u003C/span>++;\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Count pattern occurrences\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^\\d+$/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(trimmed)) patterns.\u003Cspan class=\"hljs-property\">numeric\u003C/span>++;\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^[a-zA-Z\\s]+$/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(trimmed)) patterns.\u003Cspan class=\"hljs-property\">alphabetic\u003C/span>++;\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^[a-zA-Z0-9\\s]+$/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(trimmed)) patterns.\u003Cspan class=\"hljs-property\">alphanumeric\u003C/span>++;\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^https?:\\/\\//\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(trimmed)) patterns.\u003Cspan class=\"hljs-property\">url\u003C/span>++;\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(trimmed)) patterns.\u003Cspan class=\"hljs-property\">email\u003C/span>++;\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isDateLike\u003C/span>(trimmed)) patterns.\u003Cspan class=\"hljs-property\">date\u003C/span>++;\n            \n            \u003Cspan class=\"hljs-comment\">// Track common values\u003C/span>\n            patterns.\u003Cspan class=\"hljs-property\">common\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(trimmed, (patterns.\u003Cspan class=\"hljs-property\">common\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(trimmed) || \u003Cspan class=\"hljs-number\">0\u003C/span>) + \u003Cspan class=\"hljs-number\">1\u003C/span>);\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> patterns;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">detectDataType\u003C/span>(\u003Cspan class=\"hljs-params\">columnData\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> nonEmpty = columnData.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> cell.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>());\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (nonEmpty.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;empty&#x27;\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> totalCount = nonEmpty.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> numericCount = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> integerCount = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> booleanCount = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> dateCount = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> urlCount = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> emailCount = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        nonEmpty.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> trimmed = cell.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(trimmed) &amp;&amp; !\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(\u003Cspan class=\"hljs-built_in\">parseFloat\u003C/span>(trimmed))) {\n                numericCount++;\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-title class_\">Number\u003C/span>.\u003Cspan class=\"hljs-title function_\">isInteger\u003C/span>(\u003Cspan class=\"hljs-built_in\">parseFloat\u003C/span>(trimmed))) {\n                    integerCount++;\n                }\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^(true|false|yes|no|on|off|enabled|disabled|active|inactive)$/i\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(trimmed)) {\n                booleanCount++;\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isDateLike\u003C/span>(trimmed)) {\n                dateCount++;\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^https?:\\/\\//\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(trimmed)) {\n                urlCount++;\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(trimmed)) {\n                emailCount++;\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Determine primary data type based on majority\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> threshold = totalCount * \u003Cspan class=\"hljs-number\">0.8\u003C/span>; \u003Cspan class=\"hljs-comment\">// 80% threshold\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (integerCount &gt;= threshold) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;integer&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (numericCount &gt;= threshold) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;number&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (booleanCount &gt;= threshold) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;boolean&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (dateCount &gt;= threshold) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (urlCount &gt;= threshold) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;url&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (emailCount &gt;= threshold) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;email&#x27;\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;string&#x27;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isDateLike\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Simple date detection - could be enhanced\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> datePatterns = [\n            \u003Cspan class=\"hljs-regexp\">/^\\d{4}-\\d{2}-\\d{2}$/\u003C/span>,           \u003Cspan class=\"hljs-comment\">// YYYY-MM-DD\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/^\\d{2}\\/\\d{2}\\/\\d{4}$/\u003C/span>,         \u003Cspan class=\"hljs-comment\">// MM/DD/YYYY\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/^\\d{2}-\\d{2}-\\d{4}$/\u003C/span>,           \u003Cspan class=\"hljs-comment\">// MM-DD-YYYY\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/^\\d{1,2}\\/\\d{1,2}\\/\\d{2,4}$/\u003C/span>,   \u003Cspan class=\"hljs-comment\">// M/D/YY or MM/DD/YYYY\u003C/span>\n            \u003Cspan class=\"hljs-regexp\">/^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s+\\d{1,2},?\\s+\\d{4}$/i\u003C/span>\n        ];\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> datePatterns.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">pattern\u003C/span> =&gt;\u003C/span> pattern.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(value.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()));\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateTableStructure\u003C/span>(\u003Cspan class=\"hljs-params\">table, result\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Check for separator line\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!table.\u003Cspan class=\"hljs-property\">separatorLine\u003C/span>) {\n            result.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;structure&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Missing table separator line&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: table.\u003Cspan class=\"hljs-property\">startLine\u003C/span> + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Add a separator line with dashes (e.g., |---|---|)&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check header count consistency\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> expectedColumns = table.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> !== expectedColumns) {\n                    result.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;structure&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Row has \u003Cspan class=\"hljs-subst\">${row.cells.length}\u003C/span> columns, expected \u003Cspan class=\"hljs-subst\">${expectedColumns}\u003C/span>`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: row.\u003Cspan class=\"hljs-property\">lineNumber\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Ensure all rows have the same number of columns&#x27;\u003C/span>\n                    });\n                }\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for empty headers\u003C/span>\n        table.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">header, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!header.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()) {\n                result.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;structure&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Empty header in column \u003Cspan class=\"hljs-subst\">${index + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: table.\u003Cspan class=\"hljs-property\">startLine\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Provide descriptive column headers&#x27;\u003C/span>\n                });\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Check separator alignment consistency\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (table.\u003Cspan class=\"hljs-property\">separatorLine\u003C/span> &amp;&amp; table.\u003Cspan class=\"hljs-property\">separatorLine\u003C/span>.\u003Cspan class=\"hljs-property\">alignments\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> !== table.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>) {\n            result.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;structure&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Separator columns do not match header columns&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">line\u003C/span>: table.\u003Cspan class=\"hljs-property\">separatorLine\u003C/span>.\u003Cspan class=\"hljs-property\">lineNumber\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Ensure separator has same number of columns as headers&#x27;\u003C/span>\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateDataConsistency\u003C/span>(\u003Cspan class=\"hljs-params\">table, result\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Check data type consistency within columns\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> colIndex = \u003Cspan class=\"hljs-number\">0\u003C/span>; colIndex &lt; table.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>; colIndex++) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> columnName = table.\u003Cspan class=\"hljs-property\">headers\u003C/span>[colIndex];\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> columnData = table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> row.\u003Cspan class=\"hljs-property\">cells\u003C/span>[colIndex] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> detectedType = result.\u003Cspan class=\"hljs-property\">dataQuality\u003C/span>.\u003Cspan class=\"hljs-property\">dataTypes\u003C/span>[columnName];\n            \n            \u003Cspan class=\"hljs-comment\">// Validate each cell against detected type\u003C/span>\n            columnData.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">cellValue, rowIndex\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!cellValue.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()) {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">allowEmptyCells\u003C/span>) {\n                        result.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;data&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Empty cell in column &quot;\u003Cspan class=\"hljs-subst\">${columnName}\u003C/span>&quot;`\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">line\u003C/span>: table.\u003Cspan class=\"hljs-property\">rows\u003C/span>[rowIndex].\u003Cspan class=\"hljs-property\">lineNumber\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">column\u003C/span>: colIndex + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Consider providing a value or using &quot;N/A&quot; placeholder&#x27;\u003C/span>\n                        });\n                    }\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n                }\n                \n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> validation = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateCellDataType\u003C/span>(cellValue, detectedType);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!validation.\u003Cspan class=\"hljs-property\">isValid\u003C/span>) {\n                    result.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;data&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Invalid \u003Cspan class=\"hljs-subst\">${detectedType}\u003C/span> value: &quot;\u003Cspan class=\"hljs-subst\">${cellValue}\u003C/span>&quot; in column &quot;\u003Cspan class=\"hljs-subst\">${columnName}\u003C/span>&quot;`\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: table.\u003Cspan class=\"hljs-property\">rows\u003C/span>[rowIndex].\u003Cspan class=\"hljs-property\">lineNumber\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: colIndex + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: validation.\u003Cspan class=\"hljs-property\">suggestion\u003C/span>\n                    });\n                }\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for duplicate rows\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> rowHashes = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">row, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> rowHash = row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (rowHashes.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(rowHash)) {\n                result.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;data&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Duplicate row detected&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: row.\u003Cspan class=\"hljs-property\">lineNumber\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">duplicateOf\u003C/span>: rowHashes.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(rowHash),\n                    \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Review and remove duplicate entries&#x27;\u003C/span>\n                });\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                rowHashes.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(rowHash, row.\u003Cspan class=\"hljs-property\">lineNumber\u003C/span>);\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateCellDataType\u003C/span>(\u003Cspan class=\"hljs-params\">value, expectedType\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> validator = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">builtInValidators\u003C/span>[expectedType];\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!validator) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>, \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span> };\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title function_\">validator\u003C/span>(value);\n    }\n    \n    \u003Cspan class=\"hljs-comment\">// Built-in validator implementations\u003C/span>\n    \u003Cspan class=\"hljs-title function_\">validateString\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (value.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">maxCellLength\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">`String too long (\u003Cspan class=\"hljs-subst\">${value.length}\u003C/span> chars, max \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.options.maxCellLength}\u003C/span>)`\u003C/span>\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateNumber\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(value) || \u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(\u003Cspan class=\"hljs-built_in\">parseFloat\u003C/span>(value))) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Value should be a valid number&#x27;\u003C/span>\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateInteger\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> num = \u003Cspan class=\"hljs-built_in\">parseFloat\u003C/span>(value);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(num) || !\u003Cspan class=\"hljs-title class_\">Number\u003C/span>.\u003Cspan class=\"hljs-title function_\">isInteger\u003C/span>(num)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Value should be a valid integer&#x27;\u003C/span>\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateFloat\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(value) || \u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(\u003Cspan class=\"hljs-built_in\">parseFloat\u003C/span>(value))) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Value should be a valid decimal number&#x27;\u003C/span>\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateBoolean\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> booleanValues = [\u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;false&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;yes&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;no&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;on&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;off&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;1&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;0&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;enabled&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;disabled&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;active&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;inactive&#x27;\u003C/span>];\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!booleanValues.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(value.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>())) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">`Value should be one of: \u003Cspan class=\"hljs-subst\">${booleanValues.join(\u003Cspan class=\"hljs-string\">&#x27;, &#x27;\u003C/span>)}\u003C/span>`\u003C/span>\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateDate\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> date = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>(value);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(date.\u003Cspan class=\"hljs-title function_\">getTime\u003C/span>()) &amp;&amp; !\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isDateLike\u003C/span>(value)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Value should be a valid date (YYYY-MM-DD, MM/DD/YYYY, etc.)&#x27;\u003C/span>\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateUrl\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title function_\">URL\u003C/span>(value);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Value should be a valid URL starting with http:// or https://&#x27;\u003C/span>\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateEmail\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> emailRegex = \u003Cspan class=\"hljs-regexp\">/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!emailRegex.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(value)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Value should be a valid email address&#x27;\u003C/span>\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateVersion\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> versionRegex = \u003Cspan class=\"hljs-regexp\">/^\\d+\\.\\d+(\\.\\d+)?(-[a-zA-Z0-9]+)?$/\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!versionRegex.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(value)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Value should be a valid version number (e.g., 1.2.3, 2.0.0-beta)&#x27;\u003C/span>\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateStatus\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> statusValues = [\u003Cspan class=\"hljs-string\">&#x27;active&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;inactive&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;pending&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;completed&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;cancelled&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;draft&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;published&#x27;\u003C/span>];\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!statusValues.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(value.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>())) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">`Value should be one of: \u003Cspan class=\"hljs-subst\">${statusValues.join(\u003Cspan class=\"hljs-string\">&#x27;, &#x27;\u003C/span>)}\u003C/span>`\u003C/span>\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateEnum\u003C/span>(\u003Cspan class=\"hljs-params\">value, options = []\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!options.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(value)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">`Value should be one of: \u003Cspan class=\"hljs-subst\">${options.join(\u003Cspan class=\"hljs-string\">&#x27;, &#x27;\u003C/span>)}\u003C/span>`\u003C/span>\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateRegex\u003C/span>(\u003Cspan class=\"hljs-params\">value, pattern\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!pattern.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(value)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">`Value should match pattern: \u003Cspan class=\"hljs-subst\">${pattern.toString()}\u003C/span>`\u003C/span>\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateJson\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">parse\u003C/span>(value);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Value should be valid JSON&#x27;\u003C/span>\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">validateMarkdown\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Basic markdown validation - check for common issues\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = [];\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (value.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;[&#x27;\u003C/span>) &amp;&amp; !value.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;]&#x27;\u003C/span>)) {\n            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Unclosed markdown link&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (value.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;](&#x27;\u003C/span>) &amp;&amp; !value.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\[[^\\]]*\\]\\([^)]*\\)/\u003C/span>)) {\n            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Malformed markdown link&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (issues.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: issues.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;, &#x27;\u003C/span>)\n            };\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span> };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateCellContent\u003C/span>(\u003Cspan class=\"hljs-params\">table, result\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Check for potentially problematic content\u003C/span>\n        table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">row, rowIndex\u003C/span>) =&gt;\u003C/span> {\n            row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">cell, colIndex\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">detectContentIssues\u003C/span>(cell);\n                issues.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> {\n                    result.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: issue.\u003Cspan class=\"hljs-property\">message\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">line\u003C/span>: row.\u003Cspan class=\"hljs-property\">lineNumber\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">column\u003C/span>: colIndex + \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: issue.\u003Cspan class=\"hljs-property\">suggestion\u003C/span>\n                    });\n                });\n            });\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">detectContentIssues\u003C/span>(\u003Cspan class=\"hljs-params\">cellContent\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = [];\n        \n        \u003Cspan class=\"hljs-comment\">// Check for potentially problematic characters\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (cellContent.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>)) {\n            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Cell contains pipe character which may break table formatting&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Escape pipe character or use different delimiter&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for excessive whitespace\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (cellContent !== cellContent.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()) {\n            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Cell has leading or trailing whitespace&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Remove unnecessary whitespace&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for very long content\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (cellContent.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">maxCellLength\u003C/span> * \u003Cspan class=\"hljs-number\">0.8\u003C/span>) {\n            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Cell content is very long&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Consider breaking into multiple rows or using abbreviations&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check for HTML content\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/&lt;[^&gt;]+&gt;/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(cellContent)) {\n            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Cell contains HTML tags&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Use Markdown formatting instead of HTML&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateSuggestions\u003C/span>(\u003Cspan class=\"hljs-params\">table, result\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Generate improvement suggestions based on analysis\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> suggestions = [];\n        \n        \u003Cspan class=\"hljs-comment\">// Suggest column type annotations if mixed types detected\u003C/span>\n        \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(result.\u003Cspan class=\"hljs-property\">dataQuality\u003C/span>.\u003Cspan class=\"hljs-property\">dataTypes\u003C/span>).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[columnName, dataType]\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> columnData = table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> \n                row.\u003Cspan class=\"hljs-property\">cells\u003C/span>[table.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-title function_\">indexOf\u003C/span>(columnName)] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>\n            );\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> nonEmpty = columnData.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> cell.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>());\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> consistency = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateTypeConsistency\u003C/span>(nonEmpty, dataType);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (consistency &lt; \u003Cspan class=\"hljs-number\">0.8\u003C/span>) {\n                suggestions.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;improvement&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Consider standardizing data format in column &quot;\u003Cspan class=\"hljs-subst\">${columnName}\u003C/span>&quot;`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">`Column appears to have mixed data types. Consider using consistent \u003Cspan class=\"hljs-subst\">${dataType}\u003C/span> format.`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: columnName\n                });\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Suggest sorting if data appears sortable\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">3\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> firstColumn = table.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> row.\u003Cspan class=\"hljs-property\">cells\u003C/span>[\u003Cspan class=\"hljs-number\">0\u003C/span>] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isColumnSortable\u003C/span>(firstColumn)) {\n                suggestions.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;improvement&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Consider sorting table rows&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;First column appears sortable - consider ordering rows alphabetically or numerically&#x27;\u003C/span>\n                });\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Suggest adding missing data\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> completeness = result.\u003Cspan class=\"hljs-property\">dataQuality\u003C/span>.\u003Cspan class=\"hljs-property\">completeness\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (completeness &lt; \u003Cspan class=\"hljs-number\">80\u003C/span>) {\n            suggestions.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;improvement&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Table is only \u003Cspan class=\"hljs-subst\">${completeness.toFixed(\u003Cspan class=\"hljs-number\">1\u003C/span>)}\u003C/span>% complete`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">suggestion\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Consider filling in missing data or using placeholder values like &quot;N/A&quot; or &quot;TBD&quot;&#x27;\u003C/span>\n            });\n        }\n        \n        result.\u003Cspan class=\"hljs-property\">suggestions\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(...suggestions);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">calculateTypeConsistency\u003C/span>(\u003Cspan class=\"hljs-params\">values, expectedType\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (values.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-number\">1\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> consistentCount = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        values.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">value\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> validation = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateCellDataType\u003C/span>(value, expectedType);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (validation.\u003Cspan class=\"hljs-property\">isValid\u003C/span>) {\n                consistentCount++;\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> consistentCount / values.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isColumnSortable\u003C/span>(\u003Cspan class=\"hljs-params\">columnData\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> nonEmpty = columnData.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> cell.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>());\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (nonEmpty.\u003Cspan class=\"hljs-property\">length\u003C/span> &lt; \u003Cspan class=\"hljs-number\">2\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \n        \u003Cspan class=\"hljs-comment\">// Check if all values are numbers\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (nonEmpty.\u003Cspan class=\"hljs-title function_\">every\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">val\u003C/span> =&gt;\u003C/span> !\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(val) &amp;&amp; !\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(\u003Cspan class=\"hljs-built_in\">parseFloat\u003C/span>(val)))) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check if all values are dates\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (nonEmpty.\u003Cspan class=\"hljs-title function_\">every\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">val\u003C/span> =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isDateLike\u003C/span>(val))) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check if values are already sorted or nearly sorted\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> sorted = [...nonEmpty].\u003Cspan class=\"hljs-title function_\">sort\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> sortedDesc = [...nonEmpty].\u003Cspan class=\"hljs-title function_\">sort\u003C/span>().\u003Cspan class=\"hljs-title function_\">reverse\u003C/span>();\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> matchesAsc = nonEmpty.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) === sorted.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> matchesDesc = nonEmpty.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) === sortedDesc.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> !matchesAsc &amp;&amp; !matchesDesc; \u003Cspan class=\"hljs-comment\">// Suggest sorting if not already sorted\u003C/span>\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateReport\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> report = {\n            \u003Cspan class=\"hljs-attr\">summary\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">overallHealth\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateOverallHealth\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">tables\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-property\">tables\u003C/span>.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">table\u003C/span> =&gt;\u003C/span> ({\n                \u003Cspan class=\"hljs-attr\">index\u003C/span>: table.\u003Cspan class=\"hljs-property\">tableIndex\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">location\u003C/span>: \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${table.filePath}\u003C/span>:\u003Cspan class=\"hljs-subst\">${table.startLine}\u003C/span>-\u003Cspan class=\"hljs-subst\">${table.endLine}\u003C/span>`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: table.\u003Cspan class=\"hljs-property\">isValid\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">errorCount\u003C/span>: table.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">warningCount\u003C/span>: table.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">structure\u003C/span>: table.\u003Cspan class=\"hljs-property\">structure\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">dataQuality\u003C/span>: {\n                    \u003Cspan class=\"hljs-attr\">completeness\u003C/span>: table.\u003Cspan class=\"hljs-property\">dataQuality\u003C/span>.\u003Cspan class=\"hljs-property\">completeness\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">primaryDataTypes\u003C/span>: \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(table.\u003Cspan class=\"hljs-property\">dataQuality\u003C/span>.\u003Cspan class=\"hljs-property\">dataTypes\u003C/span>)\n                        .\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[col, type]\u003C/span>) =&gt;\u003C/span> ({ \u003Cspan class=\"hljs-attr\">column\u003C/span>: col, type }))\n                },\n                \u003Cspan class=\"hljs-attr\">topIssues\u003C/span>: [...table.\u003Cspan class=\"hljs-property\">errors\u003C/span>, ...table.\u003Cspan class=\"hljs-property\">warnings\u003C/span>]\n                    .\u003Cspan class=\"hljs-title function_\">sort\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">a, b\u003C/span>) =&gt;\u003C/span> a.\u003Cspan class=\"hljs-property\">severity\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span> ? -\u003Cspan class=\"hljs-number\">1\u003C/span> : \u003Cspan class=\"hljs-number\">1\u003C/span>)\n                    .\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">5\u003C/span>)\n            })),\n            \u003Cspan class=\"hljs-attr\">recommendations\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateRecommendations\u003C/span>()\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> report;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">calculateOverallHealth\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { totalTables, validTables, errorsFound, warningsFound } = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (totalTables === \u003Cspan class=\"hljs-number\">0\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-number\">100\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> validityScore = (validTables / totalTables) * \u003Cspan class=\"hljs-number\">100\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> errorPenalty = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">min\u003C/span>(errorsFound * \u003Cspan class=\"hljs-number\">5\u003C/span>, \u003Cspan class=\"hljs-number\">50\u003C/span>); \u003Cspan class=\"hljs-comment\">// Max 50% penalty for errors\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> warningPenalty = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">min\u003C/span>(warningsFound * \u003Cspan class=\"hljs-number\">2\u003C/span>, \u003Cspan class=\"hljs-number\">25\u003C/span>); \u003Cspan class=\"hljs-comment\">// Max 25% penalty for warnings\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, validityScore - errorPenalty - warningPenalty);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateRecommendations\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> recommendations = [];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { errorsFound, warningsFound, totalTables, validTables } = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-property\">summary\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (errorsFound &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Fix Critical Table Errors&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${errorsFound}\u003C/span> errors found across tables that prevent proper rendering`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Review and fix structural issues, column mismatches, and data type errors&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (warningsFound &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Address Data Quality Warnings&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${warningsFound}\u003C/span> warnings found that could affect data quality`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Review empty cells, inconsistent formatting, and content issues&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (validTables / totalTables &lt; \u003Cspan class=\"hljs-number\">0.8\u003C/span>) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Improve Table Validity Rate&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">`Only \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-built_in\">Math\u003C/span>.round(validTables / totalTables * \u003Cspan class=\"hljs-number\">100\u003C/span>)}\u003C/span>% of tables are valid`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Focus on fixing structural issues and maintaining consistent formatting&#x27;\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Analyze common issues across tables\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> commonIssues = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">findCommonIssues\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (commonIssues.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Address Common Patterns&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">description\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Several tables have similar issues that could be addressed systematically&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">action\u003C/span>: \u003Cspan class=\"hljs-string\">`Focus on: \u003Cspan class=\"hljs-subst\">${commonIssues.slice(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">3\u003C/span>).join(\u003Cspan class=\"hljs-string\">&#x27;, &#x27;\u003C/span>)}\u003C/span>`\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> recommendations;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">findCommonIssues\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> issueCount = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-property\">tables\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">table\u003C/span> =&gt;\u003C/span> {\n            [...table.\u003Cspan class=\"hljs-property\">errors\u003C/span>, ...table.\u003Cspan class=\"hljs-property\">warnings\u003C/span>].\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> key = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${issue.type}\u003C/span>:\u003Cspan class=\"hljs-subst\">${issue.message.split(\u003Cspan class=\"hljs-string\">&#x27; &#x27;\u003C/span>).slice(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">5\u003C/span>).join(\u003Cspan class=\"hljs-string\">&#x27; &#x27;\u003C/span>)}\u003C/span>`\u003C/span>;\n                issueCount.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(key, (issueCount.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(key) || \u003Cspan class=\"hljs-number\">0\u003C/span>) + \u003Cspan class=\"hljs-number\">1\u003C/span>);\n            });\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(issueCount.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>())\n            .\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[, count]\u003C/span>) =&gt;\u003C/span> count &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">sort\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[, a], [, b]\u003C/span>) =&gt;\u003C/span> b - a)\n            .\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[issue]\u003C/span>) =&gt;\u003C/span> issue.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;:&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">1\u003C/span>])\n            .\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">5\u003C/span>);\n    }\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">MarkdownTableValidator\u003C/span>;\n\u003C/code>\u003C/pre>\u003Ch2 id=\"automated-quality-assurance-workflows\">Automated Quality Assurance Workflows\u003C/h2>\n\u003Ch3 id=\"cicd-integration-for-table-validation\">CI/CD Integration for Table Validation\u003C/h3>\n\u003Cp>Implementing continuous validation in development workflows:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-yaml\">\u003Cspan class=\"hljs-comment\"># .github/workflows/table-validation.yml - Automated table quality assurance\u003C/span>\n\u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Table\u003C/span> \u003Cspan class=\"hljs-string\">Data\u003C/span> \u003Cspan class=\"hljs-string\">Validation\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">on:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">push:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">branches:\u003C/span> [ \u003Cspan class=\"hljs-string\">main\u003C/span>, \u003Cspan class=\"hljs-string\">develop\u003C/span> ]\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;**/*.md&#x27;\u003C/span>\n  \u003Cspan class=\"hljs-attr\">pull_request:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">branches:\u003C/span> [ \u003Cspan class=\"hljs-string\">main\u003C/span>, \u003Cspan class=\"hljs-string\">develop\u003C/span> ]\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;**/*.md&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">jobs:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">validate-tables:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">repository\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">fetch-depth:\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;18&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;npm&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        npm install\n        npm install -g markdown-table-validator\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Run\u003C/span> \u003Cspan class=\"hljs-string\">table\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        node scripts/validate-all-tables.js --output-format=json &gt; validation-results.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\">validation\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        node scripts/generate-validation-report.js validation-results.json\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Check\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span> \u003Cspan class=\"hljs-string\">results\u003C/span>\n      \u003Cspan class=\"hljs-attr\">id:\u003C/span> \u003Cspan class=\"hljs-string\">validation-check\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        ERRORS=$(jq &#x27;.summary.errorsFound&#x27; validation-results.json)\n        WARNINGS=$(jq &#x27;.summary.warningsFound&#x27; validation-results.json)\n        echo &quot;errors=$ERRORS&quot; &gt;&gt; $GITHUB_OUTPUT\n        echo &quot;warnings=$WARNINGS&quot; &gt;&gt; $GITHUB_OUTPUT\n\u003C/span>        \n        \u003Cspan class=\"hljs-string\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;$ERRORS&quot;\u003C/span> \u003Cspan class=\"hljs-string\">-gt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span> ]\u003Cspan class=\"hljs-string\">;\u003C/span> \u003Cspan class=\"hljs-string\">then\u003C/span>\n          \u003Cspan class=\"hljs-string\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;❌ Table validation failed with $ERRORS errors&quot;\u003C/span>\n          \u003Cspan class=\"hljs-string\">exit\u003C/span> \u003Cspan class=\"hljs-number\">1\u003C/span>\n        \u003Cspan class=\"hljs-string\">elif\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;$WARNINGS&quot;\u003C/span> \u003Cspan class=\"hljs-string\">-gt\u003C/span> \u003Cspan class=\"hljs-number\">5\u003C/span> ]\u003Cspan class=\"hljs-string\">;\u003C/span> \u003Cspan class=\"hljs-string\">then\u003C/span>\n          \u003Cspan class=\"hljs-string\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;⚠️ Table validation completed with $WARNINGS warnings&quot;\u003C/span>\n          \u003Cspan class=\"hljs-string\">exit\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n        \u003Cspan class=\"hljs-string\">else\u003C/span>\n          \u003Cspan class=\"hljs-string\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✅ Table validation passed&quot;\u003C/span>\n          \u003Cspan class=\"hljs-string\">exit\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n        \u003Cspan class=\"hljs-string\">fi\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Upload\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/upload-artifact@v3\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">table-validation-report\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          validation-results.json\n          validation-report.html\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\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.event_name\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;pull_request&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">&amp;&amp;\u003C/span> \u003Cspan class=\"hljs-string\">always()\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/github-script@v6\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">script:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          const fs = require(&#x27;fs&#x27;);\n\u003C/span>          \n          \u003Cspan class=\"hljs-string\">try\u003C/span> {\n            \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">results\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">JSON.parse(fs.readFileSync(&#x27;validation-results.json&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;utf8&#x27;\u003C/span>\u003Cspan class=\"hljs-string\">));\u003C/span>\n            \u003Cspan class=\"hljs-string\">const\u003C/span> { \u003Cspan class=\"hljs-string\">summary\u003C/span>, \u003Cspan class=\"hljs-string\">tables\u003C/span> } \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">results;\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">errorTables\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">tables.filter(t\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> \u003Cspan class=\"hljs-string\">t.errorCount\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\u003Cspan class=\"hljs-string\">);\u003C/span>\n            \u003Cspan class=\"hljs-string\">const\u003C/span> \u003Cspan class=\"hljs-string\">warningTables\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">tables.filter(t\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> \u003Cspan class=\"hljs-string\">t.warningCount\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\u003Cspan class=\"hljs-string\">);\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">let\u003C/span> \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">=\u003C/span> \u003Cspan class=\"hljs-string\">`##\u003C/span> \u003Cspan class=\"hljs-string\">📊\u003C/span> \u003Cspan class=\"hljs-string\">Table\u003C/span> \u003Cspan class=\"hljs-string\">Validation\u003C/span> \u003Cspan class=\"hljs-string\">Report\\n\\n`;\u003C/span>\n            \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`**Summary:**\\n`;\u003C/span>\n            \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-attr\">Total tables:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">summary.totalTables\u003C/span>}\u003Cspan class=\"hljs-string\">\\n`;\u003C/span>\n            \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-attr\">Valid tables:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">summary.validTables\u003C/span>}\u003Cspan class=\"hljs-string\">\\n`;\u003C/span>\n            \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-attr\">Errors:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">summary.errorsFound\u003C/span>}\u003Cspan class=\"hljs-string\">\\n`;\u003C/span>\n            \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-attr\">Warnings:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">summary.warningsFound\u003C/span>}\u003Cspan class=\"hljs-string\">\\n\\n`;\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">if\u003C/span> \u003Cspan class=\"hljs-string\">(errorTables.length\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\u003Cspan class=\"hljs-string\">)\u003C/span> {\n              \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`###\u003C/span> \u003Cspan class=\"hljs-string\">❌\u003C/span> \u003Cspan class=\"hljs-string\">Tables\u003C/span> \u003Cspan class=\"hljs-string\">with\u003C/span> \u003Cspan class=\"hljs-string\">Errors\u003C/span> \u003Cspan class=\"hljs-string\">($\u003C/span>{\u003Cspan class=\"hljs-string\">errorTables.length\u003C/span>}\u003Cspan class=\"hljs-string\">)\\n\\n`;\u003C/span>\n              \u003Cspan class=\"hljs-string\">errorTables.slice(0\u003C/span>, \u003Cspan class=\"hljs-number\">5\u003C/span>\u003Cspan class=\"hljs-string\">).forEach(table\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-string\">**$\u003C/span>{\u003Cspan class=\"hljs-string\">table.location\u003C/span>}\u003Cspan class=\"hljs-string\">**:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">table.errorCount\u003C/span>} \u003Cspan class=\"hljs-string\">errors\\n`;\u003C/span>\n              }\u003Cspan class=\"hljs-string\">);\u003C/span>\n              \u003Cspan class=\"hljs-string\">if\u003C/span> \u003Cspan class=\"hljs-string\">(errorTables.length\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">5\u003C/span>\u003Cspan class=\"hljs-string\">)\u003C/span> {\n                \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-string\">...\u003C/span> \u003Cspan class=\"hljs-string\">and\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">errorTables.length\u003C/span> \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-number\">5\u003C/span>} \u003Cspan class=\"hljs-string\">more\\n`;\u003C/span>\n              }\n              \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`\\n`;\u003C/span>\n            }\n            \n            \u003Cspan class=\"hljs-string\">if\u003C/span> \u003Cspan class=\"hljs-string\">(warningTables.length\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\u003Cspan class=\"hljs-string\">)\u003C/span> {\n              \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`###\u003C/span> \u003Cspan class=\"hljs-string\">⚠️\u003C/span> \u003Cspan class=\"hljs-string\">Tables\u003C/span> \u003Cspan class=\"hljs-string\">with\u003C/span> \u003Cspan class=\"hljs-string\">Warnings\u003C/span> \u003Cspan class=\"hljs-string\">($\u003C/span>{\u003Cspan class=\"hljs-string\">warningTables.length\u003C/span>}\u003Cspan class=\"hljs-string\">)\\n\\n`;\u003C/span>\n              \u003Cspan class=\"hljs-string\">warningTables.slice(0\u003C/span>, \u003Cspan class=\"hljs-number\">3\u003C/span>\u003Cspan class=\"hljs-string\">).forEach(table\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-string\">**$\u003C/span>{\u003Cspan class=\"hljs-string\">table.location\u003C/span>}\u003Cspan class=\"hljs-string\">**:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">table.warningCount\u003C/span>} \u003Cspan class=\"hljs-string\">warnings\\n`;\u003C/span>\n              }\u003Cspan class=\"hljs-string\">);\u003C/span>\n              \u003Cspan class=\"hljs-string\">if\u003C/span> \u003Cspan class=\"hljs-string\">(warningTables.length\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">3\u003C/span>\u003Cspan class=\"hljs-string\">)\u003C/span> {\n                \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-string\">...\u003C/span> \u003Cspan class=\"hljs-string\">and\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">warningTables.length\u003C/span> \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-number\">3\u003C/span>} \u003Cspan class=\"hljs-string\">more\\n`;\u003C/span>\n              }\n              \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`\\n`;\u003C/span>\n            }\n            \n            \u003Cspan class=\"hljs-string\">if\u003C/span> \u003Cspan class=\"hljs-string\">(results.recommendations.length\u003C/span> \u003Cspan class=\"hljs-string\">&gt;\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\u003Cspan class=\"hljs-string\">)\u003C/span> {\n              \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`###\u003C/span> \u003Cspan class=\"hljs-string\">💡\u003C/span> \u003Cspan class=\"hljs-string\">Recommendations\\n\\n`;\u003C/span>\n              \u003Cspan class=\"hljs-string\">results.recommendations.slice(0\u003C/span>, \u003Cspan class=\"hljs-number\">3\u003C/span>\u003Cspan class=\"hljs-string\">).forEach(rec\u003C/span> \u003Cspan class=\"hljs-string\">=&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`-\u003C/span> \u003Cspan class=\"hljs-string\">**$\u003C/span>{\u003Cspan class=\"hljs-string\">rec.title\u003C/span>}\u003Cspan class=\"hljs-string\">**:\u003C/span> \u003Cspan class=\"hljs-string\">$\u003C/span>{\u003Cspan class=\"hljs-string\">rec.description\u003C/span>}\u003Cspan class=\"hljs-string\">\\n`;\u003C/span>\n              }\u003Cspan class=\"hljs-string\">);\u003C/span>\n            }\n            \n            \u003Cspan class=\"hljs-string\">comment\u003C/span> \u003Cspan class=\"hljs-string\">+=\u003C/span> \u003Cspan class=\"hljs-string\">`\\n\u003C/span>[\u003Cspan class=\"hljs-string\">View\u003C/span> \u003Cspan class=\"hljs-string\">detailed\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>]\u003Cspan class=\"hljs-string\">($\u003C/span>{\u003Cspan class=\"hljs-string\">process.env.GITHUB_SERVER_URL\u003C/span>}\u003Cspan class=\"hljs-string\">/$\u003C/span>{\u003Cspan class=\"hljs-string\">process.env.GITHUB_REPOSITORY\u003C/span>}\u003Cspan class=\"hljs-string\">/actions/runs/$\u003C/span>{\u003Cspan class=\"hljs-string\">process.env.GITHUB_RUN_ID\u003C/span>}\u003Cspan class=\"hljs-string\">)`;\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">github.rest.issues.createComment(\u003C/span>{\n              \u003Cspan class=\"hljs-attr\">issue_number:\u003C/span> \u003Cspan class=\"hljs-string\">context.issue.number\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">owner:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.owner\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">repo:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.repo\u003C/span>,\n              \u003Cspan class=\"hljs-attr\">body:\u003C/span> \u003Cspan class=\"hljs-string\">comment\u003C/span>\n            }\u003Cspan class=\"hljs-string\">);\u003C/span>\n          } \u003Cspan class=\"hljs-string\">catch\u003C/span> \u003Cspan class=\"hljs-string\">(error)\u003C/span> {\n            \u003Cspan class=\"hljs-string\">console.error(&#x27;Failed\u003C/span> \u003Cspan class=\"hljs-string\">to\u003C/span> \u003Cspan class=\"hljs-string\">post\u003C/span> \u003Cspan class=\"hljs-string\">validation\u003C/span> \u003Cspan class=\"hljs-string\">comment:&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">error);\u003C/span>\n          }\n\n  \u003Cspan class=\"hljs-attr\">validate-data-integrity:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">needs:\u003C/span> \u003Cspan class=\"hljs-string\">validate-tables\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">repository\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">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        \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;pip&#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\">Python\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        pip install pandas numpy jsonschema\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Run\u003C/span> \u003Cspan class=\"hljs-string\">data\u003C/span> \u003Cspan class=\"hljs-string\">integrity\u003C/span> \u003Cspan class=\"hljs-string\">checks\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/check-data-integrity.py --format markdown\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Validate\u003C/span> \u003Cspan class=\"hljs-string\">cross-table\u003C/span> \u003Cspan class=\"hljs-string\">references\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/validate-cross-references.py\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\">data\u003C/span> \u003Cspan class=\"hljs-string\">quality\u003C/span> \u003Cspan class=\"hljs-string\">metrics\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python scripts/generate-quality-metrics.py &gt; quality-metrics.json\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\">metrics\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\">data-quality-metrics\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">quality-metrics.json\u003C/span>\n\n  \u003Cspan class=\"hljs-attr\">performance-test:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.event_name\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;pull_request&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">repository\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;18&#x27;\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">npm\u003C/span> \u003Cspan class=\"hljs-string\">install\u003C/span>\n    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Run\u003C/span> \u003Cspan class=\"hljs-string\">table\u003C/span> \u003Cspan class=\"hljs-string\">rendering\u003C/span> \u003Cspan class=\"hljs-string\">performance\u003C/span> \u003Cspan class=\"hljs-string\">test\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        node scripts/performance-test.js &gt; performance-results.json\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Check\u003C/span> \u003Cspan class=\"hljs-string\">performance\u003C/span> \u003Cspan class=\"hljs-string\">regression\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        node scripts/check-performance-regression.js\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Upload\u003C/span> \u003Cspan class=\"hljs-string\">performance\u003C/span> \u003Cspan class=\"hljs-string\">results\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/upload-artifact@v3\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">performance-results\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">performance-results.json\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch3 id=\"advanced-data-quality-monitoring\">Advanced Data Quality Monitoring\u003C/h3>\n\u003Cp>Real-time monitoring and alerting for table data quality:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-comment\"># data-quality-monitor.py - Advanced data quality monitoring system\u003C/span>\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> json\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> pandas \u003Cspan class=\"hljs-keyword\">as\u003C/span> pd\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> numpy \u003Cspan class=\"hljs-keyword\">as\u003C/span> np\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> datetime \u003Cspan class=\"hljs-keyword\">import\u003C/span> datetime, timedelta\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> smtplib\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> email.mime.text \u003Cspan class=\"hljs-keyword\">import\u003C/span> MIMEText\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> email.mime.multipart \u003Cspan class=\"hljs-keyword\">import\u003C/span> MIMEMultipart\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> requests\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> schedule\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> time\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> re\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">DataQualityMonitor\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">__init__\u003C/span>(\u003Cspan class=\"hljs-params\">self, config_path=\u003Cspan class=\"hljs-string\">&#x27;config/data-quality.json&#x27;\u003C/span>\u003C/span>):\n        \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(config_path) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n            self.config = json.load(f)\n        \n        self.quality_metrics = {\n            \u003Cspan class=\"hljs-string\">&#x27;completeness&#x27;\u003C/span>: {},\n            \u003Cspan class=\"hljs-string\">&#x27;consistency&#x27;\u003C/span>: {},\n            \u003Cspan class=\"hljs-string\">&#x27;accuracy&#x27;\u003C/span>: {},\n            \u003Cspan class=\"hljs-string\">&#x27;timeliness&#x27;\u003C/span>: {},\n            \u003Cspan class=\"hljs-string\">&#x27;validity&#x27;\u003C/span>: {}\n        }\n        \n        self.alerts = []\n        self.history = []\n        \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">scan_markdown_tables\u003C/span>(\u003Cspan class=\"hljs-params\">self, content_dir\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Scan all markdown files for tables and extract data&quot;&quot;&quot;\u003C/span>\n        tables_data = []\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> md_file \u003Cspan class=\"hljs-keyword\">in\u003C/span> Path(content_dir).rglob(\u003Cspan class=\"hljs-string\">&#x27;*.md&#x27;\u003C/span>):\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(md_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                tables = self.extract_tables_from_markdown(content)\n                \n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, table \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(tables):\n                    table_data = {\n                        \u003Cspan class=\"hljs-string\">&#x27;file&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">str\u003C/span>(md_file),\n                        \u003Cspan class=\"hljs-string\">&#x27;table_index&#x27;\u003C/span>: i,\n                        \u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>: table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>],\n                        \u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>: table[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>],\n                        \u003Cspan class=\"hljs-string\">&#x27;metadata&#x27;\u003C/span>: {\n                            \u003Cspan class=\"hljs-string\">&#x27;last_modified&#x27;\u003C/span>: datetime.fromtimestamp(md_file.stat().st_mtime),\n                            \u003Cspan class=\"hljs-string\">&#x27;size&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(table[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>]),\n                            \u003Cspan class=\"hljs-string\">&#x27;columns&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>])\n                        }\n                    }\n                    tables_data.append(table_data)\n                    \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 processing \u003Cspan class=\"hljs-subst\">{md_file}\u003C/span>: \u003Cspan class=\"hljs-subst\">{e}\u003C/span>&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> tables_data\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">extract_tables_from_markdown\u003C/span>(\u003Cspan class=\"hljs-params\">self, content\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Extract table data from markdown content&quot;&quot;&quot;\u003C/span>\n        tables = []\n        lines = content.split(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>)\n        current_table = \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> i, line \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(lines):\n            line = line.strip()\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> line \u003Cspan class=\"hljs-keyword\">and\u003C/span> line:\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> current_table \u003Cspan class=\"hljs-keyword\">is\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>:\n                    current_table = {\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>: [], \u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>: [], \u003Cspan class=\"hljs-string\">&#x27;separator_found&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">False\u003C/span>}\n                \n                cells = [cell.strip() \u003Cspan class=\"hljs-keyword\">for\u003C/span> cell \u003Cspan class=\"hljs-keyword\">in\u003C/span> line.split(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>)[\u003Cspan class=\"hljs-number\">1\u003C/span>:-\u003Cspan class=\"hljs-number\">1\u003C/span>]]\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> current_table[\u003Cspan class=\"hljs-string\">&#x27;separator_found&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">and\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^[\\s\\|:\\-]+$&#x27;\u003C/span>, line):\n                    current_table[\u003Cspan class=\"hljs-string\">&#x27;separator_found&#x27;\u003C/span>] = \u003Cspan class=\"hljs-literal\">True\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> current_table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^[\\s\\|:\\-]+$&#x27;\u003C/span>, line):\n                    current_table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>] = cells\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> current_table[\u003Cspan class=\"hljs-string\">&#x27;separator_found&#x27;\u003C/span>]:\n                    current_table[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>].append(cells)\n                    \n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> current_table \u003Cspan class=\"hljs-keyword\">is\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>:\n                \u003Cspan class=\"hljs-comment\"># End of table\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> current_table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">and\u003C/span> current_table[\u003Cspan class=\"hljs-string\">&#x27;separator_found&#x27;\u003C/span>]:\n                    tables.append(current_table)\n                current_table = \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Handle table at end of file\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> current_table \u003Cspan class=\"hljs-keyword\">and\u003C/span> current_table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">and\u003C/span> current_table[\u003Cspan class=\"hljs-string\">&#x27;separator_found&#x27;\u003C/span>]:\n            tables.append(current_table)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> tables\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">calculate_completeness_metrics\u003C/span>(\u003Cspan class=\"hljs-params\">self, tables_data\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Calculate data completeness metrics&quot;&quot;&quot;\u003C/span>\n        metrics = {}\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> table \u003Cspan class=\"hljs-keyword\">in\u003C/span> tables_data:\n            table_id = \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{table[\u003Cspan class=\"hljs-string\">&#x27;file&#x27;\u003C/span>]}\u003C/span>:\u003Cspan class=\"hljs-subst\">{table[\u003Cspan class=\"hljs-string\">&#x27;table_index&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>\n            \n            total_cells = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(table[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>]) * \u003Cspan class=\"hljs-built_in\">len\u003C/span>(table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>])\n            filled_cells = \u003Cspan class=\"hljs-number\">0\u003C/span>\n            \n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> row \u003Cspan class=\"hljs-keyword\">in\u003C/span> table[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>]:\n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> cell \u003Cspan class=\"hljs-keyword\">in\u003C/span> row:\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> cell.strip():\n                        filled_cells += \u003Cspan class=\"hljs-number\">1\u003C/span>\n            \n            completeness = (filled_cells / total_cells * \u003Cspan class=\"hljs-number\">100\u003C/span>) \u003Cspan class=\"hljs-keyword\">if\u003C/span> total_cells &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n            \n            metrics[table_id] = {\n                \u003Cspan class=\"hljs-string\">&#x27;completeness_percentage&#x27;\u003C/span>: completeness,\n                \u003Cspan class=\"hljs-string\">&#x27;total_cells&#x27;\u003C/span>: total_cells,\n                \u003Cspan class=\"hljs-string\">&#x27;filled_cells&#x27;\u003C/span>: filled_cells,\n                \u003Cspan class=\"hljs-string\">&#x27;empty_cells&#x27;\u003C/span>: total_cells - filled_cells,\n                \u003Cspan class=\"hljs-string\">&#x27;column_completeness&#x27;\u003C/span>: self.calculate_column_completeness(table)\n            }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> metrics\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">calculate_column_completeness\u003C/span>(\u003Cspan class=\"hljs-params\">self, table\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Calculate completeness for each column&quot;&quot;&quot;\u003C/span>\n        column_metrics = {}\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> col_index, header \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>]):\n            filled_count = \u003Cspan class=\"hljs-number\">0\u003C/span>\n            total_count = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(table[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>])\n            \n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> row \u003Cspan class=\"hljs-keyword\">in\u003C/span> table[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>]:\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> col_index &lt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(row) \u003Cspan class=\"hljs-keyword\">and\u003C/span> row[col_index].strip():\n                    filled_count += \u003Cspan class=\"hljs-number\">1\u003C/span>\n            \n            completeness = (filled_count / total_count * \u003Cspan class=\"hljs-number\">100\u003C/span>) \u003Cspan class=\"hljs-keyword\">if\u003C/span> total_count &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n            column_metrics[header] = {\n                \u003Cspan class=\"hljs-string\">&#x27;completeness&#x27;\u003C/span>: completeness,\n                \u003Cspan class=\"hljs-string\">&#x27;filled&#x27;\u003C/span>: filled_count,\n                \u003Cspan class=\"hljs-string\">&#x27;total&#x27;\u003C/span>: total_count\n            }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> column_metrics\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">calculate_consistency_metrics\u003C/span>(\u003Cspan class=\"hljs-params\">self, tables_data\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Calculate data consistency metrics&quot;&quot;&quot;\u003C/span>\n        metrics = {}\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> table \u003Cspan class=\"hljs-keyword\">in\u003C/span> tables_data:\n            table_id = \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{table[\u003Cspan class=\"hljs-string\">&#x27;file&#x27;\u003C/span>]}\u003C/span>:\u003Cspan class=\"hljs-subst\">{table[\u003Cspan class=\"hljs-string\">&#x27;table_index&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>\n            \n            consistency_scores = {}\n            \n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> col_index, header \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>]):\n                column_data = []\n                \n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> row \u003Cspan class=\"hljs-keyword\">in\u003C/span> table[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>]:\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> col_index &lt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(row):\n                        column_data.append(row[col_index].strip())\n                \n                \u003Cspan class=\"hljs-comment\"># Data type consistency\u003C/span>\n                type_consistency = self.calculate_type_consistency(column_data)\n                \n                \u003Cspan class=\"hljs-comment\"># Format consistency  \u003C/span>\n                format_consistency = self.calculate_format_consistency(column_data)\n                \n                \u003Cspan class=\"hljs-comment\"># Case consistency\u003C/span>\n                case_consistency = self.calculate_case_consistency(column_data)\n                \n                consistency_scores[header] = {\n                    \u003Cspan class=\"hljs-string\">&#x27;type_consistency&#x27;\u003C/span>: type_consistency,\n                    \u003Cspan class=\"hljs-string\">&#x27;format_consistency&#x27;\u003C/span>: format_consistency,\n                    \u003Cspan class=\"hljs-string\">&#x27;case_consistency&#x27;\u003C/span>: case_consistency,\n                    \u003Cspan class=\"hljs-string\">&#x27;overall_consistency&#x27;\u003C/span>: (type_consistency + format_consistency + case_consistency) / \u003Cspan class=\"hljs-number\">3\u003C/span>\n                }\n            \n            metrics[table_id] = consistency_scores\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> metrics\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">calculate_type_consistency\u003C/span>(\u003Cspan class=\"hljs-params\">self, column_data\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Calculate data type consistency within a column&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> column_data:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-number\">100\u003C/span>\n        \n        non_empty = [val \u003Cspan class=\"hljs-keyword\">for\u003C/span> val \u003Cspan class=\"hljs-keyword\">in\u003C/span> column_data \u003Cspan class=\"hljs-keyword\">if\u003C/span> val]\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> non_empty:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-number\">100\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Detect primary data type\u003C/span>\n        type_counts = {\n            \u003Cspan class=\"hljs-string\">&#x27;number&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;boolean&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;url&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;email&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;string&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> value \u003Cspan class=\"hljs-keyword\">in\u003C/span> non_empty:\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.is_number(value):\n                type_counts[\u003Cspan class=\"hljs-string\">&#x27;number&#x27;\u003C/span>] += \u003Cspan class=\"hljs-number\">1\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> self.is_date(value):\n                type_counts[\u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>] += \u003Cspan class=\"hljs-number\">1\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> self.is_boolean(value):\n                type_counts[\u003Cspan class=\"hljs-string\">&#x27;boolean&#x27;\u003C/span>] += \u003Cspan class=\"hljs-number\">1\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> self.is_url(value):\n                type_counts[\u003Cspan class=\"hljs-string\">&#x27;url&#x27;\u003C/span>] += \u003Cspan class=\"hljs-number\">1\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">elif\u003C/span> self.is_email(value):\n                type_counts[\u003Cspan class=\"hljs-string\">&#x27;email&#x27;\u003C/span>] += \u003Cspan class=\"hljs-number\">1\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                type_counts[\u003Cspan class=\"hljs-string\">&#x27;string&#x27;\u003C/span>] += \u003Cspan class=\"hljs-number\">1\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Calculate consistency as percentage of most common type\u003C/span>\n        max_count = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(type_counts.values())\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> (max_count / \u003Cspan class=\"hljs-built_in\">len\u003C/span>(non_empty)) * \u003Cspan class=\"hljs-number\">100\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">calculate_format_consistency\u003C/span>(\u003Cspan class=\"hljs-params\">self, column_data\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Calculate format consistency within a column&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> column_data:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-number\">100\u003C/span>\n        \n        non_empty = [val \u003Cspan class=\"hljs-keyword\">for\u003C/span> val \u003Cspan class=\"hljs-keyword\">in\u003C/span> column_data \u003Cspan class=\"hljs-keyword\">if\u003C/span> val]\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(non_empty) &lt;= \u003Cspan class=\"hljs-number\">1\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-number\">100\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Group by format patterns\u003C/span>\n        format_patterns = {}\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> value \u003Cspan class=\"hljs-keyword\">in\u003C/span> non_empty:\n            pattern = self.extract_format_pattern(value)\n            format_patterns[pattern] = format_patterns.get(pattern, \u003Cspan class=\"hljs-number\">0\u003C/span>) + \u003Cspan class=\"hljs-number\">1\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Calculate consistency as percentage of most common format\u003C/span>\n        max_count = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(format_patterns.values())\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> (max_count / \u003Cspan class=\"hljs-built_in\">len\u003C/span>(non_empty)) * \u003Cspan class=\"hljs-number\">100\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">calculate_case_consistency\u003C/span>(\u003Cspan class=\"hljs-params\">self, column_data\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Calculate case consistency within a column&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> column_data:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-number\">100\u003C/span>\n        \n        text_values = [val \u003Cspan class=\"hljs-keyword\">for\u003C/span> val \u003Cspan class=\"hljs-keyword\">in\u003C/span> column_data \u003Cspan class=\"hljs-keyword\">if\u003C/span> val \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> self.is_number(val)]\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(text_values) &lt;= \u003Cspan class=\"hljs-number\">1\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-number\">100\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Count case patterns\u003C/span>\n        case_counts = {\n            \u003Cspan class=\"hljs-string\">&#x27;lowercase&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">sum\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">for\u003C/span> val \u003Cspan class=\"hljs-keyword\">in\u003C/span> text_values \u003Cspan class=\"hljs-keyword\">if\u003C/span> val.islower()),\n            \u003Cspan class=\"hljs-string\">&#x27;uppercase&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">sum\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">for\u003C/span> val \u003Cspan class=\"hljs-keyword\">in\u003C/span> text_values \u003Cspan class=\"hljs-keyword\">if\u003C/span> val.isupper()),\n            \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">sum\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">for\u003C/span> val \u003Cspan class=\"hljs-keyword\">in\u003C/span> text_values \u003Cspan class=\"hljs-keyword\">if\u003C/span> val.istitle()),\n            \u003Cspan class=\"hljs-string\">&#x27;mixed&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">sum\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">for\u003C/span> val \u003Cspan class=\"hljs-keyword\">in\u003C/span> text_values \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> val.islower() \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> val.isupper() \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> val.istitle())\n        }\n        \n        \u003Cspan class=\"hljs-comment\"># Calculate consistency as percentage of most common case\u003C/span>\n        max_count = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(case_counts.values())\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> (max_count / \u003Cspan class=\"hljs-built_in\">len\u003C/span>(text_values)) * \u003Cspan class=\"hljs-number\">100\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">calculate_accuracy_metrics\u003C/span>(\u003Cspan class=\"hljs-params\">self, tables_data\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Calculate data accuracy metrics using validation rules&quot;&quot;&quot;\u003C/span>\n        metrics = {}\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> table \u003Cspan class=\"hljs-keyword\">in\u003C/span> tables_data:\n            table_id = \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{table[\u003Cspan class=\"hljs-string\">&#x27;file&#x27;\u003C/span>]}\u003C/span>:\u003Cspan class=\"hljs-subst\">{table[\u003Cspan class=\"hljs-string\">&#x27;table_index&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>\n            \n            accuracy_scores = {}\n            \n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> col_index, header \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>]):\n                column_data = []\n                \n                \u003Cspan class=\"hljs-keyword\">for\u003C/span> row \u003Cspan class=\"hljs-keyword\">in\u003C/span> table[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>]:\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> col_index &lt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(row):\n                        column_data.append(row[col_index].strip())\n                \n                \u003Cspan class=\"hljs-comment\"># Apply validation rules based on column name and data\u003C/span>\n                validation_results = self.apply_validation_rules(header, column_data)\n                \n                total_values = \u003Cspan class=\"hljs-built_in\">len\u003C/span>([val \u003Cspan class=\"hljs-keyword\">for\u003C/span> val \u003Cspan class=\"hljs-keyword\">in\u003C/span> column_data \u003Cspan class=\"hljs-keyword\">if\u003C/span> val])\n                valid_values = \u003Cspan class=\"hljs-built_in\">sum\u003C/span>(\u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">for\u003C/span> result \u003Cspan class=\"hljs-keyword\">in\u003C/span> validation_results \u003Cspan class=\"hljs-keyword\">if\u003C/span> result[\u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span>])\n                \n                accuracy = (valid_values / total_values * \u003Cspan class=\"hljs-number\">100\u003C/span>) \u003Cspan class=\"hljs-keyword\">if\u003C/span> total_values &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-number\">100\u003C/span>\n                \n                accuracy_scores[header] = {\n                    \u003Cspan class=\"hljs-string\">&#x27;accuracy_percentage&#x27;\u003C/span>: accuracy,\n                    \u003Cspan class=\"hljs-string\">&#x27;valid_count&#x27;\u003C/span>: valid_values,\n                    \u003Cspan class=\"hljs-string\">&#x27;total_count&#x27;\u003C/span>: total_values,\n                    \u003Cspan class=\"hljs-string\">&#x27;invalid_values&#x27;\u003C/span>: [r \u003Cspan class=\"hljs-keyword\">for\u003C/span> r \u003Cspan class=\"hljs-keyword\">in\u003C/span> validation_results \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> r[\u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span>]]\n                }\n            \n            metrics[table_id] = accuracy_scores\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> metrics\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">apply_validation_rules\u003C/span>(\u003Cspan class=\"hljs-params\">self, column_name, column_data\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Apply validation rules based on column name patterns&quot;&quot;&quot;\u003C/span>\n        results = []\n        \n        \u003Cspan class=\"hljs-comment\"># Get validation rules for this column\u003C/span>\n        rules = self.get_column_validation_rules(column_name)\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> value \u003Cspan class=\"hljs-keyword\">in\u003C/span> column_data:\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> value:\n                results.append({\u003Cspan class=\"hljs-string\">&#x27;value&#x27;\u003C/span>: value, \u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>})\n                \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \n            is_valid = \u003Cspan class=\"hljs-literal\">True\u003C/span>\n            errors = []\n            \n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> rule \u003Cspan class=\"hljs-keyword\">in\u003C/span> rules:\n                \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> rule[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>] == \u003Cspan class=\"hljs-string\">&#x27;regex&#x27;\u003C/span>:\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(rule[\u003Cspan class=\"hljs-string\">&#x27;pattern&#x27;\u003C/span>], value):\n                            is_valid = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n                            errors.append(\u003Cspan class=\"hljs-string\">f&quot;Does not match pattern: \u003Cspan class=\"hljs-subst\">{rule[\u003Cspan class=\"hljs-string\">&#x27;pattern&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n                    \n                    \u003Cspan class=\"hljs-keyword\">elif\u003C/span> rule[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>] == \u003Cspan class=\"hljs-string\">&#x27;range&#x27;\u003C/span>:\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> self.is_number(value):\n                            num_val = \u003Cspan class=\"hljs-built_in\">float\u003C/span>(value)\n                            \u003Cspan class=\"hljs-keyword\">if\u003C/span> num_val &lt; rule[\u003Cspan class=\"hljs-string\">&#x27;min&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">or\u003C/span> num_val &gt; rule[\u003Cspan class=\"hljs-string\">&#x27;max&#x27;\u003C/span>]:\n                                is_valid = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n                                errors.append(\u003Cspan class=\"hljs-string\">f&quot;Value \u003Cspan class=\"hljs-subst\">{num_val}\u003C/span> outside range [\u003Cspan class=\"hljs-subst\">{rule[\u003Cspan class=\"hljs-string\">&#x27;min&#x27;\u003C/span>]}\u003C/span>, \u003Cspan class=\"hljs-subst\">{rule[\u003Cspan class=\"hljs-string\">&#x27;max&#x27;\u003C/span>]}\u003C/span>]&quot;\u003C/span>)\n                    \n                    \u003Cspan class=\"hljs-keyword\">elif\u003C/span> rule[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>] == \u003Cspan class=\"hljs-string\">&#x27;enum&#x27;\u003C/span>:\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> value.lower() \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> [opt.lower() \u003Cspan class=\"hljs-keyword\">for\u003C/span> opt \u003Cspan class=\"hljs-keyword\">in\u003C/span> rule[\u003Cspan class=\"hljs-string\">&#x27;options&#x27;\u003C/span>]]:\n                            is_valid = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n                            errors.append(\u003Cspan class=\"hljs-string\">f&quot;Value not in allowed options: \u003Cspan class=\"hljs-subst\">{rule[\u003Cspan class=\"hljs-string\">&#x27;options&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n                    \n                    \u003Cspan class=\"hljs-keyword\">elif\u003C/span> rule[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>] == \u003Cspan class=\"hljs-string\">&#x27;length&#x27;\u003C/span>:\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(value) &lt; rule[\u003Cspan class=\"hljs-string\">&#x27;min&#x27;\u003C/span>] \u003Cspan class=\"hljs-keyword\">or\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(value) &gt; rule[\u003Cspan class=\"hljs-string\">&#x27;max&#x27;\u003C/span>]:\n                            is_valid = \u003Cspan class=\"hljs-literal\">False\u003C/span>\n                            errors.append(\u003Cspan class=\"hljs-string\">f&quot;Length \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">len\u003C/span>(value)}\u003C/span> outside range [\u003Cspan class=\"hljs-subst\">{rule[\u003Cspan class=\"hljs-string\">&#x27;min&#x27;\u003C/span>]}\u003C/span>, \u003Cspan class=\"hljs-subst\">{rule[\u003Cspan class=\"hljs-string\">&#x27;max&#x27;\u003C/span>]}\u003C/span>]&quot;\u003C/span>)\n                \n                \u003Cspan class=\"hljs-keyword\">except\u003C/span> Exception \u003Cspan class=\"hljs-keyword\">as\u003C/span> e:\n                    errors.append(\u003Cspan class=\"hljs-string\">f&quot;Validation error: \u003Cspan class=\"hljs-subst\">{e}\u003C/span>&quot;\u003C/span>)\n            \n            results.append({\n                \u003Cspan class=\"hljs-string\">&#x27;value&#x27;\u003C/span>: value,\n                \u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span>: is_valid,\n                \u003Cspan class=\"hljs-string\">&#x27;errors&#x27;\u003C/span>: errors\n            })\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> results\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">get_column_validation_rules\u003C/span>(\u003Cspan class=\"hljs-params\">self, column_name\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Get validation rules based on column name patterns&quot;&quot;&quot;\u003C/span>\n        rules = []\n        \n        name_lower = column_name.lower()\n        \n        \u003Cspan class=\"hljs-comment\"># Email validation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;email&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> name_lower:\n            rules.append({\n                \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;regex&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;pattern&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$&#x27;\u003C/span>\n            })\n        \n        \u003Cspan class=\"hljs-comment\"># URL validation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;url&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> name_lower \u003Cspan class=\"hljs-keyword\">or\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;link&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> name_lower:\n            rules.append({\n                \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;regex&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;pattern&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^https?://.+&#x27;\u003C/span>\n            })\n        \n        \u003Cspan class=\"hljs-comment\"># Version validation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;version&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> name_lower:\n            rules.append({\n                \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;regex&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;pattern&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^\\d+\\.\\d+(\\.\\d+)?&#x27;\u003C/span>\n            })\n        \n        \u003Cspan class=\"hljs-comment\"># Status validation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> name_lower:\n            rules.append({\n                \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;enum&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;options&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;active&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;inactive&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;pending&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;completed&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;draft&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;published&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;archived&#x27;\u003C/span>]\n            })\n        \n        \u003Cspan class=\"hljs-comment\"># Date validation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> name_lower:\n            rules.append({\n                \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;regex&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;pattern&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">r&#x27;^\\d{4}-\\d{2}-\\d{2}|\\d{1,2}/\\d{1,2}/\\d{2,4}|[A-Za-z]{3,9}\\s+\\d{1,2},?\\s+\\d{4}&#x27;\u003C/span>\n            })\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> rules\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">calculate_timeliness_metrics\u003C/span>(\u003Cspan class=\"hljs-params\">self, tables_data\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Calculate data timeliness metrics&quot;&quot;&quot;\u003C/span>\n        metrics = {}\n        current_time = datetime.now()\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> table \u003Cspan class=\"hljs-keyword\">in\u003C/span> tables_data:\n            table_id = \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{table[\u003Cspan class=\"hljs-string\">&#x27;file&#x27;\u003C/span>]}\u003C/span>:\u003Cspan class=\"hljs-subst\">{table[\u003Cspan class=\"hljs-string\">&#x27;table_index&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>\n            \n            last_modified = table[\u003Cspan class=\"hljs-string\">&#x27;metadata&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;last_modified&#x27;\u003C/span>]\n            age_days = (current_time - last_modified).days\n            \n            \u003Cspan class=\"hljs-comment\"># Define freshness thresholds\u003C/span>\n            freshness_score = \u003Cspan class=\"hljs-number\">100\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> age_days &gt; \u003Cspan class=\"hljs-number\">30\u003C/span>:\n                freshness_score = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">100\u003C/span> - (age_days - \u003Cspan class=\"hljs-number\">30\u003C/span>) * \u003Cspan class=\"hljs-number\">2\u003C/span>)  \u003Cspan class=\"hljs-comment\"># Decrease by 2% per day after 30 days\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Look for date columns to assess data currency\u003C/span>\n            date_columns = []\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> col_index, header \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(table[\u003Cspan class=\"hljs-string\">&#x27;headers&#x27;\u003C/span>]):\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span> header.lower():\n                    column_data = []\n                    \u003Cspan class=\"hljs-keyword\">for\u003C/span> row \u003Cspan class=\"hljs-keyword\">in\u003C/span> table[\u003Cspan class=\"hljs-string\">&#x27;rows&#x27;\u003C/span>]:\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> col_index &lt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(row):\n                            column_data.append(row[col_index].strip())\n                    \n                    date_values = []\n                    \u003Cspan class=\"hljs-keyword\">for\u003C/span> value \u003Cspan class=\"hljs-keyword\">in\u003C/span> column_data:\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> value \u003Cspan class=\"hljs-keyword\">and\u003C/span> self.is_date(value):\n                            \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n                                parsed_date = pd.to_datetime(value)\n                                date_values.append(parsed_date)\n                            \u003Cspan class=\"hljs-keyword\">except\u003C/span>:\n                                \u003Cspan class=\"hljs-keyword\">pass\u003C/span>\n                    \n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> date_values:\n                        latest_date = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(date_values)\n                        data_age = (pd.Timestamp.now() - latest_date).days\n                        \n                        date_columns.append({\n                            \u003Cspan class=\"hljs-string\">&#x27;column&#x27;\u003C/span>: header,\n                            \u003Cspan class=\"hljs-string\">&#x27;latest_date&#x27;\u003C/span>: latest_date,\n                            \u003Cspan class=\"hljs-string\">&#x27;age_days&#x27;\u003C/span>: data_age,\n                            \u003Cspan class=\"hljs-string\">&#x27;values_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(date_values)\n                        })\n            \n            metrics[table_id] = {\n                \u003Cspan class=\"hljs-string\">&#x27;file_freshness_score&#x27;\u003C/span>: freshness_score,\n                \u003Cspan class=\"hljs-string\">&#x27;file_age_days&#x27;\u003C/span>: age_days,\n                \u003Cspan class=\"hljs-string\">&#x27;last_modified&#x27;\u003C/span>: last_modified.isoformat(),\n                \u003Cspan class=\"hljs-string\">&#x27;date_columns&#x27;\u003C/span>: date_columns\n            }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> metrics\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">run_quality_assessment\u003C/span>(\u003Cspan class=\"hljs-params\">self, content_dir\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Run complete data quality assessment&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;Starting data quality assessment...&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Scan all tables\u003C/span>\n        tables_data = self.scan_markdown_tables(content_dir)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Found \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">len\u003C/span>(tables_data)}\u003C/span> tables to analyze&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Calculate metrics\u003C/span>\n        self.quality_metrics[\u003Cspan class=\"hljs-string\">&#x27;completeness&#x27;\u003C/span>] = self.calculate_completeness_metrics(tables_data)\n        self.quality_metrics[\u003Cspan class=\"hljs-string\">&#x27;consistency&#x27;\u003C/span>] = self.calculate_consistency_metrics(tables_data)\n        self.quality_metrics[\u003Cspan class=\"hljs-string\">&#x27;accuracy&#x27;\u003C/span>] = self.calculate_accuracy_metrics(tables_data)\n        self.quality_metrics[\u003Cspan class=\"hljs-string\">&#x27;timeliness&#x27;\u003C/span>] = self.calculate_timeliness_metrics(tables_data)\n        \n        \u003Cspan class=\"hljs-comment\"># Generate overall quality scores\u003C/span>\n        quality_report = self.generate_quality_report()\n        \n        \u003Cspan class=\"hljs-comment\"># Check for alerts\u003C/span>\n        self.check_quality_alerts()\n        \n        \u003Cspan class=\"hljs-comment\"># Save results\u003C/span>\n        self.save_quality_results()\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> quality_report\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_quality_report\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Generate comprehensive quality report&quot;&quot;&quot;\u003C/span>\n        report = {\n            \u003Cspan class=\"hljs-string\">&#x27;timestamp&#x27;\u003C/span>: datetime.now().isoformat(),\n            \u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>: {\n                \u003Cspan class=\"hljs-string\">&#x27;total_tables&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(self.quality_metrics[\u003Cspan class=\"hljs-string\">&#x27;completeness&#x27;\u003C/span>]),\n                \u003Cspan class=\"hljs-string\">&#x27;overall_quality_score&#x27;\u003C/span>: self.calculate_overall_quality_score(),\n                \u003Cspan class=\"hljs-string\">&#x27;dimension_scores&#x27;\u003C/span>: {\n                    \u003Cspan class=\"hljs-string\">&#x27;completeness&#x27;\u003C/span>: self.calculate_dimension_average(\u003Cspan class=\"hljs-string\">&#x27;completeness&#x27;\u003C/span>),\n                    \u003Cspan class=\"hljs-string\">&#x27;consistency&#x27;\u003C/span>: self.calculate_dimension_average(\u003Cspan class=\"hljs-string\">&#x27;consistency&#x27;\u003C/span>),\n                    \u003Cspan class=\"hljs-string\">&#x27;accuracy&#x27;\u003C/span>: self.calculate_dimension_average(\u003Cspan class=\"hljs-string\">&#x27;accuracy&#x27;\u003C/span>),\n                    \u003Cspan class=\"hljs-string\">&#x27;timeliness&#x27;\u003C/span>: self.calculate_dimension_average(\u003Cspan class=\"hljs-string\">&#x27;timeliness&#x27;\u003C/span>)\n                }\n            },\n            \u003Cspan class=\"hljs-string\">&#x27;alerts&#x27;\u003C/span>: self.alerts,\n            \u003Cspan class=\"hljs-string\">&#x27;top_issues&#x27;\u003C/span>: self.identify_top_issues(),\n            \u003Cspan class=\"hljs-string\">&#x27;recommendations&#x27;\u003C/span>: self.generate_recommendations(),\n            \u003Cspan class=\"hljs-string\">&#x27;detailed_metrics&#x27;\u003C/span>: self.quality_metrics\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> report\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">calculate_overall_quality_score\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Calculate overall quality score across all dimensions&quot;&quot;&quot;\u003C/span>\n        dimension_weights = {\n            \u003Cspan class=\"hljs-string\">&#x27;completeness&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0.3\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;consistency&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0.25\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;accuracy&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0.3\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;timeliness&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0.15\u003C/span>\n        }\n        \n        weighted_score = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> dimension, weight \u003Cspan class=\"hljs-keyword\">in\u003C/span> dimension_weights.items():\n            dimension_score = self.calculate_dimension_average(dimension)\n            weighted_score += dimension_score * weight\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-built_in\">round\u003C/span>(weighted_score, \u003Cspan class=\"hljs-number\">2\u003C/span>)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">calculate_dimension_average\u003C/span>(\u003Cspan class=\"hljs-params\">self, dimension\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Calculate average score for a quality dimension&quot;&quot;&quot;\u003C/span>\n        metrics = self.quality_metrics[dimension]\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> metrics:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> dimension == \u003Cspan class=\"hljs-string\">&#x27;completeness&#x27;\u003C/span>:\n            scores = [table_metrics[\u003Cspan class=\"hljs-string\">&#x27;completeness_percentage&#x27;\u003C/span>] \n                     \u003Cspan class=\"hljs-keyword\">for\u003C/span> table_metrics \u003Cspan class=\"hljs-keyword\">in\u003C/span> metrics.values()]\n        \n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> dimension == \u003Cspan class=\"hljs-string\">&#x27;consistency&#x27;\u003C/span>:\n            scores = []\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> table_metrics \u003Cspan class=\"hljs-keyword\">in\u003C/span> metrics.values():\n                table_scores = [col_data[\u003Cspan class=\"hljs-string\">&#x27;overall_consistency&#x27;\u003C/span>] \n                              \u003Cspan class=\"hljs-keyword\">for\u003C/span> col_data \u003Cspan class=\"hljs-keyword\">in\u003C/span> table_metrics.values()]\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> table_scores:\n                    scores.append(\u003Cspan class=\"hljs-built_in\">sum\u003C/span>(table_scores) / \u003Cspan class=\"hljs-built_in\">len\u003C/span>(table_scores))\n        \n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> dimension == \u003Cspan class=\"hljs-string\">&#x27;accuracy&#x27;\u003C/span>:\n            scores = []\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> table_metrics \u003Cspan class=\"hljs-keyword\">in\u003C/span> metrics.values():\n                table_scores = [col_data[\u003Cspan class=\"hljs-string\">&#x27;accuracy_percentage&#x27;\u003C/span>] \n                              \u003Cspan class=\"hljs-keyword\">for\u003C/span> col_data \u003Cspan class=\"hljs-keyword\">in\u003C/span> table_metrics.values()]\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> table_scores:\n                    scores.append(\u003Cspan class=\"hljs-built_in\">sum\u003C/span>(table_scores) / \u003Cspan class=\"hljs-built_in\">len\u003C/span>(table_scores))\n        \n        \u003Cspan class=\"hljs-keyword\">elif\u003C/span> dimension == \u003Cspan class=\"hljs-string\">&#x27;timeliness&#x27;\u003C/span>:\n            scores = [table_metrics[\u003Cspan class=\"hljs-string\">&#x27;file_freshness_score&#x27;\u003C/span>] \n                     \u003Cspan class=\"hljs-keyword\">for\u003C/span> table_metrics \u003Cspan class=\"hljs-keyword\">in\u003C/span> metrics.values()]\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-built_in\">round\u003C/span>(\u003Cspan class=\"hljs-built_in\">sum\u003C/span>(scores) / \u003Cspan class=\"hljs-built_in\">len\u003C/span>(scores), \u003Cspan class=\"hljs-number\">2\u003C/span>) \u003Cspan class=\"hljs-keyword\">if\u003C/span> scores \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">check_quality_alerts\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Check for quality issues that require alerts&quot;&quot;&quot;\u003C/span>\n        self.alerts = []\n        \n        \u003Cspan class=\"hljs-comment\"># Check completeness alerts\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> table_id, metrics \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.quality_metrics[\u003Cspan class=\"hljs-string\">&#x27;completeness&#x27;\u003C/span>].items():\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> metrics[\u003Cspan class=\"hljs-string\">&#x27;completeness_percentage&#x27;\u003C/span>] &lt; \u003Cspan class=\"hljs-number\">50\u003C/span>:\n                self.alerts.append({\n                    \u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;completeness&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>: table_id,\n                    \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&quot;Table completeness is only \u003Cspan class=\"hljs-subst\">{metrics[\u003Cspan class=\"hljs-string\">&#x27;completeness_percentage&#x27;\u003C/span>]:\u003Cspan class=\"hljs-number\">.1\u003C/span>f}\u003C/span>%&quot;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;recommendation&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Review and fill missing data or add placeholders&#x27;\u003C/span>\n                })\n        \n        \u003Cspan class=\"hljs-comment\"># Check accuracy alerts\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> table_id, metrics \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.quality_metrics[\u003Cspan class=\"hljs-string\">&#x27;accuracy&#x27;\u003C/span>].items():\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> column, col_metrics \u003Cspan class=\"hljs-keyword\">in\u003C/span> metrics.items():\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> col_metrics[\u003Cspan class=\"hljs-string\">&#x27;accuracy_percentage&#x27;\u003C/span>] &lt; \u003Cspan class=\"hljs-number\">80\u003C/span>:\n                    self.alerts.append({\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;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;accuracy&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>: table_id,\n                        \u003Cspan class=\"hljs-string\">&#x27;column&#x27;\u003C/span>: column,\n                        \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&quot;Column &#x27;\u003Cspan class=\"hljs-subst\">{column}\u003C/span>&#x27; accuracy is only \u003Cspan class=\"hljs-subst\">{col_metrics[\u003Cspan class=\"hljs-string\">&#x27;accuracy_percentage&#x27;\u003C/span>]:\u003Cspan class=\"hljs-number\">.1\u003C/span>f}\u003C/span>%&quot;\u003C/span>,\n                        \u003Cspan class=\"hljs-string\">&#x27;recommendation&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Review and fix invalid data values&#x27;\u003C/span>\n                    })\n        \n        \u003Cspan class=\"hljs-comment\"># Check timeliness alerts\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> table_id, metrics \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.quality_metrics[\u003Cspan class=\"hljs-string\">&#x27;timeliness&#x27;\u003C/span>].items():\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> metrics[\u003Cspan class=\"hljs-string\">&#x27;file_age_days&#x27;\u003C/span>] &gt; \u003Cspan class=\"hljs-number\">90\u003C/span>:\n                self.alerts.append({\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;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;timeliness&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>: table_id,\n                    \u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&quot;Table data is \u003Cspan class=\"hljs-subst\">{metrics[\u003Cspan class=\"hljs-string\">&#x27;file_age_days&#x27;\u003C/span>]}\u003C/span> days old&quot;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;recommendation&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Review and update data if necessary&#x27;\u003C/span>\n                })\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">identify_top_issues\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Identify top data quality issues across all tables&quot;&quot;&quot;\u003C/span>\n        issues = []\n        \n        \u003Cspan class=\"hljs-comment\"># Collect all issues\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> alert \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.alerts:\n            issues.append({\n                \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: alert[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>],\n                \u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>: alert[\u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>],\n                \u003Cspan class=\"hljs-string\">&#x27;count&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;tables&#x27;\u003C/span>: [alert[\u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>]]\n            })\n        \n        \u003Cspan class=\"hljs-comment\"># Group similar issues\u003C/span>\n        grouped_issues = {}\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue \u003Cspan class=\"hljs-keyword\">in\u003C/span> issues:\n            key = \u003Cspan class=\"hljs-string\">f&quot;\u003Cspan class=\"hljs-subst\">{issue[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>]}\u003C/span>:\u003Cspan class=\"hljs-subst\">{issue[\u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> key \u003Cspan class=\"hljs-keyword\">in\u003C/span> grouped_issues:\n                grouped_issues[key][\u003Cspan class=\"hljs-string\">&#x27;count&#x27;\u003C/span>] += issue[\u003Cspan class=\"hljs-string\">&#x27;count&#x27;\u003C/span>]\n                grouped_issues[key][\u003Cspan class=\"hljs-string\">&#x27;tables&#x27;\u003C/span>].extend(issue[\u003Cspan class=\"hljs-string\">&#x27;tables&#x27;\u003C/span>])\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                grouped_issues[key] = issue\n        \n        \u003Cspan class=\"hljs-comment\"># Sort by severity and count\u003C/span>\n        severity_order = {\u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">3\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">2\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>}\n        sorted_issues = \u003Cspan class=\"hljs-built_in\">sorted\u003C/span>(\n            grouped_issues.values(),\n            key=\u003Cspan class=\"hljs-keyword\">lambda\u003C/span> x: (severity_order.get(x[\u003Cspan class=\"hljs-string\">&#x27;severity&#x27;\u003C/span>], \u003Cspan class=\"hljs-number\">0\u003C/span>), x[\u003Cspan class=\"hljs-string\">&#x27;count&#x27;\u003C/span>]),\n            reverse=\u003Cspan class=\"hljs-literal\">True\u003C/span>\n        )\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> sorted_issues[:\u003Cspan class=\"hljs-number\">10\u003C/span>]  \u003Cspan class=\"hljs-comment\"># Return top 10 issues\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_recommendations\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Generate actionable recommendations based on quality assessment&quot;&quot;&quot;\u003C/span>\n        recommendations = []\n        \n        overall_score = self.calculate_overall_quality_score()\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> overall_score &lt; \u003Cspan class=\"hljs-number\">70\u003C/span>:\n            recommendations.append({\n                \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Improve Overall Data Quality&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Overall quality score is \u003Cspan class=\"hljs-subst\">{overall_score}\u003C/span>%, below acceptable threshold&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;actions&#x27;\u003C/span>: [\n                    \u003Cspan class=\"hljs-string\">&#x27;Focus on completeness and accuracy improvements&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;Implement data validation rules&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;Establish regular data review processes&#x27;\u003C/span>\n                ]\n            })\n        \n        \u003Cspan class=\"hljs-comment\"># Dimension-specific recommendations\u003C/span>\n        completeness_score = self.calculate_dimension_average(\u003Cspan class=\"hljs-string\">&#x27;completeness&#x27;\u003C/span>)\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> completeness_score &lt; \u003Cspan class=\"hljs-number\">80\u003C/span>:\n            recommendations.append({\n                \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Address Data Completeness Issues&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Data completeness is \u003Cspan class=\"hljs-subst\">{completeness_score}\u003C/span>%&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;actions&#x27;\u003C/span>: [\n                    \u003Cspan class=\"hljs-string\">&#x27;Fill missing data where possible&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;Use consistent placeholder values (N/A, TBD)&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;Document data collection requirements&#x27;\u003C/span>\n                ]\n            })\n        \n        consistency_score = self.calculate_dimension_average(\u003Cspan class=\"hljs-string\">&#x27;consistency&#x27;\u003C/span>)\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> consistency_score &lt; \u003Cspan class=\"hljs-number\">75\u003C/span>:\n            recommendations.append({\n                \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Improve Data Consistency&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Data consistency is \u003Cspan class=\"hljs-subst\">{consistency_score}\u003C/span>%&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;actions&#x27;\u003C/span>: [\n                    \u003Cspan class=\"hljs-string\">&#x27;Standardize data formats within columns&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;Implement data entry guidelines&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;Use validation rules and dropdowns&#x27;\u003C/span>\n                ]\n            })\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> recommendations\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">save_quality_results\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Save quality assessment results&quot;&quot;&quot;\u003C/span>\n        timestamp = datetime.now().strftime(\u003Cspan class=\"hljs-string\">&#x27;%Y%m%d_%H%M%S&#x27;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Save detailed results\u003C/span>\n        results_file = \u003Cspan class=\"hljs-string\">f&#x27;quality_results_\u003Cspan class=\"hljs-subst\">{timestamp}\u003C/span>.json&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(results_file, \u003Cspan class=\"hljs-string\">&#x27;w&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n            json.dump(self.quality_metrics, f, indent=\u003Cspan class=\"hljs-number\">2\u003C/span>, default=\u003Cspan class=\"hljs-built_in\">str\u003C/span>)\n        \n        \u003Cspan class=\"hljs-comment\"># Save report\u003C/span>\n        report = self.generate_quality_report()\n        report_file = \u003Cspan class=\"hljs-string\">f&#x27;quality_report_\u003Cspan class=\"hljs-subst\">{timestamp}\u003C/span>.json&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">with\u003C/span> \u003Cspan class=\"hljs-built_in\">open\u003C/span>(report_file, \u003Cspan class=\"hljs-string\">&#x27;w&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">as\u003C/span> f:\n            json.dump(report, f, indent=\u003Cspan class=\"hljs-number\">2\u003C/span>, default=\u003Cspan class=\"hljs-built_in\">str\u003C/span>)\n        \n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Quality results saved to \u003Cspan class=\"hljs-subst\">{results_file}\u003C/span>&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Quality report saved to \u003Cspan class=\"hljs-subst\">{report_file}\u003C/span>&quot;\u003C/span>)\n    \n    \u003Cspan class=\"hljs-comment\"># Helper methods for data type detection\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">is_number\u003C/span>(\u003Cspan class=\"hljs-params\">self, value\u003C/span>):\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            \u003Cspan class=\"hljs-built_in\">float\u003C/span>(value)\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">True\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">except\u003C/span> ValueError:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">False\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">is_date\u003C/span>(\u003Cspan class=\"hljs-params\">self, value\u003C/span>):\n        date_patterns = [\n            \u003Cspan class=\"hljs-string\">r&#x27;^\\d{4}-\\d{2}-\\d{2}$&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">r&#x27;^\\d{2}/\\d{2}/\\d{4}$&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">r&#x27;^\\d{1,2}/\\d{1,2}/\\d{2,4}$&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">r&#x27;^[A-Za-z]{3,9}\\s+\\d{1,2},?\\s+\\d{4}$&#x27;\u003C/span>\n        ]\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(pattern, value.strip()) \u003Cspan class=\"hljs-keyword\">for\u003C/span> pattern \u003Cspan class=\"hljs-keyword\">in\u003C/span> date_patterns)\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">is_boolean\u003C/span>(\u003Cspan class=\"hljs-params\">self, value\u003C/span>):\n        boolean_values = [\u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;false&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;yes&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;no&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;on&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;off&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;1&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;0&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;enabled&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;disabled&#x27;\u003C/span>]\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> value.lower() \u003Cspan class=\"hljs-keyword\">in\u003C/span> boolean_values\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">is_url\u003C/span>(\u003Cspan class=\"hljs-params\">self, value\u003C/span>):\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> value.startswith((\u003Cspan class=\"hljs-string\">&#x27;http://&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;https://&#x27;\u003C/span>))\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">is_email\u003C/span>(\u003Cspan class=\"hljs-params\">self, value\u003C/span>):\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> re.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(\u003Cspan class=\"hljs-string\">r&#x27;^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$&#x27;\u003C/span>, value) \u003Cspan class=\"hljs-keyword\">is\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-literal\">None\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">extract_format_pattern\u003C/span>(\u003Cspan class=\"hljs-params\">self, value\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Extract a format pattern from a value for consistency checking&quot;&quot;&quot;\u003C/span>\n        pattern = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;\\d&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;N&#x27;\u003C/span>, value)  \u003Cspan class=\"hljs-comment\"># Replace digits with N\u003C/span>\n        pattern = re.sub(\u003Cspan class=\"hljs-string\">r&#x27;[A-Za-z]&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;A&#x27;\u003C/span>, pattern)  \u003Cspan class=\"hljs-comment\"># Replace letters with A\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> pattern\n\n\u003Cspan class=\"hljs-comment\"># CLI interface\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> __name__ == \u003Cspan class=\"hljs-string\">&quot;__main__&quot;\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">import\u003C/span> sys\n    \n    monitor = DataQualityMonitor()\n    \n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(sys.argv) &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>:\n        content_dir = sys.argv[\u003Cspan class=\"hljs-number\">1\u003C/span>]\n    \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n        content_dir = \u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C/span>\n    \n    report = monitor.run_quality_assessment(content_dir)\n    \n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;\\n📊 Data Quality Assessment Complete&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Overall Quality Score: \u003Cspan class=\"hljs-subst\">{report[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;overall_quality_score&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Tables Analyzed: \u003Cspan class=\"hljs-subst\">{report[\u003Cspan class=\"hljs-string\">&#x27;summary&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;total_tables&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Alerts Generated: \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">len\u003C/span>(report[\u003Cspan class=\"hljs-string\">&#x27;alerts&#x27;\u003C/span>])}\u003C/span>&quot;\u003C/span>)\n    \n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> report[\u003Cspan class=\"hljs-string\">&#x27;alerts&#x27;\u003C/span>]:\n        \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;\\n⚠️ Top Issues:&quot;\u003C/span>)\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> issue \u003Cspan class=\"hljs-keyword\">in\u003C/span> report[\u003Cspan class=\"hljs-string\">&#x27;top_issues&#x27;\u003C/span>][:\u003Cspan class=\"hljs-number\">3\u003C/span>]:\n            \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;  - \u003Cspan class=\"hljs-subst\">{issue[\u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>].title()}\u003C/span> issues (\u003Cspan class=\"hljs-subst\">{issue[\u003Cspan class=\"hljs-string\">&#x27;count&#x27;\u003C/span>]}\u003C/span> occurrences)&quot;\u003C/span>)\n\u003C/code>\u003C/pre>\u003Ch2 id=\"integration-with-content-management-systems\">Integration with Content Management Systems\u003C/h2>\n\u003Cp>Data validation systems integrate seamlessly with modern content workflows. When combined with \u003Ca href=\"/blog/markdown-automation-workflows-complete-guide\">automation and CI/CD systems\u003C/a>, table validation becomes part of the continuous integration process, ensuring data quality is maintained automatically as content is updated and published across development environments.\u003C/p>\n\u003Cp>For comprehensive content management, validation systems work effectively with \u003Ca href=\"/blog/markdown-link-management-cross-referencing-complete-guide\">link management and cross-referencing systems\u003C/a> to ensure that table data references and cross-links remain accurate and functional, creating cohesive information architectures where data integrity extends beyond individual tables.\u003C/p>\n\u003Cp>When building sophisticated documentation platforms, data validation complements \u003Ca href=\"/blog/markdown-progressive-web-app-documentation-complete-guide\">Progressive Web App documentation systems\u003C/a> by enabling offline data validation capabilities and ensuring that cached content maintains quality standards even when accessed without internet connectivity.\u003C/p>\n\u003Ch2 id=\"advanced-validation-scenarios\">Advanced Validation Scenarios\u003C/h2>\n\u003Ch3 id=\"cross-table-data-consistency\">Cross-Table Data Consistency\u003C/h3>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// cross-table-validator.js - Validate data consistency across multiple tables\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">CrossTableValidator\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">tableRegistry\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">relationships\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">inconsistencies\u003C/span> = [];\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">registerTable\u003C/span>(\u003Cspan class=\"hljs-params\">tableId, tableData, schema = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">tableRegistry\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(tableId, {\n            \u003Cspan class=\"hljs-attr\">data\u003C/span>: tableData,\n            \u003Cspan class=\"hljs-attr\">schema\u003C/span>: schema,\n            \u003Cspan class=\"hljs-attr\">relationships\u003C/span>: []\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">defineRelationship\u003C/span>(\u003Cspan class=\"hljs-params\">sourceTable, sourceColumn, targetTable, targetColumn, type = \u003Cspan class=\"hljs-string\">&#x27;reference&#x27;\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> relationshipId = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${sourceTable}\u003C/span>.\u003Cspan class=\"hljs-subst\">${sourceColumn}\u003C/span> -&gt; \u003Cspan class=\"hljs-subst\">${targetTable}\u003C/span>.\u003Cspan class=\"hljs-subst\">${targetColumn}\u003C/span>`\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">relationships\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(relationshipId, {\n            \u003Cspan class=\"hljs-attr\">source\u003C/span>: { \u003Cspan class=\"hljs-attr\">table\u003C/span>: sourceTable, \u003Cspan class=\"hljs-attr\">column\u003C/span>: sourceColumn },\n            \u003Cspan class=\"hljs-attr\">target\u003C/span>: { \u003Cspan class=\"hljs-attr\">table\u003C/span>: targetTable, \u003Cspan class=\"hljs-attr\">column\u003C/span>: targetColumn },\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: type, \u003Cspan class=\"hljs-comment\">// &#x27;reference&#x27;, &#x27;lookup&#x27;, &#x27;aggregation&#x27;\u003C/span>\n            \u003Cspan class=\"hljs-attr\">validated\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateAllRelationships\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> results = {\n            \u003Cspan class=\"hljs-attr\">validRelationships\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">brokenRelationships\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">inconsistencies\u003C/span>: []\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> [relationshipId, relationship] \u003Cspan class=\"hljs-keyword\">of\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">relationships\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> validationResult = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateRelationship\u003C/span>(relationshipId, relationship);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (validationResult.\u003Cspan class=\"hljs-property\">isValid\u003C/span>) {\n                results.\u003Cspan class=\"hljs-property\">validRelationships\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">relationship\u003C/span>: relationshipId,\n                    \u003Cspan class=\"hljs-attr\">details\u003C/span>: validationResult\n                });\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                results.\u003Cspan class=\"hljs-property\">brokenRelationships\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">relationship\u003C/span>: relationshipId,\n                    \u003Cspan class=\"hljs-attr\">issues\u003C/span>: validationResult.\u003Cspan class=\"hljs-property\">issues\u003C/span>\n                });\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> results;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">validateRelationship\u003C/span>(\u003Cspan class=\"hljs-params\">relationshipId, relationship\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> sourceTable = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">tableRegistry\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(relationship.\u003Cspan class=\"hljs-property\">source\u003C/span>.\u003Cspan class=\"hljs-property\">table\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> targetTable = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">tableRegistry\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(relationship.\u003Cspan class=\"hljs-property\">target\u003C/span>.\u003Cspan class=\"hljs-property\">table\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!sourceTable || !targetTable) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">issues\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;Source or target table not found&#x27;\u003C/span>]\n            };\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> sourceValues = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractColumnValues\u003C/span>(sourceTable.\u003Cspan class=\"hljs-property\">data\u003C/span>, relationship.\u003Cspan class=\"hljs-property\">source\u003C/span>.\u003Cspan class=\"hljs-property\">column\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> targetValues = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractColumnValues\u003C/span>(targetTable.\u003Cspan class=\"hljs-property\">data\u003C/span>, relationship.\u003Cspan class=\"hljs-property\">target\u003C/span>.\u003Cspan class=\"hljs-property\">column\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = [];\n        \n        \u003Cspan class=\"hljs-comment\">// Check referential integrity\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (relationship.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;reference&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> missingReferences = sourceValues.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">val\u003C/span> =&gt;\u003C/span> \n                val &amp;&amp; !targetValues.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(val)\n            );\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (missingReferences.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;missing_references&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">count\u003C/span>: missingReferences.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">examples\u003C/span>: missingReferences.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">5\u003C/span>)\n                });\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Check data type consistency\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> sourceTypes = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeDataTypes\u003C/span>(sourceValues);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> targetTypes = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeDataTypes\u003C/span>(targetValues);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (sourceTypes.\u003Cspan class=\"hljs-property\">primary\u003C/span> !== targetTypes.\u003Cspan class=\"hljs-property\">primary\u003C/span>) {\n            issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;type_mismatch&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">source_type\u003C/span>: sourceTypes.\u003Cspan class=\"hljs-property\">primary\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">target_type\u003C/span>: targetTypes.\u003Cspan class=\"hljs-property\">primary\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: issues.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">issues\u003C/span>: issues,\n            \u003Cspan class=\"hljs-attr\">statistics\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">source_unique_values\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Set\u003C/span>(sourceValues).\u003Cspan class=\"hljs-property\">size\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">target_unique_values\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Set\u003C/span>(targetValues).\u003Cspan class=\"hljs-property\">size\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">common_values\u003C/span>: sourceValues.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">val\u003C/span> =&gt;\u003C/span> targetValues.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(val)).\u003Cspan class=\"hljs-property\">length\u003C/span>\n            }\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">extractColumnValues\u003C/span>(\u003Cspan class=\"hljs-params\">tableData, columnName\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> columnIndex = tableData.\u003Cspan class=\"hljs-property\">headers\u003C/span>.\u003Cspan class=\"hljs-title function_\">indexOf\u003C/span>(columnName);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (columnIndex === -\u003Cspan class=\"hljs-number\">1\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span> [];\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> tableData.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> \n            row.\u003Cspan class=\"hljs-property\">cells\u003C/span>[columnIndex] ? row.\u003Cspan class=\"hljs-property\">cells\u003C/span>[columnIndex].\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>\n        ).\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">val\u003C/span> =&gt;\u003C/span> val);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">analyzeDataTypes\u003C/span>(\u003Cspan class=\"hljs-params\">values\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> typeCounts = {\n            \u003Cspan class=\"hljs-attr\">number\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">date\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">boolean\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">string\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>\n        };\n        \n        values.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">value\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(value) &amp;&amp; !\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(\u003Cspan class=\"hljs-built_in\">parseFloat\u003C/span>(value))) {\n                typeCounts.\u003Cspan class=\"hljs-property\">number\u003C/span>++;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isDateLike\u003C/span>(value)) {\n                typeCounts.\u003Cspan class=\"hljs-property\">date\u003C/span>++;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> ([\u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;false&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;yes&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;no&#x27;\u003C/span>].\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(value.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>())) {\n                typeCounts.\u003Cspan class=\"hljs-property\">boolean\u003C/span>++;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                typeCounts.\u003Cspan class=\"hljs-property\">string\u003C/span>++;\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> primaryType = \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>(typeCounts)\n            .\u003Cspan class=\"hljs-title function_\">sort\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[,a], [,b]\u003C/span>) =&gt;\u003C/span> b - a)[\u003Cspan class=\"hljs-number\">0\u003C/span>][\u003Cspan class=\"hljs-number\">0\u003C/span>];\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">primary\u003C/span>: primaryType, \u003Cspan class=\"hljs-attr\">counts\u003C/span>: typeCounts };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isDateLike\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> datePatterns = [\n            \u003Cspan class=\"hljs-regexp\">/^\\d{4}-\\d{2}-\\d{2}$/\u003C/span>,\n            \u003Cspan class=\"hljs-regexp\">/^\\d{2}\\/\\d{2}\\/\\d{4}$/\u003C/span>,\n            \u003Cspan class=\"hljs-regexp\">/^[A-Za-z]{3,9}\\s+\\d{1,2},?\\s+\\d{4}$/\u003C/span>\n        ];\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> datePatterns.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">pattern\u003C/span> =&gt;\u003C/span> pattern.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(value));\n    }\n}\n\u003C/code>\u003C/pre>\u003Ch3 id=\"real-time-validation-integration\">Real-Time Validation Integration\u003C/h3>\n\u003Cpre>\u003Ccode class=\"hljs language-html\">\u003Cspan class=\"hljs-comment\">&lt;!-- real-time-table-validator.html - Browser-based real-time validation --&gt;\u003C/span>\n\u003Cspan class=\"hljs-meta\">&lt;!DOCTYPE \u003Cspan class=\"hljs-keyword\">html\u003C/span>&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">html\u003C/span> \u003Cspan class=\"hljs-attr\">lang\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;en&quot;\u003C/span>&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">head\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">meta\u003C/span> \u003Cspan class=\"hljs-attr\">charset\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;UTF-8&quot;\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">meta\u003C/span> \u003Cspan class=\"hljs-attr\">name\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;viewport&quot;\u003C/span> \u003Cspan class=\"hljs-attr\">content\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;width=device-width, initial-scale=1.0&quot;\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">title\u003C/span>&gt;\u003C/span>Real-Time Table Validator\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">title\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">style\u003C/span>&gt;\u003C/span>\u003Cspan class=\"language-css\">\n        \u003Cspan class=\"hljs-selector-class\">.validation-panel\u003C/span> {\n            \u003Cspan class=\"hljs-attribute\">position\u003C/span>: fixed;\n            \u003Cspan class=\"hljs-attribute\">right\u003C/span>: \u003Cspan class=\"hljs-number\">20px\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">top\u003C/span>: \u003Cspan class=\"hljs-number\">20px\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">width\u003C/span>: \u003Cspan class=\"hljs-number\">300px\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">background\u003C/span>: white;\n            \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1px\u003C/span> solid \u003Cspan class=\"hljs-number\">#ddd\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">border-radius\u003C/span>: \u003Cspan class=\"hljs-number\">8px\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">15px\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">box-shadow\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-number\">4px\u003C/span> \u003Cspan class=\"hljs-number\">12px\u003C/span> \u003Cspan class=\"hljs-built_in\">rgba\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>,\u003Cspan class=\"hljs-number\">0\u003C/span>,\u003Cspan class=\"hljs-number\">0\u003C/span>,\u003Cspan class=\"hljs-number\">0.1\u003C/span>);\n            \u003Cspan class=\"hljs-attribute\">max-height\u003C/span>: \u003Cspan class=\"hljs-number\">80vh\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">overflow-y\u003C/span>: auto;\n        }\n        \n        \u003Cspan class=\"hljs-selector-class\">.validation-summary\u003C/span> {\n            \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">15px\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">10px\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">border-radius\u003C/span>: \u003Cspan class=\"hljs-number\">4px\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-selector-class\">.validation-summary\u003C/span>\u003Cspan class=\"hljs-selector-class\">.valid\u003C/span> {\n            \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#d4edda\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1px\u003C/span> solid \u003Cspan class=\"hljs-number\">#c3e6cb\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#155724\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-selector-class\">.validation-summary\u003C/span>\u003Cspan class=\"hljs-selector-class\">.invalid\u003C/span> {\n            \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#f8d7da\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1px\u003C/span> solid \u003Cspan class=\"hljs-number\">#f5c6cb\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#721c24\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-selector-class\">.validation-issue\u003C/span> {\n            \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">8px\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">8px\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#fff3cd\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1px\u003C/span> solid \u003Cspan class=\"hljs-number\">#ffeaa7\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">border-radius\u003C/span>: \u003Cspan class=\"hljs-number\">4px\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">12px\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-selector-class\">.validation-issue\u003C/span>\u003Cspan class=\"hljs-selector-class\">.error\u003C/span> {\n            \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#f8d7da\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">border-color\u003C/span>: \u003Cspan class=\"hljs-number\">#f5c6cb\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-selector-class\">.table-highlight\u003C/span> {\n            \u003Cspan class=\"hljs-attribute\">outline\u003C/span>: \u003Cspan class=\"hljs-number\">2px\u003C/span> solid \u003Cspan class=\"hljs-number\">#007bff\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">outline-offset\u003C/span>: \u003Cspan class=\"hljs-number\">2px\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-selector-class\">.table-highlight\u003C/span>\u003Cspan class=\"hljs-selector-class\">.invalid\u003C/span> {\n            \u003Cspan class=\"hljs-attribute\">outline-color\u003C/span>: \u003Cspan class=\"hljs-number\">#dc3545\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-selector-class\">.cell-error\u003C/span> {\n            \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-built_in\">rgba\u003C/span>(\u003Cspan class=\"hljs-number\">220\u003C/span>, \u003Cspan class=\"hljs-number\">53\u003C/span>, \u003Cspan class=\"hljs-number\">69\u003C/span>, \u003Cspan class=\"hljs-number\">0.1\u003C/span>) \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1px\u003C/span> solid \u003Cspan class=\"hljs-built_in\">rgba\u003C/span>(\u003Cspan class=\"hljs-number\">220\u003C/span>, \u003Cspan class=\"hljs-number\">53\u003C/span>, \u003Cspan class=\"hljs-number\">69\u003C/span>, \u003Cspan class=\"hljs-number\">0.3\u003C/span>) \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-selector-class\">.cell-warning\u003C/span> {\n            \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-built_in\">rgba\u003C/span>(\u003Cspan class=\"hljs-number\">255\u003C/span>, \u003Cspan class=\"hljs-number\">193\u003C/span>, \u003Cspan class=\"hljs-number\">7\u003C/span>, \u003Cspan class=\"hljs-number\">0.1\u003C/span>) \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n            \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1px\u003C/span> solid \u003Cspan class=\"hljs-built_in\">rgba\u003C/span>(\u003Cspan class=\"hljs-number\">255\u003C/span>, \u003Cspan class=\"hljs-number\">193\u003C/span>, \u003Cspan class=\"hljs-number\">7\u003C/span>, \u003Cspan class=\"hljs-number\">0.3\u003C/span>) \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n        }\n    \u003C/span>\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">style\u003C/span>&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">head\u003C/span>&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">body\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">div\u003C/span> \u003Cspan class=\"hljs-attr\">id\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;validation-panel&quot;\u003C/span> \u003Cspan class=\"hljs-attr\">class\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;validation-panel&quot;\u003C/span>&gt;\u003C/span>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">h3\u003C/span>&gt;\u003C/span>Table Validation\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">h3\u003C/span>&gt;\u003C/span>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">div\u003C/span> \u003Cspan class=\"hljs-attr\">id\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;validation-summary&quot;\u003C/span> \u003Cspan class=\"hljs-attr\">class\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;validation-summary&quot;\u003C/span>&gt;\u003C/span>\n            \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">strong\u003C/span>&gt;\u003C/span>No tables detected\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">strong\u003C/span>&gt;\u003C/span>\n        \u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">div\u003C/span>&gt;\u003C/span>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">div\u003C/span> \u003Cspan class=\"hljs-attr\">id\u003C/span>=\u003Cspan class=\"hljs-string\">&quot;validation-issues&quot;\u003C/span>&gt;\u003C/span>\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">div\u003C/span>&gt;\u003C/span>\n    \u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">div\u003C/span>&gt;\u003C/span>\n\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">script\u003C/span>&gt;\u003C/span>\u003Cspan class=\"language-javascript\">\n        \u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">RealTimeTableValidator\u003C/span> {\n            \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationPanel\u003C/span> = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-title function_\">getElementById\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;validation-panel&#x27;\u003C/span>);\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">summaryElement\u003C/span> = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-title function_\">getElementById\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;validation-summary&#x27;\u003C/span>);\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">issuesElement\u003C/span> = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-title function_\">getElementById\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;validation-issues&#x27;\u003C/span>);\n                \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">observer\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">MutationObserver\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">handleDOMChanges\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>));\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n                \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">init\u003C/span>();\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">init\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Start observing DOM changes\u003C/span>\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">observer\u003C/span>.\u003Cspan class=\"hljs-title function_\">observe\u003C/span>(\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">body\u003C/span>, {\n                    \u003Cspan class=\"hljs-attr\">childList\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">subtree\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">attributes\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">characterData\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n                });\n                \n                \u003Cspan class=\"hljs-comment\">// Initial validation\u003C/span>\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateAllTables\u003C/span>();\n                \n                \u003Cspan class=\"hljs-comment\">// Periodic revalidation\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">setInterval\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateAllTables\u003C/span>(), \u003Cspan class=\"hljs-number\">5000\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">handleDOMChanges\u003C/span>(\u003Cspan class=\"hljs-params\">mutations\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">let\u003C/span> shouldRevalidate = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                \n                mutations.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">mutation\u003C/span> =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (mutation.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;childList&#x27;\u003C/span>) {\n                        mutation.\u003Cspan class=\"hljs-property\">addedNodes\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">node\u003C/span> =&gt;\u003C/span> {\n                            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (node.\u003Cspan class=\"hljs-property\">nodeType\u003C/span> === \u003Cspan class=\"hljs-title class_\">Node\u003C/span>.\u003Cspan class=\"hljs-property\">ELEMENT_NODE\u003C/span>) {\n                                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (node.\u003Cspan class=\"hljs-property\">tagName\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;TABLE&#x27;\u003C/span> || node.\u003Cspan class=\"hljs-title function_\">querySelector\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>)) {\n                                    shouldRevalidate = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                                }\n                            }\n                        });\n                    }\n                });\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (shouldRevalidate) {\n                    \u003Cspan class=\"hljs-built_in\">setTimeout\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateAllTables\u003C/span>(), \u003Cspan class=\"hljs-number\">100\u003C/span>);\n                }\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">validateAllTables\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> tables = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-title function_\">querySelectorAll\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>);\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-title function_\">clear\u003C/span>();\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (tables.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">updateSummary\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;No tables detected&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span>);\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">issuesElement\u003C/span>.\u003Cspan class=\"hljs-property\">innerHTML\u003C/span> = \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n                    \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n                }\n                \n                \u003Cspan class=\"hljs-keyword\">let\u003C/span> totalIssues = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">let\u003C/span> totalTables = tables.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                \n                tables.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">table, index\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> results = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateTable\u003C/span>(table, index);\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(table, results);\n                    totalIssues += results.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> + results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                    \n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">highlightTable\u003C/span>(table, results);\n                });\n                \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">updateSummary\u003C/span>(\n                    \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${totalTables}\u003C/span> tables, \u003Cspan class=\"hljs-subst\">${totalIssues}\u003C/span> issues`\u003C/span>,\n                    totalIssues === \u003Cspan class=\"hljs-number\">0\u003C/span> ? \u003Cspan class=\"hljs-string\">&#x27;valid&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;invalid&#x27;\u003C/span>\n                );\n                \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">displayIssues\u003C/span>();\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">validateTable\u003C/span>(\u003Cspan class=\"hljs-params\">table, tableIndex\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> results = {\n                    tableIndex,\n                    \u003Cspan class=\"hljs-attr\">errors\u003C/span>: [],\n                    \u003Cspan class=\"hljs-attr\">warnings\u003C/span>: [],\n                    \u003Cspan class=\"hljs-attr\">isValid\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n                };\n                \n                \u003Cspan class=\"hljs-comment\">// Extract table data\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> headers = [];\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> rows = [];\n                \n                \u003Cspan class=\"hljs-comment\">// Get headers\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> headerRow = table.\u003Cspan class=\"hljs-title function_\">querySelector\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;thead tr, tr:first-child&#x27;\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headerRow) {\n                    headerRow.\u003Cspan class=\"hljs-title function_\">querySelectorAll\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;th, td&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> {\n                        headers.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(cell.\u003Cspan class=\"hljs-property\">textContent\u003C/span>.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>());\n                    });\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Get data rows\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> dataRows = table.\u003Cspan class=\"hljs-title function_\">querySelectorAll\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;tbody tr, tr:not(:first-child)&#x27;\u003C/span>);\n                dataRows.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> cells = [];\n                    row.\u003Cspan class=\"hljs-title function_\">querySelectorAll\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;td, th&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> {\n                        cells.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">content\u003C/span>: cell.\u003Cspan class=\"hljs-property\">textContent\u003C/span>.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>(),\n                            \u003Cspan class=\"hljs-attr\">element\u003C/span>: cell\n                        });\n                    });\n                    rows.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({ cells, \u003Cspan class=\"hljs-attr\">element\u003C/span>: row });\n                });\n                \n                \u003Cspan class=\"hljs-comment\">// Validate structure\u003C/span>\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateTableStructure\u003C/span>(table, headers, rows, results);\n                \n                \u003Cspan class=\"hljs-comment\">// Validate data consistency\u003C/span>\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateDataConsistency\u003C/span>(headers, rows, results);\n                \n                \u003Cspan class=\"hljs-comment\">// Validate cell content\u003C/span>\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">validateCellContent\u003C/span>(rows, results);\n                \n                results.\u003Cspan class=\"hljs-property\">isValid\u003C/span> = results.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>;\n                \n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> results;\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">validateTableStructure\u003C/span>(\u003Cspan class=\"hljs-params\">table, headers, rows, results\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Check if table has headers\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (headers.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                    results.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;structure&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Table has no headers&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>\n                    });\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Check column consistency\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> expectedColumns = headers.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                rows.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">row, rowIndex\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> !== expectedColumns) {\n                        results.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;structure&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Row \u003Cspan class=\"hljs-subst\">${rowIndex + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span> has \u003Cspan class=\"hljs-subst\">${row.cells.length}\u003C/span> columns, expected \u003Cspan class=\"hljs-subst\">${expectedColumns}\u003C/span>`\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">element\u003C/span>: row.\u003Cspan class=\"hljs-property\">element\u003C/span>\n                        });\n                    }\n                });\n                \n                \u003Cspan class=\"hljs-comment\">// Check for empty headers\u003C/span>\n                headers.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">header, index\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!header) {\n                        results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;structure&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Header \u003Cspan class=\"hljs-subst\">${index + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span> is empty`\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                        });\n                    }\n                });\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">validateDataConsistency\u003C/span>(\u003Cspan class=\"hljs-params\">headers, rows, results\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Check data types within columns\u003C/span>\n                headers.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">header, colIndex\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> columnData = rows.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> \n                        row.\u003Cspan class=\"hljs-property\">cells\u003C/span>[colIndex] ? row.\u003Cspan class=\"hljs-property\">cells\u003C/span>[colIndex].\u003Cspan class=\"hljs-property\">content\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>\n                    ).\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">content\u003C/span> =&gt;\u003C/span> content.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>());\n                    \n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (columnData.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>) {\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> dataTypes = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeColumnDataTypes\u003C/span>(columnData);\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> consistency = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateTypeConsistency\u003C/span>(dataTypes);\n                        \n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (consistency &lt; \u003Cspan class=\"hljs-number\">0.8\u003C/span>) {\n                            results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;consistency&#x27;\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Column &quot;\u003Cspan class=\"hljs-subst\">${header}\u003C/span>&quot; has mixed data types (\u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-built_in\">Math\u003C/span>.round(consistency * \u003Cspan class=\"hljs-number\">100\u003C/span>)}\u003C/span>% consistent)`\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">column\u003C/span>: colIndex\n                            });\n                        }\n                    }\n                });\n                \n                \u003Cspan class=\"hljs-comment\">// Check for duplicate rows\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> rowHashes = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Set\u003C/span>();\n                rows.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">row, rowIndex\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> rowHash = row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> cell.\u003Cspan class=\"hljs-property\">content\u003C/span>).\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (rowHashes.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(rowHash)) {\n                        results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;consistency&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Row \u003Cspan class=\"hljs-subst\">${rowIndex + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span> appears to be a duplicate`\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-attr\">element\u003C/span>: row.\u003Cspan class=\"hljs-property\">element\u003C/span>\n                        });\n                    }\n                    rowHashes.\u003Cspan class=\"hljs-title function_\">add\u003C/span>(rowHash);\n                });\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">validateCellContent\u003C/span>(\u003Cspan class=\"hljs-params\">rows, results\u003C/span>) {\n                rows.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">row, rowIndex\u003C/span>) =&gt;\u003C/span> {\n                    row.\u003Cspan class=\"hljs-property\">cells\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">cell, cellIndex\u003C/span>) =&gt;\u003C/span> {\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">detectCellIssues\u003C/span>(cell.\u003Cspan class=\"hljs-property\">content\u003C/span>);\n                        \n                        issues.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> {\n                            results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">`Row \u003Cspan class=\"hljs-subst\">${rowIndex + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>, Column \u003Cspan class=\"hljs-subst\">${cellIndex + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>: \u003Cspan class=\"hljs-subst\">${issue.message}\u003C/span>`\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">severity\u003C/span>: issue.\u003Cspan class=\"hljs-property\">severity\u003C/span>,\n                                \u003Cspan class=\"hljs-attr\">element\u003C/span>: cell.\u003Cspan class=\"hljs-property\">element\u003C/span>\n                            });\n                        });\n                    });\n                });\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">analyzeColumnDataTypes\u003C/span>(\u003Cspan class=\"hljs-params\">columnData\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> types = {\n                    \u003Cspan class=\"hljs-attr\">number\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">date\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">boolean\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">url\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">email\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">string\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>\n                };\n                \n                columnData.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">value\u003C/span> =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(value) &amp;&amp; !\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(\u003Cspan class=\"hljs-built_in\">parseFloat\u003C/span>(value))) {\n                        types.\u003Cspan class=\"hljs-property\">number\u003C/span>++;\n                    } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isDateLike\u003C/span>(value)) {\n                        types.\u003Cspan class=\"hljs-property\">date\u003C/span>++;\n                    } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> ([\u003Cspan class=\"hljs-string\">&#x27;true&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;false&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;yes&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;no&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;on&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;off&#x27;\u003C/span>].\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(value.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>())) {\n                        types.\u003Cspan class=\"hljs-property\">boolean\u003C/span>++;\n                    } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (value.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;http://&#x27;\u003C/span>) || value.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;https://&#x27;\u003C/span>)) {\n                        types.\u003Cspan class=\"hljs-property\">url\u003C/span>++;\n                    } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (value.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;@&#x27;\u003C/span>) &amp;&amp; value.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.&#x27;\u003C/span>)) {\n                        types.\u003Cspan class=\"hljs-property\">email\u003C/span>++;\n                    } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                        types.\u003Cspan class=\"hljs-property\">string\u003C/span>++;\n                    }\n                });\n                \n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> types;\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">calculateTypeConsistency\u003C/span>(\u003Cspan class=\"hljs-params\">dataTypes\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> total = \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>(dataTypes).\u003Cspan class=\"hljs-title function_\">reduce\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">sum, count\u003C/span>) =&gt;\u003C/span> sum + count, \u003Cspan class=\"hljs-number\">0\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> maxCount = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(...\u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>(dataTypes));\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> total &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? maxCount / total : \u003Cspan class=\"hljs-number\">1\u003C/span>;\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">detectCellIssues\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> issues = [];\n                \n                \u003Cspan class=\"hljs-comment\">// Check for excessive whitespace\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (content !== content.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>()) {\n                    issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Has leading or trailing whitespace&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                    });\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Check for very long content\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (content.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">100\u003C/span>) {\n                    issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Content is very long (consider abbreviating)&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                    });\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Check for HTML content\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/&lt;[^&gt;]+&gt;/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(content)) {\n                    issues.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">message\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Contains HTML tags&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">severity\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;warning&#x27;\u003C/span>\n                    });\n                }\n                \n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> issues;\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">isDateLike\u003C/span>(\u003Cspan class=\"hljs-params\">value\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> datePatterns = [\n                    \u003Cspan class=\"hljs-regexp\">/^\\d{4}-\\d{2}-\\d{2}$/\u003C/span>,\n                    \u003Cspan class=\"hljs-regexp\">/^\\d{2}\\/\\d{2}\\/\\d{4}$/\u003C/span>,\n                    \u003Cspan class=\"hljs-regexp\">/^[A-Za-z]{3,9}\\s+\\d{1,2},?\\s+\\d{4}$/\u003C/span>\n                ];\n                \n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> datePatterns.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">pattern\u003C/span> =&gt;\u003C/span> pattern.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(value));\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">highlightTable\u003C/span>(\u003Cspan class=\"hljs-params\">table, results\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Remove previous highlights\u003C/span>\n                table.\u003Cspan class=\"hljs-property\">classList\u003C/span>.\u003Cspan class=\"hljs-title function_\">remove\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;table-highlight&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;invalid&#x27;\u003C/span>);\n                table.\u003Cspan class=\"hljs-title function_\">querySelectorAll\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;.cell-error, .cell-warning&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">cell\u003C/span> =&gt;\u003C/span> {\n                    cell.\u003Cspan class=\"hljs-property\">classList\u003C/span>.\u003Cspan class=\"hljs-title function_\">remove\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;cell-error&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;cell-warning&#x27;\u003C/span>);\n                });\n                \n                \u003Cspan class=\"hljs-comment\">// Add table highlight\u003C/span>\n                table.\u003Cspan class=\"hljs-property\">classList\u003C/span>.\u003Cspan class=\"hljs-title function_\">add\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;table-highlight&#x27;\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!results.\u003Cspan class=\"hljs-property\">isValid\u003C/span>) {\n                    table.\u003Cspan class=\"hljs-property\">classList\u003C/span>.\u003Cspan class=\"hljs-title function_\">add\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;invalid&#x27;\u003C/span>);\n                }\n                \n                \u003Cspan class=\"hljs-comment\">// Highlight problem cells\u003C/span>\n                [...results.\u003Cspan class=\"hljs-property\">errors\u003C/span>, ...results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>].\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (issue.\u003Cspan class=\"hljs-property\">element\u003C/span>) {\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> cssClass = issue.\u003Cspan class=\"hljs-property\">severity\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span> ? \u003Cspan class=\"hljs-string\">&#x27;cell-error&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;cell-warning&#x27;\u003C/span>;\n                        issue.\u003Cspan class=\"hljs-property\">element\u003C/span>.\u003Cspan class=\"hljs-property\">classList\u003C/span>.\u003Cspan class=\"hljs-title function_\">add\u003C/span>(cssClass);\n                    }\n                });\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">updateSummary\u003C/span>(\u003Cspan class=\"hljs-params\">text, status\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">summaryElement\u003C/span>.\u003Cspan class=\"hljs-property\">innerHTML\u003C/span> = \u003Cspan class=\"hljs-string\">`&lt;strong&gt;\u003Cspan class=\"hljs-subst\">${text}\u003C/span>&lt;/strong&gt;`\u003C/span>;\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">summaryElement\u003C/span>.\u003Cspan class=\"hljs-property\">className\u003C/span> = \u003Cspan class=\"hljs-string\">`validation-summary \u003Cspan class=\"hljs-subst\">${status}\u003C/span>`\u003C/span>;\n            }\n            \n            \u003Cspan class=\"hljs-title function_\">displayIssues\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">issuesElement\u003C/span>.\u003Cspan class=\"hljs-property\">innerHTML\u003C/span> = \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n                \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">validationResults\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">results, table\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (results.\u003Cspan class=\"hljs-property\">errors\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> || results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                        \u003Cspan class=\"hljs-keyword\">const\u003C/span> tableHeader = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-title function_\">createElement\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;h4&#x27;\u003C/span>);\n                        tableHeader.\u003Cspan class=\"hljs-property\">textContent\u003C/span> = \u003Cspan class=\"hljs-string\">`Table \u003Cspan class=\"hljs-subst\">${results.tableIndex + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>`\u003C/span>;\n                        tableHeader.\u003Cspan class=\"hljs-property\">style\u003C/span>.\u003Cspan class=\"hljs-property\">margin\u003C/span> = \u003Cspan class=\"hljs-string\">&#x27;10px 0 5px 0&#x27;\u003C/span>;\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">issuesElement\u003C/span>.\u003Cspan class=\"hljs-title function_\">appendChild\u003C/span>(tableHeader);\n                        \n                        [...results.\u003Cspan class=\"hljs-property\">errors\u003C/span>, ...results.\u003Cspan class=\"hljs-property\">warnings\u003C/span>].\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">issue\u003C/span> =&gt;\u003C/span> {\n                            \u003Cspan class=\"hljs-keyword\">const\u003C/span> issueElement = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-title function_\">createElement\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;div&#x27;\u003C/span>);\n                            issueElement.\u003Cspan class=\"hljs-property\">className\u003C/span> = \u003Cspan class=\"hljs-string\">`validation-issue \u003Cspan class=\"hljs-subst\">${issue.severity}\u003C/span>`\u003C/span>;\n                            issueElement.\u003Cspan class=\"hljs-property\">innerHTML\u003C/span> = \u003Cspan class=\"hljs-string\">`\n                                &lt;strong&gt;\u003Cspan class=\"hljs-subst\">${issue.type}\u003C/span>:&lt;/strong&gt; \u003Cspan class=\"hljs-subst\">${issue.message}\u003C/span>\n                            `\u003C/span>;\n                            \n                            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (issue.\u003Cspan class=\"hljs-property\">element\u003C/span>) {\n                                issueElement.\u003Cspan class=\"hljs-property\">style\u003C/span>.\u003Cspan class=\"hljs-property\">cursor\u003C/span> = \u003Cspan class=\"hljs-string\">&#x27;pointer&#x27;\u003C/span>;\n                                issueElement.\u003Cspan class=\"hljs-title function_\">addEventListener\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;click&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n                                    issue.\u003Cspan class=\"hljs-property\">element\u003C/span>.\u003Cspan class=\"hljs-title function_\">scrollIntoView\u003C/span>({ \u003Cspan class=\"hljs-attr\">behavior\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;smooth&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">block\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;center&#x27;\u003C/span> });\n                                    issue.\u003Cspan class=\"hljs-property\">element\u003C/span>.\u003Cspan class=\"hljs-property\">style\u003C/span>.\u003Cspan class=\"hljs-property\">backgroundColor\u003C/span> = \u003Cspan class=\"hljs-string\">&#x27;yellow&#x27;\u003C/span>;\n                                    \u003Cspan class=\"hljs-built_in\">setTimeout\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n                                        issue.\u003Cspan class=\"hljs-property\">element\u003C/span>.\u003Cspan class=\"hljs-property\">style\u003C/span>.\u003Cspan class=\"hljs-property\">backgroundColor\u003C/span> = \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n                                    }, \u003Cspan class=\"hljs-number\">2000\u003C/span>);\n                                });\n                            }\n                            \n                            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">issuesElement\u003C/span>.\u003Cspan class=\"hljs-title function_\">appendChild\u003C/span>(issueElement);\n                        });\n                    }\n                });\n            }\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Initialize validator when DOM is ready\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">readyState\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;loading&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-title function_\">addEventListener\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;DOMContentLoaded&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">RealTimeTableValidator\u003C/span>());\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">RealTimeTableValidator\u003C/span>();\n        }\n    \u003C/span>\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">script\u003C/span>&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">body\u003C/span>&gt;\u003C/span>\n\u003Cspan class=\"hljs-tag\">&lt;/\u003Cspan class=\"hljs-name\">html\u003C/span>&gt;\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Advanced Markdown table data validation and quality assurance represents a sophisticated approach to content management that ensures data integrity, maintains professional standards, and provides automated verification of tabular content across large documentation repositories. By implementing comprehensive validation rules, automated quality checks, and systematic error detection processes, technical teams can build robust content management systems that maintain high data quality standards while scaling efficiently across complex information architectures.\u003C/p>\n\u003Cp>The key to successful data validation lies in balancing automated checks with human oversight, ensuring that technical validation serves content quality and user needs. Whether you&#39;re building technical documentation, data catalogs, or comprehensive knowledge bases, the validation techniques covered in this guide provide the foundation for creating reliable, accurate, and maintainable tabular content that users can depend on for critical decision-making.\u003C/p>\n\u003Cp>Remember to implement validation early in the content creation process, establish clear data quality standards that match your organization&#39;s requirements, and continuously monitor and optimize your validation systems based on real-world usage patterns and user feedback. With proper implementation of advanced data validation and quality assurance systems, your Markdown tables can achieve the same level of rigor, reliability, and professional quality that users expect from enterprise data management systems.\u003C/p>\n",[15,19,22,25,28,31],{"id":16,"text":17,"level":18},"why-master-markdown-table-data-validation","Why Master Markdown Table Data Validation?",2,{"id":20,"text":21,"level":18},"foundation-validation-concepts","Foundation Validation Concepts",{"id":23,"text":24,"level":18},"automated-quality-assurance-workflows","Automated Quality Assurance Workflows",{"id":26,"text":27,"level":18},"integration-with-content-management-systems","Integration with Content Management Systems",{"id":29,"text":30,"level":18},"advanced-validation-scenarios","Advanced Validation Scenarios",{"id":32,"text":33,"level":18},"conclusion","Conclusion",[],[36,44,52],{"slug":37,"title":38,"description":39,"excerpt":40,"date":41,"category":9,"author":10,"keywords":42,"readingMinutes":43},"markdown-table-data-validation-quality-assurance-complete-guide","Markdown Table Data Validation and Quality Assurance: Complete Guide for Automated Table Content Verification","Master comprehensive table data validation techniques in Markdown for automated quality assurance, content verification, and structural integrity checking. Learn advanced validation patterns and automated testing workflows.","Markdown table data validation and quality assurance ensure accurate, consistent, and reliable table content across documentation systems through automated verification, structural integrity…","2025-11-09","markdown table validation, data quality assurance, table content verification, automated markdown testing, table structure validation, data integrity checking, markdown quality control, table validation tools",22,{"slug":45,"title":46,"description":47,"excerpt":48,"date":49,"category":9,"author":10,"keywords":50,"readingMinutes":51},"markdown-table-data-validation-and-quality-assurance-complete-guide","Markdown Table Data Validation and Quality Assurance: Complete Guide for Automated Testing and Error Detection in Tabular Content","Master comprehensive data validation techniques for Markdown tables, implementing automated quality assurance, error detection systems, and data integrity checks for reliable tabular content management.","Advanced Markdown table data validation and quality assurance techniques enable systematic verification of tabular content accuracy, structural integrity, and formatting consistency across…","2025-12-18","markdown table validation, table data quality, automated table testing, markdown table errors, data validation markdown, table quality assurance, markdown table integrity, tabular data validation",26,{"slug":53,"title":54,"description":55,"excerpt":56,"date":57,"category":9,"author":10,"keywords":58,"readingMinutes":59},"markdown-data-validation-and-schema-checking-complete-guide","Markdown Data Validation and Schema Checking: Complete Guide for Content Quality Assurance and Automated Verification","Master advanced Markdown data validation techniques using schema checking, frontmatter validation, content structure verification, and automated quality assurance systems. Learn to implement robust validation workflows for documentation teams.","Advanced Markdown data validation and schema checking enables sophisticated content quality assurance systems that automatically verify document structure, validate metadata consistency, and…","2025-10-27","markdown data validation, schema checking markdown, frontmatter validation, markdown content verification, automated markdown quality, documentation validation, markdown schema, content structure validation",19,1792184944552]