[{"data":1,"prerenderedAt":61},["Reactive",2],{"blog-post-markdown-table-row-grouping-categorization-complete-guide":3},{"slug":4,"title":5,"description":6,"excerpt":7,"date":8,"category":9,"author":10,"keywords":11,"readingMinutes":12,"html":13,"headings":14,"tools":37,"related":38},"markdown-table-row-grouping-categorization-complete-guide","Markdown Table Row Grouping and Categorization: Complete Guide for Organized Data Presentation","Master advanced Markdown table row grouping techniques for structured data organization, category headers, and hierarchical content display. Learn grouping syntax, visual organization strategies, and automated categorization methods.","Advanced Markdown table row grouping and categorization techniques enable sophisticated data organization that enhances readability, improves information hierarchy, and creates logical content…","2025-11-14","Tutorial","Matthew Rathbone","markdown table grouping, markdown table categories, table row grouping, markdown table organization, data grouping markdown, table categorization, markdown hierarchical tables, structured data presentation",28,"\u003Cp>Advanced Markdown table row grouping and categorization techniques enable sophisticated data organization that enhances readability, improves information hierarchy, and creates logical content structures across different documentation systems and output formats. By mastering grouping strategies, implementing category headers, and utilizing automated organization methods, technical writers can create tables that effectively communicate complex data relationships while maintaining clarity and professional presentation standards.\u003C/p>\n\u003Ch2 id=\"why-master-table-row-grouping-and-categorization\">Why Master Table Row Grouping and Categorization?\u003C/h2>\n\u003Cp>Professional table grouping provides essential benefits for data organization:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Logical Structure\u003C/strong>: Create clear data hierarchies through strategic grouping of related information and content categories\u003C/li>\n\u003Cli>\u003Cstrong>Improved Readability\u003C/strong>: Reduce cognitive load by organizing related data into logical sections and meaningful groupings\u003C/li>\n\u003Cli>\u003Cstrong>Visual Hierarchy\u003C/strong>: Establish clear content relationships through consistent grouping patterns and category indicators\u003C/li>\n\u003Cli>\u003Cstrong>Scalable Organization\u003C/strong>: Handle large datasets effectively by breaking them into manageable, logically grouped sections\u003C/li>\n\u003Cli>\u003Cstrong>Enhanced Navigation\u003C/strong>: Enable users to quickly locate relevant information through structured content organization\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"foundation-grouping-strategies\">Foundation Grouping Strategies\u003C/h2>\n\u003Ch3 id=\"basic-category-headers\">Basic Category Headers\u003C/h3>\n\u003Cp>Understanding fundamental grouping techniques for different content types:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\"># Basic Table Row Grouping Techniques\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## Product Catalog with Category Grouping\u003C/span>\n| Product Name          | Price   | Stock | Category      |\n|:----------------------|--------:|------:|:-------------:|\n| \u003Cspan class=\"hljs-strong\">**ELECTRONICS**\u003C/span>       |         |       |               |\n| Wireless Headphones   | $129.99 |   156 | Audio         |\n| Bluetooth Speaker     |  $79.99 |   234 | Audio         |\n| Smart Watch           | $299.99 |    89 | Wearables     |\n| Fitness Tracker       | $149.99 |   123 | Wearables     |\n| \u003Cspan class=\"hljs-strong\">**ACCESSORIES**\u003C/span>       |         |       |               |\n| Phone Case            |  $24.99 |   445 | Protection    |\n| Screen Protector      |  $12.99 |   567 | Protection    |\n| Charging Cable        |  $19.99 |   334 | Cables        |\n| Power Bank            |  $45.99 |   178 | Power         |\n\n\u003Cspan class=\"hljs-section\">## Project Status by Team\u003C/span>\n| Project Name              | Status      | Deadline   | Team         |\n|:--------------------------|:-----------:|:----------:|:------------:|\n| \u003Cspan class=\"hljs-strong\">**DEVELOPMENT TEAM**\u003C/span>      |             |            |              |\n| User Authentication       | Complete    | 2025-11-01 | Frontend     |\n| API Rate Limiting         | In Progress | 2025-11-20 | Backend      |\n| Database Migration        | Planning    | 2025-12-15 | Backend      |\n| \u003Cspan class=\"hljs-strong\">**DESIGN TEAM**\u003C/span>           |             |            |              |\n| Mobile UI Redesign        | In Progress | 2025-11-30 | UI/UX        |\n| Brand Guidelines Update   | Complete    | 2025-10-15 | Brand        |\n| Accessibility Audit      | Planning    | 2025-12-01 | UI/UX        |\n| \u003Cspan class=\"hljs-strong\">**QA TEAM**\u003C/span>               |             |            |              |\n| Automated Testing Setup   | In Progress | 2025-11-25 | QA           |\n| Performance Testing       | Planning    | 2025-12-10 | QA           |\n| Security Assessment       | Complete    | 2025-11-05 | QA           |\n\n\u003Cspan class=\"hljs-section\">## Financial Report with Period Grouping\u003C/span>\n| Account Name             | Amount      | Type        | Period       |\n|:-------------------------|------------:|:-----------:|:------------:|\n| \u003Cspan class=\"hljs-strong\">**Q1 2025 RESULTS**\u003C/span>      |             |             |              |\n| Revenue                  | $125,000.00 | Income      | Q1           |\n| Cost of Goods Sold       |  $45,000.00 | Expense     | Q1           |\n| Operating Expenses       |  $35,000.00 | Expense     | Q1           |\n| Net Income               |  $45,000.00 | Income      | Q1           |\n| \u003Cspan class=\"hljs-strong\">**Q2 2025 RESULTS**\u003C/span>      |             |             |              |\n| Revenue                  | $134,567.89 | Income      | Q2           |\n| Cost of Goods Sold       |  $47,123.45 | Expense     | Q2           |\n| Operating Expenses       |  $33,890.12 | Expense     | Q2           |\n| Net Income               |  $53,554.32 | Income      | Q2           |\n\u003C/code>\u003C/pre>\u003Ch3 id=\"advanced-grouping-with-visual-separators\">Advanced Grouping with Visual Separators\u003C/h3>\n\u003Cp>Implementing sophisticated grouping for complex data structures:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\"># Advanced Row Grouping Patterns\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## Inventory Management by Location and Category\u003C/span>\n| Item Code | Product Name           | Location    | Category   | Stock | Status    |\n|:----------|:-----------------------|:-----------:|:----------:|------:|:---------:|\n| \u003Cspan class=\"hljs-strong\">**WAREHOUSE A - ELECTRONICS**\u003C/span> |                |             |            |       |           |\n| WA-001    | Laptop Pro 16&quot;         | Warehouse A | Computing  |    45 | In Stock  |\n| WA-002    | Wireless Mouse         | Warehouse A | Hardware   |   156 | In Stock  |\n| WA-003    | USB-C Hub              | Warehouse A | Cables     |    78 | In Stock  |\n| \u003Cspan class=\"hljs-strong\">**WAREHOUSE A - ACCESSORIES**\u003C/span> |                |             |            |       |           |\n| WA-101    | Laptop Bag             | Warehouse A | Bags       |    89 | In Stock  |\n| WA-102    | Keyboard Cover         | Warehouse A | Protection |    23 | Low Stock |\n| WA-103    | Screen Cleaner         | Warehouse A | Maintenance|   134 | In Stock  |\n|           |                        |             |            |       |           |\n| \u003Cspan class=\"hljs-strong\">**WAREHOUSE B - ELECTRONICS**\u003C/span> |                |             |            |       |           |\n| WB-001    | Desktop Monitor        | Warehouse B | Displays   |    67 | In Stock  |\n| WB-002    | Mechanical Keyboard    | Warehouse B | Input      |    34 | In Stock  |\n| WB-003    | Webcam HD              | Warehouse B | Camera     |    12 | Low Stock |\n| \u003Cspan class=\"hljs-strong\">**WAREHOUSE B - ACCESSORIES**\u003C/span> |                |             |            |       |           |\n| WB-101    | Monitor Stand          | Warehouse B | Stands     |    45 | In Stock  |\n| WB-102    | Cable Management       | Warehouse B | Organization|   89 | In Stock  |\n\n\u003Cspan class=\"hljs-section\">## Employee Directory by Department and Role\u003C/span>\n| Employee ID | Name              | Role           | Department | Status    | Start Date |\n|:-----------:|:------------------|:---------------|:----------:|:---------:|:----------:|\n| \u003Cspan class=\"hljs-strong\">**ENGINEERING DEPARTMENT**\u003C/span>     |                   |                |            |           |            |\n| \u003Cspan class=\"hljs-emphasis\">*Senior Engineers*\u003C/span>             |                   |                |            |           |            |\n| ENG-001     | Sarah Chen        | Senior Engineer| Engineering| Active    | 2023-01-15 |\n| ENG-002     | Marcus Rodriguez  | Senior Engineer| Engineering| Active    | 2022-11-03 |\n| ENG-003     | Lisa Park         | Staff Engineer | Engineering| Active    | 2022-03-22 |\n| \u003Cspan class=\"hljs-emphasis\">*Junior Engineers*\u003C/span>             |                   |                |            |           |            |\n| ENG-101     | Alex Kumar        | Engineer       | Engineering| Active    | 2024-06-10 |\n| ENG-102     | Jamie Smith       | Engineer       | Engineering| Active    | 2024-08-01 |\n|             |                   |                |            |           |            |\n| \u003Cspan class=\"hljs-strong\">**PRODUCT DEPARTMENT**\u003C/span>         |                   |                |            |           |            |\n| \u003Cspan class=\"hljs-emphasis\">*Product Management*\u003C/span>           |                   |                |            |           |            |\n| PRD-001     | Michael Thompson  | Product Manager| Product    | Active    | 2023-05-12 |\n| PRD-002     | Anna Wilson       | Senior PM      | Product    | Active    | 2022-09-18 |\n| \u003Cspan class=\"hljs-emphasis\">*Product Design*\u003C/span>               |                   |                |            |           |            |\n| PRD-101     | David Lee         | UX Designer    | Product    | Active    | 2024-02-28 |\n| PRD-102     | Emma Davis        | UI Designer    | Product    | Active    | 2024-04-15 |\n\n\u003Cspan class=\"hljs-section\">## Task Management with Priority and Status Grouping\u003C/span>\n| Task ID | Task Description              | Assignee      | Priority | Status      | Due Date   |\n|:-------:|:------------------------------|:--------------|:--------:|:-----------:|:----------:|\n| \u003Cspan class=\"hljs-strong\">**HIGH PRIORITY TASKS**\u003C/span>        |                              |               |          |             |            |\n| \u003Cspan class=\"hljs-emphasis\">*In Progress*\u003C/span>                  |                              |               |          |             |            |\n| TSK-001 | Fix critical security bug     | Sarah Chen    | Critical | In Progress | 2025-11-15 |\n| TSK-002 | Database performance issue    | Marcus Lopez  | High     | In Progress | 2025-11-18 |\n| \u003Cspan class=\"hljs-emphasis\">*Pending Review*\u003C/span>               |                              |               |          |             |            |\n| TSK-003 | API authentication update     | Alex Kumar    | High     | Review      | 2025-11-20 |\n| TSK-004 | Mobile app crash fix          | Lisa Park     | Critical | Review      | 2025-11-16 |\n|         |                              |               |          |             |            |\n| \u003Cspan class=\"hljs-strong\">**MEDIUM PRIORITY TASKS**\u003C/span>      |                              |               |          |             |            |\n| \u003Cspan class=\"hljs-emphasis\">*Planning Phase*\u003C/span>               |                              |               |          |             |            |\n| TSK-101 | UI component library         | Emma Davis    | Medium   | Planning    | 2025-12-01 |\n| TSK-102 | Documentation update          | David Lee     | Medium   | Planning    | 2025-11-30 |\n| \u003Cspan class=\"hljs-emphasis\">*Ready to Start*\u003C/span>               |                              |               |          |             |            |\n| TSK-103 | Performance monitoring        | Jamie Smith   | Medium   | Ready       | 2025-12-05 |\n| TSK-104 | Email template redesign       | Anna Wilson   | Medium   | Ready       | 2025-12-10 |\n\u003C/code>\u003C/pre>\u003Ch3 id=\"automated-grouping-implementation\">Automated Grouping Implementation\u003C/h3>\n\u003Cp>JavaScript solution for intelligent table row grouping:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// table-row-grouper.js - Automated table grouping and categorization\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">TableRowGrouper\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\">groupByColumn\u003C/span>: options.\u003Cspan class=\"hljs-property\">groupByColumn\u003C/span> || \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">sortGroups\u003C/span>: options.\u003Cspan class=\"hljs-property\">sortGroups\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">sortWithinGroups\u003C/span>: options.\u003Cspan class=\"hljs-property\">sortWithinGroups\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">groupHeaderStyle\u003C/span>: options.\u003Cspan class=\"hljs-property\">groupHeaderStyle\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;bold&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">emptyRowBetweenGroups\u003C/span>: options.\u003Cspan class=\"hljs-property\">emptyRowBetweenGroups\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">subGrouping\u003C/span>: options.\u003Cspan class=\"hljs-property\">subGrouping\u003C/span> || \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">customGroupHeaders\u003C/span>: options.\u003Cspan class=\"hljs-property\">customGroupHeaders\u003C/span> || {},\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">groupingStrategies\u003C/span> = {\n            \u003Cspan class=\"hljs-string\">&#x27;category&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">groupByCategory\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;alphabetical&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">groupAlphabetically\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;numerical&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">groupNumerically\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\">groupByDate\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">groupByPriority\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\">groupByStatus\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>),\n            \u003Cspan class=\"hljs-string\">&#x27;custom&#x27;\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">groupByCustomFunction\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">groupTableData\u003C/span>(\u003Cspan class=\"hljs-params\">data, groupingConfig\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">isArray\u003C/span>(data) || data.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">groupedData\u003C/span>: [], \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: { \u003Cspan class=\"hljs-attr\">groupCount\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-attr\">totalRows\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span> } };\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> strategy = groupingConfig.\u003Cspan class=\"hljs-property\">strategy\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;category&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> column = groupingConfig.\u003Cspan class=\"hljs-property\">column\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!column || !data[\u003Cspan class=\"hljs-number\">0\u003C/span>].\u003Cspan class=\"hljs-title function_\">hasOwnProperty\u003C/span>(column)) {\n            \u003Cspan class=\"hljs-keyword\">throw\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">`Grouping column &quot;\u003Cspan class=\"hljs-subst\">${column}\u003C/span>&quot; not found in data`\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Apply grouping strategy\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> groupedData = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">groupingStrategies\u003C/span>[strategy](data, groupingConfig);\n        \n        \u003Cspan class=\"hljs-comment\">// Apply sorting if requested\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\">sortGroups\u003C/span>) {\n            groupedData.\u003Cspan class=\"hljs-title function_\">sort\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">a, b\u003C/span>) =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">compareGroups\u003C/span>(a, b, groupingConfig));\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Sort within groups if requested\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\">sortWithinGroups\u003C/span> &amp;&amp; groupingConfig.\u003Cspan class=\"hljs-property\">sortColumn\u003C/span>) {\n            groupedData.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">group\u003C/span> =&gt;\u003C/span> {\n                group.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">sort\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">a, b\u003C/span>) =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">compareRows\u003C/span>(a, b, groupingConfig.\u003Cspan class=\"hljs-property\">sortColumn\u003C/span>));\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            groupedData,\n            \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">groupCount\u003C/span>: groupedData.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">totalRows\u003C/span>: data.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">groupingStrategy\u003C/span>: strategy,\n                \u003Cspan class=\"hljs-attr\">groupingColumn\u003C/span>: column\n            }\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">groupByCategory\u003C/span>(\u003Cspan class=\"hljs-params\">data, config\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> column = config.\u003Cspan class=\"hljs-property\">column\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> groups = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \n        \u003Cspan class=\"hljs-comment\">// Group data by category values\u003C/span>\n        data.\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> categoryValue = row[column] || \u003Cspan class=\"hljs-string\">&#x27;Uncategorized&#x27;\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!groups.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(categoryValue)) {\n                groups.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(categoryValue, {\n                    \u003Cspan class=\"hljs-attr\">name\u003C/span>: categoryValue,\n                    \u003Cspan class=\"hljs-attr\">displayName\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">customGroupHeaders\u003C/span>[categoryValue] || categoryValue,\n                    \u003Cspan class=\"hljs-attr\">rows\u003C/span>: []\n                });\n            }\n            \n            groups.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(categoryValue).\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(row);\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>(groups.\u003Cspan class=\"hljs-title function_\">values\u003C/span>());\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">groupAlphabetically\u003C/span>(\u003Cspan class=\"hljs-params\">data, config\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> column = config.\u003Cspan class=\"hljs-property\">column\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> groupSize = config.\u003Cspan class=\"hljs-property\">groupSize\u003C/span> || \u003Cspan class=\"hljs-number\">5\u003C/span>; \u003Cspan class=\"hljs-comment\">// Group every N items\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\">// Sort data alphabetically first\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> sortedData = [...data].\u003Cspan class=\"hljs-title function_\">sort\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">a, b\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> valA = \u003Cspan class=\"hljs-title class_\">String\u003C/span>(a[column] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> valB = \u003Cspan class=\"hljs-title class_\">String\u003C/span>(b[column] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> valA.\u003Cspan class=\"hljs-title function_\">localeCompare\u003C/span>(valB);\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> groups = [];\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; sortedData.\u003Cspan class=\"hljs-property\">length\u003C/span>; i += groupSize) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> groupRows = sortedData.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(i, i + groupSize);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> firstItem = \u003Cspan class=\"hljs-title class_\">String\u003C/span>(groupRows[\u003Cspan class=\"hljs-number\">0\u003C/span>][column] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">charAt\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>).\u003Cspan class=\"hljs-title function_\">toUpperCase\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> lastItem = \u003Cspan class=\"hljs-title class_\">String\u003C/span>(groupRows[groupRows.\u003Cspan class=\"hljs-property\">length\u003C/span> - \u003Cspan class=\"hljs-number\">1\u003C/span>][column] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">charAt\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>).\u003Cspan class=\"hljs-title function_\">toUpperCase\u003C/span>();\n            \n            groups.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${firstItem}\u003C/span>\u003Cspan class=\"hljs-subst\">${firstItem !== lastItem ? \u003Cspan class=\"hljs-string\">`-\u003Cspan class=\"hljs-subst\">${lastItem}\u003C/span>`\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">displayName\u003C/span>: \u003Cspan class=\"hljs-string\">`Items \u003Cspan class=\"hljs-subst\">${firstItem}\u003C/span>\u003Cspan class=\"hljs-subst\">${firstItem !== lastItem ? \u003Cspan class=\"hljs-string\">` through \u003Cspan class=\"hljs-subst\">${lastItem}\u003C/span>`\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">rows\u003C/span>: groupRows\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> groups;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">groupNumerically\u003C/span>(\u003Cspan class=\"hljs-params\">data, config\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> column = config.\u003Cspan class=\"hljs-property\">column\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> ranges = config.\u003Cspan class=\"hljs-property\">ranges\u003C/span> || [\n            { \u003Cspan class=\"hljs-attr\">min\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-attr\">max\u003C/span>: \u003Cspan class=\"hljs-number\">25\u003C/span>, \u003Cspan class=\"hljs-attr\">label\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Low (0-25)&#x27;\u003C/span> },\n            { \u003Cspan class=\"hljs-attr\">min\u003C/span>: \u003Cspan class=\"hljs-number\">26\u003C/span>, \u003Cspan class=\"hljs-attr\">max\u003C/span>: \u003Cspan class=\"hljs-number\">75\u003C/span>, \u003Cspan class=\"hljs-attr\">label\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Medium (26-75)&#x27;\u003C/span> },\n            { \u003Cspan class=\"hljs-attr\">min\u003C/span>: \u003Cspan class=\"hljs-number\">76\u003C/span>, \u003Cspan class=\"hljs-attr\">max\u003C/span>: \u003Cspan class=\"hljs-number\">100\u003C/span>, \u003Cspan class=\"hljs-attr\">label\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;High (76-100)&#x27;\u003C/span> },\n            { \u003Cspan class=\"hljs-attr\">min\u003C/span>: \u003Cspan class=\"hljs-number\">101\u003C/span>, \u003Cspan class=\"hljs-attr\">max\u003C/span>: \u003Cspan class=\"hljs-title class_\">Infinity\u003C/span>, \u003Cspan class=\"hljs-attr\">label\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Very High (100+)&#x27;\u003C/span> }\n        ];\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> groups = ranges.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">range\u003C/span> =&gt;\u003C/span> ({\n            \u003Cspan class=\"hljs-attr\">name\u003C/span>: range.\u003Cspan class=\"hljs-property\">label\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">displayName\u003C/span>: range.\u003Cspan class=\"hljs-property\">label\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">rows\u003C/span>: [],\n            range\n        }));\n        \n        data.\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> value = \u003Cspan class=\"hljs-built_in\">parseFloat\u003C/span>(row[column]) || \u003Cspan class=\"hljs-number\">0\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> group = groups.\u003Cspan class=\"hljs-title function_\">find\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">g\u003C/span> =&gt;\u003C/span> value &gt;= g.\u003Cspan class=\"hljs-property\">range\u003C/span>.\u003Cspan class=\"hljs-property\">min\u003C/span> &amp;&amp; value &lt;= g.\u003Cspan class=\"hljs-property\">range\u003C/span>.\u003Cspan class=\"hljs-property\">max\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (group) {\n                group.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(row);\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Remove empty groups\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> groups.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">group\u003C/span> =&gt;\u003C/span> group.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">groupByDate\u003C/span>(\u003Cspan class=\"hljs-params\">data, config\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> column = config.\u003Cspan class=\"hljs-property\">column\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> groupBy = config.\u003Cspan class=\"hljs-property\">dateGrouping\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;month&#x27;\u003C/span>; \u003Cspan class=\"hljs-comment\">// month, quarter, year\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> groups = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \n        data.\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> dateValue = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Date\u003C/span>(row[column]);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(dateValue.\u003Cspan class=\"hljs-title function_\">getTime\u003C/span>())) {\n                \u003Cspan class=\"hljs-comment\">// Invalid date, put in &quot;Invalid Dates&quot; group\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> invalidGroup = \u003Cspan class=\"hljs-string\">&#x27;Invalid Dates&#x27;\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!groups.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(invalidGroup)) {\n                    groups.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(invalidGroup, {\n                        \u003Cspan class=\"hljs-attr\">name\u003C/span>: invalidGroup,\n                        \u003Cspan class=\"hljs-attr\">displayName\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Invalid Dates&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">rows\u003C/span>: []\n                    });\n                }\n                groups.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(invalidGroup).\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(row);\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">let\u003C/span> groupKey;\n            \u003Cspan class=\"hljs-keyword\">let\u003C/span> displayName;\n            \n            \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (groupBy) {\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;year&#x27;\u003C/span>:\n                    groupKey = dateValue.\u003Cspan class=\"hljs-title function_\">getFullYear\u003C/span>();\n                    displayName = \u003Cspan class=\"hljs-string\">`Year \u003Cspan class=\"hljs-subst\">${groupKey}\u003C/span>`\u003C/span>;\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;quarter&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">const\u003C/span> quarter = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">floor\u003C/span>(dateValue.\u003Cspan class=\"hljs-title function_\">getMonth\u003C/span>() / \u003Cspan class=\"hljs-number\">3\u003C/span>) + \u003Cspan class=\"hljs-number\">1\u003C/span>;\n                    groupKey = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${dateValue.getFullYear()}\u003C/span>-Q\u003Cspan class=\"hljs-subst\">${quarter}\u003C/span>`\u003C/span>;\n                    displayName = \u003Cspan class=\"hljs-string\">`Q\u003Cspan class=\"hljs-subst\">${quarter}\u003C/span> \u003Cspan class=\"hljs-subst\">${dateValue.getFullYear()}\u003C/span>`\u003C/span>;\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;month&#x27;\u003C/span>:\n                \u003Cspan class=\"hljs-attr\">default\u003C/span>:\n                    groupKey = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${dateValue.getFullYear()}\u003C/span>-\u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-built_in\">String\u003C/span>(dateValue.getMonth() + \u003Cspan class=\"hljs-number\">1\u003C/span>).padStart(\u003Cspan class=\"hljs-number\">2\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;0&#x27;\u003C/span>)}\u003C/span>`\u003C/span>;\n                    displayName = dateValue.\u003Cspan class=\"hljs-title function_\">toLocaleDateString\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;en-US&#x27;\u003C/span>, { \u003Cspan class=\"hljs-attr\">year\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;numeric&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">month\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;long&#x27;\u003C/span> });\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n            }\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!groups.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(groupKey)) {\n                groups.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(groupKey, {\n                    \u003Cspan class=\"hljs-attr\">name\u003C/span>: groupKey,\n                    displayName,\n                    \u003Cspan class=\"hljs-attr\">rows\u003C/span>: []\n                });\n            }\n            \n            groups.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(groupKey).\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(row);\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>(groups.\u003Cspan class=\"hljs-title function_\">values\u003C/span>());\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">groupByPriority\u003C/span>(\u003Cspan class=\"hljs-params\">data, config\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> column = config.\u003Cspan class=\"hljs-property\">column\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> priorityOrder = config.\u003Cspan class=\"hljs-property\">priorityOrder\u003C/span> || [\u003Cspan class=\"hljs-string\">&#x27;Critical&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;High&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Medium&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Low&#x27;\u003C/span>];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> groups = [];\n        \n        priorityOrder.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">priority\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> rows = data.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> \n                \u003Cspan class=\"hljs-title class_\">String\u003C/span>(row[column]).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>() === priority.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>()\n            );\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (rows.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                groups.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">name\u003C/span>: priority,\n                    \u003Cspan class=\"hljs-attr\">displayName\u003C/span>: \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${priority.toUpperCase()}\u003C/span> PRIORITY`\u003C/span>,\n                    rows\n                });\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Add any items that don&#x27;t match known priorities\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> knownPriorities = priorityOrder.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> p.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>());\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> unknownRows = data.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> \n            !knownPriorities.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-title class_\">String\u003C/span>(row[column]).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>())\n        );\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (unknownRows.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            groups.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Other&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">displayName\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;OTHER PRIORITY&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">rows\u003C/span>: unknownRows\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> groups;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">groupByStatus\u003C/span>(\u003Cspan class=\"hljs-params\">data, config\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> column = config.\u003Cspan class=\"hljs-property\">column\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> statusOrder = config.\u003Cspan class=\"hljs-property\">statusOrder\u003C/span> || [\u003Cspan class=\"hljs-string\">&#x27;Active&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;In Progress&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Pending&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Complete&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Inactive&#x27;\u003C/span>];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> groups = [];\n        \n        statusOrder.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">status\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> rows = data.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> \n                \u003Cspan class=\"hljs-title class_\">String\u003C/span>(row[column]).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>().\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(status.\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>())\n            );\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (rows.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                groups.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">name\u003C/span>: status,\n                    \u003Cspan class=\"hljs-attr\">displayName\u003C/span>: status.\u003Cspan class=\"hljs-title function_\">toUpperCase\u003C/span>(),\n                    rows\n                });\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> groups;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">groupByCustomFunction\u003C/span>(\u003Cspan class=\"hljs-params\">data, config\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-keyword\">typeof\u003C/span> config.\u003Cspan class=\"hljs-property\">customGroupFunction\u003C/span> !== \u003Cspan class=\"hljs-string\">&#x27;function&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">throw\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Custom grouping requires a customGroupFunction&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> config.\u003Cspan class=\"hljs-title function_\">customGroupFunction\u003C/span>(data, config);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">compareGroups\u003C/span>(\u003Cspan class=\"hljs-params\">groupA, groupB, config\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Custom group comparison logic\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> orderA = config.\u003Cspan class=\"hljs-property\">groupOrder\u003C/span>?.\u003Cspan class=\"hljs-title function_\">indexOf\u003C/span>(groupA.\u003Cspan class=\"hljs-property\">name\u003C/span>) ?? \u003Cspan class=\"hljs-number\">999\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> orderB = config.\u003Cspan class=\"hljs-property\">groupOrder\u003C/span>?.\u003Cspan class=\"hljs-title function_\">indexOf\u003C/span>(groupB.\u003Cspan class=\"hljs-property\">name\u003C/span>) ?? \u003Cspan class=\"hljs-number\">999\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (orderA !== orderB) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> orderA - orderB;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> groupA.\u003Cspan class=\"hljs-property\">name\u003C/span>.\u003Cspan class=\"hljs-title function_\">localeCompare\u003C/span>(groupB.\u003Cspan class=\"hljs-property\">name\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">compareRows\u003C/span>(\u003Cspan class=\"hljs-params\">rowA, rowB, sortColumn\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> valA = rowA[sortColumn];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> valB = rowB[sortColumn];\n        \n        \u003Cspan class=\"hljs-comment\">// Handle numeric comparison\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> numA = \u003Cspan class=\"hljs-built_in\">parseFloat\u003C/span>(valA);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> numB = \u003Cspan class=\"hljs-built_in\">parseFloat\u003C/span>(valB);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(numA) &amp;&amp; !\u003Cspan class=\"hljs-built_in\">isNaN\u003C/span>(numB)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> numA - numB;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Handle string comparison\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title class_\">String\u003C/span>(valA).\u003Cspan class=\"hljs-title function_\">localeCompare\u003C/span>(\u003Cspan class=\"hljs-title class_\">String\u003C/span>(valB));\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateGroupedMarkdownTable\u003C/span>(\u003Cspan class=\"hljs-params\">groupedData, headers, options = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = [];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> opts = {\n            \u003Cspan class=\"hljs-attr\">alignment\u003C/span>: options.\u003Cspan class=\"hljs-property\">alignment\u003C/span> || {},\n            \u003Cspan class=\"hljs-attr\">includeGroupSummary\u003C/span>: options.\u003Cspan class=\"hljs-property\">includeGroupSummary\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">groupHeaderStyle\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">groupHeaderStyle\u003C/span>,\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Generate header row\u003C/span>\n        lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">buildHeaderRow\u003C/span>(headers));\n        lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">buildAlignmentRow\u003C/span>(headers, opts.\u003Cspan class=\"hljs-property\">alignment\u003C/span>));\n        \n        groupedData.\u003Cspan class=\"hljs-property\">groupedData\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">group, groupIndex\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Add empty row between groups (except first)\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (groupIndex &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">emptyRowBetweenGroups\u003C/span>) {\n                lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">buildEmptyRow\u003C/span>(headers.\u003Cspan class=\"hljs-property\">length\u003C/span>));\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Add group header\u003C/span>\n            lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">buildGroupHeaderRow\u003C/span>(group.\u003Cspan class=\"hljs-property\">displayName\u003C/span>, headers.\u003Cspan class=\"hljs-property\">length\u003C/span>, opts.\u003Cspan class=\"hljs-property\">groupHeaderStyle\u003C/span>));\n            \n            \u003Cspan class=\"hljs-comment\">// Add subgroup if configured\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\">subGrouping\u003C/span> &amp;&amp; group.\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> subGroups = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">createSubGroups\u003C/span>(group.\u003Cspan class=\"hljs-property\">rows\u003C/span>, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">subGrouping\u003C/span>);\n                \n                subGroups.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">subGroup\u003C/span> =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (subGroup.\u003Cspan class=\"hljs-property\">name\u003C/span>) {\n                        lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">buildSubGroupHeaderRow\u003C/span>(subGroup.\u003Cspan class=\"hljs-property\">name\u003C/span>, headers.\u003Cspan class=\"hljs-property\">length\u003C/span>));\n                    }\n                    \n                    subGroup.\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                        lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">buildDataRow\u003C/span>(row, headers));\n                    });\n                });\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-comment\">// Add group data rows\u003C/span>\n                group.\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                    lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">buildDataRow\u003C/span>(row, headers));\n                });\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Add group summary if requested\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (opts.\u003Cspan class=\"hljs-property\">includeGroupSummary\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> summary = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateGroupSummary\u003C/span>(group.\u003Cspan class=\"hljs-property\">rows\u003C/span>, headers);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (summary) {\n                    lines.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(summary);\n                }\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">table\u003C/span>: lines.\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: groupedData.\u003Cspan class=\"hljs-property\">metadata\u003C/span>\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">buildHeaderRow\u003C/span>(\u003Cspan class=\"hljs-params\">headers\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`| \u003Cspan class=\"hljs-subst\">${headers.join(\u003Cspan class=\"hljs-string\">&#x27; | &#x27;\u003C/span>)}\u003C/span> |`\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">buildAlignmentRow\u003C/span>(\u003Cspan class=\"hljs-params\">headers, alignments\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> alignmentSymbols = headers.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">header, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> alignment = alignments[header] || alignments[index] || \u003Cspan class=\"hljs-string\">&#x27;left&#x27;\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (alignment) {\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;center&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;:---:&#x27;\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;right&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;---:&#x27;\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;left&#x27;\u003C/span>:\n                \u003Cspan class=\"hljs-attr\">default\u003C/span>: \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;:---&#x27;\u003C/span>;\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`| \u003Cspan class=\"hljs-subst\">${alignmentSymbols.join(\u003Cspan class=\"hljs-string\">&#x27; | &#x27;\u003C/span>)}\u003C/span> |`\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">buildGroupHeaderRow\u003C/span>(\u003Cspan class=\"hljs-params\">groupName, columnCount, style\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> styledName = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">applyHeaderStyle\u003C/span>(groupName, style);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> emptyColumns = \u003Cspan class=\"hljs-title class_\">Array\u003C/span>(columnCount - \u003Cspan class=\"hljs-number\">1\u003C/span>).\u003Cspan class=\"hljs-title function_\">fill\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`| \u003Cspan class=\"hljs-subst\">${styledName}\u003C/span> | \u003Cspan class=\"hljs-subst\">${emptyColumns.join(\u003Cspan class=\"hljs-string\">&#x27; | &#x27;\u003C/span>)}\u003C/span> |`\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">buildSubGroupHeaderRow\u003C/span>(\u003Cspan class=\"hljs-params\">subGroupName, columnCount\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> styledName = \u003Cspan class=\"hljs-string\">`*\u003Cspan class=\"hljs-subst\">${subGroupName}\u003C/span>*`\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> emptyColumns = \u003Cspan class=\"hljs-title class_\">Array\u003C/span>(columnCount - \u003Cspan class=\"hljs-number\">1\u003C/span>).\u003Cspan class=\"hljs-title function_\">fill\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`| \u003Cspan class=\"hljs-subst\">${styledName}\u003C/span> | \u003Cspan class=\"hljs-subst\">${emptyColumns.join(\u003Cspan class=\"hljs-string\">&#x27; | &#x27;\u003C/span>)}\u003C/span> |`\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">buildDataRow\u003C/span>(\u003Cspan class=\"hljs-params\">row, headers\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> values = headers.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">header\u003C/span> =&gt;\u003C/span> \u003Cspan class=\"hljs-title class_\">String\u003C/span>(row[header] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>));\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`| \u003Cspan class=\"hljs-subst\">${values.join(\u003Cspan class=\"hljs-string\">&#x27; | &#x27;\u003C/span>)}\u003C/span> |`\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">buildEmptyRow\u003C/span>(\u003Cspan class=\"hljs-params\">columnCount\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> emptyColumns = \u003Cspan class=\"hljs-title class_\">Array\u003C/span>(columnCount).\u003Cspan class=\"hljs-title function_\">fill\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`| \u003Cspan class=\"hljs-subst\">${emptyColumns.join(\u003Cspan class=\"hljs-string\">&#x27; | &#x27;\u003C/span>)}\u003C/span> |`\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">applyHeaderStyle\u003C/span>(\u003Cspan class=\"hljs-params\">text, style\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (style) {\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;bold&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`**\u003Cspan class=\"hljs-subst\">${text}\u003C/span>**`\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;italic&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`*\u003Cspan class=\"hljs-subst\">${text}\u003C/span>*`\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;code&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`\\`\u003Cspan class=\"hljs-subst\">${text}\u003C/span>\\``\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;underline&#x27;\u003C/span>: \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`&lt;u&gt;\u003Cspan class=\"hljs-subst\">${text}\u003C/span>&lt;/u&gt;`\u003C/span>;\n            \u003Cspan class=\"hljs-attr\">default\u003C/span>: \u003Cspan class=\"hljs-keyword\">return\u003C/span> text;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">createSubGroups\u003C/span>(\u003Cspan class=\"hljs-params\">rows, subGroupConfig\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!subGroupConfig || !subGroupConfig.\u003Cspan class=\"hljs-property\">column\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> [{ \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>, rows }];\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> column = subGroupConfig.\u003Cspan class=\"hljs-property\">column\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> subGroups = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \n        rows.\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> subGroupValue = row[column] || \u003Cspan class=\"hljs-string\">&#x27;Other&#x27;\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!subGroups.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(subGroupValue)) {\n                subGroups.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(subGroupValue, {\n                    \u003Cspan class=\"hljs-attr\">name\u003C/span>: subGroupValue,\n                    \u003Cspan class=\"hljs-attr\">rows\u003C/span>: []\n                });\n            }\n            \n            subGroups.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(subGroupValue).\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(row);\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>(subGroups.\u003Cspan class=\"hljs-title function_\">values\u003C/span>());\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateGroupSummary\u003C/span>(\u003Cspan class=\"hljs-params\">rows, headers\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Generate basic summary - can be extended based on data types\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> summaryData = { \u003Cspan class=\"hljs-string\">&#x27;Group Total&#x27;\u003C/span>: rows.\u003Cspan class=\"hljs-property\">length\u003C/span>.\u003Cspan class=\"hljs-title function_\">toString\u003C/span>() };\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> emptyCells = \u003Cspan class=\"hljs-title class_\">Array\u003C/span>(headers.\u003Cspan class=\"hljs-property\">length\u003C/span> - \u003Cspan class=\"hljs-number\">1\u003C/span>).\u003Cspan class=\"hljs-title function_\">fill\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`| \u003Cspan class=\"hljs-subst\">${summaryData[\u003Cspan class=\"hljs-string\">&#x27;Group Total&#x27;\u003C/span>]}\u003C/span> items | \u003Cspan class=\"hljs-subst\">${emptyCells.join(\u003Cspan class=\"hljs-string\">&#x27; | &#x27;\u003C/span>)}\u003C/span> |`\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">analyzeGroupingPotential\u003C/span>(\u003Cspan class=\"hljs-params\">data\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">isArray\u003C/span>(data) || data.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">recommendations\u003C/span>: [], \u003Cspan class=\"hljs-attr\">analysis\u003C/span>: {} };\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> headers = \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">keys\u003C/span>(data[\u003Cspan class=\"hljs-number\">0\u003C/span>]);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> analysis = {};\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> recommendations = [];\n        \n        headers.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">header\u003C/span> =&gt;\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>(data.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">row\u003C/span> =&gt;\u003C/span> row[header]))];\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> uniqueRatio = uniqueValues.\u003Cspan class=\"hljs-property\">length\u003C/span> / data.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \n            analysis[header] = {\n                \u003Cspan class=\"hljs-attr\">uniqueValues\u003C/span>: uniqueValues.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                uniqueRatio,\n                \u003Cspan class=\"hljs-attr\">sampleValues\u003C/span>: uniqueValues.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-number\">5\u003C/span>),\n                \u003Cspan class=\"hljs-attr\">potentialGroups\u003C/span>: uniqueValues.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            };\n            \n            \u003Cspan class=\"hljs-comment\">// Make recommendations based on analysis\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (uniqueRatio &lt;= \u003Cspan class=\"hljs-number\">0.3\u003C/span> &amp;&amp; uniqueValues.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt;= \u003Cspan class=\"hljs-number\">2\u003C/span>) {\n                recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: header,\n                    \u003Cspan class=\"hljs-attr\">strategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;category&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">reason\u003C/span>: \u003Cspan class=\"hljs-string\">`Low unique ratio (\u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-built_in\">Math\u003C/span>.round(uniqueRatio * \u003Cspan class=\"hljs-number\">100\u003C/span>)}\u003C/span>%) suggests good grouping potential`\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">estimatedGroups\u003C/span>: uniqueValues.\u003Cspan class=\"hljs-property\">length\u003C/span>\n                });\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Check for date patterns\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> datePattern = \u003Cspan class=\"hljs-regexp\">/^\\d{4}-\\d{2}-\\d{2}$|^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (uniqueValues.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">val\u003C/span> =&gt;\u003C/span> datePattern.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(\u003Cspan class=\"hljs-title class_\">String\u003C/span>(val)))) {\n                recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: header,\n                    \u003Cspan class=\"hljs-attr\">strategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">reason\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Date pattern detected, suitable for temporal grouping&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">estimatedGroups\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Variable based on date range&#x27;\u003C/span>\n                });\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Check for priority/status patterns\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> statusWords = [\u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;low&#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;complete&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;pending&#x27;\u003C/span>];\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (uniqueValues.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">val\u003C/span> =&gt;\u003C/span> \n                statusWords.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">word\u003C/span> =&gt;\u003C/span> \u003Cspan class=\"hljs-title class_\">String\u003C/span>(val).\u003Cspan class=\"hljs-title function_\">toLowerCase\u003C/span>().\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(word))\n            )) {\n                recommendations.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">column\u003C/span>: header,\n                    \u003Cspan class=\"hljs-attr\">strategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">reason\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Status/priority keywords detected&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">estimatedGroups\u003C/span>: uniqueValues.\u003Cspan class=\"hljs-property\">length\u003C/span>\n                });\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> { recommendations, analysis };\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">// Usage examples\u003C/span>\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> grouper = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">TableRowGrouper\u003C/span>({\n    \u003Cspan class=\"hljs-attr\">sortGroups\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n    \u003Cspan class=\"hljs-attr\">sortWithinGroups\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n    \u003Cspan class=\"hljs-attr\">emptyRowBetweenGroups\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n});\n\n\u003Cspan class=\"hljs-comment\">// Example 1: Group product data by category\u003C/span>\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> productData = [\n    { \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;iPhone 15&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">category\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Phones&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">price\u003C/span>: \u003Cspan class=\"hljs-number\">999\u003C/span>, \u003Cspan class=\"hljs-attr\">stock\u003C/span>: \u003Cspan class=\"hljs-number\">45\u003C/span> },\n    { \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;MacBook Pro&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">category\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Computers&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">price\u003C/span>: \u003Cspan class=\"hljs-number\">2399\u003C/span>, \u003Cspan class=\"hljs-attr\">stock\u003C/span>: \u003Cspan class=\"hljs-number\">23\u003C/span> },\n    { \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;AirPods Pro&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">category\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Audio&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">price\u003C/span>: \u003Cspan class=\"hljs-number\">249\u003C/span>, \u003Cspan class=\"hljs-attr\">stock\u003C/span>: \u003Cspan class=\"hljs-number\">156\u003C/span> },\n    { \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;iPad Pro&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">category\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Tablets&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">price\u003C/span>: \u003Cspan class=\"hljs-number\">1099\u003C/span>, \u003Cspan class=\"hljs-attr\">stock\u003C/span>: \u003Cspan class=\"hljs-number\">67\u003C/span> },\n    { \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Magic Mouse&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">category\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Accessories&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">price\u003C/span>: \u003Cspan class=\"hljs-number\">79\u003C/span>, \u003Cspan class=\"hljs-attr\">stock\u003C/span>: \u003Cspan class=\"hljs-number\">234\u003C/span> },\n    { \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Samsung Galaxy&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">category\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Phones&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">price\u003C/span>: \u003Cspan class=\"hljs-number\">899\u003C/span>, \u003Cspan class=\"hljs-attr\">stock\u003C/span>: \u003Cspan class=\"hljs-number\">89\u003C/span> }\n];\n\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> groupedProducts = grouper.\u003Cspan class=\"hljs-title function_\">groupTableData\u003C/span>(productData, {\n    \u003Cspan class=\"hljs-attr\">strategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;category&#x27;\u003C/span>,\n    \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;category&#x27;\u003C/span>,\n    \u003Cspan class=\"hljs-attr\">sortColumn\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;name&#x27;\u003C/span>\n});\n\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> productTable = grouper.\u003Cspan class=\"hljs-title function_\">generateGroupedMarkdownTable\u003C/span>(\n    groupedProducts,\n    [\u003Cspan class=\"hljs-string\">&#x27;name&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;category&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;price&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;stock&#x27;\u003C/span>],\n    {\n        \u003Cspan class=\"hljs-attr\">alignment\u003C/span>: {\n            \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;left&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">category\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;center&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">price\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;right&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">stock\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;right&#x27;\u003C/span>\n        }\n    }\n);\n\n\u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Grouped Product Table:&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(productTable.\u003Cspan class=\"hljs-property\">table\u003C/span>);\n\n\u003Cspan class=\"hljs-comment\">// Example 2: Group tasks by priority with subgrouping\u003C/span>\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> taskData = [\n    { \u003Cspan class=\"hljs-attr\">task\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Fix login bug&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;High&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;In Progress&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">assignee\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;John&#x27;\u003C/span> },\n    { \u003Cspan class=\"hljs-attr\">task\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Update docs&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Low&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Pending&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">assignee\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Sarah&#x27;\u003C/span> },\n    { \u003Cspan class=\"hljs-attr\">task\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Security audit&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Critical&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;In Progress&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">assignee\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Mike&#x27;\u003C/span> },\n    { \u003Cspan class=\"hljs-attr\">task\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;UI polish&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Medium&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Complete&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">assignee\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Lisa&#x27;\u003C/span> },\n    { \u003Cspan class=\"hljs-attr\">task\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Database backup&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;High&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Complete&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">assignee\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;John&#x27;\u003C/span> }\n];\n\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> groupedTasks = grouper.\u003Cspan class=\"hljs-title function_\">groupTableData\u003C/span>(taskData, {\n    \u003Cspan class=\"hljs-attr\">strategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>,\n    \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>,\n    \u003Cspan class=\"hljs-attr\">priorityOrder\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;Critical&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;High&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Medium&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Low&#x27;\u003C/span>]\n});\n\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> taskTable = grouper.\u003Cspan class=\"hljs-title function_\">generateGroupedMarkdownTable\u003C/span>(\n    groupedTasks,\n    [\u003Cspan class=\"hljs-string\">&#x27;task&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;assignee&#x27;\u003C/span>],\n    {\n        \u003Cspan class=\"hljs-attr\">alignment\u003C/span>: {\n            \u003Cspan class=\"hljs-attr\">task\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;left&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;center&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">status\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;center&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">assignee\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;center&#x27;\u003C/span>\n        }\n    }\n);\n\n\u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Grouped Task Table:&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(taskTable.\u003Cspan class=\"hljs-property\">table\u003C/span>);\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">TableRowGrouper\u003C/span>;\n\u003C/code>\u003C/pre>\u003Ch2 id=\"advanced-hierarchical-organization\">Advanced Hierarchical Organization\u003C/h2>\n\u003Ch3 id=\"multi-level-grouping\">Multi-Level Grouping\u003C/h3>\n\u003Cp>Creating sophisticated nested grouping structures:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\"># Multi-Level Table Grouping Examples\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## Corporate Directory with Department and Role Hierarchy\u003C/span>\n| Employee ID | Name              | Department  | Role        | Level    | Salary Range |\n|:-----------:|:------------------|:-----------:|:------------|:--------:|-------------:|\n| \u003Cspan class=\"hljs-strong\">**ENGINEERING DEPARTMENT**\u003C/span>     |                   |             |             |          |              |\n| \u003Cspan class=\"hljs-emphasis\">*Executive Level*\u003C/span>              |                   |             |             |          |              |\n| ENG-001     | Sarah Johnson     | Engineering | VP Engineer | Executive| $180K-$220K  |\n| ENG-002     | Michael Chen      | Engineering | Eng Director| Executive| $160K-$200K  |\n|             |                   |             |             |          |              |\n| \u003Cspan class=\"hljs-emphasis\">*Senior Level*\u003C/span>                 |                   |             |             |          |              |\n| ENG-101     | Lisa Rodriguez    | Engineering | Staff Eng   | Senior   | $140K-$170K  |\n| ENG-102     | David Park        | Engineering | Staff Eng   | Senior   | $140K-$170K  |\n| ENG-103     | Anna Wilson       | Engineering | Senior Eng  | Senior   | $120K-$150K  |\n|             |                   |             |             |          |              |\n| \u003Cspan class=\"hljs-emphasis\">*Mid Level*\u003C/span>                    |                   |             |             |          |              |\n| ENG-201     | James Smith       | Engineering | Engineer    | Mid      | $100K-$130K  |\n| ENG-202     | Emma Davis        | Engineering | Engineer    | Mid      | $100K-$130K  |\n|             |                   |             |             |          |              |\n| \u003Cspan class=\"hljs-strong\">**PRODUCT DEPARTMENT**\u003C/span>         |                   |             |             |          |              |\n| \u003Cspan class=\"hljs-emphasis\">*Executive Level*\u003C/span>              |                   |             |             |          |              |\n| PRD-001     | Robert Martinez   | Product     | VP Product  | Executive| $170K-$210K  |\n|             |                   |             |             |          |              |\n| \u003Cspan class=\"hljs-emphasis\">*Senior Level*\u003C/span>                 |                   |             |             |          |              |\n| PRD-101     | Jennifer Taylor   | Product     | Sr PM       | Senior   | $130K-$160K  |\n| PRD-102     | Kevin Wu          | Product     | Sr Designer | Senior   | $120K-$150K  |\n|             |                   |             |             |          |              |\n| \u003Cspan class=\"hljs-emphasis\">*Mid Level*\u003C/span>                    |                   |             |             |          |              |\n| PRD-201     | Alex Thompson     | Product     | PM          | Mid      | $110K-$140K  |\n| PRD-202     | Maya Patel        | Product     | UX Designer | Mid      | $95K-$125K   |\n\n\u003Cspan class=\"hljs-section\">## Project Portfolio by Client and Project Type\u003C/span>\n| Project Code | Project Name           | Client      | Type        | Status      | Budget       |\n|:------------:|:-----------------------|:-----------:|:-----------:|:-----------:|-------------:|\n| \u003Cspan class=\"hljs-strong\">**CLIENT: TECH CORP**\u003C/span>          |                        |             |             |             |              |\n| \u003Cspan class=\"hljs-emphasis\">*Web Development Projects*\u003C/span>     |                        |             |             |             |              |\n| TC-W001      | E-commerce Platform    | Tech Corp   | Web Dev     | In Progress | $125,000     |\n| TC-W002      | Admin Dashboard        | Tech Corp   | Web Dev     | Complete    | $75,000      |\n| TC-W003      | Customer Portal        | Tech Corp   | Web Dev     | Planning    | $95,000      |\n| \u003Cspan class=\"hljs-emphasis\">*Mobile Development Projects*\u003C/span>  |                        |             |             |             |              |\n| TC-M001      | iOS App Development    | Tech Corp   | Mobile Dev  | In Progress | $180,000     |\n| TC-M002      | Android App Port       | Tech Corp   | Mobile Dev  | Planning    | $120,000     |\n|              |                        |             |             |             |              |\n| \u003Cspan class=\"hljs-strong\">**CLIENT: STARTUP INC**\u003C/span>        |                        |             |             |             |              |\n| \u003Cspan class=\"hljs-emphasis\">*Web Development Projects*\u003C/span>     |                        |             |             |             |              |\n| SI-W001      | MVP Website            | Startup Inc | Web Dev     | Complete    | $45,000      |\n| SI-W002      | Payment Integration    | Startup Inc | Web Dev     | In Progress | $30,000      |\n| \u003Cspan class=\"hljs-emphasis\">*Consulting Projects*\u003C/span>          |                        |             |             |             |              |\n| SI-C001      | Technical Architecture | Startup Inc | Consulting  | Complete    | $25,000      |\n| SI-C002      | Performance Audit      | Startup Inc | Consulting  | Planning    | $15,000      |\n\n\u003Cspan class=\"hljs-section\">## Inventory Control with Location and Category Hierarchy\u003C/span>\n| Item Code   | Product Name           | Category    | Subcategory | Location    | Stock | Status    |\n|:-----------:|:-----------------------|:-----------:|:------------|:-----------:|------:|:---------:|\n| \u003Cspan class=\"hljs-strong\">**MAIN WAREHOUSE**\u003C/span>             |                        |             |             |             |       |           |\n| \u003Cspan class=\"hljs-emphasis\">*Electronics - Computing*\u003C/span>     |                        |             |             |             |       |           |\n| MW-EC-001   | Laptop Pro 16&quot;         | Electronics | Computing   | Main WH     |    45 | In Stock  |\n| MW-EC-002   | Desktop Workstation    | Electronics | Computing   | Main WH     |    23 | In Stock  |\n| MW-EC-003   | Server Rack Unit       | Electronics | Computing   | Main WH     |    12 | Low Stock |\n| \u003Cspan class=\"hljs-emphasis\">*Electronics - Peripherals*\u003C/span>   |                        |             |             |             |       |           |\n| MW-EP-001   | Wireless Mouse         | Electronics | Peripherals | Main WH     |   156 | In Stock  |\n| MW-EP-002   | Mechanical Keyboard    | Electronics | Peripherals | Main WH     |    89 | In Stock  |\n| MW-EP-003   | USB-C Hub              | Electronics | Peripherals | Main WH     |    67 | In Stock  |\n|             |                        |             |             |             |       |           |\n| \u003Cspan class=\"hljs-strong\">**SATELLITE WAREHOUSE**\u003C/span>        |                        |             |             |             |       |           |\n| \u003Cspan class=\"hljs-emphasis\">*Office Supplies - Furniture*\u003C/span> |                        |             |             |             |       |           |\n| SW-OF-001   | Ergonomic Chair        | Office      | Furniture   | Satellite   |    34 | In Stock  |\n| SW-OF-002   | Standing Desk          | Office      | Furniture   | Satellite   |    18 | Low Stock |\n| SW-OF-003   | Monitor Arm            | Office      | Furniture   | Satellite   |    56 | In Stock  |\n| \u003Cspan class=\"hljs-emphasis\">*Office Supplies - Stationery*\u003C/span>|                        |             |             |             |       |           |\n| SW-OS-001   | Notebook Set           | Office      | Stationery  | Satellite   |   234 | In Stock  |\n| SW-OS-002   | Pen Collection         | Office      | Stationery  | Satellite   |   445 | In Stock  |\n\u003C/code>\u003C/pre>\u003Ch3 id=\"dynamic-grouping-with-conditional-logic\">Dynamic Grouping with Conditional Logic\u003C/h3>\n\u003Cp>Advanced grouping based on multiple criteria:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-css\">\u003Cspan class=\"hljs-comment\">/* enhanced-table-grouping.css - Styles for grouped table presentation */\u003C/span>\n\n\u003Cspan class=\"hljs-comment\">/* Base table styling with grouping support */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">width\u003C/span>: \u003Cspan class=\"hljs-number\">100%\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border-collapse\u003C/span>: collapse;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">1.5rem\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-family\u003C/span>: -apple-system, BlinkMacSystemFont, \u003Cspan class=\"hljs-string\">&#x27;Segoe UI&#x27;\u003C/span>, sans-serif;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Standard table cells */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span> \u003Cspan class=\"hljs-selector-tag\">th\u003C/span>,\n\u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span> \u003Cspan class=\"hljs-selector-tag\">td\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1px\u003C/span> solid \u003Cspan class=\"hljs-number\">#e1e5e9\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">0.75rem\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">vertical-align\u003C/span>: top;\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: left;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Header row styling */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span> \u003Cspan class=\"hljs-selector-tag\">th\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#f6f8fa\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: \u003Cspan class=\"hljs-number\">600\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">position\u003C/span>: sticky;\n    \u003Cspan class=\"hljs-attribute\">top\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">z-index\u003C/span>: \u003Cspan class=\"hljs-number\">10\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Group header styling */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.group-header\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#0969da\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: white \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: \u003Cspan class=\"hljs-number\">700\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">1.1em\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">text-transform\u003C/span>: uppercase;\n    \u003Cspan class=\"hljs-attribute\">letter-spacing\u003C/span>: \u003Cspan class=\"hljs-number\">0.5px\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">1rem\u003C/span> \u003Cspan class=\"hljs-number\">0.75rem\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border-top\u003C/span>: \u003Cspan class=\"hljs-number\">3px\u003C/span> solid \u003Cspan class=\"hljs-number\">#0550ae\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Subgroup header styling */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.subgroup-header\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#ddf4ff\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#0969da\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: \u003Cspan class=\"hljs-number\">600\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-style\u003C/span>: italic;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">0.6rem\u003C/span> \u003Cspan class=\"hljs-number\">0.75rem\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border-left\u003C/span>: \u003Cspan class=\"hljs-number\">4px\u003C/span> solid \u003Cspan class=\"hljs-number\">#0969da\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Empty row for spacing between groups */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.group-separator\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">height\u003C/span>: \u003Cspan class=\"hljs-number\">0.5rem\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: transparent;\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: none;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Alternating row colors within groups */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.group-row\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:nth-child\u003C/span>(even) {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#f8f9fa\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.group-row\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:nth-child\u003C/span>(odd) {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: white;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Group summary row styling */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.group-summary\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#fff8dc\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border-top\u003C/span>: \u003Cspan class=\"hljs-number\">2px\u003C/span> solid \u003Cspan class=\"hljs-number\">#ffd33d\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: \u003Cspan class=\"hljs-number\">600\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-style\u003C/span>: italic;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#8b6914\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Indentation for hierarchical grouping */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.indent-1\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">padding-left\u003C/span>: \u003Cspan class=\"hljs-number\">1.5rem\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.indent-2\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">padding-left\u003C/span>: \u003Cspan class=\"hljs-number\">3rem\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.indent-3\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">padding-left\u003C/span>: \u003Cspan class=\"hljs-number\">4.5rem\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Group collapse/expand functionality */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.collapsible-group\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">position\u003C/span>: relative;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.collapsible-group\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;▼&#x27;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">position\u003C/span>: absolute;\n    \u003Cspan class=\"hljs-attribute\">left\u003C/span>: \u003Cspan class=\"hljs-number\">0.25rem\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">top\u003C/span>: \u003Cspan class=\"hljs-number\">50%\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">transform\u003C/span>: \u003Cspan class=\"hljs-built_in\">translateY\u003C/span>(-\u003Cspan class=\"hljs-number\">50%\u003C/span>);\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">0.8em\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">cursor\u003C/span>: pointer;\n    user-select: none;\n    \u003Cspan class=\"hljs-attribute\">transition\u003C/span>: transform \u003Cspan class=\"hljs-number\">0.2s\u003C/span> ease;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.collapsible-group\u003C/span>\u003Cspan class=\"hljs-selector-class\">.collapsed\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">transform\u003C/span>: \u003Cspan class=\"hljs-built_in\">translateY\u003C/span>(-\u003Cspan class=\"hljs-number\">50%\u003C/span>) \u003Cspan class=\"hljs-built_in\">rotate\u003C/span>(-\u003Cspan class=\"hljs-number\">90deg\u003C/span>);\n}\n\n\u003Cspan class=\"hljs-selector-class\">.collapsible-group\u003C/span>\u003Cspan class=\"hljs-selector-class\">.collapsed\u003C/span> + \u003Cspan class=\"hljs-selector-class\">.group-content\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: none;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Priority-based group coloring */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.priority-critical\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border-left\u003C/span>: \u003Cspan class=\"hljs-number\">6px\u003C/span> solid \u003Cspan class=\"hljs-number\">#dc3545\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.priority-critical\u003C/span> \u003Cspan class=\"hljs-selector-class\">.group-header\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#dc3545\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.priority-high\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border-left\u003C/span>: \u003Cspan class=\"hljs-number\">6px\u003C/span> solid \u003Cspan class=\"hljs-number\">#fd7e14\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.priority-high\u003C/span> \u003Cspan class=\"hljs-selector-class\">.group-header\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#fd7e14\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.priority-medium\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border-left\u003C/span>: \u003Cspan class=\"hljs-number\">6px\u003C/span> solid \u003Cspan class=\"hljs-number\">#ffc107\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.priority-medium\u003C/span> \u003Cspan class=\"hljs-selector-class\">.group-header\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#ffc107\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#000\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.priority-low\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border-left\u003C/span>: \u003Cspan class=\"hljs-number\">6px\u003C/span> solid \u003Cspan class=\"hljs-number\">#28a745\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.priority-low\u003C/span> \u003Cspan class=\"hljs-selector-class\">.group-header\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#28a745\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Status-based indicators */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.status-complete\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#d4edda\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#155724\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.status-progress\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#cce5ff\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#004085\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.status-pending\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#fff3cd\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#856404\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.status-blocked\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#f8d7da\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#721c24\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Responsive design for grouped tables */\u003C/span>\n\u003Cspan class=\"hljs-keyword\">@media\u003C/span> (\u003Cspan class=\"hljs-attribute\">max-width\u003C/span>: \u003Cspan class=\"hljs-number\">768px\u003C/span>) {\n    \u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">0.875rem\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span> \u003Cspan class=\"hljs-selector-tag\">th\u003C/span>,\n    \u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span> \u003Cspan class=\"hljs-selector-tag\">td\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">0.5rem\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-selector-class\">.group-header\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">1rem\u003C/span>;\n        \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">0.75rem\u003C/span> \u003Cspan class=\"hljs-number\">0.5rem\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-selector-class\">.indent-1\u003C/span>, \u003Cspan class=\"hljs-selector-class\">.indent-2\u003C/span>, \u003Cspan class=\"hljs-selector-class\">.indent-3\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">padding-left\u003C/span>: \u003Cspan class=\"hljs-number\">0.75rem\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">/* Print styles for grouped tables */\u003C/span>\n\u003Cspan class=\"hljs-keyword\">@media\u003C/span> print {\n    \u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">break-inside\u003C/span>: avoid;\n    }\n    \n    \u003Cspan class=\"hljs-selector-class\">.group-header\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">break-after\u003C/span>: avoid;\n        \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#f0f0f0\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n        \u003Cspan class=\"hljs-attribute\">color\u003C/span>: black \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n        -webkit-print-\u003Cspan class=\"hljs-attribute\">color\u003C/span>-adjust: exact;\n    }\n    \n    \u003Cspan class=\"hljs-selector-class\">.collapsible-group\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">display\u003C/span>: none;\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">/* Dark theme support */\u003C/span>\n\u003Cspan class=\"hljs-keyword\">@media\u003C/span> (\u003Cspan class=\"hljs-attribute\">prefers-color-scheme\u003C/span>: dark) {\n    \u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span> \u003Cspan class=\"hljs-selector-tag\">th\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#21262d\u003C/span>;\n        \u003Cspan class=\"hljs-attribute\">border-color\u003C/span>: \u003Cspan class=\"hljs-number\">#30363d\u003C/span>;\n        \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#f0f6fc\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span> \u003Cspan class=\"hljs-selector-tag\">td\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">border-color\u003C/span>: \u003Cspan class=\"hljs-number\">#30363d\u003C/span>;\n        \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#e6edf3\u003C/span>;\n        \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#0d1117\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-selector-class\">.group-row\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:nth-child\u003C/span>(even) {\n        \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#161b22\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-selector-class\">.subgroup-header\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#1c2128\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n        \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#58a6ff\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-selector-class\">.group-summary\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#2d2b00\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n        \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#f7d93a\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">/* Animation for group transitions */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.group-transition\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">transition\u003C/span>: all \u003Cspan class=\"hljs-number\">0.3s\u003C/span> ease-in-out;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.group-fade-in\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">animation\u003C/span>: fadeIn \u003Cspan class=\"hljs-number\">0.5s\u003C/span> ease-in-out;\n}\n\n\u003Cspan class=\"hljs-keyword\">@keyframes\u003C/span> fadeIn {\n    \u003Cspan class=\"hljs-selector-tag\">from\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">opacity\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-attribute\">transform\u003C/span>: \u003Cspan class=\"hljs-built_in\">translateY\u003C/span>(-\u003Cspan class=\"hljs-number\">10px\u003C/span>);\n    }\n    \u003Cspan class=\"hljs-selector-tag\">to\u003C/span> {\n        \u003Cspan class=\"hljs-attribute\">opacity\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>;\n        \u003Cspan class=\"hljs-attribute\">transform\u003C/span>: \u003Cspan class=\"hljs-built_in\">translateY\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>);\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">/* Group statistics and metadata */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.group-stats\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">0.85rem\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#666\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-style\u003C/span>: italic;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">0.25rem\u003C/span> \u003Cspan class=\"hljs-number\">0.75rem\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">background-color\u003C/span>: \u003Cspan class=\"hljs-number\">#f8f9fa\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">1px\u003C/span> solid \u003Cspan class=\"hljs-number\">#e1e5e9\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Enhanced accessibility */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span>\u003Cspan class=\"hljs-selector-attr\">[aria-expanded=\u003Cspan class=\"hljs-string\">&quot;false&quot;\u003C/span>]\u003C/span> \u003Cspan class=\"hljs-selector-class\">.collapsible-content\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: none;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.grouped-table\u003C/span>\u003Cspan class=\"hljs-selector-attr\">[aria-expanded=\u003Cspan class=\"hljs-string\">&quot;true&quot;\u003C/span>]\u003C/span> \u003Cspan class=\"hljs-selector-class\">.collapsible-content\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: table-row-group;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Focus states for keyboard navigation */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.collapsible-group\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:focus\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">outline\u003C/span>: \u003Cspan class=\"hljs-number\">2px\u003C/span> solid \u003Cspan class=\"hljs-number\">#0969da\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">outline-offset\u003C/span>: -\u003Cspan class=\"hljs-number\">2px\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Table caption for grouped tables */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.grouped-table-caption\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">caption-side\u003C/span>: top;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: \u003Cspan class=\"hljs-number\">600\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">1.1em\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">0.5rem\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: left;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#24292f\u003C/span>;\n}\n\n\u003Cspan class=\"hljs-comment\">/* Export-friendly styling */\u003C/span>\n\u003Cspan class=\"hljs-selector-class\">.export-mode\u003C/span> \u003Cspan class=\"hljs-selector-class\">.collapsible-group\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: none;\n}\n\n\u003Cspan class=\"hljs-selector-class\">.export-mode\u003C/span> \u003Cspan class=\"hljs-selector-class\">.group-separator\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border-top\u003C/span>: \u003Cspan class=\"hljs-number\">1px\u003C/span> solid \u003Cspan class=\"hljs-number\">#e1e5e9\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">height\u003C/span>: auto;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">0.25rem\u003C/span>;\n}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"integration-with-documentation-systems\">Integration with Documentation Systems\u003C/h2>\n\u003Cp>Table row grouping strategies integrate seamlessly with comprehensive documentation workflows and content management systems. When combined with \u003Ca href=\"/blog/markdown-automated-testing-validation-complete-guide\">automated testing and validation systems\u003C/a>, proper grouping ensures that data organization remains consistent and functional across different rendering engines and output formats, from web documentation to PDF reports and mobile-responsive layouts.\u003C/p>\n\u003Cp>For sophisticated content organization, grouping techniques work effectively with \u003Ca href=\"/blog/markdown-table-data-validation-quality-assurance-complete-guide\">table data validation and quality assurance systems\u003C/a> to ensure that not only is data accurate and properly validated, but it&#39;s also presented with logical organization that supports user comprehension and efficient information retrieval processes.\u003C/p>\n\u003Cp>When building comprehensive documentation platforms, row grouping complements \u003Ca href=\"/blog/markdown-tables-advanced-features-and-styling-guide\">advanced table features and styling techniques\u003C/a> by providing the structural foundation that enhances more sophisticated table functionality like sorting, filtering, and interactive data exploration while maintaining logical content hierarchy and professional presentation standards.\u003C/p>\n\u003Ch2 id=\"advanced-automation-and-optimization\">Advanced Automation and Optimization\u003C/h2>\n\u003Ch3 id=\"intelligent-grouping-recommendations\">Intelligent Grouping Recommendations\u003C/h3>\n\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-comment\"># intelligent-grouping-analyzer.py - Advanced grouping analysis and recommendations\u003C/span>\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> collections \u003Cspan class=\"hljs-keyword\">import\u003C/span> Counter, defaultdict\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> datetime \u003Cspan class=\"hljs-keyword\">import\u003C/span> datetime\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> re\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">IntelligentGroupingAnalyzer\u003C/span>:\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">__init__\u003C/span>(\u003Cspan class=\"hljs-params\">self\u003C/span>):\n        self.grouping_strategies = {\n            \u003Cspan class=\"hljs-string\">&#x27;categorical&#x27;\u003C/span>: self.analyze_categorical_grouping,\n            \u003Cspan class=\"hljs-string\">&#x27;numerical&#x27;\u003C/span>: self.analyze_numerical_grouping,\n            \u003Cspan class=\"hljs-string\">&#x27;temporal&#x27;\u003C/span>: self.analyze_temporal_grouping,\n            \u003Cspan class=\"hljs-string\">&#x27;hierarchical&#x27;\u003C/span>: self.analyze_hierarchical_grouping,\n            \u003Cspan class=\"hljs-string\">&#x27;priority_based&#x27;\u003C/span>: self.analyze_priority_grouping,\n            \u003Cspan class=\"hljs-string\">&#x27;status_based&#x27;\u003C/span>: self.analyze_status_grouping\n        }\n        \n        self.patterns = {\n            \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>: [\n                \u003Cspan class=\"hljs-string\">r&#x27;\\d{4}-\\d{2}-\\d{2}&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">r&#x27;\\d{1,2}/\\d{1,2}/\\d{4}&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">r&#x27;\\d{1,2}-\\d{1,2}-\\d{4}&#x27;\u003C/span>\n            ],\n            \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>: [\n                \u003Cspan class=\"hljs-string\">r&#x27;(?i)(critical|high|medium|low|urgent)&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">r&#x27;(?i)(p[0-4]|priority\\s*[0-4])&#x27;\u003C/span>\n            ],\n            \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: [\n                \u003Cspan class=\"hljs-string\">r&#x27;(?i)(active|inactive|pending|complete|done|failed|success)&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">r&#x27;(?i)(in\\s*progress|not\\s*started|on\\s*hold)&#x27;\u003C/span>\n            ]\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_data_for_grouping\u003C/span>(\u003Cspan class=\"hljs-params\">self, data\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;\n        Analyze dataset to recommend optimal grouping strategies\n        &quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(data, (\u003Cspan class=\"hljs-built_in\">list\u003C/span>, pd.DataFrame)):\n            \u003Cspan class=\"hljs-keyword\">raise\u003C/span> ValueError(\u003Cspan class=\"hljs-string\">&quot;Data must be a list of dictionaries or pandas DataFrame&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">isinstance\u003C/span>(data, \u003Cspan class=\"hljs-built_in\">list\u003C/span>):\n            df = pd.DataFrame(data)\n        \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n            df = data.copy()\n        \n        analysis_results = {\n            \u003Cspan class=\"hljs-string\">&#x27;dataset_info&#x27;\u003C/span>: self.get_dataset_info(df),\n            \u003Cspan class=\"hljs-string\">&#x27;column_analysis&#x27;\u003C/span>: {},\n            \u003Cspan class=\"hljs-string\">&#x27;grouping_recommendations&#x27;\u003C/span>: [],\n            \u003Cspan class=\"hljs-string\">&#x27;optimal_strategies&#x27;\u003C/span>: []\n        }\n        \n        \u003Cspan class=\"hljs-comment\"># Analyze each column for grouping potential\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> column \u003Cspan class=\"hljs-keyword\">in\u003C/span> df.columns:\n            column_analysis = self.analyze_column_for_grouping(df[column], column)\n            analysis_results[\u003Cspan class=\"hljs-string\">&#x27;column_analysis&#x27;\u003C/span>][column] = column_analysis\n        \n        \u003Cspan class=\"hljs-comment\"># Generate grouping recommendations\u003C/span>\n        recommendations = self.generate_grouping_recommendations(analysis_results[\u003Cspan class=\"hljs-string\">&#x27;column_analysis&#x27;\u003C/span>])\n        analysis_results[\u003Cspan class=\"hljs-string\">&#x27;grouping_recommendations&#x27;\u003C/span>] = recommendations\n        \n        \u003Cspan class=\"hljs-comment\"># Determine optimal strategies\u003C/span>\n        optimal_strategies = self.determine_optimal_strategies(df, analysis_results[\u003Cspan class=\"hljs-string\">&#x27;column_analysis&#x27;\u003C/span>])\n        analysis_results[\u003Cspan class=\"hljs-string\">&#x27;optimal_strategies&#x27;\u003C/span>] = optimal_strategies\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> analysis_results\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">get_dataset_info\u003C/span>(\u003Cspan class=\"hljs-params\">self, df\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Get basic information about the dataset&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-string\">&#x27;row_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(df),\n            \u003Cspan class=\"hljs-string\">&#x27;column_count&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(df.columns),\n            \u003Cspan class=\"hljs-string\">&#x27;columns&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">list\u003C/span>(df.columns),\n            \u003Cspan class=\"hljs-string\">&#x27;memory_usage&#x27;\u003C/span>: df.memory_usage(deep=\u003Cspan class=\"hljs-literal\">True\u003C/span>).\u003Cspan class=\"hljs-built_in\">sum\u003C/span>(),\n            \u003Cspan class=\"hljs-string\">&#x27;data_types&#x27;\u003C/span>: df.dtypes.to_dict()\n        }\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_column_for_grouping\u003C/span>(\u003Cspan class=\"hljs-params\">self, series, column_name\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Analyze individual column for grouping potential&quot;&quot;&quot;\u003C/span>\n        analysis = {\n            \u003Cspan class=\"hljs-string\">&#x27;column_name&#x27;\u003C/span>: column_name,\n            \u003Cspan class=\"hljs-string\">&#x27;data_type&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">str\u003C/span>(series.dtype),\n            \u003Cspan class=\"hljs-string\">&#x27;unique_values&#x27;\u003C/span>: series.nunique(),\n            \u003Cspan class=\"hljs-string\">&#x27;null_values&#x27;\u003C/span>: series.isnull().\u003Cspan class=\"hljs-built_in\">sum\u003C/span>(),\n            \u003Cspan class=\"hljs-string\">&#x27;unique_ratio&#x27;\u003C/span>: series.nunique() / \u003Cspan class=\"hljs-built_in\">len\u003C/span>(series),\n            \u003Cspan class=\"hljs-string\">&#x27;value_distribution&#x27;\u003C/span>: series.value_counts().head(\u003Cspan class=\"hljs-number\">10\u003C/span>).to_dict(),\n            \u003Cspan class=\"hljs-string\">&#x27;recommended_strategies&#x27;\u003C/span>: []\n        }\n        \n        \u003Cspan class=\"hljs-comment\"># Apply specific analysis strategies\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> strategy_name, strategy_func \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.grouping_strategies.items():\n            strategy_result = strategy_func(series, analysis)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> strategy_result[\u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>]:\n                analysis[\u003Cspan class=\"hljs-string\">&#x27;recommended_strategies&#x27;\u003C/span>].append({\n                    \u003Cspan class=\"hljs-string\">&#x27;strategy&#x27;\u003C/span>: strategy_name,\n                    \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: strategy_result[\u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>],\n                    \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: strategy_result[\u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>],\n                    \u003Cspan class=\"hljs-string\">&#x27;estimated_groups&#x27;\u003C/span>: strategy_result[\u003Cspan class=\"hljs-string\">&#x27;estimated_groups&#x27;\u003C/span>],\n                    \u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>: strategy_result.get(\u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>, {})\n                })\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> analysis\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_categorical_grouping\u003C/span>(\u003Cspan class=\"hljs-params\">self, series, base_analysis\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Analyze suitability for categorical grouping&quot;&quot;&quot;\u003C/span>\n        unique_ratio = base_analysis[\u003Cspan class=\"hljs-string\">&#x27;unique_ratio&#x27;\u003C/span>]\n        unique_count = base_analysis[\u003Cspan class=\"hljs-string\">&#x27;unique_values&#x27;\u003C/span>]\n        \n        \u003Cspan class=\"hljs-comment\"># Categorical grouping is suitable when:\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># - Low unique ratio (many repeated values)\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># - Reasonable number of unique values (2-20 typically)\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># - Non-numeric data or categorical numeric data\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> unique_ratio &lt;= \u003Cspan class=\"hljs-number\">0.3\u003C/span> \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-number\">2\u003C/span> &lt;= unique_count &lt;= \u003Cspan class=\"hljs-number\">20\u003C/span>:\n            confidence = \u003Cspan class=\"hljs-number\">0.9\u003C/span> - (unique_ratio * \u003Cspan class=\"hljs-number\">0.5\u003C/span>)  \u003Cspan class=\"hljs-comment\"># Higher confidence for lower ratios\u003C/span>\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: confidence,\n                \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Low unique ratio (\u003Cspan class=\"hljs-subst\">{unique_ratio:\u003Cspan class=\"hljs-number\">.2\u003C/span>%}\u003C/span>) with \u003Cspan class=\"hljs-subst\">{unique_count}\u003C/span> categories&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;estimated_groups&#x27;\u003C/span>: unique_count,\n                \u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>: {\n                    \u003Cspan class=\"hljs-string\">&#x27;sort_groups&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;group_by_frequency&#x27;\u003C/span>: unique_ratio &lt; \u003Cspan class=\"hljs-number\">0.2\u003C/span>\n                }\n            }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">False\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;High unique ratio or too many categories&#x27;\u003C/span>}\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_numerical_grouping\u003C/span>(\u003Cspan class=\"hljs-params\">self, series, base_analysis\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Analyze suitability for numerical range grouping&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            numeric_series = pd.to_numeric(series, errors=\u003Cspan class=\"hljs-string\">&#x27;coerce&#x27;\u003C/span>)\n            non_null_numeric = numeric_series.dropna()\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(non_null_numeric) &lt; \u003Cspan class=\"hljs-built_in\">len\u003C/span>(series) * \u003Cspan class=\"hljs-number\">0.8\u003C/span>:  \u003Cspan class=\"hljs-comment\"># Less than 80% numeric\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">False\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Insufficient numeric data&#x27;\u003C/span>}\n            \n            \u003Cspan class=\"hljs-comment\"># Calculate range and distribution\u003C/span>\n            value_range = non_null_numeric.\u003Cspan class=\"hljs-built_in\">max\u003C/span>() - non_null_numeric.\u003Cspan class=\"hljs-built_in\">min\u003C/span>()\n            std_dev = non_null_numeric.std()\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> value_range &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-keyword\">and\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> pd.isna(std_dev):\n                \u003Cspan class=\"hljs-comment\"># Suitable for numerical grouping if there&#x27;s reasonable spread\u003C/span>\n                confidence = \u003Cspan class=\"hljs-built_in\">min\u003C/span>(\u003Cspan class=\"hljs-number\">0.8\u003C/span>, (std_dev / non_null_numeric.mean()) * \u003Cspan class=\"hljs-number\">0.5\u003C/span>) \u003Cspan class=\"hljs-keyword\">if\u003C/span> non_null_numeric.mean() != \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-number\">0.5\u003C/span>\n                \n                \u003Cspan class=\"hljs-comment\"># Suggest number of groups based on data distribution\u003C/span>\n                estimated_groups = \u003Cspan class=\"hljs-built_in\">min\u003C/span>(\u003Cspan class=\"hljs-number\">5\u003C/span>, \u003Cspan class=\"hljs-built_in\">max\u003C/span>(\u003Cspan class=\"hljs-number\">3\u003C/span>, \u003Cspan class=\"hljs-built_in\">int\u003C/span>(np.sqrt(\u003Cspan class=\"hljs-built_in\">len\u003C/span>(non_null_numeric)))))\n                \n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                    \u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: confidence,\n                    \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Numeric data with range \u003Cspan class=\"hljs-subst\">{value_range:\u003Cspan class=\"hljs-number\">.2\u003C/span>f}\u003C/span> and std dev \u003Cspan class=\"hljs-subst\">{std_dev:\u003Cspan class=\"hljs-number\">.2\u003C/span>f}\u003C/span>&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-string\">&#x27;estimated_groups&#x27;\u003C/span>: estimated_groups,\n                    \u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>: {\n                        \u003Cspan class=\"hljs-string\">&#x27;method&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;equal_interval&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-string\">&#x27;groups&#x27;\u003C/span>: estimated_groups,\n                        \u003Cspan class=\"hljs-string\">&#x27;include_outliers&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>\n                    }\n                }\n        \u003Cspan class=\"hljs-keyword\">except\u003C/span>:\n            \u003Cspan class=\"hljs-keyword\">pass\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">False\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Not suitable for numerical grouping&#x27;\u003C/span>}\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_temporal_grouping\u003C/span>(\u003Cspan class=\"hljs-params\">self, series, base_analysis\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Analyze suitability for temporal/date-based grouping&quot;&quot;&quot;\u003C/span>\n        date_pattern_matches = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        total_values = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(series.dropna())\n        \n        \u003Cspan class=\"hljs-comment\"># Check for date patterns\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> pattern \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.patterns[\u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>]:\n            matches = series.astype(\u003Cspan class=\"hljs-built_in\">str\u003C/span>).\u003Cspan class=\"hljs-built_in\">str\u003C/span>.\u003Cspan class=\"hljs-keyword\">match\u003C/span>(pattern).\u003Cspan class=\"hljs-built_in\">sum\u003C/span>()\n            date_pattern_matches = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(date_pattern_matches, matches)\n        \n        \u003Cspan class=\"hljs-comment\"># Try to parse as dates\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n            parsed_dates = pd.to_datetime(series, errors=\u003Cspan class=\"hljs-string\">&#x27;coerce&#x27;\u003C/span>)\n            valid_dates = parsed_dates.dropna()\n            date_ratio = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(valid_dates) / total_values \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\">0\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">except\u003C/span>:\n            date_ratio = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        \n        pattern_ratio = date_pattern_matches / total_values \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\">0\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> date_ratio &gt;= \u003Cspan class=\"hljs-number\">0.8\u003C/span> \u003Cspan class=\"hljs-keyword\">or\u003C/span> pattern_ratio &gt;= \u003Cspan class=\"hljs-number\">0.8\u003C/span>:\n            confidence = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(date_ratio, pattern_ratio) * \u003Cspan class=\"hljs-number\">0.9\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Determine temporal grouping strategy\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(valid_dates) &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>:\n                date_span = (valid_dates.\u003Cspan class=\"hljs-built_in\">max\u003C/span>() - valid_dates.\u003Cspan class=\"hljs-built_in\">min\u003C/span>()).days\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> date_span &lt;= \u003Cspan class=\"hljs-number\">31\u003C/span>:\n                    grouping_method = \u003Cspan class=\"hljs-string\">&#x27;day&#x27;\u003C/span>\n                    estimated_groups = date_span\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> date_span &lt;= \u003Cspan class=\"hljs-number\">365\u003C/span>:\n                    grouping_method = \u003Cspan class=\"hljs-string\">&#x27;month&#x27;\u003C/span>\n                    estimated_groups = \u003Cspan class=\"hljs-built_in\">min\u003C/span>(\u003Cspan class=\"hljs-number\">12\u003C/span>, date_span // \u003Cspan class=\"hljs-number\">30\u003C/span> + \u003Cspan class=\"hljs-number\">1\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                    grouping_method = \u003Cspan class=\"hljs-string\">&#x27;year&#x27;\u003C/span>\n                    estimated_groups = \u003Cspan class=\"hljs-built_in\">min\u003C/span>(\u003Cspan class=\"hljs-number\">10\u003C/span>, date_span // \u003Cspan class=\"hljs-number\">365\u003C/span> + \u003Cspan class=\"hljs-number\">1\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                grouping_method = \u003Cspan class=\"hljs-string\">&#x27;month&#x27;\u003C/span>\n                estimated_groups = \u003Cspan class=\"hljs-number\">6\u003C/span>\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: confidence,\n                \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Strong date pattern detection (ratio: \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">max\u003C/span>(date_ratio, pattern_ratio):\u003Cspan class=\"hljs-number\">.2\u003C/span>%}\u003C/span>)&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;estimated_groups&#x27;\u003C/span>: estimated_groups,\n                \u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>: {\n                    \u003Cspan class=\"hljs-string\">&#x27;grouping_method&#x27;\u003C/span>: grouping_method,\n                    \u003Cspan class=\"hljs-string\">&#x27;sort_chronologically&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>\n                }\n            }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">False\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;No significant date patterns detected&#x27;\u003C/span>}\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_hierarchical_grouping\u003C/span>(\u003Cspan class=\"hljs-params\">self, series, base_analysis\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Analyze suitability for hierarchical grouping&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Look for hierarchical patterns (e.g., &quot;Department &gt; Team&quot;, &quot;Category/Subcategory&quot;)\u003C/span>\n        hierarchical_indicators = [\n            \u003Cspan class=\"hljs-string\">r&#x27;[&gt;\\/\\\\|]&#x27;\u003C/span>,  \u003Cspan class=\"hljs-comment\"># Separators like &gt;, /, \\, |\u003C/span>\n            \u003Cspan class=\"hljs-string\">r&#x27;\\s*-\\s*&#x27;\u003C/span>,   \u003Cspan class=\"hljs-comment\"># Dash separators\u003C/span>\n            \u003Cspan class=\"hljs-string\">r&#x27;[A-Z][a-z]+\\s*:\\s*[A-Z][a-z]+&#x27;\u003C/span>,  \u003Cspan class=\"hljs-comment\"># &quot;Category: Subcategory&quot;\u003C/span>\n            \u003Cspan class=\"hljs-string\">r&#x27;^[A-Z0-9]+-[A-Z0-9]+&#x27;\u003C/span>  \u003Cspan class=\"hljs-comment\"># Code patterns like &quot;ENG-001&quot;\u003C/span>\n        ]\n        \n        hierarchical_matches = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        total_values = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(series.dropna())\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> pattern \u003Cspan class=\"hljs-keyword\">in\u003C/span> hierarchical_indicators:\n            matches = series.astype(\u003Cspan class=\"hljs-built_in\">str\u003C/span>).\u003Cspan class=\"hljs-built_in\">str\u003C/span>.contains(pattern, regex=\u003Cspan class=\"hljs-literal\">True\u003C/span>, na=\u003Cspan class=\"hljs-literal\">False\u003C/span>).\u003Cspan class=\"hljs-built_in\">sum\u003C/span>()\n            hierarchical_matches = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(hierarchical_matches, matches)\n        \n        hierarchical_ratio = hierarchical_matches / total_values \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\">0\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> hierarchical_ratio &gt;= \u003Cspan class=\"hljs-number\">0.6\u003C/span>:\n            confidence = hierarchical_ratio * \u003Cspan class=\"hljs-number\">0.8\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Try to determine hierarchy levels\u003C/span>\n            sample_values = series.dropna().head(\u003Cspan class=\"hljs-number\">20\u003C/span>)\n            max_levels = \u003Cspan class=\"hljs-number\">1\u003C/span>\n            \n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> value \u003Cspan class=\"hljs-keyword\">in\u003C/span> sample_values:\n                str_value = \u003Cspan class=\"hljs-built_in\">str\u003C/span>(value)\n                levels = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(re.split(\u003Cspan class=\"hljs-string\">r&#x27;[&gt;\\/\\\\|\\s*-\\s*:]&#x27;\u003C/span>, str_value))\n                max_levels = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(max_levels, levels)\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: confidence,\n                \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Hierarchical patterns detected (ratio: \u003Cspan class=\"hljs-subst\">{hierarchical_ratio:\u003Cspan class=\"hljs-number\">.2\u003C/span>%}\u003C/span>)&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;estimated_groups&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">min\u003C/span>(base_analysis[\u003Cspan class=\"hljs-string\">&#x27;unique_values&#x27;\u003C/span>], max_levels * \u003Cspan class=\"hljs-number\">3\u003C/span>),\n                \u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>: {\n                    \u003Cspan class=\"hljs-string\">&#x27;max_levels&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">min\u003C/span>(max_levels, \u003Cspan class=\"hljs-number\">3\u003C/span>),\n                    \u003Cspan class=\"hljs-string\">&#x27;separator_patterns&#x27;\u003C/span>: hierarchical_indicators\n                }\n            }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">False\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;No hierarchical patterns detected&#x27;\u003C/span>}\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_priority_grouping\u003C/span>(\u003Cspan class=\"hljs-params\">self, series, base_analysis\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Analyze suitability for priority-based grouping&quot;&quot;&quot;\u003C/span>\n        priority_matches = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        total_values = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(series.dropna())\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> pattern \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.patterns[\u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>]:\n            matches = series.astype(\u003Cspan class=\"hljs-built_in\">str\u003C/span>).\u003Cspan class=\"hljs-built_in\">str\u003C/span>.contains(pattern, regex=\u003Cspan class=\"hljs-literal\">True\u003C/span>, na=\u003Cspan class=\"hljs-literal\">False\u003C/span>).\u003Cspan class=\"hljs-built_in\">sum\u003C/span>()\n            priority_matches = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(priority_matches, matches)\n        \n        priority_ratio = priority_matches / total_values \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\">0\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> priority_ratio &gt;= \u003Cspan class=\"hljs-number\">0.7\u003C/span>:\n            confidence = priority_ratio * \u003Cspan class=\"hljs-number\">0.85\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Identify priority levels\u003C/span>\n            priority_levels = \u003Cspan class=\"hljs-built_in\">set\u003C/span>()\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> value \u003Cspan class=\"hljs-keyword\">in\u003C/span> series.dropna():\n                str_value = \u003Cspan class=\"hljs-built_in\">str\u003C/span>(value).lower()\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(p \u003Cspan class=\"hljs-keyword\">in\u003C/span> str_value \u003Cspan class=\"hljs-keyword\">for\u003C/span> p \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;urgent&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;p0&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;priority 0&#x27;\u003C/span>]):\n                    priority_levels.add(\u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(p \u003Cspan class=\"hljs-keyword\">in\u003C/span> str_value \u003Cspan class=\"hljs-keyword\">for\u003C/span> p \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;p1&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;priority 1&#x27;\u003C/span>]):\n                    priority_levels.add(\u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(p \u003Cspan class=\"hljs-keyword\">in\u003C/span> str_value \u003Cspan class=\"hljs-keyword\">for\u003C/span> p \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;p2&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;priority 2&#x27;\u003C/span>]):\n                    priority_levels.add(\u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(p \u003Cspan class=\"hljs-keyword\">in\u003C/span> str_value \u003Cspan class=\"hljs-keyword\">for\u003C/span> p \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;p3&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;priority 3&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;p4&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;priority 4&#x27;\u003C/span>]):\n                    priority_levels.add(\u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: confidence,\n                \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Priority keywords detected (ratio: \u003Cspan class=\"hljs-subst\">{priority_ratio:\u003Cspan class=\"hljs-number\">.2\u003C/span>%}\u003C/span>)&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;estimated_groups&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(priority_levels),\n                \u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>: {\n                    \u003Cspan class=\"hljs-string\">&#x27;priority_order&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;critical&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>],\n                    \u003Cspan class=\"hljs-string\">&#x27;detected_levels&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">list\u003C/span>(priority_levels)\n                }\n            }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">False\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;No priority patterns detected&#x27;\u003C/span>}\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze_status_grouping\u003C/span>(\u003Cspan class=\"hljs-params\">self, series, base_analysis\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Analyze suitability for status-based grouping&quot;&quot;&quot;\u003C/span>\n        status_matches = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        total_values = \u003Cspan class=\"hljs-built_in\">len\u003C/span>(series.dropna())\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> pattern \u003Cspan class=\"hljs-keyword\">in\u003C/span> self.patterns[\u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>]:\n            matches = series.astype(\u003Cspan class=\"hljs-built_in\">str\u003C/span>).\u003Cspan class=\"hljs-built_in\">str\u003C/span>.contains(pattern, regex=\u003Cspan class=\"hljs-literal\">True\u003C/span>, na=\u003Cspan class=\"hljs-literal\">False\u003C/span>).\u003Cspan class=\"hljs-built_in\">sum\u003C/span>()\n            status_matches = \u003Cspan class=\"hljs-built_in\">max\u003C/span>(status_matches, matches)\n        \n        status_ratio = status_matches / total_values \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\">0\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> status_ratio &gt;= \u003Cspan class=\"hljs-number\">0.6\u003C/span>:\n            confidence = status_ratio * \u003Cspan class=\"hljs-number\">0.8\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Identify status types\u003C/span>\n            status_types = \u003Cspan class=\"hljs-built_in\">set\u003C/span>()\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> value \u003Cspan class=\"hljs-keyword\">in\u003C/span> series.dropna():\n                str_value = \u003Cspan class=\"hljs-built_in\">str\u003C/span>(value).lower()\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(s \u003Cspan class=\"hljs-keyword\">in\u003C/span> str_value \u003Cspan class=\"hljs-keyword\">for\u003C/span> s \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;complete&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;done&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;finished&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;success&#x27;\u003C/span>]):\n                    status_types.add(\u003Cspan class=\"hljs-string\">&#x27;complete&#x27;\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(s \u003Cspan class=\"hljs-keyword\">in\u003C/span> str_value \u003Cspan class=\"hljs-keyword\">for\u003C/span> s \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;progress&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;working&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;developing&#x27;\u003C/span>]):\n                    status_types.add(\u003Cspan class=\"hljs-string\">&#x27;in_progress&#x27;\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(s \u003Cspan class=\"hljs-keyword\">in\u003C/span> str_value \u003Cspan class=\"hljs-keyword\">for\u003C/span> s \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;pending&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;waiting&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;hold&#x27;\u003C/span>]):\n                    status_types.add(\u003Cspan class=\"hljs-string\">&#x27;pending&#x27;\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(s \u003Cspan class=\"hljs-keyword\">in\u003C/span> str_value \u003Cspan class=\"hljs-keyword\">for\u003C/span> s \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;active&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;running&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;live&#x27;\u003C/span>]):\n                    status_types.add(\u003Cspan class=\"hljs-string\">&#x27;active&#x27;\u003C/span>)\n                \u003Cspan class=\"hljs-keyword\">elif\u003C/span> \u003Cspan class=\"hljs-built_in\">any\u003C/span>(s \u003Cspan class=\"hljs-keyword\">in\u003C/span> str_value \u003Cspan class=\"hljs-keyword\">for\u003C/span> s \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;inactive&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;disabled&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;stopped&#x27;\u003C/span>]):\n                    status_types.add(\u003Cspan class=\"hljs-string\">&#x27;inactive&#x27;\u003C/span>)\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                \u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">True\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: confidence,\n                \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">f&#x27;Status keywords detected (ratio: \u003Cspan class=\"hljs-subst\">{status_ratio:\u003Cspan class=\"hljs-number\">.2\u003C/span>%}\u003C/span>)&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;estimated_groups&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">len\u003C/span>(status_types),\n                \u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>: {\n                    \u003Cspan class=\"hljs-string\">&#x27;status_order&#x27;\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;active&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;in_progress&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;pending&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;complete&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;inactive&#x27;\u003C/span>],\n                    \u003Cspan class=\"hljs-string\">&#x27;detected_statuses&#x27;\u003C/span>: \u003Cspan class=\"hljs-built_in\">list\u003C/span>(status_types)\n                }\n            }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\u003Cspan class=\"hljs-string\">&#x27;suitable&#x27;\u003C/span>: \u003Cspan class=\"hljs-literal\">False\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;reasoning&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;No status patterns detected&#x27;\u003C/span>}\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_grouping_recommendations\u003C/span>(\u003Cspan class=\"hljs-params\">self, column_analysis\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Generate comprehensive grouping recommendations&quot;&quot;&quot;\u003C/span>\n        recommendations = []\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> column_name, analysis \u003Cspan class=\"hljs-keyword\">in\u003C/span> column_analysis.items():\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> analysis[\u003Cspan class=\"hljs-string\">&#x27;recommended_strategies&#x27;\u003C/span>]:\n                \u003Cspan class=\"hljs-comment\"># Sort strategies by confidence\u003C/span>\n                sorted_strategies = \u003Cspan class=\"hljs-built_in\">sorted\u003C/span>(\n                    analysis[\u003Cspan class=\"hljs-string\">&#x27;recommended_strategies&#x27;\u003C/span>],\n                    key=\u003Cspan class=\"hljs-keyword\">lambda\u003C/span> x: x[\u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>],\n                    reverse=\u003Cspan class=\"hljs-literal\">True\u003C/span>\n                )\n                \n                best_strategy = sorted_strategies[\u003Cspan class=\"hljs-number\">0\u003C/span>]\n                \n                recommendation = {\n                    \u003Cspan class=\"hljs-string\">&#x27;column&#x27;\u003C/span>: column_name,\n                    \u003Cspan class=\"hljs-string\">&#x27;primary_strategy&#x27;\u003C/span>: best_strategy,\n                    \u003Cspan class=\"hljs-string\">&#x27;alternative_strategies&#x27;\u003C/span>: sorted_strategies[\u003Cspan class=\"hljs-number\">1\u003C/span>:\u003Cspan class=\"hljs-number\">3\u003C/span>] \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">len\u003C/span>(sorted_strategies) &gt; \u003Cspan class=\"hljs-number\">1\u003C/span> \u003Cspan class=\"hljs-keyword\">else\u003C/span> [],\n                    \u003Cspan class=\"hljs-string\">&#x27;data_characteristics&#x27;\u003C/span>: {\n                        \u003Cspan class=\"hljs-string\">&#x27;unique_ratio&#x27;\u003C/span>: analysis[\u003Cspan class=\"hljs-string\">&#x27;unique_ratio&#x27;\u003C/span>],\n                        \u003Cspan class=\"hljs-string\">&#x27;unique_count&#x27;\u003C/span>: analysis[\u003Cspan class=\"hljs-string\">&#x27;unique_values&#x27;\u003C/span>],\n                        \u003Cspan class=\"hljs-string\">&#x27;data_type&#x27;\u003C/span>: analysis[\u003Cspan class=\"hljs-string\">&#x27;data_type&#x27;\u003C/span>]\n                    }\n                }\n                \n                recommendations.append(recommendation)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> recommendations\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">determine_optimal_strategies\u003C/span>(\u003Cspan class=\"hljs-params\">self, df, column_analysis\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Determine optimal grouping strategies for the entire dataset&quot;&quot;&quot;\u003C/span>\n        strategies = []\n        \n        \u003Cspan class=\"hljs-comment\"># Primary grouping strategy\u003C/span>\n        best_column = \u003Cspan class=\"hljs-literal\">None\u003C/span>\n        best_confidence = \u003Cspan class=\"hljs-number\">0\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> column_name, analysis \u003Cspan class=\"hljs-keyword\">in\u003C/span> column_analysis.items():\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> analysis[\u003Cspan class=\"hljs-string\">&#x27;recommended_strategies&#x27;\u003C/span>]:\n                top_strategy = analysis[\u003Cspan class=\"hljs-string\">&#x27;recommended_strategies&#x27;\u003C/span>][\u003Cspan class=\"hljs-number\">0\u003C/span>]\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> top_strategy[\u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>] &gt; best_confidence:\n                    best_confidence = top_strategy[\u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>]\n                    best_column = column_name\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> best_column:\n            primary_analysis = column_analysis[best_column]\n            primary_strategy = primary_analysis[\u003Cspan class=\"hljs-string\">&#x27;recommended_strategies&#x27;\u003C/span>][\u003Cspan class=\"hljs-number\">0\u003C/span>]\n            \n            strategies.append({\n                \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;primary&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-string\">&#x27;column&#x27;\u003C/span>: best_column,\n                \u003Cspan class=\"hljs-string\">&#x27;strategy&#x27;\u003C/span>: primary_strategy[\u003Cspan class=\"hljs-string\">&#x27;strategy&#x27;\u003C/span>],\n                \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: primary_strategy[\u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>],\n                \u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>: primary_strategy[\u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>]\n            })\n            \n            \u003Cspan class=\"hljs-comment\"># Look for secondary grouping opportunities\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> column_name, analysis \u003Cspan class=\"hljs-keyword\">in\u003C/span> column_analysis.items():\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> column_name != best_column \u003Cspan class=\"hljs-keyword\">and\u003C/span> analysis[\u003Cspan class=\"hljs-string\">&#x27;recommended_strategies&#x27;\u003C/span>]:\n                    secondary_strategy = analysis[\u003Cspan class=\"hljs-string\">&#x27;recommended_strategies&#x27;\u003C/span>][\u003Cspan class=\"hljs-number\">0\u003C/span>]\n                    \n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> secondary_strategy[\u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>] &gt;= \u003Cspan class=\"hljs-number\">0.6\u003C/span>:\n                        strategies.append({\n                            \u003Cspan class=\"hljs-string\">&#x27;type&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;secondary&#x27;\u003C/span>,\n                            \u003Cspan class=\"hljs-string\">&#x27;column&#x27;\u003C/span>: column_name,\n                            \u003Cspan class=\"hljs-string\">&#x27;strategy&#x27;\u003C/span>: secondary_strategy[\u003Cspan class=\"hljs-string\">&#x27;strategy&#x27;\u003C/span>],\n                            \u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>: secondary_strategy[\u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>],\n                            \u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>: secondary_strategy[\u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>]\n                        })\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> strategies\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_grouping_code\u003C/span>(\u003Cspan class=\"hljs-params\">self, df, recommendations\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Generate JavaScript code for implementing recommended grouping&quot;&quot;&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-keyword\">not\u003C/span> recommendations:\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&quot;// No suitable grouping strategies found&quot;\u003C/span>\n        \n        primary_rec = recommendations[\u003Cspan class=\"hljs-number\">0\u003C/span>]\n        strategy = primary_rec[\u003Cspan class=\"hljs-string\">&#x27;primary_strategy&#x27;\u003C/span>]\n        \n        code_template = \u003Cspan class=\"hljs-string\">f&#x27;&#x27;&#x27;\n// Auto-generated table grouping configuration\nconst groupingConfig = {{\n    strategy: &#x27;\u003Cspan class=\"hljs-subst\">{strategy[\u003Cspan class=\"hljs-string\">&#x27;strategy&#x27;\u003C/span>]}\u003C/span>&#x27;,\n    column: &#x27;\u003Cspan class=\"hljs-subst\">{primary_rec[\u003Cspan class=\"hljs-string\">&#x27;column&#x27;\u003C/span>]}\u003C/span>&#x27;,\n    confidence: \u003Cspan class=\"hljs-subst\">{strategy[\u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>]:\u003Cspan class=\"hljs-number\">.2\u003C/span>f}\u003C/span>,\n    estimatedGroups: \u003Cspan class=\"hljs-subst\">{strategy[\u003Cspan class=\"hljs-string\">&#x27;estimated_groups&#x27;\u003C/span>]}\u003C/span>,\n    configuration: \u003Cspan class=\"hljs-subst\">{strategy[\u003Cspan class=\"hljs-string\">&#x27;configuration&#x27;\u003C/span>]}\u003C/span>\n}};\n\n// Apply grouping to your data\nconst grouper = new TableRowGrouper();\nconst groupedData = grouper.groupTableData(yourData, groupingConfig);\nconst markdownTable = grouper.generateGroupedMarkdownTable(\n    groupedData,\n    \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">list\u003C/span>(df.columns)}\u003C/span>,\n    {{\n        alignment: \u003Cspan class=\"hljs-subst\">{\n            // Auto-detected alignments\n            {self._generate_alignment_suggestions(df)}\u003C/span>\n        }\n    }}\n);\n\nconsole.log(markdownTable.table);\n&#x27;&#x27;&#x27;\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> code_template\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">_generate_alignment_suggestions\u003C/span>(\u003Cspan class=\"hljs-params\">self, df\u003C/span>):\n        \u003Cspan class=\"hljs-string\">&quot;&quot;&quot;Generate alignment suggestions based on data types&quot;&quot;&quot;\u003C/span>\n        alignments = []\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> column \u003Cspan class=\"hljs-keyword\">in\u003C/span> df.columns:\n            series = df[column]\n            \n            \u003Cspan class=\"hljs-comment\"># Try to determine if numeric\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span>:\n                numeric_series = pd.to_numeric(series, errors=\u003Cspan class=\"hljs-string\">&#x27;coerce&#x27;\u003C/span>)\n                numeric_ratio = numeric_series.notna().\u003Cspan class=\"hljs-built_in\">sum\u003C/span>() / \u003Cspan class=\"hljs-built_in\">len\u003C/span>(series)\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> numeric_ratio &gt;= \u003Cspan class=\"hljs-number\">0.8\u003C/span>:\n                    alignments.append(\u003Cspan class=\"hljs-string\">f&quot;&#x27;\u003Cspan class=\"hljs-subst\">{column}\u003C/span>&#x27;: &#x27;right&#x27;&quot;\u003C/span>)\n                    \u003Cspan class=\"hljs-keyword\">continue\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">except\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">pass\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\"># Check for status/categorical indicators\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> series.nunique() / \u003Cspan class=\"hljs-built_in\">len\u003C/span>(series) &lt;= \u003Cspan class=\"hljs-number\">0.3\u003C/span>:\n                alignments.append(\u003Cspan class=\"hljs-string\">f&quot;&#x27;\u003Cspan class=\"hljs-subst\">{column}\u003C/span>&#x27;: &#x27;center&#x27;&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>:\n                alignments.append(\u003Cspan class=\"hljs-string\">f&quot;&#x27;\u003Cspan class=\"hljs-subst\">{column}\u003C/span>&#x27;: &#x27;left&#x27;&quot;\u003C/span>)\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;,\\n            &#x27;\u003C/span>.join(alignments)\n\n\u003Cspan class=\"hljs-comment\"># Usage example\u003C/span>\nanalyzer = IntelligentGroupingAnalyzer()\n\n\u003Cspan class=\"hljs-comment\"># Sample data for analysis\u003C/span>\nsample_data = [\n    {\u003Cspan class=\"hljs-string\">&#x27;project&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Website Redesign&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;High&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;In Progress&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;team&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Frontend&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;budget&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">50000\u003C/span>},\n    {\u003Cspan class=\"hljs-string\">&#x27;project&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Mobile App&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Critical&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Planning&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;team&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Mobile&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;budget&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">125000\u003C/span>},\n    {\u003Cspan class=\"hljs-string\">&#x27;project&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Database Migration&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;High&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Complete&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;team&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Backend&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;budget&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">30000\u003C/span>},\n    {\u003Cspan class=\"hljs-string\">&#x27;project&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Security Audit&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;priority&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Medium&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;status&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Pending&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;team&#x27;\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Security&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;budget&#x27;\u003C/span>: \u003Cspan class=\"hljs-number\">20000\u003C/span>}\n]\n\n\u003Cspan class=\"hljs-comment\"># Analyze data for grouping potential\u003C/span>\nanalysis = analyzer.analyze_data_for_grouping(sample_data)\n\n\u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;Grouping Analysis Results:&quot;\u003C/span>)\n\u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Dataset: \u003Cspan class=\"hljs-subst\">{analysis[\u003Cspan class=\"hljs-string\">&#x27;dataset_info&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;row_count&#x27;\u003C/span>]}\u003C/span> rows, \u003Cspan class=\"hljs-subst\">{analysis[\u003Cspan class=\"hljs-string\">&#x27;dataset_info&#x27;\u003C/span>][\u003Cspan class=\"hljs-string\">&#x27;column_count&#x27;\u003C/span>]}\u003C/span> columns&quot;\u003C/span>)\n\u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Recommendations: \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">len\u003C/span>(analysis[\u003Cspan class=\"hljs-string\">&#x27;grouping_recommendations&#x27;\u003C/span>])}\u003C/span>&quot;\u003C/span>)\n\n\u003Cspan class=\"hljs-keyword\">for\u003C/span> rec \u003Cspan class=\"hljs-keyword\">in\u003C/span> analysis[\u003Cspan class=\"hljs-string\">&#x27;grouping_recommendations&#x27;\u003C/span>]:\n    strategy = rec[\u003Cspan class=\"hljs-string\">&#x27;primary_strategy&#x27;\u003C/span>]\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;- \u003Cspan class=\"hljs-subst\">{rec[\u003Cspan class=\"hljs-string\">&#x27;column&#x27;\u003C/span>]}\u003C/span>: \u003Cspan class=\"hljs-subst\">{strategy[\u003Cspan class=\"hljs-string\">&#x27;strategy&#x27;\u003C/span>]}\u003C/span> (confidence: \u003Cspan class=\"hljs-subst\">{strategy[\u003Cspan class=\"hljs-string\">&#x27;confidence&#x27;\u003C/span>]:\u003Cspan class=\"hljs-number\">.2\u003C/span>%}\u003C/span>)&quot;\u003C/span>)\n\n\u003Cspan class=\"hljs-comment\"># Generate implementation code\u003C/span>\ncode = analyzer.generate_grouping_code(pd.DataFrame(sample_data), analysis[\u003Cspan class=\"hljs-string\">&#x27;grouping_recommendations&#x27;\u003C/span>])\n\u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;\\nGenerated Code:&quot;\u003C/span>)\n\u003Cspan class=\"hljs-built_in\">print\u003C/span>(code)\n\u003C/code>\u003C/pre>\u003Ch2 id=\"troubleshooting-grouping-issues\">Troubleshooting Grouping Issues\u003C/h2>\n\u003Ch3 id=\"common-problems-and-solutions\">Common Problems and Solutions\u003C/h3>\n\u003Cp>\u003Cstrong>Problem\u003C/strong>: Groups not displaying with proper visual separation\u003C/p>\n\u003Cp>\u003Cstrong>Solutions\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\u003Cspan class=\"hljs-section\"># Visual Separation Techniques\u003C/span>\n\n\u003Cspan class=\"hljs-section\">## Method 1: Empty Row Separators\u003C/span>\n| Product Name     | Category | Price |\n|:-----------------|:--------:|------:|\n| \u003Cspan class=\"hljs-strong\">**ELECTRONICS**\u003C/span>  |          |       |\n| Laptop           | Computer | $1299 |\n| Mouse            | Hardware |   $29 |\n|                  |          |       |\n| \u003Cspan class=\"hljs-strong\">**ACCESSORIES**\u003C/span>  |          |       |\n| Bag              | Storage  |   $45 |\n| Cable            | Hardware |   $19 |\n\n\u003Cspan class=\"hljs-section\">## Method 2: Visual Group Headers with Styling\u003C/span>\n| Item             | Type     | Cost  |\n|:-----------------|:--------:|------:|\n| \u003Cspan class=\"hljs-strong\">**\u003Cspan class=\"hljs-emphasis\">*🔧 TOOLS*\u003C/span>**\u003C/span>   |          |       |\n| Hammer           | Hand     | $24.99|\n| Drill            | Power    | $89.99|\n| \u003Cspan class=\"hljs-strong\">**\u003Cspan class=\"hljs-emphasis\">*📦 SUPPLIES*\u003C/span>**\u003C/span>|          |       |\n| Screws           | Hardware | $12.99|\n| Paint            | Finish   | $34.99|\n\n\u003Cspan class=\"hljs-section\">## Method 3: Hierarchical Indentation\u003C/span>\n| Task Description        | Status      | Due Date   |\n|:------------------------|:-----------:|:----------:|\n| \u003Cspan class=\"hljs-strong\">**PROJECT ALPHA**\u003C/span>       |             |            |\n|   › Database Setup      | Complete    | 2025-11-01 |\n|   › API Development     | In Progress | 2025-11-15 |\n|   › Testing Phase       | Pending     | 2025-11-30 |\n| \u003Cspan class=\"hljs-strong\">**PROJECT BETA**\u003C/span>        |             |            |\n|   › UI Design           | Complete    | 2025-10-15 |\n|   › Frontend Code       | In Progress | 2025-11-20 |\n\u003C/code>\u003C/pre>\u003Cp>\u003Cstrong>Problem\u003C/strong>: Too many groups making table difficult to read\u003C/p>\n\u003Cp>\u003Cstrong>Solutions\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// Group consolidation helper\u003C/span>\n\u003Cspan class=\"hljs-keyword\">function\u003C/span> \u003Cspan class=\"hljs-title function_\">consolidateGroups\u003C/span>(\u003Cspan class=\"hljs-params\">groupedData, maxGroups = \u003Cspan class=\"hljs-number\">5\u003C/span>\u003C/span>) {\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (groupedData.\u003Cspan class=\"hljs-property\">length\u003C/span> &lt;= maxGroups) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> groupedData;\n    }\n    \n    \u003Cspan class=\"hljs-comment\">// Combine smaller groups into &quot;Other&quot; category\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> sortedGroups = groupedData.\u003Cspan class=\"hljs-title function_\">sort\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">a, b\u003C/span>) =&gt;\u003C/span> b.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> - a.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>);\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> keepGroups = sortedGroups.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, maxGroups - \u003Cspan class=\"hljs-number\">1\u003C/span>);\n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> combineGroups = sortedGroups.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(maxGroups - \u003Cspan class=\"hljs-number\">1\u003C/span>);\n    \n    \u003Cspan class=\"hljs-keyword\">const\u003C/span> otherGroup = {\n        \u003Cspan class=\"hljs-attr\">name\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Other&#x27;\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">displayName\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;OTHER ITEMS&#x27;\u003C/span>,\n        \u003Cspan class=\"hljs-attr\">rows\u003C/span>: combineGroups.\u003Cspan class=\"hljs-title function_\">flatMap\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">group\u003C/span> =&gt;\u003C/span> group.\u003Cspan class=\"hljs-property\">rows\u003C/span>)\n    };\n    \n    \u003Cspan class=\"hljs-keyword\">return\u003C/span> [...keepGroups, otherGroup];\n}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Advanced Markdown table row grouping and categorization techniques provide the structural foundation for creating organized, readable, and scalable data presentations that enhance user comprehension while maintaining professional appearance standards. By mastering grouping strategies, implementing intelligent categorization systems, and utilizing automated organization tools, content creators can transform complex datasets into well-structured information hierarchies that effectively communicate relationships and support efficient data navigation.\u003C/p>\n\u003Cp>The key to successful table grouping lies in understanding your data characteristics, selecting appropriate grouping strategies, and implementing consistent visual patterns that guide users through information hierarchies. Whether you&#39;re organizing project portfolios, managing inventory systems, or presenting analytical reports, the techniques covered in this guide provide the tools necessary to create sophisticated data presentations that maintain clarity and usability at scale.\u003C/p>\n\u003Cp>Remember to validate your grouping choices against user needs, consider the responsive behavior of grouped tables on different devices, and maintain consistency in grouping patterns throughout your documentation system. With proper implementation of advanced grouping techniques, your Markdown tables can achieve the same level of organization and functionality as professionally designed database reports while retaining the simplicity and maintainability that makes Markdown such an effective content creation tool.\u003C/p>\n",[15,19,22,25,28,31,34],{"id":16,"text":17,"level":18},"why-master-table-row-grouping-and-categorization","Why Master Table Row Grouping and Categorization?",2,{"id":20,"text":21,"level":18},"foundation-grouping-strategies","Foundation Grouping Strategies",{"id":23,"text":24,"level":18},"advanced-hierarchical-organization","Advanced Hierarchical Organization",{"id":26,"text":27,"level":18},"integration-with-documentation-systems","Integration with Documentation Systems",{"id":29,"text":30,"level":18},"advanced-automation-and-optimization","Advanced Automation and Optimization",{"id":32,"text":33,"level":18},"troubleshooting-grouping-issues","Troubleshooting Grouping Issues",{"id":35,"text":36,"level":18},"conclusion","Conclusion",[],[39,47,53],{"slug":40,"title":41,"description":42,"excerpt":43,"date":44,"category":9,"author":10,"keywords":45,"readingMinutes":46},"markdown-table-data-formatting-and-styling-complete-guide","Markdown Table Data Formatting and Styling: Complete Guide for Professional Data Presentation","Master advanced Markdown table data formatting techniques for professional presentations, including numeric formatting, data alignment, conditional styling, and responsive design patterns. Create publication-ready data tables with consistent styling.","Advanced Markdown table data formatting and styling enables professional data presentation that transforms raw information into comprehensible, visually appealing tables suitable for reports,…","2025-11-18","markdown table formatting, data presentation markdown, table styling, numeric formatting tables, markdown data visualization, professional table design, responsive markdown tables, table data alignment",16,{"slug":48,"title":41,"description":49,"excerpt":50,"date":51,"category":9,"author":10,"keywords":52,"readingMinutes":46},"markdown-table-data-formatting-styling-complete-guide","Master advanced Markdown table data formatting techniques including numerical alignment, data validation, conditional styling, and professional presentation patterns for enhanced readability and visual impact.","Advanced Markdown table data formatting and styling techniques enable professional data presentation that goes beyond basic tabular structures, incorporating sophisticated formatting patterns,…","2025-11-17","markdown table formatting, table data styling, markdown table alignment, data presentation markdown, table cell formatting, professional tables markdown, markdown table design, data visualization markdown",{"slug":54,"title":55,"description":56,"excerpt":57,"date":58,"category":9,"author":10,"keywords":59,"readingMinutes":60},"markdown-table-filtering-sorting-interactive-complete-guide","Markdown Table Filtering and Sorting: Complete Interactive Guide for Dynamic Data Presentation","Master interactive Markdown table filtering and sorting with client-side JavaScript, server-side processing, and advanced data manipulation techniques. Learn implementation patterns, performance optimization, and user experience enhancements for dynamic content systems.","Interactive Markdown table filtering and sorting transforms static documentation into dynamic, user-friendly interfaces that enable real-time data exploration and content discovery. By…","2025-10-06","markdown table filtering, markdown table sorting, interactive markdown tables, dynamic table filtering, table search functionality, sortable markdown tables, table data manipulation, interactive documentation",32,1792184944744]