{"id":150,"date":"2025-11-10T11:00:03","date_gmt":"2025-11-10T03:00:03","guid":{"rendered":"http:\/\/xn--c-pg7b.top\/?p=150"},"modified":"2026-01-28T21:39:14","modified_gmt":"2026-01-28T13:39:14","slug":"%e6%99%ba%e8%83%bd%e4%bb%a3%e7%a0%81%e8%a7%a3%e9%87%8a%e5%99%a8%ef%bc%88%e7%ac%ac3%e7%89%88%ef%bc%89","status":"publish","type":"post","link":"https:\/\/xn--c-pg7b.top\/index.php\/2025\/11\/10\/%e6%99%ba%e8%83%bd%e4%bb%a3%e7%a0%81%e8%a7%a3%e9%87%8a%e5%99%a8%ef%bc%88%e7%ac%ac3%e7%89%88%ef%bc%89\/","title":{"rendered":"\u667a\u80fd\u4ee3\u7801\u89e3\u91ca\u5668\uff08\u7b2c3\u7248\uff09"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u4e00\u4e2a\u57fa\u4e8eWeb\u7684\u667a\u80fd\u4ee3\u7801\u89e3\u91ca\u5668\u5de5\u5177\uff0c\u8c03\u7528\u672c\u5730AI\u5927\u6a21\u578b\uff0c\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u4ee3\u7801\u8bed\u8a00\uff0c\u9ad8\u4eae\u663e\u793a\u4ee3\u7801\uff0c\u5e76\u63d0\u4f9b\u4ee3\u7801\u7ed3\u6784\u5206\u6790\u548c\u89e3\u91ca\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## \u529f\u80fd\u7279\u70b9<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; \ud83d\udcdd <strong>**\u4ee3\u7801\u8bed\u8a00\u81ea\u52a8\u8bc6\u522b**<\/strong>\uff1a\u667a\u80fd\u68c0\u6d4b\u8f93\u5165\u4ee3\u7801\u7684\u7f16\u7a0b\u8bed\u8a00<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; \ud83c\udfa8 <strong>**\u8bed\u6cd5\u9ad8\u4eae\u663e\u793a**<\/strong>\uff1a\u7f8e\u5316\u4ee3\u7801\u5c55\u793a\uff0c\u63d0\u9ad8\u53ef\u8bfb\u6027<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; \ud83c\udfd7\ufe0f <strong>**\u4ee3\u7801\u7ed3\u6784\u5206\u6790**<\/strong>\uff1a\u63d0\u53d6\u5e76\u5c55\u793a\u4ee3\u7801\u4e2d\u7684\u7c7b\u3001\u51fd\u6570\u3001\u5bfc\u5165\u8bed\u53e5\u7b49\u7ed3\u6784<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; \ud83d\udcd6 <strong>**\u4ee3\u7801\u89e3\u91ca**<\/strong>\uff1a\u63d0\u4f9b\u4ee3\u7801\u7684\u8be6\u7ec6\u89e3\u91ca\uff08\u53ef\u9009\u62e9\u4f7f\u7528OpenAI API\u83b7\u53d6\u66f4\u667a\u80fd\u7684\u89e3\u91ca\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; \ud83d\udcbb <strong>**\u7528\u6237\u53cb\u597d\u754c\u9762**<\/strong>\uff1a\u7b80\u6d01\u76f4\u89c2\u7684Web\u754c\u9762\uff0c\u64cd\u4f5c\u7b80\u5355<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## \u5b89\u88c5\u8bf4\u660e<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 1. \u5b89\u88c5\u4f9d\u8d56<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cd f:\\TraeCN\\\u667a\u80fd\u4ee3\u7801\u89e3\u91ca\u5668<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pip install -r requirements.txt<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 2. \u914d\u7f6eOpenAI API\uff08\u53ef\u9009\uff09<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u60a8\u5e0c\u671b\u4f7f\u7528OpenAI API\u83b7\u53d6\u66f4\u667a\u80fd\u7684\u4ee3\u7801\u89e3\u91ca\uff0c\u8bf7\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u64cd\u4f5c\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. \u590d\u5236`.env.example`\u6587\u4ef6\u5e76\u91cd\u547d\u540d\u4e3a`.env`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. \u5728`.env`\u6587\u4ef6\u4e2d\u586b\u5165\u60a8\u7684OpenAI API\u5bc6\u94a5<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OPENAI_API_KEY=your_api_key_here<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&gt; \u6ce8\u610f\uff1a\u5373\u4f7f\u6ca1\u6709OpenAI API\u5bc6\u94a5\uff0c\u5de5\u5177\u4ecd\u7136\u53ef\u4ee5\u4f7f\u7528\u57fa\u672c\u7684\u4ee3\u7801\u5206\u6790\u529f\u80fd\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## \u4f7f\u7528\u65b9\u6cd5<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 1. \u542f\u52a8\u5e94\u7528<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python app.py<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 2. \u8bbf\u95ee\u754c\u9762<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6253\u5f00\u6d4f\u89c8\u5668\uff0c\u8bbf\u95ee\u4ee5\u4e0b\u5730\u5740\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">http:\/\/localhost:5000<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 3. \u4f7f\u7528\u5de5\u5177<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. \u5728\u4ee3\u7801\u8f93\u5165\u6846\u4e2d\u7c98\u8d34\u6216\u8f93\u5165\u60a8\u60f3\u8981\u5206\u6790\u7684\u4ee3\u7801<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. \u70b9\u51fb&#8221;\u5206\u6790\u4ee3\u7801&#8221;\u6309\u94ae<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. \u5728\u7ed3\u679c\u533a\u57df\u67e5\u770b\u5206\u6790\u7ed3\u679c\uff0c\u5305\u62ec\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8211; \u9ad8\u4eae\u663e\u793a\u7684\u4ee3\u7801<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8211; \u4ee3\u7801\u7ed3\u6784\u5206\u6790\uff08\u7c7b\u3001\u51fd\u6570\u3001\u5bfc\u5165\u7b49\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8211; \u4ee3\u7801\u89e3\u91ca<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## \u652f\u6301\u7684\u8bed\u8a00<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5de5\u5177\u652f\u6301\u591a\u79cd\u7f16\u7a0b\u8bed\u8a00\u7684\u8bc6\u522b\u548c\u5206\u6790\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; Python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; Java<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; JavaScript<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; TypeScript<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; HTML<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; CSS<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; C\/C++<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; C#<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; Go<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; Rust<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; PHP<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; Ruby<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; Swift<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; Kotlin<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; SQL<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; Shell\/Bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; JSON\/XML\/YAML<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## \u6280\u672f\u6808<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**\u540e\u7aef**<\/strong>\uff1aPython, Flask<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**\u524d\u7aef**<\/strong>\uff1aHTML, CSS, JavaScript<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**\u4ee3\u7801\u9ad8\u4eae**<\/strong>\uff1aPygments<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**\u8bed\u8a00\u68c0\u6d4b**<\/strong>\uff1alangdetect<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**\u667a\u80fd\u89e3\u91ca**<\/strong>\uff1a\u53ef\u9009\u7684OpenAI API\u96c6\u6210<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## \u6ce8\u610f\u4e8b\u9879<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. \u4e3a\u4e86\u83b7\u5f97\u6700\u4f73\u4f53\u9a8c\uff0c\u8bf7\u4f7f\u7528\u73b0\u4ee3\u6d4f\u89c8\u5668\uff08Chrome, Firefox, Edge\u7b49\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. \u5927\u578b\u4ee3\u7801\u6587\u4ef6\u53ef\u80fd\u9700\u8981\u8f83\u957f\u65f6\u95f4\u5904\u7406<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. \u4f7f\u7528OpenAI API\u9700\u8981\u6709\u6548\u7684API\u5bc6\u94a5\uff0c\u5e76\u4e14\u53ef\u80fd\u4ea7\u751f\u8d39\u7528<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">4. \u5de5\u5177\u4ec5\u5728\u672c\u5730\u8fd0\u884c\uff0c\u4e0d\u4f1a\u4e0a\u4f20\u60a8\u7684\u4ee3\u7801\u5230\u4efb\u4f55\u670d\u52a1\u5668<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## \u6269\u5c55\u4e0e\u8d21\u732e<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u60a8\u60f3\u6269\u5c55\u6216\u6539\u8fdb\u6b64\u5de5\u5177\uff0c\u6b22\u8fce\u63d0\u4ea4Issue\u6216Pull Request\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## \u8bb8\u53ef\u8bc1<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b64\u9879\u76ee\u91c7\u7528MIT\u8bb8\u53ef\u8bc1\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/xn--c-pg7b.top\/wp-content\/uploads\/2025\/11\/a3d4592f9f18b52f0d97313ea550979d-1024x562.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"562\" data-original=\"https:\/\/xn--c-pg7b.top\/wp-content\/uploads\/2025\/11\/a3d4592f9f18b52f0d97313ea550979d-1024x562.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-165\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-5fe20e26-f8d3-4735-82fb-4bef6efaeec9\" href=\"https:\/\/xn--c-pg7b.top\/wp-content\/uploads\/2025\/11\/\u667a\u80fd\u4ee3\u7801\u89e3\u91ca\u5668.zip\">\u667a\u80fd\u4ee3\u7801\u89e3\u91ca\u5668<\/a><a href=\"https:\/\/xn--c-pg7b.top\/wp-content\/uploads\/2025\/11\/\u667a\u80fd\u4ee3\u7801\u89e3\u91ca\u5668.zip\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-5fe20e26-f8d3-4735-82fb-4bef6efaeec9\">\u4e0b\u8f7d<\/a><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"zh-CN\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;title&gt;\u667a\u80fd\u4ee3\u7801\u89e3\u91ca\u5668&lt;\/title&gt;\n    &lt;style&gt;\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            margin: 0;\n            padding: 20px;\n            min-height: 100vh;\n        }\n        .container {\n            max-width: 1200px;\n            margin: 0 auto;\n            background: white;\n            border-radius: 12px;\n            box-shadow: 0 8px 32px rgba(0,0,0,0.1);\n            overflow: hidden;\n        }\n        .header {\n            background: linear-gradient(135deg, #1890ff 0%, #722ed1 100%);\n            color: white;\n            padding: 30px;\n            text-align: center;\n        }\n        .header h1 {\n            margin: 0;\n            font-size: 2.5em;\n            font-weight: 600;\n        }\n        .content {\n            padding: 30px;\n        }\n        .input-section {\n            margin-bottom: 30px;\n        }\n        .input-section h2,\n        .result-section h2 {\n            color: #333;\n            margin-bottom: 15px;\n            font-weight: 600;\n        }\n        #code-input {\n            width: 100%;\n            min-height: 300px;\n            padding: 15px;\n            border: 1px solid #d9d9d9;\n            border-radius: 6px;\n            font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n            font-size: 14px;\n            resize: vertical;\n        }\n        #analyze-btn {\n            background: #1890ff;\n            color: white;\n            border: none;\n            padding: 12px 24px;\n            margin-top: 10px;\n            border-radius: 6px;\n            cursor: pointer;\n            font-size: 16px;\n            font-weight: 500;\n            transition: background 0.3s;\n        }\n        #analyze-btn:hover {\n            background: #40a9ff;\n        }\n        .result-section {\n            display: none;\n        }\n        .result-tabs {\n            display: flex;\n            border-bottom: 1px solid #d9d9d9;\n            margin-bottom: 20px;\n        }\n        .tab {\n            padding: 10px 20px;\n            cursor: pointer;\n            border-bottom: 2px solid transparent;\n            transition: all 0.3s;\n        }\n        .tab.active {\n            color: #1890ff;\n            border-bottom-color: #1890ff;\n            font-weight: 500;\n        }\n        .tab-content {\n            display: none;\n        }\n        .tab-content.active {\n            display: block;\n        }\n        .highlight-box {\n            background: #f5f5f5;\n            border: 1px solid #d9d9d9;\n            border-radius: 6px;\n            padding: 0;\n            overflow-x: auto;\n            position: relative;\n        }\n        .code-with-line-numbers {\n            display: flex;\n            font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n            font-size: 14px;\n        }\n        .line-numbers {\n            background: #e8e8e8;\n            color: #666;\n            padding: 15px 10px;\n            text-align: right;\n            user-select: none;\n            border-right: 1px solid #d9d9d9;\n            min-width: 40px;\n        }\n        .line-number {\n            display: block;\n            line-height: 1.5;\n            font-size: 14px;\n        }\n        .code-content {\n            padding: 15px;\n            white-space: pre-wrap;\n            word-wrap: break-word;\n            flex: 1;\n        }\n        \/* \u57fa\u4e8e\u529f\u80fd\u7684\u4ee3\u7801\u9ad8\u4eae *\/\n        .keyword { color: #708; font-weight: bold; }\n        .string { color: #a31515; }\n        .comment { color: #008000; font-style: italic; }\n        .number { color: #098658; }\n        .operator { color: #0000ff; font-weight: bold; }\n        .function { color: #795e26; }\n        .variable { color: #000000; }\n        .class { color: #267f99; font-weight: bold; }\n        .import { color: #001080; }\n        .control-structure { color: #af00db; font-weight: bold; }\n        .language-info {\n            background: #e6f7ff;\n            color: #1890ff;\n            padding: 8px 12px;\n            border-radius: 4px;\n            font-size: 14px;\n            display: inline-block;\n            margin-bottom: 10px;\n        }\n        .structure-info {\n            background: #f6ffed;\n            border: 1px solid #b7eb8f;\n            border-radius: 6px;\n            padding: 15px;\n            margin-bottom: 20px;\n        }\n        .structure-item {\n            margin-bottom: 10px;\n        }\n        .structure-item h4 {\n            margin: 0 0 8px 0;\n            color: #389e0d;\n            font-weight: 600;\n        }\n        .structure-list {\n            list-style: none;\n            padding: 0;\n            margin: 0;\n        }\n        .structure-list li {\n            padding: 4px 0;\n            font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n            font-size: 13px;\n            color: #595959;\n        }\n        .explanation-box {\n            background: #fff7e6;\n            border: 1px solid #ffd591;\n            border-radius: 6px;\n            padding: 25px;\n            line-height: 1.7;\n            color: #d46b08;\n            overflow-x: auto;\n            text-align: left;\n        }\n        .explanation-box h1, \n        .explanation-box h2, \n        .explanation-box h3, \n        .explanation-box h4, \n        .explanation-box h5, \n        .explanation-box h6 {\n            margin-top: 30px;\n            margin-bottom: 15px;\n            color: #d46b08;\n            font-weight: 600;\n            clear: both;\n        }\n        .explanation-box h1 { font-size: 2em; }\n        .explanation-box h2 { \n            font-size: 1.7em; \n            border-bottom: 2px solid #ffd591; \n            padding-bottom: 8px;\n            margin-top: 40px;\n        }\n        .explanation-box h3 { \n            font-size: 1.4em;\n            margin-top: 30px;\n        }\n        .explanation-box h4 { \n            font-size: 1.2em;\n            margin-top: 25px;\n        }\n        .explanation-box h5 { font-size: 1.1em; }\n        .explanation-box h6 { font-size: 1em; }\n        \n        .explanation-box ul,\n        .explanation-box ol {\n            margin: 15px 0;\n            padding-left: 30px;\n        }\n        .explanation-box ul ul,\n        .explanation-box ul ol,\n        .explanation-box ol ul,\n        .explanation-box ol ol {\n            margin: 8px 0;\n            padding-left: 25px;\n        }\n        .explanation-box li {\n            margin: 10px 0;\n            line-height: 1.6;\n            text-align: left;\n        }\n        .explanation-box pre {\n            background: #f0f0f0;\n            border-radius: 6px;\n            padding: 15px;\n            overflow-x: auto;\n            margin: 20px 0;\n            font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n            font-size: 13px;\n            border: 1px solid #e0e0e0;\n        }\n        .explanation-box code {\n            background: #f5f5f5;\n            padding: 3px 6px;\n            border-radius: 3px;\n            font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n            font-size: 0.9em;\n            border: 1px solid #e8e8e8;\n        }\n        .explanation-box pre code {\n            background: none;\n            padding: 0;\n            border: none;\n        }\n        .explanation-box strong {\n            font-weight: 700;\n            color: #a84700;\n        }\n        .explanation-box p {\n              margin: 15px 0;\n              text-align: left;\n              line-height: 1.7;\n          }\n        .loading-overlay {\n            display: none;\n            position: fixed;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n            background: rgba(0, 0, 0, 0.5);\n            z-index: 1000;\n            justify-content: center;\n            align-items: center;\n        }\n        .loading-spinner {\n            background: white;\n            padding: 30px;\n            border-radius: 8px;\n            text-align: center;\n        }\n        .loading-spinner span {\n            display: block;\n            margin-top: 10px;\n            color: #333;\n        }\n        @media (max-width: 768px) {\n            .container {\n                border-radius: 8px;\n            }\n            .header h1 {\n                font-size: 2em;\n            }\n            .content {\n                padding: 20px;\n            }\n            .result-tabs {\n                flex-wrap: wrap;\n            }\n            .tab {\n                padding: 8px 16px;\n                font-size: 14px;\n            }\n        }\n        \/* \u6eda\u52a8\u6761\u6837\u5f0f *\/\n        ::-webkit-scrollbar {\n            width: 8px;\n            height: 8px;\n        }\n        ::-webkit-scrollbar-track {\n            background: #f1f1f1;\n            border-radius: 4px;\n        }\n        ::-webkit-scrollbar-thumb {\n            background: #c1c1c1;\n            border-radius: 4px;\n        }\n        ::-webkit-scrollbar-thumb:hover {\n            background: #a8a8a8;\n        }\n        \/* \u52a0\u8f7d\u52a8\u753b *\/\n        @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n        }\n    &lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;div class=\"container\"&gt;\n        &lt;div class=\"header\"&gt;\n            &lt;h1&gt;\u667a\u80fd\u4ee3\u7801\u89e3\u91ca\u5668&lt;\/h1&gt;\n        &lt;\/div&gt;\n        &lt;div class=\"content\"&gt;\n            &lt;div class=\"input-section\"&gt;\n                &lt;h2&gt;\u8f93\u5165\u4ee3\u7801&lt;\/h2&gt;\n                &lt;textarea id=\"code-input\" placeholder=\"\u8bf7\u5728\u6b64\u7c98\u8d34\u6216\u8f93\u5165\u4ee3\u7801...\"&gt;&lt;\/textarea&gt;\n                &lt;button id=\"analyze-btn\"&gt;\u5206\u6790\u4ee3\u7801&lt;\/button&gt;\n            &lt;\/div&gt;\n            \n            &lt;div class=\"result-section\" id=\"result-section\"&gt;\n                &lt;div class=\"language-info\" id=\"language-info\"&gt;\u68c0\u6d4b\u5230\u7684\u8bed\u8a00: &lt;span id=\"detected-language\"&gt;Python&lt;\/span&gt;&lt;\/div&gt;\n                \n                &lt;div class=\"result-tabs\"&gt;\n                    &lt;div class=\"tab active\" data-tab=\"highlight\"&gt;\u9ad8\u4eae\u4ee3\u7801&lt;\/div&gt;\n                    &lt;div class=\"tab\" data-tab=\"structure\"&gt;\u4ee3\u7801\u7ed3\u6784&lt;\/div&gt;\n                    &lt;div class=\"tab\" data-tab=\"explanation\"&gt;\u4ee3\u7801\u89e3\u91ca&lt;\/div&gt;\n                &lt;\/div&gt;\n                \n                &lt;div class=\"tab-content active\" id=\"highlight-content\"&gt;\n                    &lt;style id=\"highlight-css\"&gt;&lt;\/style&gt;\n                    &lt;div class=\"highlight-box\"&gt;\n                        &lt;div id=\"code-with-line-numbers\" class=\"code-with-line-numbers\"&gt;\n                            &lt;div class=\"line-numbers\" id=\"line-numbers\"&gt;&lt;\/div&gt;\n                            &lt;div class=\"code-content\" id=\"code-content\"&gt;&lt;\/div&gt;\n                        &lt;\/div&gt;\n                    &lt;\/div&gt;\n                &lt;\/div&gt;\n                \n                &lt;div class=\"tab-content\" id=\"structure-content\"&gt;\n                    &lt;div class=\"structure-info\"&gt;\n                        &lt;div class=\"structure-item\"&gt;\n                            &lt;h4&gt;\u7c7b\u5b9a\u4e49&lt;\/h4&gt;\n                            &lt;ul class=\"structure-list\" id=\"classes-list\"&gt;&lt;\/ul&gt;\n                        &lt;\/div&gt;\n                        &lt;div class=\"structure-item\"&gt;\n                            &lt;h4&gt;\u51fd\u6570\u5b9a\u4e49&lt;\/h4&gt;\n                            &lt;ul class=\"structure-list\" id=\"functions-list\"&gt;&lt;\/ul&gt;\n                        &lt;\/div&gt;\n                        &lt;div class=\"structure-item\"&gt;\n                            &lt;h4&gt;\u5bfc\u5165\u8bed\u53e5&lt;\/h4&gt;\n                            &lt;ul class=\"structure-list\" id=\"imports-list\"&gt;&lt;\/ul&gt;\n                        &lt;\/div&gt;\n                        &lt;div class=\"structure-item\"&gt;\n                            &lt;h4&gt;\u53d8\u91cf\u58f0\u660e&lt;\/h4&gt;\n                            &lt;ul class=\"structure-list\" id=\"variables-list\"&gt;&lt;\/ul&gt;\n                        &lt;\/div&gt;\n                        &lt;div class=\"structure-item\"&gt;\n                            &lt;h4&gt;\u63a7\u5236\u7ed3\u6784&lt;\/h4&gt;\n                            &lt;ul class=\"structure-list\" id=\"control-structures-list\"&gt;&lt;\/ul&gt;\n                        &lt;\/div&gt;\n                    &lt;\/div&gt;\n                &lt;\/div&gt;\n                \n                &lt;div class=\"tab-content\" id=\"explanation-content\"&gt;\n                    &lt;div class=\"explanation-box\" id=\"code-explanation\"&gt;&lt;\/div&gt;\n                &lt;\/div&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n    \n    &lt;div class=\"loading-overlay\" id=\"loading-overlay\"&gt;\n        &lt;div class=\"loading-spinner\"&gt;\n            &lt;div style=\"width: 40px; height: 40px; margin: 0 auto; border: 4px solid #f3f3f3; border-top: 4px solid #1890ff; border-radius: 50%; animation: spin 1s linear infinite;\"&gt;&lt;\/div&gt;\n            &lt;span&gt;\u6b63\u5728\u5206\u6790\u4ee3\u7801\uff0c\u8bf7\u7a0d\u5019...&lt;\/span&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n    \n    &lt;script&gt;\n        \/\/ \u52a0\u8f7d\u52a8\u753b\n        const loadingOverlay = document.getElementById('loading-overlay');\n        \n        function showLoading() {\n            loadingOverlay.style.display = 'flex';\n        }\n        \n        function hideLoading() {\n            loadingOverlay.style.display = 'none';\n        }\n        \n        \/\/ \u9009\u9879\u5361\u5207\u6362\n        const tabs = document.querySelectorAll('.tab');\n        tabs.forEach(tab =&gt; {\n            tab.addEventListener('click', () =&gt; {\n                \/\/ \u79fb\u9664\u6240\u6709\u6d3b\u52a8\u72b6\u6001\n                document.querySelectorAll('.tab').forEach(t =&gt; t.classList.remove('active'));\n                document.querySelectorAll('.tab-content').forEach(c =&gt; c.classList.remove('active'));\n                \n                \/\/ \u6dfb\u52a0\u5f53\u524d\u6d3b\u52a8\u72b6\u6001\n                tab.classList.add('active');\n                const tabId = tab.getAttribute('data-tab');\n                document.getElementById(`${tabId}-content`).classList.add('active');\n            });\n        });\n        \n        \/\/ \u5206\u6790\u6309\u94ae\u70b9\u51fb\u4e8b\u4ef6\n        document.getElementById('analyze-btn').addEventListener('click', () =&gt; {\n            const code = document.getElementById('code-input').value;\n            \n            if (!code.trim()) {\n                alert('\u8bf7\u8f93\u5165\u4ee3\u7801\u540e\u518d\u5206\u6790');\n                return;\n            }\n            \n            showLoading();\n            \n            \/\/ \u53d1\u9001AJAX\u8bf7\u6c42\n            fetch('\/analyze', {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json'\n                },\n                body: JSON.stringify({ code })\n            })\n            .then(response =&gt; response.json())\n            .then(data =&gt; {\n                hideLoading();\n                \n                if (data.error) {\n                    alert('\u9519\u8bef: ' + data.error);\n                    return;\n                }\n                \n                try {\n                    \/\/ \u5b89\u5168\u5730\u8bbf\u95ee\u6570\u636e\uff0c\u63d0\u4f9b\u9ed8\u8ba4\u503c\n                    const safeData = {\n                        language: data.language || '\u672a\u77e5',\n                        css: data.css || '',\n                        code: data.code || '',\n                        highlighted_code: data.highlighted_code || '',\n                        analysis: data.analysis || {},\n                        explanation: data.explanation || '\u65e0\u6cd5\u751f\u6210\u4ee3\u7801\u89e3\u91ca\u3002'\n                    };\n                    \n                    \/\/ \u66f4\u65b0\u8bed\u8a00\u4fe1\u606f\n                    document.getElementById('detected-language').textContent = safeData.language;\n                    \n                    \/\/ \u66f4\u65b0\u9ad8\u4eae\u4ee3\u7801\u548c\u884c\u53f7\n                    document.getElementById('highlight-css').textContent = safeData.css;\n                    \n                    \/\/ \u751f\u6210\u884c\u53f7\n                    const codeForLineNumbers = safeData.code || safeData.highlighted_code;\n                    const codeLines = codeForLineNumbers ? codeForLineNumbers.split('\\n') : &#91;''];\n                    const lineNumbersContainer = document.getElementById('line-numbers');\n                    lineNumbersContainer.innerHTML = '';\n                    \n                    codeLines.forEach((line, index) =&gt; {\n                        const lineNumber = document.createElement('span');\n                        lineNumber.className = 'line-number';\n                        lineNumber.textContent = index + 1;\n                        lineNumbersContainer.appendChild(lineNumber);\n                    });\n                    \n                    \/\/ \u5b89\u5168\u5730\u66f4\u65b0\u4ee3\u7801\u5185\u5bb9\n                    try {\n                        if (safeData.code) {\n                            document.getElementById('code-content').innerHTML = highlightCodeByFunctionality(safeData.code, safeData.language);\n                        } else {\n                            document.getElementById('code-content').innerHTML = safeData.highlighted_code;\n                        }\n                    } catch (e) {\n                        console.error('\u4ee3\u7801\u9ad8\u4eae\u5931\u8d25:', e);\n                        document.getElementById('code-content').textContent = safeData.code || safeData.highlighted_code || '\u65e0\u6cd5\u663e\u793a\u4ee3\u7801';\n                    }\n                    \n                    \/\/ \u5b89\u5168\u5730\u66f4\u65b0\u4ee3\u7801\u7ed3\u6784\n                    const analysis = safeData.analysis;\n                    updateStructureList('classes-list', Array.isArray(analysis.classes) ? analysis.classes : &#91;], 'name');\n                    updateStructureList('functions-list', Array.isArray(analysis.functions) ? analysis.functions : &#91;], 'name');\n                    updateStructureList('imports-list', Array.isArray(analysis.imports) ? analysis.imports : &#91;], 'content');\n                    updateStructureList('variables-list', Array.isArray(analysis.variables) ? analysis.variables : &#91;], 'name');\n                    updateStructureList('control-structures-list', Array.isArray(analysis.control_structures) ? analysis.control_structures : &#91;], 'content');\n                    \n                    \/\/ \u5b89\u5168\u5730\u66f4\u65b0\u4ee3\u7801\u89e3\u91ca\n                    try {\n                        const formattedExplanation = formatMarkdown(safeData.explanation);\n                        document.getElementById('code-explanation').innerHTML = formattedExplanation;\n                    } catch (e) {\n                        console.error('Markdown\u683c\u5f0f\u5316\u5931\u8d25:', e);\n                        document.getElementById('code-explanation').textContent = safeData.explanation;\n                    }\n                    \n                    \/\/ \u663e\u793a\u7ed3\u679c\u90e8\u5206\n                    document.getElementById('result-section').style.display = 'block';\n                } catch (e) {\n                    console.error('\u5904\u7406\u5206\u6790\u7ed3\u679c\u65f6\u51fa\u9519:', e);\n                    alert('\u663e\u793a\u7ed3\u679c\u65f6\u51fa\u73b0\u9519\u8bef\u3002\u8bf7\u68c0\u67e5\u63a7\u5236\u53f0\u83b7\u53d6\u66f4\u591a\u4fe1\u606f\u3002');\n                }\n            })\n            .catch(error =&gt; {\n                hideLoading();\n                alert('\u5206\u6790\u8fc7\u7a0b\u4e2d\u51fa\u9519: ' + error.message);\n            });\n        });\n        \n        \/\/ \u66f4\u65b0\u7ed3\u6784\u5217\u8868\n        function updateStructureList(elementId, items, displayKey) {\n            const listElement = document.getElementById(elementId);\n            listElement.innerHTML = '';\n            \n            if (items.length === 0) {\n                listElement.innerHTML = '&lt;li&gt;\u672a\u68c0\u6d4b\u5230&lt;\/li&gt;';\n                return;\n            }\n            \n            \/\/ \u663e\u793a\u6240\u6709\u9879\u76ee\uff0c\u4e0d\u505a\u4efb\u4f55\u622a\u65ad\n            items.forEach(item =&gt; {\n                const li = document.createElement('li');\n                li.textContent = `\u7b2c${item.line}\u884c: ${item&#91;displayKey]}`;\n                listElement.appendChild(li);\n            });\n        }\n        \n        \/\/ \u57fa\u4e8e\u529f\u80fd\u7684\u4ee3\u7801\u9ad8\u4eae\u51fd\u6570 - \u5b89\u5168\u7248\u672c\n        function highlightCodeByFunctionality(code, language) {\n            try {\n                \/\/ \u5b89\u5168\u68c0\u67e5\u8f93\u5165\n                if (!code || typeof code !== 'string') {\n                    return code || '';\n                }\n                if (!language || typeof language !== 'string') {\n                    language = 'plaintext';\n                }\n                \n                \/\/ \u4e0d\u540c\u8bed\u8a00\u7684\u5173\u952e\u5b57\u548c\u89c4\u5219\n                const keywords = {\n                    'python': &#91;'def', 'class', 'if', 'elif', 'else', 'for', 'while', 'in', 'return', 'import', 'from', 'as', 'try', 'except', 'finally', 'with', 'lambda', 'pass', 'continue', 'break', 'and', 'or', 'not', 'is', 'None', 'True', 'False'],\n                    'javascript': &#91;'function', 'var', 'let', 'const', 'if', 'else', 'for', 'while', 'do', 'return', 'import', 'export', 'try', 'catch', 'finally', 'class', 'extends', 'super', 'new', 'this', 'typeof', 'instanceof', 'in', 'continue', 'break', 'switch', 'case', 'default', 'throw', 'async', 'await', 'true', 'false', 'null', 'undefined'],\n                    'java': &#91;'public', 'private', 'protected', 'class', 'interface', 'extends', 'implements', 'static', 'final', 'if', 'else', 'for', 'while', 'do', 'return', 'import', 'package', 'try', 'catch', 'finally', 'throw', 'throws', 'new', 'this', 'super', 'void', 'int', 'long', 'double', 'float', 'boolean', 'char', 'byte', 'short', 'true', 'false', 'null', 'continue', 'break', 'switch', 'case', 'default'],\n                    'cpp': &#91;'class', 'struct', 'public', 'private', 'protected', 'if', 'else', 'for', 'while', 'do', 'return', '#include', 'using', 'namespace', 'try', 'catch', 'throw', 'new', 'delete', 'this', 'const', 'static', 'virtual', 'override', 'final', 'int', 'long', 'double', 'float', 'bool', 'char', 'void', 'unsigned', 'signed', 'short', 'continue', 'break', 'switch', 'case', 'default', 'true', 'false', 'nullptr']\n                };\n                \n                let highlightedCode = code;\n                \n                \/\/ \u8f6c\u4e49HTML\u7279\u6b8a\u5b57\u7b26\n                highlightedCode = highlightedCode\n                    .replace(\/&amp;\/g, '&amp;amp;')\n                    .replace(\/&lt;\/g, '&amp;lt;')\n                    .replace(\/&gt;\/g, '&amp;gt;')\n                    .replace(\/\"\/g, '&amp;quot;')\n                    .replace(\/'\/g, '&amp;#39;');\n                \n                \/\/ \u5b89\u5168\u5730\u9ad8\u4eae\u6ce8\u91ca\n                try {\n                    \/\/ Python\n                    if (language === 'python') {\n                        highlightedCode = highlightedCode.replace(\/#.*$\/gm, '&lt;span class=\"comment\"&gt;$&amp;&lt;\/span&gt;');\n                    }\n                    \/\/ C-like languages\n                    else {\n                        \/\/ \u5355\u884c\u6ce8\u91ca\n                        highlightedCode = highlightedCode.replace(\/\\\/\\\/.*$\/gm, '&lt;span class=\"comment\"&gt;$&amp;&lt;\/span&gt;');\n                        \/\/ \u591a\u884c\u6ce8\u91ca (\u5b89\u5168\u5b9e\u73b0)\n                        highlightedCode = highlightedCode.replace(\/\\\/\\*&#91;\\s\\S]*?\\*\\\/\/g, '&lt;span class=\"comment\"&gt;$&amp;&lt;\/span&gt;');\n                    }\n                } catch (e) {\n                    console.error('\u6ce8\u91ca\u9ad8\u4eae\u5931\u8d25:', e);\n                }\n                \n                \/\/ \u5b89\u5168\u5730\u9ad8\u4eae\u5b57\u7b26\u4e32\n                try {\n                    highlightedCode = highlightedCode.replace(\/\"(&#91;^\"\\\\]|\\\\.)*\"\/g, '&lt;span class=\"string\"&gt;$&amp;&lt;\/span&gt;');\n                    highlightedCode = highlightedCode.replace(\/'(&#91;^'\\\\]|\\\\.)*'\/g, '&lt;span class=\"string\"&gt;$&amp;&lt;\/span&gt;');\n                } catch (e) {\n                    console.error('\u5b57\u7b26\u4e32\u9ad8\u4eae\u5931\u8d25:', e);\n                }\n                \n                \/\/ \u5b89\u5168\u5730\u9ad8\u4eae\u6570\u5b57\n                try {\n                    highlightedCode = highlightedCode.replace(\/\\b\\d+(\\.\\d+)?\\b\/g, '&lt;span class=\"number\"&gt;$&amp;&lt;\/span&gt;');\n                } catch (e) {\n                    console.error('\u6570\u5b57\u9ad8\u4eae\u5931\u8d25:', e);\n                }\n                \n                \/\/ \u5b89\u5168\u5730\u9ad8\u4eae\u8fd0\u7b97\u7b26 - \u4fee\u590d\u6b63\u5219\u8868\u8fbe\u5f0f\n                try {\n                    const operators = &#91;'+', '-', '*', '\/', '%', '=', '==', '!=', '&lt;', '&gt;', '&lt;=', '&gt;=', '&amp;&amp;', '||', '!', '++', '--', '+=', '-=', '*=', '\/=', '%=', '&lt;&lt;', '&gt;&gt;', '&gt;&gt;&gt;', '|', '&amp;', '^', '~'];\n                    \/\/ \u6309\u7167\u8fd0\u7b97\u7b26\u957f\u5ea6\u6392\u5e8f\uff0c\u957f\u7684\u5148\u5904\u7406\n                    operators.sort((a, b) =&gt; b.length - a.length);\n                    \n                    operators.forEach(op =&gt; {\n                        try {\n                            \/\/ \u6b63\u786e\u8f6c\u4e49\u6240\u6709\u7279\u6b8a\u5b57\u7b26\n                            const escapedOp = op.replace(\/&#91;.*+?^${}()|&#91;\\]\\\\]\/g, '\\\\$&amp;');\n                            \/\/ \u907f\u514d\u4f7f\u7528\u5355\u8bcd\u8fb9\u754c\uff0c\u56e0\u4e3a\u8fd0\u7b97\u7b26\u4e0d\u662f\u5355\u8bcd\u5b57\u7b26\n                            const regex = new RegExp(`(${escapedOp})`, 'g');\n                            highlightedCode = highlightedCode.replace(regex, '&lt;span class=\"operator\"&gt;$1&lt;\/span&gt;');\n                        } catch (e) {\n                            console.error(`\u8fd0\u7b97\u7b26\u9ad8\u4eae\u5931\u8d25 (${op}):`, e);\n                        }\n                    });\n                } catch (e) {\n                    console.error('\u8fd0\u7b97\u7b26\u9ad8\u4eae\u603b\u4f53\u5931\u8d25:', e);\n                }\n                \n                \/\/ \u5b89\u5168\u5730\u9ad8\u4eae\u5173\u952e\u5b57\n                try {\n                    const langKeywords = keywords&#91;language.toLowerCase()] || &#91;];\n                    langKeywords.forEach(keyword =&gt; {\n                        try {\n                            const escapedKeyword = keyword.replace(\/&#91;.*+?^${}()|&#91;\\]\\\\]\/g, '\\\\$&amp;');\n                            highlightedCode = highlightedCode.replace(new RegExp(`\\\\b${escapedKeyword}\\\\b`, 'g'), '&lt;span class=\"keyword\"&gt;$&amp;&lt;\/span&gt;');\n                        } catch (e) {\n                            console.error(`\u5173\u952e\u5b57\u9ad8\u4eae\u5931\u8d25 (${keyword}):`, e);\n                        }\n                    });\n                } catch (e) {\n                    console.error('\u5173\u952e\u5b57\u9ad8\u4eae\u603b\u4f53\u5931\u8d25:', e);\n                }\n                \n                \/\/ \u5b89\u5168\u5730\u9ad8\u4eae\u51fd\u6570 - \u4fee\u590d\u6355\u83b7\u7ec4\u95ee\u9898\n                try {\n                    if (language === 'python') {\n                        highlightedCode = highlightedCode.replace(\/def\\s+(\\w+)\\s*\\(\/g, 'def &lt;span class=\"function\"&gt;$1&lt;\/span&gt; (');\n                    } else if (language === 'javascript' || language === 'java' || language === 'cpp') {\n                        highlightedCode = highlightedCode.replace(\/function\\s+(\\w+)\\s*\\(\/g, 'function &lt;span class=\"function\"&gt;$1&lt;\/span&gt; (');\n                        \/\/ \u4fee\u590d\u6355\u83b7\u7ec4\u7f16\u53f7\u9519\u8bef\n                        highlightedCode = highlightedCode.replace(\/\\b(\\w+)\\s+(\\w+)\\s*\\(\/g, '$1 &lt;span class=\"function\"&gt;$2&lt;\/span&gt; (');\n                    }\n                } catch (e) {\n                    console.error('\u51fd\u6570\u9ad8\u4eae\u5931\u8d25:', e);\n                }\n                \n                \/\/ \u5b89\u5168\u5730\u9ad8\u4eae\u7c7b\n                try {\n                    highlightedCode = highlightedCode.replace(\/class\\s+(\\w+)\/g, 'class &lt;span class=\"class\"&gt;$1&lt;\/span&gt;');\n                } catch (e) {\n                    console.error('\u7c7b\u9ad8\u4eae\u5931\u8d25:', e);\n                }\n                \n                \/\/ \u5b89\u5168\u5730\u9ad8\u4eae\u5bfc\u5165\n                try {\n                    if (language === 'python') {\n                        highlightedCode = highlightedCode.replace(\/import\\s+(\\w+)\/g, '&lt;span class=\"import\"&gt;import&lt;\/span&gt; &lt;span class=\"variable\"&gt;$1&lt;\/span&gt;');\n                        highlightedCode = highlightedCode.replace(\/from\\s+(\\w+)\\s+import\/g, '&lt;span class=\"import\"&gt;from&lt;\/span&gt; &lt;span class=\"variable\"&gt;$1&lt;\/span&gt; &lt;span class=\"import\"&gt;import&lt;\/span&gt;');\n                    }\n                } catch (e) {\n                    console.error('\u5bfc\u5165\u9ad8\u4eae\u5931\u8d25:', e);\n                }\n                \n                return highlightedCode;\n            } catch (e) {\n                console.error('\u4ee3\u7801\u9ad8\u4eae\u603b\u4f53\u5931\u8d25:', e);\n                \/\/ \u53d1\u751f\u9519\u8bef\u65f6\uff0c\u81f3\u5c11\u8f6c\u4e49HTML\u7279\u6b8a\u5b57\u7b26\u5e76\u8fd4\u56de\n                if (code &amp;&amp; typeof code === 'string') {\n                    return code\n                        .replace(\/&amp;\/g, '&amp;amp;')\n                        .replace(\/&lt;\/g, '&amp;lt;')\n                        .replace(\/&gt;\/g, '&amp;gt;')\n                        .replace(\/\"\/g, '&amp;quot;')\n                        .replace(\/'\/g, '&amp;#39;');\n                }\n                return code || '';\n            }\n        }\n        \n        \/\/ \u6539\u8fdb\u7684Markdown\u683c\u5f0f\u5316\n        function formatMarkdown(text) {\n            try {\n                \/\/ \u5b89\u5168\u68c0\u67e5\u8f93\u5165\n                if (!text || typeof text !== 'string') {\n                    return text || '';\n                }\n                \n                \/\/ \u66ff\u6362\u5236\u8868\u7b26\u4e3a\u7a7a\u683c\uff0c\u9632\u6b62\u683c\u5f0f\u6df7\u4e71\n                text = text.replace(\/\\t\/g, '    ');\n                \n                \/\/ \u9996\u5148\u5904\u7406\u4ee3\u7801\u5757 (```)\n                let codeBlocks = &#91;];\n                let codeBlockCounter = 0;\n                text = text.replace(\/```&#91;\\s\\S]*?```\/g, (match) =&gt; {\n                    const codeBlockId = `CODE_BLOCK_PLACEHOLDER_${codeBlockCounter++}`;\n                    codeBlocks.push(match);\n                    return codeBlockId;\n                });\n                \n                \/\/ \u7279\u6b8a\u5904\u7406\u884c\u53f7\u6807\u8bb0\uff0c\u786e\u4fdd\u5b83\u4eec\u5728\u4ee3\u7801\u5757\u5916\u6b63\u786e\u663e\u793a\n                text = text.replace(\/\\*\\*\\&#91;\u884c\u53f7 (\\d+)\\]\\*\\*:\\s*`(&#91;^`]+)`\/g, '&lt;p&gt;&lt;strong&gt;&#91;\u884c\u53f7 $1]&lt;\/strong&gt;: &lt;code&gt;$2&lt;\/code&gt;&lt;\/p&gt;');\n                \n                \/\/ \u5904\u7406\u884c\u5185\u4ee3\u7801\u548c\u7c97\u4f53\n                text = text.replace(\/`(.*?)`\/g, '&lt;code&gt;$1&lt;\/code&gt;');\n                text = text.replace(\/\\*\\*(.*?)\\*\\*\/g, '&lt;strong&gt;$1&lt;\/strong&gt;');\n                \n                \/\/ \u5904\u7406\u6807\u9898\n                text = text.replace(\/^# (.*?)$\/gm, '&lt;h1&gt;$1&lt;\/h1&gt;');\n                text = text.replace(\/^## (.*?)$\/gm, '&lt;h2&gt;$1&lt;\/h2&gt;');\n                text = text.replace(\/^### (.*?)$\/gm, '&lt;h3&gt;$1&lt;\/h3&gt;');\n                text = text.replace(\/^#### (.*?)$\/gm, '&lt;h4&gt;$1&lt;\/h4&gt;');\n                text = text.replace(\/^##### (.*?)$\/gm, '&lt;h5&gt;$1&lt;\/h5&gt;');\n                text = text.replace(\/^###### (.*?)$\/gm, '&lt;h6&gt;$1&lt;\/h6&gt;');\n                \n                \/\/ \u62c6\u5206\u6bb5\u843d\n                const paragraphs = text.split(\/\\n\\n+\/);\n                let result = '';\n                \n                \/\/ \u5904\u7406\u6bcf\u4e2a\u6bb5\u843d\n                paragraphs.forEach(paragraph =&gt; {\n                    paragraph = paragraph.trim();\n                    if (!paragraph) return;\n                    \n                    \/\/ \u68c0\u67e5\u662f\u5426\u5df2\u7ecf\u88ab\u5904\u7406\u4e3a\u6807\u9898\u6216\u884c\u53f7\u6807\u8bb0\n                    if (paragraph.match(\/^&lt;h&#91;1-6]&gt;\/) &amp;&amp; paragraph.match(\/&lt;\\\/h&#91;1-6]&gt;$\/)) {\n                        result += paragraph + '\\n';\n                        return;\n                    }\n                    if (paragraph.match(\/^&lt;p&gt;&lt;strong&gt;\\&#91;\u884c\u53f7\/)) {\n                        result += paragraph;\n                        return;\n                    }\n                    \n                    \/\/ \u68c0\u67e5\u662f\u5426\u662f\u5217\u8868\n                    if (paragraph.match(\/^(\\s*&#91;-*]|\\s*\\d+\\.) \/m)) {\n                        \/\/ \u5904\u7406\u5217\u8868\n                        let inList = false;\n                        let currentListLevel = 0;\n                        let listContent = '';\n                        \n                        const listLines = paragraph.split('\\n');\n                        listLines.forEach(line =&gt; {\n                            line = line.trim();\n                            if (!line) return;\n                            \n                            \/\/ \u8ba1\u7b97\u5217\u8868\u7f29\u8fdb\u7ea7\u522b\n                            let level = 0;\n                            const indentMatch = line.match(\/^(\\s*)\/)&#91;0];\n                            level = Math.floor(indentMatch.length \/ 4);\n                            \n                            \/\/ \u63d0\u53d6\u5217\u8868\u6807\u8bb0\u548c\u5185\u5bb9\n                            const listMatch = line.match(\/^(\\s*&#91;-*]|\\s*\\d+\\.)\\s+(.*)$\/);\n                            if (listMatch) {\n                                const content = listMatch&#91;2];\n                                \n                                \/\/ \u5904\u7406\u5217\u8868\u5d4c\u5957\n                                while (currentListLevel &gt; level) {\n                                    listContent += '&lt;\/li&gt;&lt;\/ul&gt;';\n                                    currentListLevel--;\n                                }\n                                while (currentListLevel &lt; level) {\n                                    listContent += '&lt;ul&gt;';\n                                    currentListLevel++;\n                                }\n                                if (!inList) {\n                                    listContent += '&lt;ul&gt;';\n                                    currentListLevel++;\n                                    inList = true;\n                                } else if (currentListLevel === level) {\n                                    \/\/ \u540c\u4e00\u7ea7\u522b\u7684\u4e0b\u4e00\u4e2a\u5217\u8868\u9879\n                                    listContent += '&lt;\/li&gt;';\n                                }\n                                listContent += `&lt;li&gt;${content}`;\n                            }\n                        });\n                        \n                        \/\/ \u5173\u95ed\u6240\u6709\u672a\u95ed\u5408\u7684\u5217\u8868\u6807\u7b7e\n                        while (currentListLevel &gt; 0) {\n                            listContent += '&lt;\/li&gt;&lt;\/ul&gt;';\n                            currentListLevel--;\n                        }\n                        \n                        result += listContent;\n                    } else {\n                        \/\/ \u666e\u901a\u6bb5\u843d\n                        result += `&lt;p&gt;${paragraph}&lt;\/p&gt;`;\n                    }\n                });\n                \n                \/\/ \u6062\u590d\u4ee3\u7801\u5757\n                codeBlocks.forEach((codeBlock, index) =&gt; {\n                    const codeContent = codeBlock.slice(codeBlock.indexOf('\\n') + 1, codeBlock.lastIndexOf('\\n'));\n                    result = result.replace(`CODE_BLOCK_PLACEHOLDER_${index}`, `&lt;pre&gt;&lt;code&gt;${codeContent}&lt;\/code&gt;&lt;\/pre&gt;`);\n                });\n                \n                return result;\n            } catch (e) {\n                console.error('Markdown\u683c\u5f0f\u5316\u9519\u8bef:', e);\n                \/\/ \u8fd4\u56de\u539f\u59cb\u6587\u672c\u800c\u4e0d\u8fdb\u884c\u683c\u5f0f\u5316\n                return text || '';\n            }\n        }\n    &lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Ollama\u914d\u7f6e\n# \u672c\u5730Ollama\u53ef\u6267\u884c\u6587\u4ef6\u8def\u5f84\nOLLAMA_PATH=F:\\\\OllamaAI\\\\ollama.exe\n# \u4f7f\u7528\u7684\u6a21\u578b\u540d\u79f0\nOLLAMA_MODEL=deepseek-r1:14b<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Ollama\u914d\u7f6e\u793a\u4f8b\n# \u672c\u5730Ollama\u53ef\u6267\u884c\u6587\u4ef6\u8def\u5f84\nOLLAMA_PATH=F:\\\\OllamaAI\\\\ollama.exe\n# \u4f7f\u7528\u7684\u6a21\u578b\u540d\u79f0\nOLLAMA_MODEL=deepseek-r1:14b<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># -*- coding: utf-8 -*-\nfrom flask import Flask, render_template, request, jsonify\nimport os\nimport re\nimport subprocess\nimport json\nfrom pygments import highlight\nfrom pygments.lexers import guess_lexer, get_lexer_by_name\nfrom pygments.formatters import HtmlFormatter\nimport langdetect\nfrom dotenv import load_dotenv\nimport traceback\nimport time\nimport threading\nfrom concurrent.futures import ThreadPoolExecutor\n\n# \u52a0\u8f7d\u73af\u5883\u53d8\u91cf\nload_dotenv()\n\napp = Flask(__name__)\n\n# Ollama\u914d\u7f6e - \u4fee\u590d\u8def\u5f84\u683c\u5f0f\u95ee\u9898\nOLLAMA_PATH = os.getenv('OLLAMA_PATH', 'F:\\\\OllamaAI\\\\ollama.exe')\n# \u5907\u9009\u8def\u5f84\u5217\u8868\uff0c\u589e\u52a0\u627e\u5230Ollama\u7684\u53ef\u80fd\u6027\nOLLAMA_PATHS = &#91;\n    OLLAMA_PATH,\n    'F:\/OllamaAI\/ollama.exe',\n    'C:\/Program Files\/Ollama\/ollama.exe',\n    'C:\/Program Files (x86)\/Ollama\/ollama.exe',\n    'ollama.exe'  # \u5c1d\u8bd5\u5728PATH\u4e2d\u67e5\u627e\n]\n\n# \u786e\u4fdd\u4f7f\u7528\u5b58\u5728\u7684Ollama\u8def\u5f84\nfor path in OLLAMA_PATHS:\n    if os.path.exists(path):\n        OLLAMA_PATH = path\n        break\n\nOLLAMA_MODEL = os.getenv('OLLAMA_MODEL', 'deepseek-r1:14b')\n\n# \u8bed\u8a00\u6620\u5c04\u5b57\u5178\uff0c\u7528\u4e8e\u5c06\u6280\u672f\u8bed\u8a00\u540d\u79f0\u6620\u5c04\u4e3a\u5e38\u7528\u540d\u79f0\nLANGUAGE_MAPPING = {\n    'python': 'Python',\n    'javascript': 'JavaScript',\n    'java': 'Java',\n    'c++': 'C++',\n    'c#': 'C#',\n    'ruby': 'Ruby',\n    'go': 'Go',\n    'rust': 'Rust',\n    'php': 'PHP',\n    'swift': 'Swift',\n    'kotlin': 'Kotlin',\n    'typescript': 'TypeScript',\n    'html': 'HTML',\n    'css': 'CSS',\n    'sql': 'SQL',\n    'shell': 'Shell\u811a\u672c',\n    'bash': 'Bash\u811a\u672c',\n    'powershell': 'PowerShell',\n    'plaintext': '\u7eaf\u6587\u672c'\n}\n\n# \u4f7f\u7528\u7ebf\u7a0b\u6c60\u63d0\u9ad8\u6027\u80fd\nexecutor = ThreadPoolExecutor(max_workers=8)\n\ndef analyze_code_structure(code):\n    \"\"\"\u5b8c\u6574\u5206\u6790\u4ee3\u7801\u7ed3\u6784\uff0c\u63d0\u53d6\u6240\u6709\u5173\u952e\u4fe1\u606f\"\"\"\n    result = {\n        'imports': &#91;],\n        'classes': &#91;],\n        'functions': &#91;],\n        'variables': &#91;],\n        'control_structures': &#91;]\n    }\n    \n    lines = code.split('\\n')\n    \n    # \u5206\u6790\u6240\u6709\u4ee3\u7801\u884c\uff0c\u4e0d\u9650\u5236\u884c\u6570\n    for i, line in enumerate(lines, 1):\n        line_stripped = line.strip()\n        \n        # \u8df3\u8fc7\u7a7a\u884c\u548c\u6ce8\u91ca\uff0c\u63d0\u9ad8\u5904\u7406\u901f\u5ea6\n        if not line_stripped or line_stripped.startswith('#') or line_stripped.startswith('\/\/'):\n            continue\n        \n        # \u4f7f\u7528\u5b57\u7b26\u4e32\u65b9\u6cd5\u63d0\u9ad8\u6027\u80fd\n        if line_stripped.startswith('import ') or line_stripped.startswith('from '):\n            # \u63d0\u53d6\u5bfc\u5165\u4fe1\u606f\n            result&#91;'imports'].append({\n                'line': i,\n                'content': line_stripped\n            })\n        elif line_stripped.startswith('class '):\n            # \u63d0\u53d6\u7c7b\u540d\n            class_name = line_stripped.split('class ')&#91;1].split('(')&#91;0].split(':')&#91;0].strip()\n            result&#91;'classes'].append({\n                'line': i,\n                'name': class_name,\n                'content': line_stripped\n            })\n        elif line_stripped.startswith('def ') or line_stripped.startswith('function '):\n            # \u63d0\u53d6\u51fd\u6570\u540d\n            func_parts = line_stripped.split('(')&#91;0]\n            if func_parts.startswith('def '):\n                func_name = func_parts.split('def ')&#91;1].strip()\n            else:\n                func_name = func_parts.split('function ')&#91;1].strip()\n            result&#91;'functions'].append({\n                'line': i,\n                'name': func_name,\n                'content': line_stripped\n            })\n        elif line_stripped.startswith('if ') or line_stripped.startswith('for ') or \\\n             line_stripped.startswith('while ') or line_stripped.startswith('switch ') or \\\n             line_stripped.startswith('try') or line_stripped.startswith('catch') or \\\n             line_stripped.startswith('finally') or line_stripped.startswith('else'):\n            # \u8bc6\u522b\u63a7\u5236\u7ed3\u6784\n            result&#91;'control_structures'].append({\n                'line': i,\n                'content': line_stripped\n            })\n        elif '=' in line_stripped and not any(op in line_stripped for op in &#91;'==', '!=', '&lt;=', '&gt;=']):\n            # \u8bc6\u522b\u53d8\u91cf\u8d4b\u503c\n            var_name = line_stripped.split('=')&#91;0].strip().split(' ')&#91;-1]\n            result&#91;'variables'].append({\n                'line': i,\n                'name': var_name,\n                'content': line_stripped\n            })\n    \n    return result\n\n# \u8be6\u7ec6\u4ee3\u7801\u89e3\u91ca\u51fd\u6570 - \u672c\u5730\u7248\u672c\ndef detailed_local_explain(code, language, analysis):\n    \"\"\"\u751f\u6210\u8be6\u7ec6\u7684\u4ee3\u7801\u89e3\u91ca\uff0c\u4fdd\u7559\u6240\u6709\u4ee3\u7801\u7ed3\u6784\u4fe1\u606f\u548c\u5b8c\u6574\u5206\u6790\"\"\"\n    explanation = f\"# {language}\u4ee3\u7801\u8be6\u7ec6\u5206\u6790\\n\\n\"\n    \n    # \u5b8c\u6574\u7684\u6574\u4f53\u7ed3\u6784\u5206\u6790\n    explanation += \"## \u4ee3\u7801\u7ed3\u6784\u6982\u89c8\\n\\n\"\n    explanation += f\"- \u4ee3\u7801\u884c\u6570: {len(code.split('\\n'))}\\n\"\n    \n    if analysis.get('classes'):\n        explanation += f\"- \u7c7b\u6570\u91cf: {len(analysis&#91;'classes'])}\\n\"\n        for cls in analysis&#91;'classes']:\n            explanation += f\"  - {cls&#91;'name']} (\u7b2c{cls&#91;'line']}\u884c)\\n\"\n    \n    if analysis.get('functions'):\n        explanation += f\"- \u51fd\u6570\u6570\u91cf: {len(analysis&#91;'functions'])}\\n\"\n        for func in analysis&#91;'functions']:\n            explanation += f\"  - {func&#91;'name']} (\u7b2c{func&#91;'line']}\u884c)\\n\"\n    \n    if analysis.get('imports'):\n        explanation += f\"- \u5bfc\u5165\u8bed\u53e5: {len(analysis&#91;'imports'])}\u4e2a\\n\"\n    if analysis.get('variables'):\n        explanation += f\"- \u53d8\u91cf\u58f0\u660e: {len(analysis&#91;'variables'])}\u4e2a\\n\"\n    if analysis.get('control_structures'):\n        explanation += f\"- \u63a7\u5236\u7ed3\u6784: {len(analysis&#91;'control_structures'])}\u4e2a\\n\"\n    \n    # \u8be6\u7ec6\u5206\u6790\u7c7b\u5b9a\u4e49\n    if analysis.get('classes'):\n        explanation += \"\\n## \u7c7b\u5b9a\u4e49\u8be6\u60c5\\n\\n\"\n        for cls in analysis&#91;'classes']:\n            explanation += f\"- **\u7b2c{cls&#91;'line']}\u884c**: `{cls&#91;'content']}`\\n\"\n            explanation += f\"  - \u7c7b\u540d: {cls&#91;'name']}\\n\"\n            \n            # \u63d0\u53d6\u7ee7\u627f\u4fe1\u606f\n            if '(' in cls&#91;'content'] and ')' in cls&#91;'content']:\n                parent_class = cls&#91;'content'].split('(')&#91;1].split(')')&#91;0].strip()\n                explanation += f\"  - \u7ee7\u627f\u5173\u7cfb: \u7ee7\u627f\u81ea {parent_class}\\n\"\n            else:\n                explanation += \"  - \u7ee7\u627f\u5173\u7cfb: \u65e0\u663e\u5f0f\u7ee7\u627f\\n\"\n            \n            explanation += \"  - \u4f5c\u7528: \u5b9a\u4e49\u4e86\u4e00\u4e2a\u65b0\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5c01\u88c5\u76f8\u5173\u6570\u636e\u548c\u65b9\u6cd5\\n\"\n    \n    # \u8be6\u7ec6\u5206\u6790\u51fd\u6570\u5b9a\u4e49\n    if analysis.get('functions'):\n        explanation += \"\\n## \u51fd\u6570\u5b9a\u4e49\u8be6\u60c5\\n\\n\"\n        for func in analysis&#91;'functions']:\n            explanation += f\"- **\u7b2c{func&#91;'line']}\u884c**: `{func&#91;'content']}`\\n\"\n            explanation += f\"  - \u51fd\u6570\u540d: {func&#91;'name']}\\n\"\n            \n            # \u63d0\u53d6\u53c2\u6570\u4fe1\u606f\n            if '(' in func&#91;'content'] and ')' in func&#91;'content']:\n                params_str = func&#91;'content'].split('(')&#91;1].split(')')&#91;0].strip()\n                if params_str:\n                    params = &#91;p.strip() for p in params_str.split(',')]\n                    explanation += f\"  - \u53c2\u6570: {', '.join(params)}\\n\"\n                else:\n                    explanation += \"  - \u53c2\u6570: \u65e0\u53c2\u6570\\n\"\n            \n            explanation += \"  - \u4f5c\u7528: \u5c01\u88c5\u53ef\u91cd\u7528\u7684\u4ee3\u7801\u903b\u8f91\uff0c\u6267\u884c\u7279\u5b9a\u4efb\u52a1\\n\"\n    \n    # \u5b8c\u6574\u7684\u4ee3\u7801\u9010\u884c\u5206\u6790\n    explanation += \"\\n## \u4ee3\u7801\u9010\u884c\u5206\u6790\\n\\n\"\n    explanation += \"\u4ee5\u4e0b\u662f\u4ee3\u7801\u7684\u8be6\u7ec6\u9010\u884c\u5206\u6790\uff1a\\n\\n\"\n    \n    lines = code.split('\\n')\n    # \u5206\u6790\u6240\u6709\u4ee3\u7801\u884c\uff0c\u4e0d\u9650\u5236\u884c\u6570\n    for i, line in enumerate(lines, 1):\n        original_line = line\n        line = line.strip()\n        \n        if not line:\n            explanation += f\"**&#91;\u884c{i}]**: `&#91;\u7a7a\u884c]`\\n\"\n        elif line.startswith('#') or line.startswith('\/\/'):\n            explanation += f\"**&#91;\u884c{i}]**: `{original_line}`\\n\"\n            explanation += \"  - \u6ce8\u91ca\u884c\uff1a\u63d0\u4f9b\u4ee3\u7801\u89e3\u91ca\uff0c\u4e0d\u6267\u884c\\n\"\n        else:\n            explanation += f\"**&#91;\u884c{i}]**: `{original_line}`\\n\"\n            \n            # \u8be6\u7ec6\u5206\u6790\u5404\u79cd\u4ee3\u7801\u7c7b\u578b\n            if line.startswith('import ') or line.startswith('from '):\n                explanation += \"  - \u5bfc\u5165\u8bed\u53e5\uff1a\u5f15\u5165\u5916\u90e8\u6a21\u5757\u6216\u5e93\\n\"\n                \n                # \u5206\u6790\u5bfc\u5165\u7c7b\u578b\n                if 'as' in line:\n                    parts = line.split('as')\n                    imported = parts&#91;0].strip()\n                    alias = parts&#91;1].strip()\n                    explanation += f\"  - \u5bfc\u5165\u5185\u5bb9: {imported.replace('import', '').strip()}\uff0c\u522b\u540d: {alias}\\n\"\n                elif 'from' in line:\n                    parts = line.split('import')\n                    module = parts&#91;0].replace('from', '').strip()\n                    components = parts&#91;1].strip()\n                    explanation += f\"  - \u4ece {module} \u5bfc\u5165: {components}\\n\"\n            elif line.startswith('class '):\n                explanation += \"  - \u7c7b\u5b9a\u4e49\uff1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u7c7b\\n\"\n            elif line.startswith('def ') or line.startswith('function '):\n                explanation += \"  - \u51fd\u6570\u5b9a\u4e49\uff1a\u521b\u5efa\u4e00\u4e2a\u53ef\u91cd\u7528\u7684\u4ee3\u7801\u5757\\n\"\n            elif '=' in line and not any(op in line for op in &#91;'==', '!=', '&lt;=', '&gt;=']):\n                explanation += \"  - \u53d8\u91cf\u8d4b\u503c\uff1a\u7ed9\u53d8\u91cf\u5206\u914d\u503c\\n\"\n                \n                # \u5206\u6790\u8d4b\u503c\u8fd0\u7b97\u7b26\n                if '+=' in line:\n                    explanation += \"  - '+=' \u52a0\u6cd5\u8d4b\u503c\u8fd0\u7b97\u7b26\uff1a\u5c06\u53f3\u4fa7\u503c\u52a0\u5230\u5de6\u4fa7\u53d8\u91cf\u5e76\u8d4b\u503c\\n\"\n                elif '-=' in line:\n                    explanation += \"  - '-=' \u51cf\u6cd5\u8d4b\u503c\u8fd0\u7b97\u7b26\uff1a\u4ece\u5de6\u4fa7\u53d8\u91cf\u51cf\u53bb\u53f3\u4fa7\u503c\u5e76\u8d4b\u503c\\n\"\n                elif '*=' in line:\n                    explanation += \"  - '*=' \u4e58\u6cd5\u8d4b\u503c\u8fd0\u7b97\u7b26\uff1a\u5c06\u5de6\u4fa7\u53d8\u91cf\u4e58\u4ee5\u53f3\u4fa7\u503c\u5e76\u8d4b\u503c\\n\"\n                elif '\/=' in line:\n                    explanation += \"  - '\/=' \u9664\u6cd5\u8d4b\u503c\u8fd0\u7b97\u7b26\uff1a\u5c06\u5de6\u4fa7\u53d8\u91cf\u9664\u4ee5\u53f3\u4fa7\u503c\u5e76\u8d4b\u503c\\n\"\n                else:\n                    var_name = line.split('=')&#91;0].strip()\n                    value_part = line.split('=')&#91;1].strip() if '=' in line else ''\n                    explanation += f\"  - \u53d8\u91cf\u540d: {var_name}\\n\"\n                    if value_part:\n                        explanation += f\"  - \u8d4b\u503c\u5185\u5bb9: {value_part}\\n\"\n            elif line.startswith('if ') or line.startswith('else ') or line.startswith('elif '):\n                explanation += \"  - \u6761\u4ef6\u8bed\u53e5\uff1a\u6839\u636e\u6761\u4ef6\u6267\u884c\u4e0d\u540c\u4ee3\u7801\\n\"\n                if 'if' in line:\n                    condition = line.split('if')&#91;1].split(':')&#91;0].strip()\n                    explanation += f\"  - \u6761\u4ef6\u8868\u8fbe\u5f0f: {condition}\\n\"\n            elif line.startswith('for ') or line.startswith('while '):\n                explanation += \"  - \u5faa\u73af\u8bed\u53e5\uff1a\u91cd\u590d\u6267\u884c\u4ee3\u7801\u5757\\n\"\n                if 'for' in line:\n                    loop_info = line.split('for')&#91;1].split(':')&#91;0].strip()\n                    explanation += f\"  - \u5faa\u73af\u6761\u4ef6: {loop_info}\\n\"\n                elif 'while' in line:\n                    loop_condition = line.split('while')&#91;1].split(':')&#91;0].strip()\n                    explanation += f\"  - \u5faa\u73af\u6761\u4ef6: {loop_condition}\\n\"\n            elif line.startswith('return '):\n                explanation += \"  - \u8fd4\u56de\u8bed\u53e5\uff1a\u4ece\u51fd\u6570\u8fd4\u56de\u503c\\n\"\n                return_value = line.split('return')&#91;1].strip() if 'return' in line else ''\n                if return_value:\n                    explanation += f\"  - \u8fd4\u56de\u503c: {return_value}\\n\"\n            elif line.startswith('print(') or line.startswith('console.log('):\n                explanation += \"  - \u8f93\u51fa\u8bed\u53e5\uff1a\u6253\u5370\u4fe1\u606f\u5230\u63a7\u5236\u53f0\\n\"\n            elif line.startswith('try:') or line.startswith('catch') or line.startswith('except') or line.startswith('finally:'):\n                explanation += \"  - \u5f02\u5e38\u5904\u7406\uff1a\u6355\u83b7\u548c\u5904\u7406\u8fd0\u884c\u65f6\u9519\u8bef\\n\"\n            elif line.startswith('break') or line.startswith('continue'):\n                explanation += \"  - \u6d41\u7a0b\u63a7\u5236\uff1a\u4e2d\u65ad\u6216\u7ee7\u7eed\u5faa\u73af\\n\"\n            elif line.startswith('def '):\n                explanation += \"  - \u51fd\u6570\u5b9a\u4e49\uff1a\u521b\u5efa\u4e00\u4e2a\u65b0\u51fd\u6570\\n\"\n                func_name = line.split('def ')&#91;1].split('(')&#91;0].strip()\n                explanation += f\"  - \u51fd\u6570\u540d: {func_name}\\n\"\n            \n            # \u5206\u6790\u8fd0\u7b97\u7b26\n            operators = {\n                '+': '\u52a0\u6cd5\u8fd0\u7b97\u7b26',\n                '-': '\u51cf\u6cd5\u8fd0\u7b97\u7b26',\n                '*': '\u4e58\u6cd5\u8fd0\u7b97\u7b26',\n                '\/': '\u9664\u6cd5\u8fd0\u7b97\u7b26',\n                '%': '\u53d6\u6a21\u8fd0\u7b97\u7b26',\n                '**': '\u5e42\u8fd0\u7b97\u7b26',\n                '\/\/': '\u6574\u9664\u8fd0\u7b97\u7b26',\n                '==': '\u7b49\u4e8e\u8fd0\u7b97\u7b26',\n                '!=': '\u4e0d\u7b49\u8fd0\u7b97\u7b26',\n                '&lt;': '\u5c0f\u4e8e\u8fd0\u7b97\u7b26',\n                '&gt;': '\u5927\u4e8e\u8fd0\u7b97\u7b26',\n                '&lt;=': '\u5c0f\u4e8e\u7b49\u4e8e\u8fd0\u7b97\u7b26',\n                '&gt;=': '\u5927\u4e8e\u7b49\u4e8e\u8fd0\u7b97\u7b26',\n                'and': '\u903b\u8f91\u4e0e\u8fd0\u7b97\u7b26',\n                'or': '\u903b\u8f91\u6216\u8fd0\u7b97\u7b26',\n                'not': '\u903b\u8f91\u975e\u8fd0\u7b97\u7b26'\n            }\n            \n            # \u68c0\u67e5\u662f\u5426\u5305\u542b\u8fd0\u7b97\u7b26\u5e76\u89e3\u91ca\n            for op, desc in operators.items():\n                # \u907f\u514d\u5c06\u590d\u5408\u8fd0\u7b97\u7b26\u4e2d\u7684\u90e8\u5206\u5355\u72ec\u8bc6\u522b\n                if op in line and not any(full_op in line for full_op in &#91;op+'=', op+op, op+' ']):\n                    explanation += f\"  - {op} {desc}\\n\"\n                    \n                    # \u63d0\u4f9b\u66f4\u8be6\u7ec6\u7684\u8fd0\u7b97\u7b26\u8bf4\u660e\n                    op_details = {\n                        '+': '\u7528\u4e8e\u6570\u503c\u76f8\u52a0\u6216\u5b57\u7b26\u4e32\u62fc\u63a5',\n                        '-': '\u7528\u4e8e\u6570\u503c\u76f8\u51cf',\n                        '*': '\u7528\u4e8e\u6570\u503c\u76f8\u4e58',\n                        '\/': '\u7528\u4e8e\u6d6e\u70b9\u9664\u6cd5\uff0c\u5f97\u5230\u6d6e\u70b9\u6570\u7ed3\u679c',\n                        '%': '\u8ba1\u7b97\u9664\u6cd5\u7684\u4f59\u6570',\n                        '**': '\u8ba1\u7b97\u5e42\u6b21\u65b9\uff0c\u5982 2**3 = 8',\n                        '\/\/': '\u6574\u9664\u8fd0\u7b97\u7b26\uff0c\u7ed3\u679c\u53d6\u6574',\n                        '==': '\u6bd4\u8f83\u4e24\u4e2a\u503c\u662f\u5426\u76f8\u7b49',\n                        '!=': '\u6bd4\u8f83\u4e24\u4e2a\u503c\u662f\u5426\u4e0d\u76f8\u7b49',\n                        '&lt;': '\u6bd4\u8f83\u5de6\u4fa7\u503c\u662f\u5426\u5c0f\u4e8e\u53f3\u4fa7\u503c',\n                        '&gt;': '\u6bd4\u8f83\u5de6\u4fa7\u503c\u662f\u5426\u5927\u4e8e\u53f3\u4fa7\u503c',\n                        '&lt;=': '\u6bd4\u8f83\u5de6\u4fa7\u503c\u662f\u5426\u5c0f\u4e8e\u6216\u7b49\u4e8e\u53f3\u4fa7\u503c',\n                        '&gt;=': '\u6bd4\u8f83\u5de6\u4fa7\u503c\u662f\u5426\u5927\u4e8e\u6216\u7b49\u4e8e\u53f3\u4fa7\u503c',\n                        'and': '\u903b\u8f91\u4e0e\uff0c\u4e24\u4e2a\u6761\u4ef6\u90fd\u4e3a\u771f\u65f6\u7ed3\u679c\u4e3a\u771f',\n                        'or': '\u903b\u8f91\u6216\uff0c\u81f3\u5c11\u4e00\u4e2a\u6761\u4ef6\u4e3a\u771f\u65f6\u7ed3\u679c\u4e3a\u771f',\n                        'not': '\u903b\u8f91\u975e\uff0c\u53d6\u53cd\u5e03\u5c14\u503c'}\n                    if op in op_details:\n                        explanation += f\"  - \u4f5c\u7528: {op_details&#91;op]}\\n\"\n                    break\n\n# \u4f7f\u7528Ollama\u8fdb\u884c\u8be6\u7ec6\u4ee3\u7801\u89e3\u91ca\ndef explain_with_ollama(code, language):\n    \"\"\"\u4f7f\u7528Ollama\u672c\u5730\u5927\u6a21\u578b\u8fdb\u884c\u4ee3\u7801\u89e3\u91ca\uff0c\u63d0\u9ad8GPU\u5229\u7528\u7387\"\"\"\n    try:\n        # \u9996\u5148\u68c0\u67e5Ollama\u662f\u5426\u53ef\u7528\n        if not os.path.exists(OLLAMA_PATH):\n            print(f\"Ollama\u4e0d\u53ef\u7528\uff0c\u8def\u5f84\u4e0d\u5b58\u5728: {OLLAMA_PATH}\")\n            return None\n            \n        # \u6784\u5efa\u8be6\u7ec6\u7684\u63d0\u793a\u8bcd\uff0c\u786e\u4fdd\u6a21\u578b\u751f\u6210\u9ad8\u8d28\u91cf\u7684\u89e3\u91ca\n        prompt = f\"\"\"\n\u8bf7\u8be6\u7ec6\u5206\u6790\u4ee5\u4e0b{language}\u4ee3\u7801\uff0c\u89e3\u91ca\u6bcf\u4e00\u884c\u7684\u529f\u80fd\u3001\u4f5c\u7528\u4ee5\u53ca\u4f7f\u7528\u7684\u8bed\u6cd5\u3002\n\u7279\u522b\u6ce8\u610f\u89e3\u91ca\u8fd0\u7b97\u7b26\u7684\u4f5c\u7528\u548c\u5404\u79cd\u8bed\u6cd5\u7ed3\u6784\u7684\u610f\u4e49\u3002\n\u8bf7\u6309\u884c\u53f7\u4f9d\u6b21\u89e3\u91ca\u6bcf\u4e00\u884c\u4ee3\u7801\uff0c\u4e0d\u8981\u8df3\u8fc7\u4efb\u4f55\u4e00\u884c\u3002\n\u4ee3\u7801\uff1a\n```\n{code}\n```\n\u8bf7\u4ee5Markdown\u683c\u5f0f\u8f93\u51fa\uff0c\u5305\u62ec\uff1a\n1. \u4ee3\u7801\u6574\u4f53\u7ed3\u6784\u6982\u89c8\n2. \u9010\u884c\u8be6\u7ec6\u89e3\u91ca\uff0c\u5305\u542b\u884c\u53f7\n3. \u8fd0\u7b97\u7b26\u548c\u7279\u6b8a\u8bed\u6cd5\u7684\u8be6\u7ec6\u8bf4\u660e\n4. \u4ee3\u7801\u7684\u4e3b\u8981\u529f\u80fd\u548c\u5de5\u4f5c\u539f\u7406\n\"\"\"\n\n        # \u4f7f\u7528\u4f18\u5316\u7684\u547d\u4ee4\u884c\u53c2\u6570\u8c03\u7528Ollama\n        cmd = &#91;OLLAMA_PATH, \"run\", OLLAMA_MODEL, \"--options\", \"num_gpu=1\", \"--options\", \"num_thread=16\"]\n        \n        # \u542f\u52a8\u5b50\u8fdb\u7a0b\u6267\u884cOllama\u547d\u4ee4\n        process = subprocess.Popen(\n            cmd,\n            stdin=subprocess.PIPE,\n            stdout=subprocess.PIPE,\n            stderr=subprocess.PIPE,\n            text=True,\n            encoding='utf-8',\n            creationflags=subprocess.CREATE_NEW_CONSOLE if os.name == 'nt' else 0\n        )\n\n        # \u5199\u5165\u63d0\u793a\u8bcd\n        stdout, stderr = process.communicate(prompt, timeout=45)  # \u589e\u52a0\u8d85\u65f6\u65f6\u95f4\n\n        # \u68c0\u67e5\u6267\u884c\u7ed3\u679c\n        if process.returncode != 0:\n            print(f\"Ollama\u6267\u884c\u9519\u8bef: {stderr}\")\n            return None\n\n        # \u5904\u7406\u8f93\u51fa\uff0c\u63d0\u53d6\u5b9e\u9645\u56de\u7b54\n        cleaned_output = stdout.strip()\n        \n        # \u5982\u679c\u8f93\u51fa\u4e3a\u7a7a\u6216\u8005\u8fc7\u4e8e\u7b80\u77ed\uff0c\u8fd4\u56deNone\n        if not cleaned_output or len(cleaned_output) &lt; 50:\n            return None\n            \n        return cleaned_output\n\n    except Exception as e:\n        print(f\"Ollama\u8c03\u7528\u51fa\u9519: {str(e)}\")\n        return None\n\n@app.route('\/')\ndef index():\n    return render_template('index.html')\n\n@app.route('\/analyze', methods=&#91;'POST'])\ndef analyze():\n    try:\n        # \u786e\u4fdd\u8bf7\u6c42\u6709JSON\u6570\u636e\n        if not request.is_json:\n            return jsonify({'error': '\u65e0\u6548\u7684\u8bf7\u6c42\u683c\u5f0f\uff0c\u8bf7\u63d0\u4f9bJSON\u6570\u636e'}), 400\n        \n        data = request.get_json()\n        code = data.get('code', '').strip()\n        \n        if not code:\n            return jsonify({\n                'error': '\u8bf7\u8f93\u5165\u4ee3\u7801'\n            })\n        \n        # \u9ad8\u6548\u7684\u8bed\u8a00\u68c0\u6d4b\n        try:\n            # \u4f18\u5316\u7684\u8bed\u8a00\u68c0\u6d4b\n            if 'import' in code and 'def' in code:\n                language = 'python'\n            elif 'function' in code and ('var' in code or 'let' in code or 'const' in code):\n                language = 'javascript'\n            elif '&lt;html&gt;' in code.lower() or '&lt;body&gt;' in code.lower():\n                language = 'html'\n            elif 'select' in code.lower() and 'from' in code.lower():\n                language = 'sql'\n            elif '#include' in code:\n                language = 'c++'\n            else:\n                try:\n                    lexer = guess_lexer(code)\n                    language = lexer.name.lower()\n                except:\n                    language = 'plaintext'\n            \n            display_language = LANGUAGE_MAPPING.get(language, language.title())\n        except:\n            language = 'plaintext'\n            display_language = '\u7eaf\u6587\u672c'\n        \n        # \u8bed\u6cd5\u9ad8\u4eae\n        try:\n            lexer = get_lexer_by_name(language)\n            formatter = HtmlFormatter(nowrap=True, cssclass='highlight', noclasses=True)\n            highlighted_code = highlight(code, lexer, formatter)\n        except:\n            highlighted_code = code.replace('&lt;', '&amp;lt;').replace('&gt;', '&amp;gt;')\n        \n        # \u5e76\u884c\u6267\u884c\u4ee3\u7801\u7ed3\u6784\u5206\u6790\n        future = executor.submit(analyze_code_structure, code)\n        analysis = future.result()\n        \n        # \u751f\u6210CSS\u6837\u5f0f\n        formatter = HtmlFormatter(noclasses=True)\n        css = formatter.get_style_defs('.highlight')\n        \n        # \u5c1d\u8bd5\u4f7f\u7528Ollama\u8fdb\u884c\u89e3\u91ca\uff0c\u540c\u65f6\u51c6\u5907\u672c\u5730\u89e3\u91ca\u4f5c\u4e3a\u5907\u9009\n        # \u4f7f\u7528\u7ebf\u7a0b\u6c60\u5e76\u884c\u6267\u884cOllama\u8c03\u7528\uff0c\u907f\u514d\u963b\u585e\u4e3b\u7ebf\u7a0b\n        future_ollama = executor.submit(explain_with_ollama, code, display_language)\n        ollama_explanation = future_ollama.result()\n        \n        # \u5982\u679cOllama\u8c03\u7528\u6210\u529f\u5e76\u8fd4\u56de\u6709\u6548\u7ed3\u679c\uff0c\u4f7f\u7528Ollama\u7684\u89e3\u91ca\n        if ollama_explanation:\n            explanation = ollama_explanation\n        else:\n            # \u5426\u5219\u4f7f\u7528\u672c\u5730\u8be6\u7ec6\u89e3\u91ca\n            print(\"Ollama\u8c03\u7528\u5931\u8d25\u6216\u7ed3\u679c\u4e0d\u5b8c\u6574\uff0c\u4f7f\u7528\u672c\u5730\u89e3\u91ca\")\n            # \u5e76\u884c\u6267\u884c\u672c\u5730\u89e3\u91ca\u751f\u6210\n            future_local = executor.submit(detailed_local_explain, code, display_language, analysis)\n            explanation = future_local.result()\n        \n        # \u8fd4\u56de\u5b8c\u6574\u6570\u636e\uff0c\u4e0d\u7701\u7565\u4efb\u4f55\u5185\u5bb9\n        response_data = {\n            'language': display_language,\n            'highlighted_code': highlighted_code,\n            'css': css,\n            'analysis': analysis,\n            'explanation': explanation,\n            'code': code,\n            'explain_method': 'ollama' if ollama_explanation else 'local'\n        }\n        \n        return jsonify(response_data)\n        \n    except Exception as e:\n        print(f\"\u5904\u7406\u5931\u8d25: {e}\")\n        traceback.print_exc()  # \u6253\u5370\u8be6\u7ec6\u5f02\u5e38\u5806\u6808\n        \n        # \u5f02\u5e38\u5904\u7406\uff0c\u786e\u4fdd\u8fd4\u56de\u6709\u610f\u4e49\u7684\u9519\u8bef\u4fe1\u606f\n        return jsonify({\n            'error': f'\u5904\u7406\u5931\u8d25: {str(e)}',\n            'language': '\u672a\u77e5',\n            'highlighted_code': '',\n            'css': '',\n            'analysis': {\n                'classes': &#91;],\n                'functions': &#91;],\n                'imports': &#91;],\n                'variables': &#91;],\n                'control_structures': &#91;]\n            },\n            'explanation': f'\u5904\u7406\u5931\u8d25: {str(e)}',\n            'code': code if 'code' in locals() else ''\n        })\n\nif __name__ == '__main__':\n    # \u5927\u5e45\u4f18\u5316GPU\u6027\u80fd\u7684\u73af\u5883\u53d8\u91cf\u8bbe\u7f6e\n    # \u6838\u5fc3GPU\u8bbe\u7f6e\n    os.environ&#91;'OLLAMA_GPU'] = '1.0'  # 100% GPU\u4f7f\u7528\u7387\n    \n    # \u5185\u5b58\u548c\u7f13\u5b58\u4f18\u5316\n    os.environ&#91;'OLLAMA_MAX_LOADED_MODELS'] = '1'\n    os.environ&#91;'OLLAMA_KEEP_ALIVE'] = '30m'  # \u5ef6\u957f\u6a21\u578b\u4fdd\u6301\u65f6\u95f4\n    \n    # \u5e76\u884c\u5904\u7406\u4f18\u5316 - \u663e\u8457\u589e\u52a0\u5e76\u884c\u5ea6\n    os.environ&#91;'OLLAMA_NUM_PARALLEL'] = '16'  # \u589e\u52a0\u523016\u4e2a\u5e76\u884c\u5904\u7406\n    os.environ&#91;'OLLAMA_BATCH_SIZE'] = '256'  # \u589e\u52a0\u6279\u5904\u7406\u5927\u5c0f\u5230256\n    os.environ&#91;'OLLAMA_THREADS'] = '16'  # \u589e\u52a0\u7ebf\u7a0b\u6570\u523016\n    \n    # CUDA\u548cTensorRT\u4f18\u5316\n    os.environ&#91;'OLLAMA_TENSORRT'] = '1'  # \u542f\u7528TensorRT\u52a0\u901f\n    os.environ&#91;'OLLAMA_CUDA_DMMV_X'] = '32'  # \u4f18\u5316CUDA\u77e9\u9635\u4e58\u6cd5\n    os.environ&#91;'OLLAMA_CUDA_DMMV_Y'] = '1'\n    \n    # \u65b0\u589e\u66f4\u591aGPU\u76f8\u5173\u4f18\u5316\u73af\u5883\u53d8\u91cf\n    os.environ&#91;'OLLAMA_CUDA_BLOCK_SIZE'] = '128'  # \u8bbe\u7f6eCUDA\u5757\u5927\u5c0f\n    os.environ&#91;'OLLAMA_CUDA_KV_QM_K'] = '16'  # \u4f18\u5316KV\u7f13\u5b58\u91cf\u5316\u77e9\u9635\n    os.environ&#91;'OLLAMA_CUDA_KV_QM_V'] = '16'\n    os.environ&#91;'OLLAMA_CUDA_MMV_X'] = '16'  # \u4f18\u5316\u77e9\u9635\u4e58\u6cd5\u5411\u91cf\n    os.environ&#91;'OLLAMA_CUDA_MMV_Y'] = '1'\n    os.environ&#91;'OLLAMA_GPU_LAYERS'] = '20'  # \u8bbe\u7f6eGPU\u5904\u7406\u7684\u5c42\u6570\n    os.environ&#91;'OLLAMA_CUDA_FORCE_MMQ'] = '1'  # \u5f3a\u5236\u4f7f\u7528\u6df7\u5408\u7cbe\u5ea6\u91cf\u5316\n    os.environ&#91;'OLLAMA_CUDA_PEER_ACCESS'] = '1'  # \u542f\u7528GPU\u95f4\u5bf9\u7b49\u8bbf\u95ee\n    os.environ&#91;'OLLAMA_CUDA_MMQ_ENABLED'] = '1'  # \u542f\u7528MMQ\u91cf\u5316\n    \n    # \u8bbe\u7f6eCUDA\u4f18\u5316\u73af\u5883\u53d8\u91cf\n    os.environ&#91;'CUDA_VISIBLE_DEVICES'] = '0'  # \u786e\u4fdd\u4f7f\u7528GPU 0\n    os.environ&#91;'CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID'  # \u6309PCI\u603b\u7ebfID\u6392\u5e8f\u8bbe\u5907\n    os.environ&#91;'CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'  # \u4f18\u5316cuBLAS\u6027\u80fd\n    os.environ&#91;'CUDA_CACHE_DISABLE'] = '0'  # \u542f\u7528CUDA\u7f13\u5b58\n    os.environ&#91;'CUDA_MODULE_LOADING'] = 'LAZY'  # \u4f7f\u7528\u5ef6\u8fdf\u52a0\u8f7d\u4ee5\u63d0\u9ad8\u6027\u80fd\n    os.environ&#91;'CUDA_LAUNCH_BLOCKING'] = '0'  # \u7981\u7528\u540c\u6b65\u542f\u52a8\u4ee5\u63d0\u9ad8\u6027\u80fd\n    os.environ&#91;'CUDA_FORCE_PTX_JIT'] = '1'  # \u5f3a\u5236PTX JIT\u7f16\u8bd1\u4ee5\u83b7\u5f97\u6700\u4f73\u6027\u80fd\n    \n    # \u786e\u4fddtemplates\u6587\u4ef6\u5939\u5b58\u5728\n    if not os.path.exists('templates'):\n        os.makedirs('templates')\n        print(\"\u8bf7\u786e\u4fddtemplates\u76ee\u5f55\u4e0b\u6709index.html\u6587\u4ef6\")\n    \n    # \u8fd0\u884cFlask\u5e94\u7528\n    app.run(debug=True, host='0.0.0.0', port=5555)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>flask==2.3.2\npygments==2.15.1\nlangdetect==1.0.9\npython-dotenv==1.0.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u4e2a\u57fa\u4e8eWeb\u7684\u667a\u80fd\u4ee3\u7801\u89e3\u91ca\u5668\u5de5\u5177\uff0c\u8c03\u7528\u672c\u5730AI\u5927\u6a21\u578b\uff0c\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u4ee3\u7801\u8bed\u8a00\uff0c\u9ad8\u4eae\u663e\u793a\u4ee3\u7801\uff0c\u5e76\u63d0\u4f9b\u4ee3\u7801\u7ed3\u6784\u5206\u6790 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,15],"tags":[],"class_list":["post-150","post","type-post","status-publish","format-standard","hentry","category-ctf","category-15"],"_links":{"self":[{"href":"https:\/\/xn--c-pg7b.top\/index.php\/wp-json\/wp\/v2\/posts\/150","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xn--c-pg7b.top\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/xn--c-pg7b.top\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/xn--c-pg7b.top\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/xn--c-pg7b.top\/index.php\/wp-json\/wp\/v2\/comments?post=150"}],"version-history":[{"count":2,"href":"https:\/\/xn--c-pg7b.top\/index.php\/wp-json\/wp\/v2\/posts\/150\/revisions"}],"predecessor-version":[{"id":166,"href":"https:\/\/xn--c-pg7b.top\/index.php\/wp-json\/wp\/v2\/posts\/150\/revisions\/166"}],"wp:attachment":[{"href":"https:\/\/xn--c-pg7b.top\/index.php\/wp-json\/wp\/v2\/media?parent=150"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/xn--c-pg7b.top\/index.php\/wp-json\/wp\/v2\/categories?post=150"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/xn--c-pg7b.top\/index.php\/wp-json\/wp\/v2\/tags?post=150"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}