{"@attributes":{"version":"2.0"},"channel":{"title":"\u9996\u9875 on \u81ea\u5982\u8bf4","link":"https:\/\/zrs.me\/","description":"Recent content in \u9996\u9875 on \u81ea\u5982\u8bf4","generator":"Hugo","language":"zh-CN","lastBuildDate":"Thu, 26 Mar 2026 02:02:14 +0800","item":[{"title":"\u751f\u6d3b\u4e0d\u4f1a\u653e\u5f03\u4f60\uff0c\u4f46\u4e5f\u4e0d\u4f1a\u653e\u8fc7\u4f60","link":"https:\/\/zrs.me\/56\/","pubDate":"Thu, 26 Mar 2026 02:02:14 +0800","guid":"https:\/\/zrs.me\/56\/","description":"<p>\u751f\u6d3b\u662f\u4e2a\u5947\u602a\u7684\u503a\u4e3b\u3002\u5b83\u4ece\u4e0d\u4e3b\u52a8\u4e0e\u4f60\u89e3\u7ea6\uff0c\u5374\u4e5f\u4e0d\u80af\u7ed9\u4f60\u7247\u523b\u5b89\u5b81\u3002\u6211\u66fe\u4ee5\u4e3a\u201c\u4e0d\u653e\u5f03\u201d\u662f\u79cd\u6e29\u67d4\uff0c\u540e\u6765\u624d\u660e\u767d\uff0c\u90a3\u4e0d\u8fc7\u662f\u5b83\u6700\u57fa\u672c\u7684\u751f\u610f\u7ecf\u2014\u2014\u6bcf\u4e2a\u7075\u9b42\u90fd\u662f\u5b83\u7684\u957f\u671f\u996d\u7968\uff0c\u5b83\u600e\u4f1a\u820d\u5f97\u8f7b\u6613\u653e\u624b\uff1f<\/p>"},{"title":"\u672c\u7ad9\u4e3b\u9898\u8bb0\u5f552026.02.27","link":"https:\/\/zrs.me\/55\/","pubDate":"Fri, 27 Feb 2026 13:20:06 +0800","guid":"https:\/\/zrs.me\/55\/","description":"<p>\u9274\u4e8e\u672c\u7ad9\u4e24\u4e2a\u6708\u6ca1\u6709\u66f4\u65b0\u548c\u7ef4\u62a4\uff0c\u4e3b\u9898\u4f5c\u8005\u66f4\u65b0\u5f88\u591a\uff0c\u67b6\u6784\u53d8\u5316\u5bfc\u81f4\u65e0\u6cd5\u7f16\u8bd1\u3002\u56e0\u4e2a\u4eba\u80fd\u529b\u6709\u9650\uff0c\u672c\u7ad9\u65e0\u6cd5\u7ee7\u7eed\u8ddf\u8fdb\u4e3b\u9898\u66f4\u65b0\uff0c\u76ee\u524d\u9a7b\u7559\u7248\u672c\u5982\u4e0b\uff1a<\/p>\n<ul>\n<li>commits:186<\/li>\n<li>version:v1.1.6-1-g2f7b80b<\/li>\n<li>date:2025.11.17<\/li>\n<li>hash:2f7b80bdbd93cbeb2b24d5db0f8d0e205f7d1a58<\/li>\n<\/ul>\n<p>\u4ee5\u540e\u6709\u80fd\u529b\u7ee7\u7eed\u8ddf\u8fdb\uff0chugo\u8fd8\u662f\u633a\u597d\u73a9\u7684\u3002<\/p>"},{"title":"\u300a\u4e0d\u80fd\u8bf4\u7684\u79d8\u5bc6\u300b\u7eed\u8d30 \u00b7 \u7434\u97f3\u7684\u56de\u54cd","link":"https:\/\/zrs.me\/54\/","pubDate":"Sat, 02 Aug 2025 23:51:38 +0800","guid":"https:\/\/zrs.me\/54\/","description":"<p>\u4e0a\u7bc7\u5199\u4e86\u53f6\u6e58\u4f26\u4e0e\u5c0f\u96e8\u7684\u91cd\u9022\uff0c\u7531\u4e8e\u6ca1\u544a\u8bc9deepseek\u4e0d\u9700\u8981\u7ed3\u5c40\uff0cdeepseek\u8fd8\u7ed9\u603b\u7ed3\u4e86\u7ed3\u5c40\u3002\u6211\u628a\u7ed3\u5c40\u624b\u52a8\u5220\u6389\u4e86\uff0c\u672c\u6b21\u7ee7\u7eed\u5c55\u5f00\u60c5\u8282\u3002<\/p>\n<p>\u57fa\u4e8e\u4e0a\u7bc7\uff0c\u6211\u4eec\u7ee7\u7eed\u8ba9deepseek\u7eed\u5199\uff0c\u4ee5\u4e0b\u662f\u63d0\u793a\u8bcd\uff1a<\/p>"},{"title":"\u300a\u4e0d\u80fd\u8bf4\u7684\u79d8\u5bc6\u300b\u7eed\u58f9 \u00b7 \u91cd\u9022","link":"https:\/\/zrs.me\/53\/","pubDate":"Fri, 01 Aug 2025 17:57:35 +0800","guid":"https:\/\/zrs.me\/53\/","description":"<p>\u7535\u5f71\u300a\u4e0d\u80fd\u8bf4\u7684\u79d8\u5bc6\u300b\u770b\u4e86\u5f88\u591a\u904d\uff0c\u5728\u770b\u4e86\u97e9\u7248\u540e\uff0c\u5fc3\u91cc\u5bf9\u539f\u7248\u7684\u7ed3\u5c40\u4e5f\u66fe\u9884\u6f14\u51fa\u65e0\u6570\u4e2a\u4e0d\u540c\u7684\u7ed3\u5c40\uff0c\u7ec8\u4e8e\u9f13\u8d77\u52c7\u6c14\u7eed\u5199\u5176\u4e2d\u4e00\u4e2a\u65b9\u5411\uff0c\u6361\u4e00\u6361\u7535\u5f71\u7559\u7ed9\u6211\u4eec\u7684\u788e\u7247\u3002<\/p>"},{"title":"\u3010\u89c1\u95fb\u3011\u4e70\u9e21\u86cb","link":"https:\/\/zrs.me\/52\/","pubDate":"Sat, 12 Jul 2025 01:22:21 +0800","guid":"https:\/\/zrs.me\/52\/","description":"<p>\u6700\u8fd1\u6301\u7eed\u72c2\u5403\u9e21\u86cb\u51cf\u80a5\u4e2d\uff0c\u5c0f\u533a\u95e8\u53e3\u5730\u4e0b\u8d85\u5e02\u7684\u9e21\u86cb\u533a\u57df\u6211\u6210\u4e3a\u4e86\u5e38\u5ba2\uff0c\u6bcf\u5468\u603b\u8981\u53bb\u4e24\u4e09\u6b21\u3002<\/p>\n<p>\u8fd9\u5929\uff0c\u4e3a\u4e86\u82b1\u6389\u67d0\u5b9d\u78b0\u4e00\u78b0\u7ea2\u5305\uff0c\u7167\u4f8b\u53bb\u4e86\u9e21\u86cb\u533a\u3002\u770b\u5230\u4e24\u4e2a\u5e74\u8f7b\u4e14\u5bcc\u6709\u671d\u6c14\u7684\u5973\u5b69\u9a7b\u8db3\u5728\u9e21\u86cb\u7b50\u9762\u524d\u72b9\u8c6b\u4e0d\u51b3\uff0c\u53ef\u80fd\u5979\u4eec\u4e5f\u662f\u8981\u4e70\u9e21\u86cb\u5427\u3002\u6211\u8fc7\u53bb\u76f4\u63a5\u626f\u4e86\u888b\u5b50\u5e95\u4e0b\u5934\u6311\u9009\u9e21\u86cb\u3002<\/p>"},{"title":"Lucky Even - \u751a\u5e78","link":"https:\/\/zrs.me\/51\/","pubDate":"Sat, 12 Jul 2025 00:44:45 +0800","guid":"https:\/\/zrs.me\/51\/","description":"<p>\u7ee7\u300cNot Even - \u672a\u53ca\u300d\u540e\uff0c\u53c8\u4e00\u9879\u76ee\u4e0a\u7ebf\u2014\u2014\u300eLucky Even - \u751a\u5e78\u300f\u3002<\/p>\n<p>\u540e\u6765\u53c8\u7ffb\u4e86\u7ffb\u90a3\u4e2a\u672a\u6ce8\u57df\u540d\u5217\u8868\uff0c\u770b\u5230\u4e86le.edu.kg\uff0c\u55ef&hellip;\u4e50\u6559\u80b2\uff0c\u5bd3\u610f\u8fd8\u4e0d\u9519\uff0c\u4e8e\u662f\u4e00\u51b2\u52a8\u53c8\u4e70\u4e86\u8fd9\u4e2a\u57df\u540d\u3002<\/p>"},{"title":"Not Even - \u672a\u53ca","link":"https:\/\/zrs.me\/50\/","pubDate":"Thu, 10 Jul 2025 15:16:59 +0800","guid":"https:\/\/zrs.me\/50\/","description":"<p>\u4eca\u5929\u770b\u5230\u6709\u4eba\u5206\u4eabedu.kg\u57df\u540d\u6ce8\u518c\u65b9\u6cd5\uff0c\u53ef\u80fd\u6211\u662f\u6700\u540e\u4e00\u4e2a\u77e5\u9053edu.kg\u8fd9\u4e2a\u6559\u80b2\u57df\u540d\u4e2a\u4eba\u53ef\u4ee5\u968f\u4fbf\u6ce8\u518c\u7684\u5427\uff0c\u4e3b\u8981\u662f\u5f53\u65f6\u88abAI\u5ffd\u60a0\u8bf4\u53ef\u4ee5\u6ce8\u518c\u5404\u79cd\u6559\u80b2\u4f18\u60e0\u3002\u4e8e\u662f\u7acb\u5373\u6311\u9009\u4e86\u4e00\u4e2ane.edu.kg\uff0c\u6211\u60f3\u5230\u7684 NE = national education\u3002<\/p>"},{"title":"\u9020\u4e2a\u8f6e\u5b50\u2014\u2014\u65e7\u624b\u673a\u6539\u9020\u6210\u65f6\u949f","link":"https:\/\/zrs.me\/49\/","pubDate":"Tue, 08 Jul 2025 23:26:54 +0800","guid":"https:\/\/zrs.me\/49\/","description":"<p>\u7ffb\u7bb1\u5012\u67dc\u53d1\u73b0\u4e86\u591a\u5e74\u524d\u7684\u5c0f\u7c731\u7535\u4fe1\u7248\uff0c\u8fd8\u80fd\u5f00\u673a\uff0c\u5c31\u662f\u7535\u6c60\u4e0d\u600e\u4e48\u884c\u4e86\uff0c\u539f\u88c5\u574f\u4e86\uff0c\u4e24\u5757\u7b2c\u4e09\u65b9\u54c1\u724c\u7535\u6c60\u90fd\u4e00\u70b9\u9f13\u5305\u3002\u73b0\u5728\u7535\u4fe1\u76842G3G\u90fd\u5df2\u7ecf\u9000\u7f51\u4e86\uff0c\u4e5f\u5c31\u53ea\u80fd\u901a\u8fc72.4G\u7684\u65e0\u7ebf\u8054\u4e00\u4e0b\u7f51\u4e86\u3002\u4f55\u4e0d\u7528\u6765\u5f53\u4e2a\u684c\u9762\u6570\u5b57\u65f6\u949f\u5462\u3002<\/p>"},{"title":"\u672c\u8de8\u5e73\u53f0\u5199hugo\u535a\u5ba2\u4f53\u9a8c\u57fa\u672c\u4e00\u81f4","link":"https:\/\/zrs.me\/48\/","pubDate":"Thu, 03 Jul 2025 02:11:25 +0800","guid":"https:\/\/zrs.me\/48\/","description":"<p>\u56e0\u4e3a\u524d\u5929\u51e0\u6362\u4e86\u65b0HDR\u663e\u793a\u5668\uff0c\u4e8e\u662f\u6253\u5f00\u4e86\u5f88\u4e45\u4e4b\u524d\u88c5\u7684ubuntu\u7cfb\u7edf\uff0c\u770b\u4e0blinux\u662f\u5426\u652f\u6301HDR\uff0c\u4e0d\u600e\u4e48\u4f1a\u7528ubuntu\uff0c\u53ea\u662f\u5b89\u88c5\u4e86\u7cfb\u7edf\uff0c\u6ca1\u600e\u4e48\u6298\u8170\u8fc7\u8f6f\u4ef6\uff0c\u56e0\u6b64\u7cfb\u7edf\u5f88\u5e72\u51c0\u3002<\/p>"},{"title":"DeepSeek\u4e00\u4e9b\u60ca\u8273\u5230\u6211\u7684\u53e5\u5b50","link":"https:\/\/zrs.me\/47\/","pubDate":"Tue, 01 Jul 2025 01:13:59 +0800","guid":"https:\/\/zrs.me\/47\/","description":"<p>\u65e5\u5e38\u4f7f\u7528DeepSeek\u5df2\u7ecf\u6709\u4e00\u6bb5\u65f6\u95f4\u4e86\uff0c\u6709\u65f6\u5019\u559c\u6b22\u6709\u4e00\u642d\u6ca1\u4e00\u642d\u5730\u95eeDeepSeek\u4e00\u4e9b\u95ee\u9898\uff0c\u6709\u65f6\u5019\u786e\u5b9e\u6709\u9700\u8981\u89e3\u7b54\u7684\u95ee\u9898\uff0c\u6709\u65f6\u5019\u5355\u7eaf\u5730\u60f3\u770b\u4e00\u4e0bAI\u662f\u4f1a\u56de\u7b54\u51fa\u4ec0\u4e48\u5185\u5bb9\uff0c\u4e00\u95ee\u4e00\u7b54\u95f4\uff0c\u603b\u6709\u4e00\u4e9b\u53e5\u5b50\u60ca\u8273\u5230\u6211\u3002<\/p>"},{"title":"hugo\u4e3b\u9898\u53ca\u6587\u4ef6\u8986\u76d6\u673a\u5236","link":"https:\/\/zrs.me\/46\/","pubDate":"Thu, 19 Jun 2025 09:02:42 +0800","guid":"https:\/\/zrs.me\/46\/","description":"<p>\u524d\u9762\u5728\u7f51\u4e0a\u770b\u6559\u7a0b\u548c\u81ea\u884c\u63a2\u7d22hugo\u642d\u5efa\u65f6\uff0c\u5b66\u4e60\u7684\u5230\u5bf9\u4e3b\u9898\u7684\u5904\u7406\u65b9\u6cd5\u7b80\u5355\u7c97\u66b4\uff0c\u628a\u4e3b\u9898\u5305\u653e\u5165themes\u6587\u4ef6\u5939\u540e\uff0c\u628aarchetypes\u3001assets\u3001layouts\u3001static\u7b49\u6587\u4ef6\u5939\u76f4\u63a5\u590d\u5236\u5230hugo\u7684\u6839\u76ee\u5f55\u3002<\/p>"},{"title":"\u5b66\u4e60-\u5b9e\u52a1-\u501f\u6b3e\u8d39\u7528","link":"https:\/\/zrs.me\/45\/","pubDate":"Thu, 19 Jun 2025 01:43:07 +0800","guid":"https:\/\/zrs.me\/45\/","description":"<h2 id=\"\u501f\u6b3e\u8d39\u7528\">\u501f\u6b3e\u8d39\u7528<\/h2>\n<h3 id=\"\u4e00\u501f\u6b3e\u8d39\u7528\u7684\u754c\u5b9a\">\u4e00\u3001\u501f\u6b3e\u8d39\u7528\u7684\u754c\u5b9a<\/h3>\n<p>\u54ea\u4e9b\u5c5e\u4e8e\u501f\u6b3e\u8d39\u7528\uff1a<\/p>\n<ul>\n<li>\u501f\u6b3e\u4ea7\u751f\u7684\u5229\u606f<\/li>\n<li>\u53d1\u884c\u503a\u5238\u6298\u4ef7\u6216\u6ea2\u4ef7\u7684\u644a\u9500<\/li>\n<li>\u501f\u6b3e\u53d1\u751f\u7684\u8f85\u52a9\u8d39\u7528<\/li>\n<li>\u5916\u5e01\u501f\u6b3e\u53d1\u751f\u7684\u6c47\u5151\u5dee\u989d<\/li>\n<\/ul>\n<h3 id=\"\u4e8c\u501f\u6b3e\u8d39\u7528\u7684\u786e\u8ba4\">\u4e8c\u3001\u501f\u6b3e\u8d39\u7528\u7684\u786e\u8ba4<\/h3>\n<p><strong>\u8d44\u672c\u5316<\/strong> or <strong>\u8d39\u7528\u5316<\/strong><br>\n<strong>\u4e13\u95e8\u501f\u6b3e<\/strong> and <strong>\u4e00\u822c\u501f\u6b3e<\/strong> \u90fd\u53ef\u4ee5\u8d44\u672c\u5316\u3002\u5148\u5360\u7528\u4e13\u95e8\u501f\u6b3e\u3002<\/p>"},{"title":"\u5b66\u4e60-\u5b9e\u52a1-\u80a1\u4efd\u652f\u4ed8","link":"https:\/\/zrs.me\/44\/","pubDate":"Tue, 17 Jun 2025 09:38:59 +0800","guid":"https:\/\/zrs.me\/44\/","description":"<p>\uff08\u638c\u63e1\u524d\u97625\u4e2a\u5927\u9898\uff09<\/p>\n<h1 id=\"\u80a1\u4efd\u652f\u4ed8\">\u80a1\u4efd\u652f\u4ed8<\/h1>\n<h1 id=\"\u80a1\u4efd\u652f\u4ed8\u548c\u73b0\u91d1\u652f\u4ed8\">\u80a1\u4efd\u652f\u4ed8\u548c\u73b0\u91d1\u652f\u4ed8<\/h1>"},{"title":"\u5b66\u4e60-\u5b9e\u52a1-\u804c\u5de5\u85aa\u916c","link":"https:\/\/zrs.me\/43\/","pubDate":"Tue, 10 Jun 2025 09:10:56 +0800","guid":"https:\/\/zrs.me\/43\/","description":"<h2 id=\"\u804c\u5de5\u85aa\u916c\u5206\u7c7b\">\u804c\u5de5\u85aa\u916c\u5206\u7c7b<\/h2>\n<p>4\u4e2a\u5206\u7c7b\uff1a<\/p>\n<ul>\n<li>\u77ed\u671f\u804c\u5de5\u85aa\u916c<\/li>\n<li>\u79bb\u804c\u540e\u798f\u5229<\/li>\n<li>\u8f9e\u9000\u798f\u5229<\/li>\n<li>\u5176\u4ed6\u957f\u671f\u804c\u5de5\u798f\u5229<\/li>\n<\/ul>\n<p>\u8f9e\u9000\u798f\u5229\u4e00\u5f8b\u8fdb\u7ba1\u7406\u8d39\u7528\uff0c\u5185\u9000\u4ea7\u751f\u7684\u85aa\u916c\u5c5e\u4e8e\u8f9e\u9000\u798f\u5229\uff0c\u4e5f\u8fdb\u7ba1\u7406\u8d39\u7528<\/p>\n<h2 id=\"\u77ed\u671f\u804c\u5de5\u85aa\u916c\">\u77ed\u671f\u804c\u5de5\u85aa\u916c<\/h2>\n<h3 id=\"\u65e5\u5e38\u5de5\u8d44\">\u65e5\u5e38\u5de5\u8d44<\/h3>\n<div\n class=\"code-block-container border-border bg-card my-6 overflow-hidden rounded-xl border shadow-sm transition-all duration-200 ease-out hover:-translate-y-0.5 hover:shadow-md\">\n \n <div\n class=\"code-block-header bg-muted\/30 border-border flex items-center justify-between border-b px-4 py-3\">\n \n <div class=\"flex items-center gap-2\">\n <div class=\"text-muted-foreground flex-shrink-0\">\n \n <svg class=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" \/>\n<\/svg>\n <\/div>\n <span class=\"text-muted-foreground text-sm font-medium\">\n PLAINTEXT\n <\/span>\n <\/div>\n\n \n <div class=\"flex items-center gap-2\">\n <button\n class=\"collapse-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-0\"\n data-default-state=\"expanded\"\n data-collapsed=\"false\"\n data-auto-collapse-lines=\"30\"\n data-auto-collapse-height=\"400\"\n data-collapsed-height=\"120\"\n title=\"\u6298\u53e0\"\n aria-label=\"\u6298\u53e0\">\n <span class=\"collapse-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\"\/><\/svg>\n <\/span>\n <span class=\"collapse-text hidden sm:inline\"\n >\u6298\u53e0<\/span\n >\n <\/button>\n <button\n class=\"copy-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-0\"\n title=\"\u590d\u5236\"\n aria-label=\"\u590d\u5236\">\n <span class=\"copy-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" \/>\n<\/svg>\n <\/span>\n <span class=\"copy-text hidden sm:inline\"\n >\u590d\u5236<\/span\n >\n <\/button>\n <\/div>\n <\/div>\n\n \n <div class=\"code-block-content relative\" id=\"code-0\">\n <pre tabindex=\"0\"><code>\u501f\uff1a\u751f\u4ea7\u6210\u672c\n \u5236\u9020\u8d39\u7528\n \u9500\u552e\u8d39\u7528\n \u7ba1\u7406\u8d39\u7528\n \u7814\u53d1\u652f\u51fa\n \u5728\u5efa\u5de5\u7a0b\n \u2026\u2026\n \u8d37\uff1a\u5e94\u4ed8\u804c\u5de5\u85aa\u916c<\/code><\/pre>\n \n <div\n class=\"collapse-overlay to-card\/90 pointer-events-none absolute inset-0 bg-gradient-to-b from-transparent via-transparent opacity-0 transition-opacity duration-300\">\n <div\n class=\"text-muted-foreground bg-card\/80 border-border\/50 hover:bg-primary\/10 hover:text-primary hover:border-primary\/30 absolute bottom-4 left-1\/2 -translate-x-1\/2 cursor-pointer rounded-full border px-3 py-1.5 text-xs backdrop-blur-sm transition-all duration-200\">\n \u70b9\u51fb\u5c55\u5f00\u67e5\u770b\u66f4\u591a\n <\/div>\n <\/div>\n <\/div>\n<\/div>\n\n\n<script>\n(function() {\n const codeId = 'code-0';\n const copyBtn = document.querySelector('.copy-code-btn[data-code-id=\"' + codeId + '\"]');\n const collapseBtn = document.querySelector('.collapse-code-btn[data-code-id=\"' + codeId + '\"]');\n const codeContainer = document.getElementById(codeId);\n\n if (!codeContainer) return;\n\n \n if (copyBtn) {\n const copyIcon = copyBtn.querySelector('.copy-icon');\n const copyText = copyBtn.querySelector('.copy-text');\n\n copyBtn.addEventListener('click', async function() {\n try {\n \n let codeText = '';\n\n \n const codeTableCell = codeContainer.querySelector('.lntd:last-child code');\n if (codeTableCell) {\n codeText = codeTableCell.textContent || codeTableCell.innerText;\n } else {\n \n const codeElement = codeContainer.querySelector('code');\n if (codeElement) {\n \n const hasInlineLineNumbers = codeElement.querySelector('.ln');\n if (hasInlineLineNumbers) {\n \n const codeLines = codeElement.querySelectorAll('.cl');\n if (codeLines.length > 0) {\n codeText = Array.from(codeLines)\n .map(line => {\n const text = line.textContent || line.innerText;\n \n return text.replace(\/\\n+$\/, '');\n })\n .join('\\n')\n .replace(\/\\n+$\/, ''); \n } else {\n \n const allText = codeElement.textContent || codeElement.innerText;\n codeText = allText.replace(\/^\\d+\/gm, '').replace(\/^\\s+\/gm, '');\n }\n } else {\n \n codeText = codeElement.textContent || codeElement.innerText;\n }\n } else {\n \n codeText = codeContainer.textContent || codeContainer.innerText;\n }\n }\n\n \n codeText = codeText.trim();\n\n \n await navigator.clipboard.writeText(codeText);\n\n \n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M5 13l4 4L19 7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u5df2\u590d\u5236';\n }\n copyBtn.classList.add('text-green-600');\n\n \n setTimeout(() => {\n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n copyBtn.classList.remove('text-green-600');\n }, 2000);\n\n } catch (err) {\n console.error('\u590d\u5236\u5931\u8d25:', err);\n\n \n const range = document.createRange();\n const codeElement = codeContainer.querySelector('code') || codeContainer;\n range.selectNodeContents(codeElement);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n \n if (copyText) {\n copyText.textContent = '\u5df2\u9009\u62e9';\n }\n\n setTimeout(() => {\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n selection.removeAllRanges();\n }, 2000);\n }\n });\n }\n\n \n if (collapseBtn) {\n const collapseIcon = collapseBtn.querySelector('.collapse-icon');\n const collapseText = collapseBtn.querySelector('.collapse-text');\n const collapseOverlay = codeContainer.querySelector('.collapse-overlay');\n\n \n let codeElement = codeContainer.querySelector('pre.chroma');\n if (!codeElement) {\n codeElement = codeContainer.querySelector('pre');\n }\n\n const defaultState = collapseBtn.dataset.defaultState || 'expanded';\n const isCollapsedAttr = collapseBtn.dataset.collapsed === 'true';\n const autoCollapseLines = parseInt(collapseBtn.dataset.autoCollapseLines) || 30;\n const autoCollapseHeight = parseInt(collapseBtn.dataset.autoCollapseHeight) || 400;\n const collapsedHeight = parseInt(collapseBtn.dataset.collapsedHeight) || 120;\n\n let isCollapsed = false;\n\n \n function initCollapse() {\n \n const shouldCollapse = isCollapsedAttr ||\n defaultState === 'collapsed' ||\n shouldAutoCollapse();\n\n if (shouldCollapse) {\n setCollapsed(true, false); \n }\n }\n\n function shouldAutoCollapse() {\n \n if (codeElement) {\n const lines = codeElement.querySelectorAll('.line, .cl');\n const height = codeElement.offsetHeight;\n return lines.length > autoCollapseLines || height > autoCollapseHeight;\n }\n\n \n const containerHeight = codeContainer.offsetHeight;\n if (containerHeight > autoCollapseHeight) {\n return true;\n }\n\n \n const textContent = codeContainer.textContent || codeContainer.innerText || '';\n const estimatedLines = textContent.split('\\n').length;\n return estimatedLines > autoCollapseLines;\n }\n\n function setCollapsed(collapsed, animate = true) {\n if (!collapseOverlay) return;\n\n isCollapsed = collapsed;\n\n if (collapsed) {\n \n codeContainer.style.maxHeight = collapsedHeight + 'px';\n codeContainer.style.overflow = 'hidden';\n collapseOverlay.style.opacity = '1';\n collapseOverlay.style.pointerEvents = 'auto';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M19 9l-7 7-7-7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u5c55\u5f00';\n }\n collapseBtn.title = '\u5c55\u5f00';\n\n } else {\n \n codeContainer.style.maxHeight = '';\n codeContainer.style.overflow = '';\n collapseOverlay.style.opacity = '0';\n collapseOverlay.style.pointerEvents = 'none';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath fill=\\u0022currentColor\\u0022 d=\\u0022M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\\u0022\\\/\\u003e\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u6298\u53e0';\n }\n collapseBtn.title = '\u6298\u53e0';\n }\n\n \n if (animate) {\n codeContainer.style.transition = 'max-height 0.3s ease-out';\n setTimeout(() => {\n codeContainer.style.transition = '';\n }, 300);\n }\n }\n\n function toggleCollapse() {\n setCollapsed(!isCollapsed, true);\n }\n\n \n collapseBtn.addEventListener('click', toggleCollapse);\n\n \n if (collapseOverlay) {\n collapseOverlay.addEventListener('click', () => {\n if (isCollapsed) {\n setCollapsed(false, true);\n }\n });\n }\n\n \n initCollapse();\n }\n})();\n<\/script>\n<h3 id=\"\u975e\u8d27\u5e01\u6027\u798f\u5229\">\u975e\u8d27\u5e01\u6027\u798f\u5229<\/h3>\n<h4 id=\"\u81ea\u4ea7\u7684\u5546\u54c1\">\u81ea\u4ea7\u7684\u5546\u54c1<\/h4>\n<p>\u6309\u516c\u5141\u4ef7\u503c\u8ba1\u7b97\u8fdb\u9879\u7a0e\u548c\u8ba1\u5165\u5e94\u4ed8\u804c\u5de5\u85aa\u916c\u3002\uff08<em>\u4e0e\u5356\u51fa\u5b58\u8d27\u7684\u5206\u5f55\u76f8\u540c\uff0c\u94f6\u5b58\u6362\u4e3a\u5e94\u4ed8\u804c\u5de5\u85aa\u916c\u5373\u53ef<\/em>\uff09<\/p>"},{"title":"\u66f4\u6362\u65b0\u4e3b\u9898narrow","link":"https:\/\/zrs.me\/41\/","pubDate":"Mon, 09 Jun 2025 10:22:06 +0800","guid":"https:\/\/zrs.me\/41\/","description":"<p>\u524d\u51e0\u5929\u5728v2\u4e0a\u53d1\u73b0\u7f51\u53cb\u7684\u65b0\u4f5c\u54c1\uff0c\u6e05\u65b0\u597d\u770b\uff0c\u4e00\u773c\u5c31\u76f8\u4e2d\u4e86\uff0c\u8c03\u8bd5\u4e86\u4e24\u5929\u540e\u7ec8\u4e8e\u642c\u4e0a\u6765\u4e86\u3002<\/p>\n<p>\n<figure class=\"image-figure not-prose my-8\" \n data-lightbox-enabled=\"false\"\n data-gallery-type=\"auto\">\n <div class=\"image-container\">\n <img\n src=\"https:\/\/zrs.me\/41\/home.png\"\n alt=\"\u4e3b\u9898\u9884\u89c8\"\n title=\"\u4e3b\u9898\u9884\u89c8\"\n \n \n \n \n width=\"2775\"\n height=\"1667\"\n \n \n \n loading=\"lazy\"\n decoding=\"async\"\n data-gallery-src=\"https:\/\/zrs.me\/41\/home.png\"\n data-gallery-alt=\"\u4e3b\u9898\u9884\u89c8\"\n data-gallery-title=\"\u4e3b\u9898\u9884\u89c8\" \/><\/div>\n\n <figcaption class=\"image-caption\">\n \u4e3b\u9898\u9884\u89c8\n <\/figcaption><\/figure><\/p>"},{"title":"\u81ea\u5982\u8bf4\u2014\u2014\u535a\u5ba2\u7684\u65b0\u540d\u5b57","link":"https:\/\/zrs.me\/40\/","pubDate":"Wed, 21 May 2025 23:55:28 +0800","guid":"https:\/\/zrs.me\/40\/","description":"<p>\u4e0a\u4e2a\u540d\u5b57\u6709\u70b9\u80e1\u95f9\u4e86\uff0c\u8fd9\u6b21\u8d77\u4e2a\u6709\u610f\u5883\u7684\u540d\u5b57\uff0czr&ndash;\u81ea\u5982\uff0czrs&ndash;\u81ea\u5982\u8bf4\u3002<\/p>\n<h1 id=\"\u81ea\u5982z\u00ec-r\u00fa\">\u81ea\u5982[z\u00ec r\u00fa]<\/h1>\n<p>\n<figure class=\"image-figure not-prose my-8\" \n data-lightbox-enabled=\"false\"\n data-gallery-type=\"auto\">\n <div class=\"image-container\">\n <img\n src=\"https:\/\/zrs.me\/40\/zr.png\"\n alt=\"Small Image\"\n title=\"\u81ea\u5982[z\u00ec r\u00fa] \"\n \n \n \n \n width=\"400\"\n height=\"211\"\n \n \n \n loading=\"lazy\"\n decoding=\"async\"\n data-gallery-src=\"https:\/\/zrs.me\/40\/zr.png\"\n data-gallery-alt=\"Small Image\"\n data-gallery-title=\"\u81ea\u5982[z\u00ec r\u00fa] \" \/><\/div>\n\n <figcaption class=\"image-caption\">\n \u81ea\u5982[z\u00ec r\u00fa]\n <\/figcaption><\/figure><\/p>"},{"title":"\u5b66\u4e60-\u5b9e\u52a1-\u957f\u6295-\u6743\u76ca\u6cd5\u4e0b\u957f\u6295\u7684\u6838\u7b97","link":"https:\/\/zrs.me\/39\/","pubDate":"Mon, 19 May 2025 22:56:01 +0800","guid":"https:\/\/zrs.me\/39\/","description":"<h1 id=\"\u6743\u76ca\u6cd5\">\u6743\u76ca\u6cd5<\/h1>\n<p>\u4ec0\u4e48\u65f6\u5019\u7528\u6743\u76ca\u6cd5\uff1f \u8fbe\u4e0d\u5230\u63a7\u5236\u7684\u60c5\u51b5\u4e0b\uff08<strong>\u5171\u540c\u63a7\u5236<\/strong>\uff0c<strong>\u91cd\u5927\u5f71\u54cd<\/strong>\uff09\uff0c\u91c7\u7528\u6743\u76ca\u6cd5\u6838\u7b97\uff0c\u8fbe\u5230\u63a7\u5236\u91c7\u7528\u6210\u672c\u6cd5\u6838\u7b97\u3002<\/p>\n<p>\u79d1\u76ee\u8bbe\u7f6e\uff1a<\/p>\n<div\n class=\"code-block-container border-border bg-card my-6 overflow-hidden rounded-xl border shadow-sm transition-all duration-200 ease-out hover:-translate-y-0.5 hover:shadow-md\">\n \n <div\n class=\"code-block-header bg-muted\/30 border-border flex items-center justify-between border-b px-4 py-3\">\n \n <div class=\"flex items-center gap-2\">\n <div class=\"text-muted-foreground flex-shrink-0\">\n \n <svg class=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" \/>\n<\/svg>\n <\/div>\n <span class=\"text-muted-foreground text-sm font-medium\">\n TEXT\n <\/span>\n <\/div>\n\n \n <div class=\"flex items-center gap-2\">\n <button\n class=\"collapse-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-0\"\n data-default-state=\"expanded\"\n data-collapsed=\"false\"\n data-auto-collapse-lines=\"30\"\n data-auto-collapse-height=\"400\"\n data-collapsed-height=\"120\"\n title=\"\u6298\u53e0\"\n aria-label=\"\u6298\u53e0\">\n <span class=\"collapse-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\"\/><\/svg>\n <\/span>\n <span class=\"collapse-text hidden sm:inline\"\n >\u6298\u53e0<\/span\n >\n <\/button>\n <button\n class=\"copy-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-0\"\n title=\"\u590d\u5236\"\n aria-label=\"\u590d\u5236\">\n <span class=\"copy-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" \/>\n<\/svg>\n <\/span>\n <span class=\"copy-text hidden sm:inline\"\n >\u590d\u5236<\/span\n >\n <\/button>\n <\/div>\n <\/div>\n\n \n <div class=\"code-block-content relative\" id=\"code-0\">\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-text\" data-lang=\"text\"><span class=\"line\"><span class=\"cl\">\u957f\u671f\u80a1\u6743\u6295\u8d44-\u6295\u8d44\u6210\u672c\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> -\u635f\u76ca\u8c03\u6574\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> -\u5176\u4ed6\u7efc\u5408\u6536\u76ca\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> -\u5176\u4ed6\u6743\u76ca\u53d8\u52a8<\/span><\/span><\/code><\/pre><\/div>\n \n <div\n class=\"collapse-overlay to-card\/90 pointer-events-none absolute inset-0 bg-gradient-to-b from-transparent via-transparent opacity-0 transition-opacity duration-300\">\n <div\n class=\"text-muted-foreground bg-card\/80 border-border\/50 hover:bg-primary\/10 hover:text-primary hover:border-primary\/30 absolute bottom-4 left-1\/2 -translate-x-1\/2 cursor-pointer rounded-full border px-3 py-1.5 text-xs backdrop-blur-sm transition-all duration-200\">\n \u70b9\u51fb\u5c55\u5f00\u67e5\u770b\u66f4\u591a\n <\/div>\n <\/div>\n <\/div>\n<\/div>\n\n\n<script>\n(function() {\n const codeId = 'code-0';\n const copyBtn = document.querySelector('.copy-code-btn[data-code-id=\"' + codeId + '\"]');\n const collapseBtn = document.querySelector('.collapse-code-btn[data-code-id=\"' + codeId + '\"]');\n const codeContainer = document.getElementById(codeId);\n\n if (!codeContainer) return;\n\n \n if (copyBtn) {\n const copyIcon = copyBtn.querySelector('.copy-icon');\n const copyText = copyBtn.querySelector('.copy-text');\n\n copyBtn.addEventListener('click', async function() {\n try {\n \n let codeText = '';\n\n \n const codeTableCell = codeContainer.querySelector('.lntd:last-child code');\n if (codeTableCell) {\n codeText = codeTableCell.textContent || codeTableCell.innerText;\n } else {\n \n const codeElement = codeContainer.querySelector('code');\n if (codeElement) {\n \n const hasInlineLineNumbers = codeElement.querySelector('.ln');\n if (hasInlineLineNumbers) {\n \n const codeLines = codeElement.querySelectorAll('.cl');\n if (codeLines.length > 0) {\n codeText = Array.from(codeLines)\n .map(line => {\n const text = line.textContent || line.innerText;\n \n return text.replace(\/\\n+$\/, '');\n })\n .join('\\n')\n .replace(\/\\n+$\/, ''); \n } else {\n \n const allText = codeElement.textContent || codeElement.innerText;\n codeText = allText.replace(\/^\\d+\/gm, '').replace(\/^\\s+\/gm, '');\n }\n } else {\n \n codeText = codeElement.textContent || codeElement.innerText;\n }\n } else {\n \n codeText = codeContainer.textContent || codeContainer.innerText;\n }\n }\n\n \n codeText = codeText.trim();\n\n \n await navigator.clipboard.writeText(codeText);\n\n \n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M5 13l4 4L19 7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u5df2\u590d\u5236';\n }\n copyBtn.classList.add('text-green-600');\n\n \n setTimeout(() => {\n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n copyBtn.classList.remove('text-green-600');\n }, 2000);\n\n } catch (err) {\n console.error('\u590d\u5236\u5931\u8d25:', err);\n\n \n const range = document.createRange();\n const codeElement = codeContainer.querySelector('code') || codeContainer;\n range.selectNodeContents(codeElement);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n \n if (copyText) {\n copyText.textContent = '\u5df2\u9009\u62e9';\n }\n\n setTimeout(() => {\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n selection.removeAllRanges();\n }, 2000);\n }\n });\n }\n\n \n if (collapseBtn) {\n const collapseIcon = collapseBtn.querySelector('.collapse-icon');\n const collapseText = collapseBtn.querySelector('.collapse-text');\n const collapseOverlay = codeContainer.querySelector('.collapse-overlay');\n\n \n let codeElement = codeContainer.querySelector('pre.chroma');\n if (!codeElement) {\n codeElement = codeContainer.querySelector('pre');\n }\n\n const defaultState = collapseBtn.dataset.defaultState || 'expanded';\n const isCollapsedAttr = collapseBtn.dataset.collapsed === 'true';\n const autoCollapseLines = parseInt(collapseBtn.dataset.autoCollapseLines) || 30;\n const autoCollapseHeight = parseInt(collapseBtn.dataset.autoCollapseHeight) || 400;\n const collapsedHeight = parseInt(collapseBtn.dataset.collapsedHeight) || 120;\n\n let isCollapsed = false;\n\n \n function initCollapse() {\n \n const shouldCollapse = isCollapsedAttr ||\n defaultState === 'collapsed' ||\n shouldAutoCollapse();\n\n if (shouldCollapse) {\n setCollapsed(true, false); \n }\n }\n\n function shouldAutoCollapse() {\n \n if (codeElement) {\n const lines = codeElement.querySelectorAll('.line, .cl');\n const height = codeElement.offsetHeight;\n return lines.length > autoCollapseLines || height > autoCollapseHeight;\n }\n\n \n const containerHeight = codeContainer.offsetHeight;\n if (containerHeight > autoCollapseHeight) {\n return true;\n }\n\n \n const textContent = codeContainer.textContent || codeContainer.innerText || '';\n const estimatedLines = textContent.split('\\n').length;\n return estimatedLines > autoCollapseLines;\n }\n\n function setCollapsed(collapsed, animate = true) {\n if (!collapseOverlay) return;\n\n isCollapsed = collapsed;\n\n if (collapsed) {\n \n codeContainer.style.maxHeight = collapsedHeight + 'px';\n codeContainer.style.overflow = 'hidden';\n collapseOverlay.style.opacity = '1';\n collapseOverlay.style.pointerEvents = 'auto';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M19 9l-7 7-7-7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u5c55\u5f00';\n }\n collapseBtn.title = '\u5c55\u5f00';\n\n } else {\n \n codeContainer.style.maxHeight = '';\n codeContainer.style.overflow = '';\n collapseOverlay.style.opacity = '0';\n collapseOverlay.style.pointerEvents = 'none';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath fill=\\u0022currentColor\\u0022 d=\\u0022M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\\u0022\\\/\\u003e\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u6298\u53e0';\n }\n collapseBtn.title = '\u6298\u53e0';\n }\n\n \n if (animate) {\n codeContainer.style.transition = 'max-height 0.3s ease-out';\n setTimeout(() => {\n codeContainer.style.transition = '';\n }, 300);\n }\n }\n\n function toggleCollapse() {\n setCollapsed(!isCollapsed, true);\n }\n\n \n collapseBtn.addEventListener('click', toggleCollapse);\n\n \n if (collapseOverlay) {\n collapseOverlay.addEventListener('click', () => {\n if (isCollapsed) {\n setCollapsed(false, true);\n }\n });\n }\n\n \n initCollapse();\n }\n})();\n<\/script>\n<h2 id=\"\u521d\u59cb\u6295\u8d44\u6210\u672c\u7684\u8c03\u6574\">\u521d\u59cb\u6295\u8d44\u6210\u672c\u7684\u8c03\u6574<\/h2>\n<p><strong>\u521d\u59cb\u6295\u8d44\u6210\u672c<\/strong>\u4e3a\u5b9e\u9645\u4ed8\u51fa\u7684\u5bf9\u4ef7+\u521d\u59cb\u76f4\u63a5\u8d39\u7528<br>\n<strong>\u6295\u8d44\u65e5\u4eab\u6709\u7684\u88ab\u6295\u8d44\u5355\u4f4d\u53ef\u8fa8\u8ba4\u51c0\u8d44\u4ea7\u7684\u516c\u5141\u4ef7\u503c\u4efd\u989d<\/strong><br>\n<strong>\u4ee5\u4e0a\u4e24\u4e2a\u6309\u9ad8\u7684\u7b97<\/strong>\uff0c\u5982\u679c\u7b2c2\u4e2a\u9ad8\u4e86\uff0c\u4e5f\u5c31\u662f\u82b1\u4f4e\u4ef7\u4e70\u5230\u4e86\u9ad8\u516c\u5141\u4ef7\u7684\u8d44\u4ea7\uff0c\u5f62\u6210\u7684\u5dee\u989d\u8ba1<strong>\u8425\u4e1a\u5916\u6536\u5165<\/strong>\uff0c\u8fd9\u6837\u7684\u8bdd\u662f\u4e24\u4e2a\u5206\u5f55\uff1a<\/p>"},{"title":"\u8ba4\u8bc6hugo\u7684\u9875\u9762\u5305\uff08Page Bundles\uff09","link":"https:\/\/zrs.me\/38\/","pubDate":"Fri, 16 May 2025 12:30:46 +0800","guid":"https:\/\/zrs.me\/38\/","description":{}},{"title":"\u5b66\u4e60-\u5b9e\u52a1-\u957f\u6295-\u975e\u540c\u63a7\u4e0b\u7684\u4f01\u4e1a\u5408\u5e76","link":"https:\/\/zrs.me\/36\/","pubDate":"Fri, 16 May 2025 04:07:03 +0800","guid":"https:\/\/zrs.me\/36\/","description":{}},{"title":"\u6587\u7ae0\u56fa\u5b9a\u94fe\u63a5\u53ca\u56fe\u6587\u7684\u7ec4\u7ec7\u65b9\u5f0f","link":"https:\/\/zrs.me\/35\/","pubDate":"Thu, 15 May 2025 23:14:08 +0800","guid":"https:\/\/zrs.me\/35\/","description":{}},{"title":"\u8def\u8fb9\u644a\u4e70\u6765\u4e00\u53ea\u5c0f\u6a58\u732b","link":"https:\/\/zrs.me\/37\/","pubDate":"Thu, 15 May 2025 10:10:54 +0800","guid":"https:\/\/zrs.me\/37\/","description":{}},{"title":"\u5b66\u4e60-\u5b9e\u52a1-\u957f\u6295-\u540c\u63a7\u4e0b\u7684\u4f01\u4e1a\u5408\u5e76","link":"https:\/\/zrs.me\/34\/","pubDate":"Wed, 14 May 2025 23:27:57 +0800","guid":"https:\/\/zrs.me\/34\/","description":"\u540c\u4e00\u63a7\u5236\u4e0b\u7684\u4f01\u4e1a\u5408\u5e76\u4e4b\u521d\u59cb\u8ba1\u91cf"},{"title":"\u3010PowerShell\u3011\u56e0\u4e3a\u5728\u6b64\u7cfb\u7edf\u4e0a\u7981\u6b62\u8fd0\u884c\u811a\u672c\u7684\u89e3\u51b3\u65b9\u6cd5","link":"https:\/\/zrs.me\/33\/","pubDate":"Wed, 07 May 2025 16:11:12 +0800","guid":"https:\/\/zrs.me\/33\/","description":{}},{"title":"\u4f18\u5316\u535a\u5ba2\u4e2d\u6587\u7ae0\u7684\u56fa\u5b9a\u94fe\u63a5","link":"https:\/\/zrs.me\/32\/","pubDate":"Tue, 06 May 2025 12:17:15 +0800","guid":"https:\/\/zrs.me\/32\/","description":{}},{"title":"\u5bf9\u4e8ehugo\u7248\u672c\u7684\u8ba4\u8bc6","link":"https:\/\/zrs.me\/31\/","pubDate":"Mon, 05 May 2025 02:24:23 +0800","guid":"https:\/\/zrs.me\/31\/","description":{}},{"title":"\u6587\u7ae0\u56fa\u5b9a\u94fe\u63a5\u7684\u8bbe\u7f6e","link":"https:\/\/zrs.me\/30\/","pubDate":"Mon, 05 May 2025 01:22:57 +0800","guid":"https:\/\/zrs.me\/30\/","description":{}},{"title":"\u5b66\u4e60-\u8d22\u52a1\u7ba1\u7406-\u7b79\u8d44\u7ba1\u7406\uff08\u4e0b\uff09","link":"https:\/\/zrs.me\/29\/","pubDate":"Fri, 02 May 2025 20:10:43 +0800","guid":"https:\/\/zrs.me\/29\/","description":"<h2 id=\"\u7b2c\u4e00\u8282-\u8d44\u91d1\u9700\u8981\u91cf\u7684\u9884\u6d4b\">\u7b2c\u4e00\u8282 \u8d44\u91d1\u9700\u8981\u91cf\u7684\u9884\u6d4b<\/h2>\n<h4 id=\"\u56e0\u7d20\u5206\u6790\u6cd5\">\u56e0\u7d20\u5206\u6790\u6cd5<\/h4>\n<p>\u53c8\u79f0\u5206\u6790\u8c03\u6cd5\uff0c\u6839\u636e\u9884\u7b97\u5e74\u5ea6\u751f\u4ea7\u7ecf\u8425\u548c\u8d44\u91d1\u5468\u8f6c\u52a0\u901f\u7684\u8981\u6c42\uff0c\u8fdb\u884c\u5206\u6790\u8c03\u6574\u3002<br>\n\u516c\u5f0f\uff1a<br>\n<strong>\u8d44\u91d1\u9700\u8981\u91cf=\uff08\u57fa\u671f\u5e73\u5747\u8d44\u91d1\u7528\u91cf-\u4e0d\u5408\u7406\u7684\u8d44\u91d1\u5360\u7528\u91cf\uff09\u00d7\uff081+\u9884\u6d4b\u9500\u552e\u589e\u957f\u7387\uff09\u00f7\uff081+\u9884\u6d4b\u8d44\u91d1\u5468\u8f6c\u901f\u5ea6\u589e\u957f\u7387\uff09<\/strong><br>\n<strong>\uff08\u57fa\u671f\u5e73\u5747\u8d44\u91d1\u7528\u91cf-\u4e0d\u5408\u7406\u7684\u8d44\u91d1\u5360\u7528\u91cf\uff09<\/strong> \u53ef\u89c6\u4e3a\u57fa\u671f\u5408\u7406\u7684\u8d44\u91d1\u5360\u7528\u91cf\u3002<br>\n\uff08\u8ba1\u7b97\u65f6\u5982\u679c\u7ed9\u51fa\u8d44\u91d1\u5468\u8f6c\u901f\u5ea6\u51cf\u6162\u6216\u9500\u552e\u589e\u957f\u964d\u4f4e\uff0c\u5219\u4e3a\u8d1f\u53f7\uff0c\u6309\u51cf\u6cd5\u8ba1\u7b97\uff09\n\u7279\u70b9\uff1a\u8ba1\u7b97\u7b80\u4fbf\uff0c\u6613\u4e8e\u638c\u63e1\uff0c\u4f46\u9884\u6d4b\u7ed3\u679c\u4e0d\u592a\u7cbe\u786e\u3002<br>\n\u9002\u7528\uff1a\u54c1\u79cd\u7e41\u591a\uff0c\u89c4\u683c\u590d\u6742\uff0c\u8d44\u91d1\u5360\u7528\u91cf\u8f83\u5c0f\u7684\u9879\u76ee\u3002<\/p>"},{"title":"\u4f18\u5316\u535a\u5ba2\u6587\u7ae0md\u6587\u4ef6\u7684\u6392\u5e8f","link":"https:\/\/zrs.me\/28\/","pubDate":"Wed, 30 Apr 2025 01:29:19 +0800","guid":"https:\/\/zrs.me\/28\/","description":"<p>\u672c\u7ad9\u6b63\u5f0f\u542f\u7528\u4e00\u6708\u6709\u4f59\uff0c\u968f\u7740\u6587\u7ae0\u8d8a\u5199\u8d8a\u591a\uff0cvs code \u7f16\u8f91\u5668\u5de6\u4fa7\u7684\u5de5\u4f5c\u533a\u6587\u4ef6\u6d4f\u89c8\u4ee4\u6211\u5341\u5206\u56f0\u60d1\uff0c\u6587\u7ae0\u7684\u987a\u5e8f\u597d\u50cf\u4e0d\u662f\u6309\u65e5\u671f\u6392\u5e8f\u7684\uff0c\u597d\u50cf\u662f\u6309\u5b57\u6bcd\u6392\u5e8f\u3002\u4e00\u773c\u671b\u53bb\u4e0d\u77e5\u9053\u5148\u540e\u987a\u5e8f\u548c\u5199\u4f5c\u65e5\u671f\u3002\u5982\u56fe\uff1a<br>\n\n<figure class=\"image-figure not-prose my-8\" \n data-lightbox-enabled=\"false\"\n data-gallery-type=\"auto\">\n <div class=\"image-container\">\n <img\n src=\"https:\/\/tcc.zrs.xyz\/usr\/uploads\/2025\/04\/1037036207.png\"\n alt=\"img202504300117.png\"\n \n \n loading=\"lazy\"\n decoding=\"async\"\n data-gallery-src=\"https:\/\/tcc.zrs.xyz\/usr\/uploads\/2025\/04\/1037036207.png\"\n data-gallery-alt=\"img202504300117.png\"\n data-gallery-title=\"\" \/><\/div>\n\n <\/figure><\/p>"},{"title":"\u53c8\u4ece\u96f6\u5f00\u59cb\u5c1d\u8bd5\u642d\u5efa\u535a\u5ba2","link":"https:\/\/zrs.me\/27\/","pubDate":"Tue, 29 Apr 2025 13:24:59 +0800","guid":"https:\/\/zrs.me\/27\/","description":{}},{"title":"\u672c\u7ad9\u7533\u8bf7\u4e86\u840c\u56fd\u5907\u6848","link":"https:\/\/zrs.me\/26\/","pubDate":"Tue, 29 Apr 2025 00:35:37 +0800","guid":"https:\/\/zrs.me\/26\/","description":{}},{"title":"\u9759\u6001\u535a\u5ba2\u8ba9\u4eba\u66f4\u4e13\u6ce8\u4e8e\u5199\u4f5c","link":"https:\/\/zrs.me\/25\/","pubDate":"Sun, 27 Apr 2025 22:58:32 +0800","guid":"https:\/\/zrs.me\/25\/","description":{}},{"title":"Twikoo\u8bc4\u8bba\u7cfb\u7edf\u7684\u90e8\u7f72","link":"https:\/\/zrs.me\/24\/","pubDate":"Sun, 27 Apr 2025 09:56:08 +0800","guid":"https:\/\/zrs.me\/24\/","description":{}},{"title":"\u6211\u4e3a\u4ec0\u4e48\u4fe1\u9053\u4e0d\u4fe1\u4f5b","link":"https:\/\/zrs.me\/23\/","pubDate":"Thu, 24 Apr 2025 12:21:40 +0800","guid":"https:\/\/zrs.me\/23\/","description":{}},{"title":"\u535a\u5ba2\u8d77\u4e86\u4e2a\u65b0\u540d\u5b57","link":"https:\/\/zrs.me\/22\/","pubDate":"Wed, 23 Apr 2025 12:02:15 +0800","guid":"https:\/\/zrs.me\/22\/","description":{}},{"title":"\u535a\u5ba2\u90e8\u7f72\u81f3vercel","link":"https:\/\/zrs.me\/21\/","pubDate":"Wed, 23 Apr 2025 03:12:04 +0800","guid":"https:\/\/zrs.me\/21\/","description":{}},{"title":"\u5b66\u4e60-\u5b9e\u52a1-\u65e0\u5f62\u8d44\u4ea7","link":"https:\/\/zrs.me\/20\/","pubDate":"Mon, 21 Apr 2025 21:46:06 +0800","guid":"https:\/\/zrs.me\/20\/","description":{}},{"title":"\u672c\u5730\u7f16\u8f91\u5668vs Code","link":"https:\/\/zrs.me\/19\/","pubDate":"Tue, 15 Apr 2025 00:44:29 +0800","guid":"https:\/\/zrs.me\/19\/","description":{}},{"title":"\u5b66\u4e60 \u5b9e\u52a1 \u56fa\u5b9a\u8d44\u4ea7","link":"https:\/\/zrs.me\/18\/","pubDate":"Sun, 13 Apr 2025 23:35:38 +0800","guid":"https:\/\/zrs.me\/18\/","description":{}},{"title":"\u5b66\u4e60-\u5b9e\u52a1-\u5b58\u8d27\u59d4\u6258\u52a0\u5de5\u4e2d\u7684\u6d88\u8d39\u7a0e","link":"https:\/\/zrs.me\/17\/","pubDate":"Sun, 13 Apr 2025 02:28:42 +0800","guid":"https:\/\/zrs.me\/17\/","description":{}},{"title":"\u7ed3\u675f\u4e86office365\uff0c\u6362\u4e0a\u4e86WPS","link":"https:\/\/zrs.me\/16\/","pubDate":"Wed, 09 Apr 2025 17:51:10 +0800","guid":"https:\/\/zrs.me\/16\/","description":{}},{"title":"\u672c\u7ad9\u7684\u90e8\u7f72","link":"https:\/\/zrs.me\/15\/","pubDate":"Wed, 09 Apr 2025 02:09:41 +0800","guid":"https:\/\/zrs.me\/15\/","description":{}},{"title":"\u672c\u5957\u6a21\u677f\u76ee\u524d\u53d1\u73b0\u95ee\u9898","link":"https:\/\/zrs.me\/14\/","pubDate":"Tue, 08 Apr 2025 16:25:01 +0800","guid":"https:\/\/zrs.me\/14\/","description":{}},{"title":"\u5b66\u4e60-\u8d22\u52a1\u7ba1\u7406-\u884d\u751f\u5de5\u5177\u7b79\u8d44-\u8ba4\u80a1\u6743\u8bc1\u3001\u4f18\u5148\u80a1","link":"https:\/\/zrs.me\/13\/","pubDate":"Tue, 08 Apr 2025 01:07:51 +0800","guid":"https:\/\/zrs.me\/13\/","description":{}},{"title":"Hugo\u7684\u5e38\u7528\u547d\u4ee4","link":"https:\/\/zrs.me\/12\/","pubDate":"Tue, 08 Apr 2025 00:08:46 +0800","guid":"https:\/\/zrs.me\/12\/","description":{}},{"title":"Hugo\u4f18\u5316\u4e3b\u9898\u6a21\u677f\u7684\u4e00\u4e9b\u5185\u5bb9","link":"https:\/\/zrs.me\/11\/","pubDate":"Tue, 08 Apr 2025 00:00:54 +0800","guid":"https:\/\/zrs.me\/11\/","description":{}},{"title":"\u91cd\u65b0\u914d\u7f6egithub\u4ed3\u5e93","link":"https:\/\/zrs.me\/10\/","pubDate":"Sat, 05 Apr 2025 22:18:11 +0800","guid":"https:\/\/zrs.me\/10\/","description":{}},{"title":"hugo\u5728windows\u4e0b\u7684\u5b89\u88c5","link":"https:\/\/zrs.me\/9\/","pubDate":"Sat, 05 Apr 2025 17:44:23 +0800","guid":"https:\/\/zrs.me\/9\/","description":"\u5728windows\u4e0b\u5b89\u88c5hugo\u5e76\u914d\u7f6e\u73af\u5883\u53d8\u91cf\u3002"},{"title":"\u5b66\u4e60-\u8d22\u52a1\u7ba1\u7406-\u884d\u751f\u5de5\u5177\u7b79\u8d44-\u53ef\u8f6c\u6362\u503a\u5238","link":"https:\/\/zrs.me\/8\/","pubDate":"Sat, 05 Apr 2025 00:03:00 +0800","guid":"https:\/\/zrs.me\/8\/","description":{}},{"title":"hugo\u4e0ewp,ty\u7684\u4f53\u9a8c\u611f\u53d7","link":"https:\/\/zrs.me\/7\/","pubDate":"Fri, 04 Apr 2025 01:40:00 +0800","guid":"https:\/\/zrs.me\/7\/","description":{}},{"title":"\u518d\u6b21\u642d\u5efa\u6210\u529f\u5e76\u8bb0\u4e00\u5904\u4e3b\u9898\u4fee\u6539\u5185\u5bb9","link":"https:\/\/zrs.me\/6\/","pubDate":"Fri, 04 Apr 2025 00:03:23 +0800","guid":"https:\/\/zrs.me\/6\/","description":{}},{"title":"\u81ea\u5df1\u518d\u6b21\u642d\u5efa\u5931\u8d25","link":"https:\/\/zrs.me\/5\/","pubDate":"Thu, 03 Apr 2025 00:18:23 +0800","guid":"https:\/\/zrs.me\/5\/","description":{}},{"title":"\u672c\u7ad9\u7684\u642d\u5efa","link":"https:\/\/zrs.me\/4\/","pubDate":"Wed, 02 Apr 2025 00:18:23 +0800","guid":"https:\/\/zrs.me\/4\/","description":"<p>\u672c\u7ad9\u4f7f\u7528hugo+github pages\u642d\u5efa\uff1b<\/p>\n<p>\u600e\u4e48\u642d\u5efa\u8d77\u6765\u597d\u50cf\u5df2\u7ecf\u5b8c\u5168\u5fd8\u8bb0\u4e86\uff1b<\/p>\n<p>hugo\u7248\u672c124\uff0c\u4e3b\u9898\u6a21\u677fsulv-hugo-papermod-main\uff1b<\/p>"},{"title":"\u5173\u4e8e","link":"https:\/\/zrs.me\/about\/","pubDate":"Tue, 01 Apr 2025 23:59:59 +0800","guid":"https:\/\/zrs.me\/about\/","description":{}},{"title":"\u7ae5\u8da3","link":"https:\/\/zrs.me\/3\/","pubDate":"Mon, 31 Mar 2025 00:18:15 +0800","guid":"https:\/\/zrs.me\/3\/","description":"\u4f59\u5fc6\u7ae5\u7a1a\u65f6\uff0c\u80fd\u5f20\u76ee\u5bf9\u65e5\u3002"},{"title":"\u3010AI\u3011DeepSeek\u7684\u56de\u7b54\u8ba9\u6211\u4e00\u60ca","link":"https:\/\/zrs.me\/2\/","pubDate":"Mon, 31 Mar 2025 00:17:58 +0800","guid":"https:\/\/zrs.me\/2\/","description":{}},{"title":"hello world","link":"https:\/\/zrs.me\/1\/","pubDate":"Mon, 02 Sep 2024 00:00:00 +0800","guid":"https:\/\/zrs.me\/1\/","description":{}},{"title":"KaTeX \u548c Mermaid \u6d4b\u8bd5","link":"https:\/\/zrs.me\/katex-mermaid-test\/","pubDate":"Wed, 17 Jan 2024 10:00:00 +0800","guid":"https:\/\/zrs.me\/katex-mermaid-test\/","description":"<h1 id=\"katex-\u548c-mermaid-\u6d4b\u8bd5\">KaTeX \u548c Mermaid \u6d4b\u8bd5<\/h1>\n<p>\u672c\u6587\u7528\u4e8e\u6d4b\u8bd5 KaTeX \u6570\u5b66\u516c\u5f0f\u6e32\u67d3\u548c Mermaid \u56fe\u8868\u529f\u80fd\u3002<\/p>\n<h2 id=\"mermaid-\u56fe\u8868\u6d4b\u8bd5\">Mermaid \u56fe\u8868\u6d4b\u8bd5<\/h2>\n<h3 id=\"\u6d41\u7a0b\u56fe\">\u6d41\u7a0b\u56fe<\/h3>\n\n\n\n<pre class=\"mermaid\">\n graph TD\n A[\u5f00\u59cb] --&gt; B{\u662f\u5426\u4e3a\u7528\u6237\uff1f}\n B --&gt;|\u662f| C[\u663e\u793a\u7528\u6237\u754c\u9762]\n B --&gt;|\u5426| D[\u663e\u793a\u767b\u5f55\u9875\u9762]\n C --&gt; E[\u7528\u6237\u64cd\u4f5c]\n D --&gt; F[\u7528\u6237\u767b\u5f55]\n F --&gt; G{\u767b\u5f55\u6210\u529f\uff1f}\n G --&gt;|\u662f| C\n G --&gt;|\u5426| H[\u663e\u793a\u9519\u8bef\u4fe1\u606f]\n H --&gt; D\n E --&gt; I[\u7ed3\u675f]\n<\/pre>\n\n<h3 id=\"\u5e8f\u5217\u56fe\">\u5e8f\u5217\u56fe<\/h3>\n\n\n\n<pre class=\"mermaid\">\n sequenceDiagram\n participant \u7528\u6237\n participant \u6d4f\u89c8\u5668\n participant \u670d\u52a1\u5668\n participant \u6570\u636e\u5e93\n\n \u7528\u6237-&gt;&gt;\u6d4f\u89c8\u5668: \u8f93\u5165\u7f51\u5740\n \u6d4f\u89c8\u5668-&gt;&gt;\u670d\u52a1\u5668: \u53d1\u9001HTTP\u8bf7\u6c42\n \u670d\u52a1\u5668-&gt;&gt;\u6570\u636e\u5e93: \u67e5\u8be2\u6570\u636e\n \u6570\u636e\u5e93--&gt;&gt;\u670d\u52a1\u5668: \u8fd4\u56de\u6570\u636e\n \u670d\u52a1\u5668--&gt;&gt;\u6d4f\u89c8\u5668: \u8fd4\u56deHTML\n \u6d4f\u89c8\u5668--&gt;&gt;\u7528\u6237: \u663e\u793a\u9875\u9762\n<\/pre>\n\n<h3 id=\"\u7518\u7279\u56fe\">\u7518\u7279\u56fe<\/h3>\n\n\n\n<pre class=\"mermaid\">\n gantt\n title \u9879\u76ee\u5f00\u53d1\u65f6\u95f4\u7ebf\n dateFormat YYYY-MM-DD\n section \u8bbe\u8ba1\u9636\u6bb5\n \u9700\u6c42\u5206\u6790 :done, des1, 2024-01-01,2024-01-05\n UI\u8bbe\u8ba1 :done, des2, 2024-01-06, 2024-01-12\n \u539f\u578b\u5236\u4f5c :active, des3, 2024-01-13, 2024-01-18\n section \u5f00\u53d1\u9636\u6bb5\n \u524d\u7aef\u5f00\u53d1 : dev1, 2024-01-19, 2024-02-15\n \u540e\u7aef\u5f00\u53d1 : dev2, 2024-01-19, 2024-02-20\n \u6570\u636e\u5e93\u8bbe\u8ba1 : dev3, 2024-01-19, 2024-01-25\n section \u6d4b\u8bd5\u9636\u6bb5\n \u5355\u5143\u6d4b\u8bd5 : test1, 2024-02-16, 2024-02-25\n \u96c6\u6210\u6d4b\u8bd5 : test2, 2024-02-21, 2024-03-01\n \u7528\u6237\u6d4b\u8bd5 : test3, 2024-02-26, 2024-03-05\n<\/pre>\n\n<h2 id=\"katex-\u6d4b\u8bd5\">KaTeX \u6d4b\u8bd5<\/h2>\n<h3 id=\"\u884c\u5185\u516c\u5f0f\">\u884c\u5185\u516c\u5f0f<\/h3>\n<p>\u8fd9\u662f\u4e00\u4e2a\u884c\u5185\u516c\u5f0f\uff1a$E = mc^2$\uff0c\u7231\u56e0\u65af\u5766\u7684\u8d28\u80fd\u7b49\u4ef7\u516c\u5f0f\u3002<\/p>"},{"title":"\u4ee3\u7801\u9ad8\u4eae\u6d4b\u8bd5","link":"https:\/\/zrs.me\/code-highlighting-test\/","pubDate":"Tue, 16 Jan 2024 10:00:00 +0800","guid":"https:\/\/zrs.me\/code-highlighting-test\/","description":"<h1 id=\"\u4ee3\u7801\u9ad8\u4eae\u6d4b\u8bd5\">\u4ee3\u7801\u9ad8\u4eae\u6d4b\u8bd5<\/h1>\n<p>\u672c\u6587\u7528\u4e8e\u6d4b\u8bd5\u65b0\u7684\u4ee3\u7801\u9ad8\u4eae\u529f\u80fd\uff0c\u5305\u62ec\u8bed\u6cd5\u9ad8\u4eae\u3001\u590d\u5236\u6309\u94ae\u3001\u8bed\u8a00\u663e\u793a\u7b49\u3002<\/p>\n<h2 id=\"javascript\">JavaScript<\/h2>\n<div\n class=\"code-block-container border-border bg-card my-6 overflow-hidden rounded-xl border shadow-sm transition-all duration-200 ease-out hover:-translate-y-0.5 hover:shadow-md\">\n \n <div\n class=\"code-block-header bg-muted\/30 border-border flex items-center justify-between border-b px-4 py-3\">\n \n <div class=\"flex items-center gap-2\">\n <div class=\"text-muted-foreground flex-shrink-0\">\n \n <svg class=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" \/>\n<\/svg>\n <\/div>\n <span class=\"text-muted-foreground text-sm font-medium\">\n JAVASCRIPT\n <\/span>\n <\/div>\n\n \n <div class=\"flex items-center gap-2\">\n <button\n class=\"collapse-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-0\"\n data-default-state=\"expanded\"\n data-collapsed=\"false\"\n data-auto-collapse-lines=\"30\"\n data-auto-collapse-height=\"400\"\n data-collapsed-height=\"120\"\n title=\"\u6298\u53e0\"\n aria-label=\"\u6298\u53e0\">\n <span class=\"collapse-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\"\/><\/svg>\n <\/span>\n <span class=\"collapse-text hidden sm:inline\"\n >\u6298\u53e0<\/span\n >\n <\/button>\n <button\n class=\"copy-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-0\"\n title=\"\u590d\u5236\"\n aria-label=\"\u590d\u5236\">\n <span class=\"copy-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" \/>\n<\/svg>\n <\/span>\n <span class=\"copy-text hidden sm:inline\"\n >\u590d\u5236<\/span\n >\n <\/button>\n <\/div>\n <\/div>\n\n \n <div class=\"code-block-content relative\" id=\"code-0\">\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-javascript\" data-lang=\"javascript\"><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">function<\/span> <span class=\"nx\">fibonacci<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">n<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"nx\">n<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">fibonacci<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">fibonacci<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">2<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kr\">const<\/span> <span class=\"nx\">result<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">fibonacci<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"sb\">`\u7b2c10\u4e2a\u6590\u6ce2\u90a3\u5951\u6570\u662f\uff1a<\/span><span class=\"si\">${<\/span><span class=\"nx\">result<\/span><span class=\"si\">}<\/span><span class=\"sb\">`<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u5f02\u6b65\/\u7b49\u5f85\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\"><\/span><span class=\"kr\">const<\/span> <span class=\"nx\">asyncFunction<\/span> <span class=\"o\">=<\/span> <span class=\"kr\">async<\/span> <span class=\"p\">()<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kr\">const<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=<\/span> <span class=\"kr\">await<\/span> <span class=\"nx\">fetch<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;\/api\/data&#39;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kr\">const<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=<\/span> <span class=\"kr\">await<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">data<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;\u83b7\u53d6\u6570\u636e\u65f6\u51fa\u9519\uff1a&#39;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">error<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">};<\/span><\/span><\/span><\/code><\/pre><\/div>\n \n <div\n class=\"collapse-overlay to-card\/90 pointer-events-none absolute inset-0 bg-gradient-to-b from-transparent via-transparent opacity-0 transition-opacity duration-300\">\n <div\n class=\"text-muted-foreground bg-card\/80 border-border\/50 hover:bg-primary\/10 hover:text-primary hover:border-primary\/30 absolute bottom-4 left-1\/2 -translate-x-1\/2 cursor-pointer rounded-full border px-3 py-1.5 text-xs backdrop-blur-sm transition-all duration-200\">\n \u70b9\u51fb\u5c55\u5f00\u67e5\u770b\u66f4\u591a\n <\/div>\n <\/div>\n <\/div>\n<\/div>\n\n\n<script>\n(function() {\n const codeId = 'code-0';\n const copyBtn = document.querySelector('.copy-code-btn[data-code-id=\"' + codeId + '\"]');\n const collapseBtn = document.querySelector('.collapse-code-btn[data-code-id=\"' + codeId + '\"]');\n const codeContainer = document.getElementById(codeId);\n\n if (!codeContainer) return;\n\n \n if (copyBtn) {\n const copyIcon = copyBtn.querySelector('.copy-icon');\n const copyText = copyBtn.querySelector('.copy-text');\n\n copyBtn.addEventListener('click', async function() {\n try {\n \n let codeText = '';\n\n \n const codeTableCell = codeContainer.querySelector('.lntd:last-child code');\n if (codeTableCell) {\n codeText = codeTableCell.textContent || codeTableCell.innerText;\n } else {\n \n const codeElement = codeContainer.querySelector('code');\n if (codeElement) {\n \n const hasInlineLineNumbers = codeElement.querySelector('.ln');\n if (hasInlineLineNumbers) {\n \n const codeLines = codeElement.querySelectorAll('.cl');\n if (codeLines.length > 0) {\n codeText = Array.from(codeLines)\n .map(line => {\n const text = line.textContent || line.innerText;\n \n return text.replace(\/\\n+$\/, '');\n })\n .join('\\n')\n .replace(\/\\n+$\/, ''); \n } else {\n \n const allText = codeElement.textContent || codeElement.innerText;\n codeText = allText.replace(\/^\\d+\/gm, '').replace(\/^\\s+\/gm, '');\n }\n } else {\n \n codeText = codeElement.textContent || codeElement.innerText;\n }\n } else {\n \n codeText = codeContainer.textContent || codeContainer.innerText;\n }\n }\n\n \n codeText = codeText.trim();\n\n \n await navigator.clipboard.writeText(codeText);\n\n \n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M5 13l4 4L19 7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u5df2\u590d\u5236';\n }\n copyBtn.classList.add('text-green-600');\n\n \n setTimeout(() => {\n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n copyBtn.classList.remove('text-green-600');\n }, 2000);\n\n } catch (err) {\n console.error('\u590d\u5236\u5931\u8d25:', err);\n\n \n const range = document.createRange();\n const codeElement = codeContainer.querySelector('code') || codeContainer;\n range.selectNodeContents(codeElement);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n \n if (copyText) {\n copyText.textContent = '\u5df2\u9009\u62e9';\n }\n\n setTimeout(() => {\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n selection.removeAllRanges();\n }, 2000);\n }\n });\n }\n\n \n if (collapseBtn) {\n const collapseIcon = collapseBtn.querySelector('.collapse-icon');\n const collapseText = collapseBtn.querySelector('.collapse-text');\n const collapseOverlay = codeContainer.querySelector('.collapse-overlay');\n\n \n let codeElement = codeContainer.querySelector('pre.chroma');\n if (!codeElement) {\n codeElement = codeContainer.querySelector('pre');\n }\n\n const defaultState = collapseBtn.dataset.defaultState || 'expanded';\n const isCollapsedAttr = collapseBtn.dataset.collapsed === 'true';\n const autoCollapseLines = parseInt(collapseBtn.dataset.autoCollapseLines) || 30;\n const autoCollapseHeight = parseInt(collapseBtn.dataset.autoCollapseHeight) || 400;\n const collapsedHeight = parseInt(collapseBtn.dataset.collapsedHeight) || 120;\n\n let isCollapsed = false;\n\n \n function initCollapse() {\n \n const shouldCollapse = isCollapsedAttr ||\n defaultState === 'collapsed' ||\n shouldAutoCollapse();\n\n if (shouldCollapse) {\n setCollapsed(true, false); \n }\n }\n\n function shouldAutoCollapse() {\n \n if (codeElement) {\n const lines = codeElement.querySelectorAll('.line, .cl');\n const height = codeElement.offsetHeight;\n return lines.length > autoCollapseLines || height > autoCollapseHeight;\n }\n\n \n const containerHeight = codeContainer.offsetHeight;\n if (containerHeight > autoCollapseHeight) {\n return true;\n }\n\n \n const textContent = codeContainer.textContent || codeContainer.innerText || '';\n const estimatedLines = textContent.split('\\n').length;\n return estimatedLines > autoCollapseLines;\n }\n\n function setCollapsed(collapsed, animate = true) {\n if (!collapseOverlay) return;\n\n isCollapsed = collapsed;\n\n if (collapsed) {\n \n codeContainer.style.maxHeight = collapsedHeight + 'px';\n codeContainer.style.overflow = 'hidden';\n collapseOverlay.style.opacity = '1';\n collapseOverlay.style.pointerEvents = 'auto';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M19 9l-7 7-7-7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u5c55\u5f00';\n }\n collapseBtn.title = '\u5c55\u5f00';\n\n } else {\n \n codeContainer.style.maxHeight = '';\n codeContainer.style.overflow = '';\n collapseOverlay.style.opacity = '0';\n collapseOverlay.style.pointerEvents = 'none';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath fill=\\u0022currentColor\\u0022 d=\\u0022M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\\u0022\\\/\\u003e\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u6298\u53e0';\n }\n collapseBtn.title = '\u6298\u53e0';\n }\n\n \n if (animate) {\n codeContainer.style.transition = 'max-height 0.3s ease-out';\n setTimeout(() => {\n codeContainer.style.transition = '';\n }, 300);\n }\n }\n\n function toggleCollapse() {\n setCollapsed(!isCollapsed, true);\n }\n\n \n collapseBtn.addEventListener('click', toggleCollapse);\n\n \n if (collapseOverlay) {\n collapseOverlay.addEventListener('click', () => {\n if (isCollapsed) {\n setCollapsed(false, true);\n }\n });\n }\n\n \n initCollapse();\n }\n})();\n<\/script>\n<h2 id=\"\u5e26\u884c\u53f7\u7684\u4ee3\u7801\u5757\">\u5e26\u884c\u53f7\u7684\u4ee3\u7801\u5757<\/h2>\n<div\n class=\"code-block-container border-border bg-card my-6 overflow-hidden rounded-xl border shadow-sm transition-all duration-200 ease-out hover:-translate-y-0.5 hover:shadow-md\">\n \n <div\n class=\"code-block-header bg-muted\/30 border-border flex items-center justify-between border-b px-4 py-3\">\n \n <div class=\"flex items-center gap-2\">\n <div class=\"text-muted-foreground flex-shrink-0\">\n \n <svg class=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" \/>\n<\/svg>\n <\/div>\n <span class=\"text-muted-foreground text-sm font-medium\">\n PYTHON\n <\/span>\n <\/div>\n\n \n <div class=\"flex items-center gap-2\">\n <button\n class=\"collapse-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-1\"\n data-default-state=\"expanded\"\n data-collapsed=\"false\"\n data-auto-collapse-lines=\"30\"\n data-auto-collapse-height=\"400\"\n data-collapsed-height=\"120\"\n title=\"\u6298\u53e0\"\n aria-label=\"\u6298\u53e0\">\n <span class=\"collapse-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\"\/><\/svg>\n <\/span>\n <span class=\"collapse-text hidden sm:inline\"\n >\u6298\u53e0<\/span\n >\n <\/button>\n <button\n class=\"copy-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-1\"\n title=\"\u590d\u5236\"\n aria-label=\"\u590d\u5236\">\n <span class=\"copy-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" \/>\n<\/svg>\n <\/span>\n <span class=\"copy-text hidden sm:inline\"\n >\u590d\u5236<\/span\n >\n <\/button>\n <\/div>\n <\/div>\n\n \n <div class=\"code-block-content relative\" id=\"code-1\">\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-python\" data-lang=\"python\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"c1\"># \u5e26\u884c\u53f7\u7684 Python \u4ee3\u7801<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"nn\">asyncio<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"kn\">from<\/span> <span class=\"nn\">typing<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">List<\/span><span class=\"p\">,<\/span> <span class=\"n\">Optional<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"k\">class<\/span> <span class=\"nc\">DataProcessor<\/span><span class=\"p\">:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"> <span class=\"k\">def<\/span> <span class=\"fm\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span><span class=\"p\">:<\/span> <span class=\"n\">List<\/span><span class=\"p\">[<\/span><span class=\"nb\">dict<\/span><span class=\"p\">]):<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">data<\/span> <span class=\"o\">=<\/span> <span class=\"n\">data<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"> <span class=\"k\">def<\/span> <span class=\"nf\">process<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">Optional<\/span><span class=\"p\">[<\/span><span class=\"nb\">dict<\/span><span class=\"p\">]:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"> <span class=\"s2\">&#34;&#34;&#34;\u5904\u7406\u6570\u636e\u5e76\u8fd4\u56de\u7ed3\u679c&#34;&#34;&#34;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">data<\/span><span class=\"p\">:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"kc\">None<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"> <span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"> <span class=\"s1\">&#39;total&#39;<\/span><span class=\"p\">:<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">data<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"> <span class=\"s1\">&#39;processed&#39;<\/span><span class=\"p\">:<\/span> <span class=\"p\">[]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">18<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">19<\/span><span class=\"cl\"> <span class=\"k\">for<\/span> <span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">data<\/span><span class=\"p\">:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">20<\/span><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">validate_item<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">):<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">21<\/span><span class=\"cl\"> <span class=\"n\">result<\/span><span class=\"p\">[<\/span><span class=\"s1\">&#39;processed&#39;<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">22<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">23<\/span><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">result<\/span><\/span><\/span><\/code><\/pre><\/div>\n \n <div\n class=\"collapse-overlay to-card\/90 pointer-events-none absolute inset-0 bg-gradient-to-b from-transparent via-transparent opacity-0 transition-opacity duration-300\">\n <div\n class=\"text-muted-foreground bg-card\/80 border-border\/50 hover:bg-primary\/10 hover:text-primary hover:border-primary\/30 absolute bottom-4 left-1\/2 -translate-x-1\/2 cursor-pointer rounded-full border px-3 py-1.5 text-xs backdrop-blur-sm transition-all duration-200\">\n \u70b9\u51fb\u5c55\u5f00\u67e5\u770b\u66f4\u591a\n <\/div>\n <\/div>\n <\/div>\n<\/div>\n\n\n<script>\n(function() {\n const codeId = 'code-1';\n const copyBtn = document.querySelector('.copy-code-btn[data-code-id=\"' + codeId + '\"]');\n const collapseBtn = document.querySelector('.collapse-code-btn[data-code-id=\"' + codeId + '\"]');\n const codeContainer = document.getElementById(codeId);\n\n if (!codeContainer) return;\n\n \n if (copyBtn) {\n const copyIcon = copyBtn.querySelector('.copy-icon');\n const copyText = copyBtn.querySelector('.copy-text');\n\n copyBtn.addEventListener('click', async function() {\n try {\n \n let codeText = '';\n\n \n const codeTableCell = codeContainer.querySelector('.lntd:last-child code');\n if (codeTableCell) {\n codeText = codeTableCell.textContent || codeTableCell.innerText;\n } else {\n \n const codeElement = codeContainer.querySelector('code');\n if (codeElement) {\n \n const hasInlineLineNumbers = codeElement.querySelector('.ln');\n if (hasInlineLineNumbers) {\n \n const codeLines = codeElement.querySelectorAll('.cl');\n if (codeLines.length > 0) {\n codeText = Array.from(codeLines)\n .map(line => {\n const text = line.textContent || line.innerText;\n \n return text.replace(\/\\n+$\/, '');\n })\n .join('\\n')\n .replace(\/\\n+$\/, ''); \n } else {\n \n const allText = codeElement.textContent || codeElement.innerText;\n codeText = allText.replace(\/^\\d+\/gm, '').replace(\/^\\s+\/gm, '');\n }\n } else {\n \n codeText = codeElement.textContent || codeElement.innerText;\n }\n } else {\n \n codeText = codeContainer.textContent || codeContainer.innerText;\n }\n }\n\n \n codeText = codeText.trim();\n\n \n await navigator.clipboard.writeText(codeText);\n\n \n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M5 13l4 4L19 7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u5df2\u590d\u5236';\n }\n copyBtn.classList.add('text-green-600');\n\n \n setTimeout(() => {\n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n copyBtn.classList.remove('text-green-600');\n }, 2000);\n\n } catch (err) {\n console.error('\u590d\u5236\u5931\u8d25:', err);\n\n \n const range = document.createRange();\n const codeElement = codeContainer.querySelector('code') || codeContainer;\n range.selectNodeContents(codeElement);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n \n if (copyText) {\n copyText.textContent = '\u5df2\u9009\u62e9';\n }\n\n setTimeout(() => {\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n selection.removeAllRanges();\n }, 2000);\n }\n });\n }\n\n \n if (collapseBtn) {\n const collapseIcon = collapseBtn.querySelector('.collapse-icon');\n const collapseText = collapseBtn.querySelector('.collapse-text');\n const collapseOverlay = codeContainer.querySelector('.collapse-overlay');\n\n \n let codeElement = codeContainer.querySelector('pre.chroma');\n if (!codeElement) {\n codeElement = codeContainer.querySelector('pre');\n }\n\n const defaultState = collapseBtn.dataset.defaultState || 'expanded';\n const isCollapsedAttr = collapseBtn.dataset.collapsed === 'true';\n const autoCollapseLines = parseInt(collapseBtn.dataset.autoCollapseLines) || 30;\n const autoCollapseHeight = parseInt(collapseBtn.dataset.autoCollapseHeight) || 400;\n const collapsedHeight = parseInt(collapseBtn.dataset.collapsedHeight) || 120;\n\n let isCollapsed = false;\n\n \n function initCollapse() {\n \n const shouldCollapse = isCollapsedAttr ||\n defaultState === 'collapsed' ||\n shouldAutoCollapse();\n\n if (shouldCollapse) {\n setCollapsed(true, false); \n }\n }\n\n function shouldAutoCollapse() {\n \n if (codeElement) {\n const lines = codeElement.querySelectorAll('.line, .cl');\n const height = codeElement.offsetHeight;\n return lines.length > autoCollapseLines || height > autoCollapseHeight;\n }\n\n \n const containerHeight = codeContainer.offsetHeight;\n if (containerHeight > autoCollapseHeight) {\n return true;\n }\n\n \n const textContent = codeContainer.textContent || codeContainer.innerText || '';\n const estimatedLines = textContent.split('\\n').length;\n return estimatedLines > autoCollapseLines;\n }\n\n function setCollapsed(collapsed, animate = true) {\n if (!collapseOverlay) return;\n\n isCollapsed = collapsed;\n\n if (collapsed) {\n \n codeContainer.style.maxHeight = collapsedHeight + 'px';\n codeContainer.style.overflow = 'hidden';\n collapseOverlay.style.opacity = '1';\n collapseOverlay.style.pointerEvents = 'auto';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M19 9l-7 7-7-7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u5c55\u5f00';\n }\n collapseBtn.title = '\u5c55\u5f00';\n\n } else {\n \n codeContainer.style.maxHeight = '';\n codeContainer.style.overflow = '';\n collapseOverlay.style.opacity = '0';\n collapseOverlay.style.pointerEvents = 'none';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath fill=\\u0022currentColor\\u0022 d=\\u0022M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\\u0022\\\/\\u003e\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u6298\u53e0';\n }\n collapseBtn.title = '\u6298\u53e0';\n }\n\n \n if (animate) {\n codeContainer.style.transition = 'max-height 0.3s ease-out';\n setTimeout(() => {\n codeContainer.style.transition = '';\n }, 300);\n }\n }\n\n function toggleCollapse() {\n setCollapsed(!isCollapsed, true);\n }\n\n \n collapseBtn.addEventListener('click', toggleCollapse);\n\n \n if (collapseOverlay) {\n collapseOverlay.addEventListener('click', () => {\n if (isCollapsed) {\n setCollapsed(false, true);\n }\n });\n }\n\n \n initCollapse();\n }\n})();\n<\/script>\n<h2 id=\"\u9ad8\u4eae\u7279\u5b9a\u884c\">\u9ad8\u4eae\u7279\u5b9a\u884c<\/h2>\n<div\n class=\"code-block-container border-border bg-card my-6 overflow-hidden rounded-xl border shadow-sm transition-all duration-200 ease-out hover:-translate-y-0.5 hover:shadow-md\">\n \n <div\n class=\"code-block-header bg-muted\/30 border-border flex items-center justify-between border-b px-4 py-3\">\n \n <div class=\"flex items-center gap-2\">\n <div class=\"text-muted-foreground flex-shrink-0\">\n \n <svg class=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" \/>\n<\/svg>\n <\/div>\n <span class=\"text-muted-foreground text-sm font-medium\">\n GO\n <\/span>\n <\/div>\n\n \n <div class=\"flex items-center gap-2\">\n <button\n class=\"collapse-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-2\"\n data-default-state=\"expanded\"\n data-collapsed=\"false\"\n data-auto-collapse-lines=\"30\"\n data-auto-collapse-height=\"400\"\n data-collapsed-height=\"120\"\n title=\"\u6298\u53e0\"\n aria-label=\"\u6298\u53e0\">\n <span class=\"collapse-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\"\/><\/svg>\n <\/span>\n <span class=\"collapse-text hidden sm:inline\"\n >\u6298\u53e0<\/span\n >\n <\/button>\n <button\n class=\"copy-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-2\"\n title=\"\u590d\u5236\"\n aria-label=\"\u590d\u5236\">\n <span class=\"copy-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" \/>\n<\/svg>\n <\/span>\n <span class=\"copy-text hidden sm:inline\"\n >\u590d\u5236<\/span\n >\n <\/button>\n <\/div>\n <\/div>\n\n \n <div class=\"code-block-content relative\" id=\"code-2\">\n <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kn\">package<\/span> <span class=\"nx\">main<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line hl\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"s\">&#34;fmt&#34;<\/span> <span class=\"c1\">\/\/ \u8fd9\u4e00\u884c\u5c06\u88ab\u9ad8\u4eae<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line hl\"><span class=\"ln\"> 6<\/span><span class=\"cl\"> <span class=\"nx\">message<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">&#34;\u4f60\u597d\uff0c\u4e16\u754c\uff01&#34;<\/span> <span class=\"c1\">\/\/ \u8fd9\u4e00\u884c\u4e5f\u5c06\u88ab\u9ad8\u4eae<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line hl\"><span class=\"ln\"> 8<\/span><span class=\"cl\"> <span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">message<\/span><span class=\"p\">)<\/span> <span class=\"c1\">\/\/ \u8fd9\u4e00\u884c\u4e5f\u5c06\u88ab\u9ad8\u4eae<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"> <span class=\"k\">for<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span> <span class=\"nx\">i<\/span> <span class=\"p\">&lt;<\/span> <span class=\"mi\">3<\/span><span class=\"p\">;<\/span> <span class=\"nx\">i<\/span><span class=\"o\">++<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"> <span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Printf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\u8ba1\u6570\uff1a%d\\n&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">i<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n \n <div\n class=\"collapse-overlay to-card\/90 pointer-events-none absolute inset-0 bg-gradient-to-b from-transparent via-transparent opacity-0 transition-opacity duration-300\">\n <div\n class=\"text-muted-foreground bg-card\/80 border-border\/50 hover:bg-primary\/10 hover:text-primary hover:border-primary\/30 absolute bottom-4 left-1\/2 -translate-x-1\/2 cursor-pointer rounded-full border px-3 py-1.5 text-xs backdrop-blur-sm transition-all duration-200\">\n \u70b9\u51fb\u5c55\u5f00\u67e5\u770b\u66f4\u591a\n <\/div>\n <\/div>\n <\/div>\n<\/div>\n\n\n<script>\n(function() {\n const codeId = 'code-2';\n const copyBtn = document.querySelector('.copy-code-btn[data-code-id=\"' + codeId + '\"]');\n const collapseBtn = document.querySelector('.collapse-code-btn[data-code-id=\"' + codeId + '\"]');\n const codeContainer = document.getElementById(codeId);\n\n if (!codeContainer) return;\n\n \n if (copyBtn) {\n const copyIcon = copyBtn.querySelector('.copy-icon');\n const copyText = copyBtn.querySelector('.copy-text');\n\n copyBtn.addEventListener('click', async function() {\n try {\n \n let codeText = '';\n\n \n const codeTableCell = codeContainer.querySelector('.lntd:last-child code');\n if (codeTableCell) {\n codeText = codeTableCell.textContent || codeTableCell.innerText;\n } else {\n \n const codeElement = codeContainer.querySelector('code');\n if (codeElement) {\n \n const hasInlineLineNumbers = codeElement.querySelector('.ln');\n if (hasInlineLineNumbers) {\n \n const codeLines = codeElement.querySelectorAll('.cl');\n if (codeLines.length > 0) {\n codeText = Array.from(codeLines)\n .map(line => {\n const text = line.textContent || line.innerText;\n \n return text.replace(\/\\n+$\/, '');\n })\n .join('\\n')\n .replace(\/\\n+$\/, ''); \n } else {\n \n const allText = codeElement.textContent || codeElement.innerText;\n codeText = allText.replace(\/^\\d+\/gm, '').replace(\/^\\s+\/gm, '');\n }\n } else {\n \n codeText = codeElement.textContent || codeElement.innerText;\n }\n } else {\n \n codeText = codeContainer.textContent || codeContainer.innerText;\n }\n }\n\n \n codeText = codeText.trim();\n\n \n await navigator.clipboard.writeText(codeText);\n\n \n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M5 13l4 4L19 7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u5df2\u590d\u5236';\n }\n copyBtn.classList.add('text-green-600');\n\n \n setTimeout(() => {\n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n copyBtn.classList.remove('text-green-600');\n }, 2000);\n\n } catch (err) {\n console.error('\u590d\u5236\u5931\u8d25:', err);\n\n \n const range = document.createRange();\n const codeElement = codeContainer.querySelector('code') || codeContainer;\n range.selectNodeContents(codeElement);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n \n if (copyText) {\n copyText.textContent = '\u5df2\u9009\u62e9';\n }\n\n setTimeout(() => {\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n selection.removeAllRanges();\n }, 2000);\n }\n });\n }\n\n \n if (collapseBtn) {\n const collapseIcon = collapseBtn.querySelector('.collapse-icon');\n const collapseText = collapseBtn.querySelector('.collapse-text');\n const collapseOverlay = codeContainer.querySelector('.collapse-overlay');\n\n \n let codeElement = codeContainer.querySelector('pre.chroma');\n if (!codeElement) {\n codeElement = codeContainer.querySelector('pre');\n }\n\n const defaultState = collapseBtn.dataset.defaultState || 'expanded';\n const isCollapsedAttr = collapseBtn.dataset.collapsed === 'true';\n const autoCollapseLines = parseInt(collapseBtn.dataset.autoCollapseLines) || 30;\n const autoCollapseHeight = parseInt(collapseBtn.dataset.autoCollapseHeight) || 400;\n const collapsedHeight = parseInt(collapseBtn.dataset.collapsedHeight) || 120;\n\n let isCollapsed = false;\n\n \n function initCollapse() {\n \n const shouldCollapse = isCollapsedAttr ||\n defaultState === 'collapsed' ||\n shouldAutoCollapse();\n\n if (shouldCollapse) {\n setCollapsed(true, false); \n }\n }\n\n function shouldAutoCollapse() {\n \n if (codeElement) {\n const lines = codeElement.querySelectorAll('.line, .cl');\n const height = codeElement.offsetHeight;\n return lines.length > autoCollapseLines || height > autoCollapseHeight;\n }\n\n \n const containerHeight = codeContainer.offsetHeight;\n if (containerHeight > autoCollapseHeight) {\n return true;\n }\n\n \n const textContent = codeContainer.textContent || codeContainer.innerText || '';\n const estimatedLines = textContent.split('\\n').length;\n return estimatedLines > autoCollapseLines;\n }\n\n function setCollapsed(collapsed, animate = true) {\n if (!collapseOverlay) return;\n\n isCollapsed = collapsed;\n\n if (collapsed) {\n \n codeContainer.style.maxHeight = collapsedHeight + 'px';\n codeContainer.style.overflow = 'hidden';\n collapseOverlay.style.opacity = '1';\n collapseOverlay.style.pointerEvents = 'auto';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M19 9l-7 7-7-7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u5c55\u5f00';\n }\n collapseBtn.title = '\u5c55\u5f00';\n\n } else {\n \n codeContainer.style.maxHeight = '';\n codeContainer.style.overflow = '';\n collapseOverlay.style.opacity = '0';\n collapseOverlay.style.pointerEvents = 'none';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath fill=\\u0022currentColor\\u0022 d=\\u0022M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\\u0022\\\/\\u003e\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u6298\u53e0';\n }\n collapseBtn.title = '\u6298\u53e0';\n }\n\n \n if (animate) {\n codeContainer.style.transition = 'max-height 0.3s ease-out';\n setTimeout(() => {\n codeContainer.style.transition = '';\n }, 300);\n }\n }\n\n function toggleCollapse() {\n setCollapsed(!isCollapsed, true);\n }\n\n \n collapseBtn.addEventListener('click', toggleCollapse);\n\n \n if (collapseOverlay) {\n collapseOverlay.addEventListener('click', () => {\n if (isCollapsed) {\n setCollapsed(false, true);\n }\n });\n }\n\n \n initCollapse();\n }\n})();\n<\/script>\n<h2 id=\"\u5e26\u6587\u4ef6\u540d\u7684\u4ee3\u7801\u5757\">\u5e26\u6587\u4ef6\u540d\u7684\u4ee3\u7801\u5757<\/h2>\n<div\n class=\"code-block-container border-border bg-card my-6 overflow-hidden rounded-xl border shadow-sm transition-all duration-200 ease-out hover:-translate-y-0.5 hover:shadow-md\">\n \n <div\n class=\"code-block-header bg-muted\/30 border-border flex items-center justify-between border-b px-4 py-3\">\n \n <div class=\"flex items-center gap-2\">\n <div class=\"text-muted-foreground flex-shrink-0\">\n \n <svg class=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" \/>\n<\/svg>\n <\/div>\n <span class=\"text-muted-foreground text-sm font-medium\">\n api.ts\n <\/span>\n <\/div>\n\n \n <div class=\"flex items-center gap-2\">\n <button\n class=\"collapse-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-3\"\n data-default-state=\"expanded\"\n data-collapsed=\"false\"\n data-auto-collapse-lines=\"30\"\n data-auto-collapse-height=\"400\"\n data-collapsed-height=\"120\"\n title=\"\u6298\u53e0\"\n aria-label=\"\u6298\u53e0\">\n <span class=\"collapse-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\"\/><\/svg>\n <\/span>\n <span class=\"collapse-text hidden sm:inline\"\n >\u6298\u53e0<\/span\n >\n <\/button>\n <button\n class=\"copy-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-3\"\n title=\"\u590d\u5236\"\n aria-label=\"\u590d\u5236\">\n <span class=\"copy-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" \/>\n<\/svg>\n <\/span>\n <span class=\"copy-text hidden sm:inline\"\n >\u590d\u5236<\/span\n >\n <\/button>\n <\/div>\n <\/div>\n\n \n <div class=\"code-block-content relative\" id=\"code-3\">\n <div class=\"highlight\" filename=\"api.ts\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-typescript\" data-lang=\"typescript\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ TypeScript API\n<\/span><\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\"><\/span><span class=\"kr\">interface<\/span> <span class=\"nx\">ApiResponse<\/span><span class=\"p\">&lt;<\/span><span class=\"nt\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">data<\/span>: <span class=\"kt\">T<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">status<\/span>: <span class=\"kt\">number<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">message<\/span>: <span class=\"kt\">string<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kr\">interface<\/span> <span class=\"nx\">User<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">id<\/span>: <span class=\"kt\">number<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">name<\/span>: <span class=\"kt\">string<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">email<\/span>: <span class=\"kt\">string<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">avatar?<\/span>: <span class=\"kt\">string<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kr\">class<\/span> <span class=\"nx\">ApiClient<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kr\">private<\/span> <span class=\"nx\">baseURL<\/span>: <span class=\"kt\">string<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kr\">private<\/span> <span class=\"nx\">headers<\/span>: <span class=\"kt\">Record<\/span><span class=\"p\">&lt;<\/span><span class=\"nt\">string<\/span><span class=\"p\">,<\/span> <span class=\"na\">string<\/span><span class=\"p\">&gt;;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kr\">constructor<\/span><span class=\"p\">(<\/span><span class=\"nx\">baseURL<\/span>: <span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"nx\">apiKey?<\/span>: <span class=\"kt\">string<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">baseURL<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">baseURL<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">headers<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"s1\">&#39;Content-Type&#39;<\/span><span class=\"o\">:<\/span> <span class=\"s1\">&#39;application\/json&#39;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">...(<\/span><span class=\"nx\">apiKey<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"p\">{<\/span> <span class=\"s1\">&#39;Authorization&#39;<\/span><span class=\"o\">:<\/span> <span class=\"sb\">`Bearer <\/span><span class=\"si\">${<\/span><span class=\"nx\">apiKey<\/span><span class=\"si\">}<\/span><span class=\"sb\">`<\/span> <span class=\"p\">})<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">};<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kr\">async<\/span> <span class=\"kr\">get<\/span><span class=\"p\">&lt;<\/span><span class=\"nt\">T<\/span><span class=\"p\">&gt;(<\/span><span class=\"nx\">endpoint<\/span>: <span class=\"kt\">string<\/span><span class=\"p\">)<\/span><span class=\"o\">:<\/span> <span class=\"nx\">Promise<\/span><span class=\"p\">&lt;<\/span><span class=\"nt\">ApiResponse<\/span><span class=\"p\">&lt;<\/span><span class=\"nt\">T<\/span><span class=\"p\">&gt;&gt;<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kr\">const<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">fetch<\/span><span class=\"p\">(<\/span><span class=\"sb\">`<\/span><span class=\"si\">${<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">baseURL<\/span><span class=\"si\">}${<\/span><span class=\"nx\">endpoint<\/span><span class=\"si\">}<\/span><span class=\"sb\">`<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">method<\/span><span class=\"o\">:<\/span> <span class=\"s1\">&#39;GET&#39;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">headers<\/span>: <span class=\"kt\">this.headers<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">});<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nx\">ok<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nb\">Error<\/span><span class=\"p\">(<\/span><span class=\"sb\">`HTTP \u9519\u8bef\uff01\u72b6\u6001\uff1a<\/span><span class=\"si\">${<\/span><span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nx\">status<\/span><span class=\"si\">}<\/span><span class=\"sb\">`<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kr\">async<\/span> <span class=\"nx\">post<\/span><span class=\"p\">&lt;<\/span><span class=\"nt\">T<\/span><span class=\"p\">&gt;(<\/span><span class=\"nx\">endpoint<\/span>: <span class=\"kt\">string<\/span><span class=\"p\">,<\/span> <span class=\"nx\">data<\/span>: <span class=\"kt\">any<\/span><span class=\"p\">)<\/span><span class=\"o\">:<\/span> <span class=\"nx\">Promise<\/span><span class=\"p\">&lt;<\/span><span class=\"nt\">ApiResponse<\/span><span class=\"p\">&lt;<\/span><span class=\"nt\">T<\/span><span class=\"p\">&gt;&gt;<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kr\">const<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">fetch<\/span><span class=\"p\">(<\/span><span class=\"sb\">`<\/span><span class=\"si\">${<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">baseURL<\/span><span class=\"si\">}${<\/span><span class=\"nx\">endpoint<\/span><span class=\"si\">}<\/span><span class=\"sb\">`<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">method<\/span><span class=\"o\">:<\/span> <span class=\"s1\">&#39;POST&#39;<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">headers<\/span>: <span class=\"kt\">this.headers<\/span><span class=\"p\">,<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">body<\/span>: <span class=\"kt\">JSON.stringify<\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">),<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">});<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kr\">const<\/span> <span class=\"nx\">client<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">ApiClient<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;https:\/\/api.example.com&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;your-api-key&#39;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kr\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nx\">getUsers<\/span><span class=\"p\">()<\/span><span class=\"o\">:<\/span> <span class=\"nx\">Promise<\/span><span class=\"p\">&lt;<\/span><span class=\"nt\">User<\/span><span class=\"err\">[]<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"kr\">const<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"kr\">get<\/span><span class=\"p\">&lt;<\/span><span class=\"nt\">User<\/span><span class=\"err\">[]<\/span><span class=\"p\">&gt;(<\/span><span class=\"s1\">&#39;\/users&#39;<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;\u83b7\u53d6\u7528\u6237\u65f6\u51fa\u9519\uff1a&#39;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">error<\/span><span class=\"p\">);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"p\">[];<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n \n <div\n class=\"collapse-overlay to-card\/90 pointer-events-none absolute inset-0 bg-gradient-to-b from-transparent via-transparent opacity-0 transition-opacity duration-300\">\n <div\n class=\"text-muted-foreground bg-card\/80 border-border\/50 hover:bg-primary\/10 hover:text-primary hover:border-primary\/30 absolute bottom-4 left-1\/2 -translate-x-1\/2 cursor-pointer rounded-full border px-3 py-1.5 text-xs backdrop-blur-sm transition-all duration-200\">\n \u70b9\u51fb\u5c55\u5f00\u67e5\u770b\u66f4\u591a\n <\/div>\n <\/div>\n <\/div>\n<\/div>\n\n\n<script>\n(function() {\n const codeId = 'code-3';\n const copyBtn = document.querySelector('.copy-code-btn[data-code-id=\"' + codeId + '\"]');\n const collapseBtn = document.querySelector('.collapse-code-btn[data-code-id=\"' + codeId + '\"]');\n const codeContainer = document.getElementById(codeId);\n\n if (!codeContainer) return;\n\n \n if (copyBtn) {\n const copyIcon = copyBtn.querySelector('.copy-icon');\n const copyText = copyBtn.querySelector('.copy-text');\n\n copyBtn.addEventListener('click', async function() {\n try {\n \n let codeText = '';\n\n \n const codeTableCell = codeContainer.querySelector('.lntd:last-child code');\n if (codeTableCell) {\n codeText = codeTableCell.textContent || codeTableCell.innerText;\n } else {\n \n const codeElement = codeContainer.querySelector('code');\n if (codeElement) {\n \n const hasInlineLineNumbers = codeElement.querySelector('.ln');\n if (hasInlineLineNumbers) {\n \n const codeLines = codeElement.querySelectorAll('.cl');\n if (codeLines.length > 0) {\n codeText = Array.from(codeLines)\n .map(line => {\n const text = line.textContent || line.innerText;\n \n return text.replace(\/\\n+$\/, '');\n })\n .join('\\n')\n .replace(\/\\n+$\/, ''); \n } else {\n \n const allText = codeElement.textContent || codeElement.innerText;\n codeText = allText.replace(\/^\\d+\/gm, '').replace(\/^\\s+\/gm, '');\n }\n } else {\n \n codeText = codeElement.textContent || codeElement.innerText;\n }\n } else {\n \n codeText = codeContainer.textContent || codeContainer.innerText;\n }\n }\n\n \n codeText = codeText.trim();\n\n \n await navigator.clipboard.writeText(codeText);\n\n \n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M5 13l4 4L19 7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u5df2\u590d\u5236';\n }\n copyBtn.classList.add('text-green-600');\n\n \n setTimeout(() => {\n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n copyBtn.classList.remove('text-green-600');\n }, 2000);\n\n } catch (err) {\n console.error('\u590d\u5236\u5931\u8d25:', err);\n\n \n const range = document.createRange();\n const codeElement = codeContainer.querySelector('code') || codeContainer;\n range.selectNodeContents(codeElement);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n \n if (copyText) {\n copyText.textContent = '\u5df2\u9009\u62e9';\n }\n\n setTimeout(() => {\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n selection.removeAllRanges();\n }, 2000);\n }\n });\n }\n\n \n if (collapseBtn) {\n const collapseIcon = collapseBtn.querySelector('.collapse-icon');\n const collapseText = collapseBtn.querySelector('.collapse-text');\n const collapseOverlay = codeContainer.querySelector('.collapse-overlay');\n\n \n let codeElement = codeContainer.querySelector('pre.chroma');\n if (!codeElement) {\n codeElement = codeContainer.querySelector('pre');\n }\n\n const defaultState = collapseBtn.dataset.defaultState || 'expanded';\n const isCollapsedAttr = collapseBtn.dataset.collapsed === 'true';\n const autoCollapseLines = parseInt(collapseBtn.dataset.autoCollapseLines) || 30;\n const autoCollapseHeight = parseInt(collapseBtn.dataset.autoCollapseHeight) || 400;\n const collapsedHeight = parseInt(collapseBtn.dataset.collapsedHeight) || 120;\n\n let isCollapsed = false;\n\n \n function initCollapse() {\n \n const shouldCollapse = isCollapsedAttr ||\n defaultState === 'collapsed' ||\n shouldAutoCollapse();\n\n if (shouldCollapse) {\n setCollapsed(true, false); \n }\n }\n\n function shouldAutoCollapse() {\n \n if (codeElement) {\n const lines = codeElement.querySelectorAll('.line, .cl');\n const height = codeElement.offsetHeight;\n return lines.length > autoCollapseLines || height > autoCollapseHeight;\n }\n\n \n const containerHeight = codeContainer.offsetHeight;\n if (containerHeight > autoCollapseHeight) {\n return true;\n }\n\n \n const textContent = codeContainer.textContent || codeContainer.innerText || '';\n const estimatedLines = textContent.split('\\n').length;\n return estimatedLines > autoCollapseLines;\n }\n\n function setCollapsed(collapsed, animate = true) {\n if (!collapseOverlay) return;\n\n isCollapsed = collapsed;\n\n if (collapsed) {\n \n codeContainer.style.maxHeight = collapsedHeight + 'px';\n codeContainer.style.overflow = 'hidden';\n collapseOverlay.style.opacity = '1';\n collapseOverlay.style.pointerEvents = 'auto';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M19 9l-7 7-7-7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u5c55\u5f00';\n }\n collapseBtn.title = '\u5c55\u5f00';\n\n } else {\n \n codeContainer.style.maxHeight = '';\n codeContainer.style.overflow = '';\n collapseOverlay.style.opacity = '0';\n collapseOverlay.style.pointerEvents = 'none';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath fill=\\u0022currentColor\\u0022 d=\\u0022M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\\u0022\\\/\\u003e\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u6298\u53e0';\n }\n collapseBtn.title = '\u6298\u53e0';\n }\n\n \n if (animate) {\n codeContainer.style.transition = 'max-height 0.3s ease-out';\n setTimeout(() => {\n codeContainer.style.transition = '';\n }, 300);\n }\n }\n\n function toggleCollapse() {\n setCollapsed(!isCollapsed, true);\n }\n\n \n collapseBtn.addEventListener('click', toggleCollapse);\n\n \n if (collapseOverlay) {\n collapseOverlay.addEventListener('click', () => {\n if (isCollapsed) {\n setCollapsed(false, true);\n }\n });\n }\n\n \n initCollapse();\n }\n})();\n<\/script>\n<h2 id=\"\u7eaf\u6587\u672c\u4ee3\u7801\u5757\">\u7eaf\u6587\u672c\u4ee3\u7801\u5757<\/h2>\n<div\n class=\"code-block-container border-border bg-card my-6 overflow-hidden rounded-xl border shadow-sm transition-all duration-200 ease-out hover:-translate-y-0.5 hover:shadow-md\">\n \n <div\n class=\"code-block-header bg-muted\/30 border-border flex items-center justify-between border-b px-4 py-3\">\n \n <div class=\"flex items-center gap-2\">\n <div class=\"text-muted-foreground flex-shrink-0\">\n \n <svg class=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" \/>\n<\/svg>\n <\/div>\n <span class=\"text-muted-foreground text-sm font-medium\">\n PLAINTEXT\n <\/span>\n <\/div>\n\n \n <div class=\"flex items-center gap-2\">\n <button\n class=\"collapse-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-4\"\n data-default-state=\"expanded\"\n data-collapsed=\"false\"\n data-auto-collapse-lines=\"30\"\n data-auto-collapse-height=\"400\"\n data-collapsed-height=\"120\"\n title=\"\u6298\u53e0\"\n aria-label=\"\u6298\u53e0\">\n <span class=\"collapse-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\"\/><\/svg>\n <\/span>\n <span class=\"collapse-text hidden sm:inline\"\n >\u6298\u53e0<\/span\n >\n <\/button>\n <button\n class=\"copy-code-btn text-muted-foreground hover:text-primary hover:bg-primary\/10 focus:ring-primary\/20 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-all duration-200 ease-out focus:ring-2 focus:outline-none\"\n data-code-id=\"code-4\"\n title=\"\u590d\u5236\"\n aria-label=\"\u590d\u5236\">\n <span class=\"copy-icon\">\n \n <svg class=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" \/>\n<\/svg>\n <\/span>\n <span class=\"copy-text hidden sm:inline\"\n >\u590d\u5236<\/span\n >\n <\/button>\n <\/div>\n <\/div>\n\n \n <div class=\"code-block-content relative\" id=\"code-4\">\n <pre tabindex=\"0\"><code>\u8fd9\u662f\u4e00\u4e2a\u7eaf\u6587\u672c\u4ee3\u7801\u5757\u3002\n\u5b83\u4e0d\u5e94\u8be5\u6709\u8bed\u6cd5\u9ad8\u4eae\u3002\n\u4f60\u53ef\u4ee5\u5728\u8fd9\u91cc\u6d4b\u8bd5\u590d\u5236\u529f\u80fd\u3002\n\nfunction test() {\n console.log(&#34;\u8fd9\u662f\u4e00\u4e2a\u6d4b\u8bd5\u3002&#34;);\n}<\/code><\/pre>\n \n <div\n class=\"collapse-overlay to-card\/90 pointer-events-none absolute inset-0 bg-gradient-to-b from-transparent via-transparent opacity-0 transition-opacity duration-300\">\n <div\n class=\"text-muted-foreground bg-card\/80 border-border\/50 hover:bg-primary\/10 hover:text-primary hover:border-primary\/30 absolute bottom-4 left-1\/2 -translate-x-1\/2 cursor-pointer rounded-full border px-3 py-1.5 text-xs backdrop-blur-sm transition-all duration-200\">\n \u70b9\u51fb\u5c55\u5f00\u67e5\u770b\u66f4\u591a\n <\/div>\n <\/div>\n <\/div>\n<\/div>\n\n\n<script>\n(function() {\n const codeId = 'code-4';\n const copyBtn = document.querySelector('.copy-code-btn[data-code-id=\"' + codeId + '\"]');\n const collapseBtn = document.querySelector('.collapse-code-btn[data-code-id=\"' + codeId + '\"]');\n const codeContainer = document.getElementById(codeId);\n\n if (!codeContainer) return;\n\n \n if (copyBtn) {\n const copyIcon = copyBtn.querySelector('.copy-icon');\n const copyText = copyBtn.querySelector('.copy-text');\n\n copyBtn.addEventListener('click', async function() {\n try {\n \n let codeText = '';\n\n \n const codeTableCell = codeContainer.querySelector('.lntd:last-child code');\n if (codeTableCell) {\n codeText = codeTableCell.textContent || codeTableCell.innerText;\n } else {\n \n const codeElement = codeContainer.querySelector('code');\n if (codeElement) {\n \n const hasInlineLineNumbers = codeElement.querySelector('.ln');\n if (hasInlineLineNumbers) {\n \n const codeLines = codeElement.querySelectorAll('.cl');\n if (codeLines.length > 0) {\n codeText = Array.from(codeLines)\n .map(line => {\n const text = line.textContent || line.innerText;\n \n return text.replace(\/\\n+$\/, '');\n })\n .join('\\n')\n .replace(\/\\n+$\/, ''); \n } else {\n \n const allText = codeElement.textContent || codeElement.innerText;\n codeText = allText.replace(\/^\\d+\/gm, '').replace(\/^\\s+\/gm, '');\n }\n } else {\n \n codeText = codeElement.textContent || codeElement.innerText;\n }\n } else {\n \n codeText = codeContainer.textContent || codeContainer.innerText;\n }\n }\n\n \n codeText = codeText.trim();\n\n \n await navigator.clipboard.writeText(codeText);\n\n \n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M5 13l4 4L19 7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u5df2\u590d\u5236';\n }\n copyBtn.classList.add('text-green-600');\n\n \n setTimeout(() => {\n copyIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n copyBtn.classList.remove('text-green-600');\n }, 2000);\n\n } catch (err) {\n console.error('\u590d\u5236\u5931\u8d25:', err);\n\n \n const range = document.createRange();\n const codeElement = codeContainer.querySelector('code') || codeContainer;\n range.selectNodeContents(codeElement);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n \n if (copyText) {\n copyText.textContent = '\u5df2\u9009\u62e9';\n }\n\n setTimeout(() => {\n if (copyText) {\n copyText.textContent = '\u590d\u5236';\n }\n selection.removeAllRanges();\n }, 2000);\n }\n });\n }\n\n \n if (collapseBtn) {\n const collapseIcon = collapseBtn.querySelector('.collapse-icon');\n const collapseText = collapseBtn.querySelector('.collapse-text');\n const collapseOverlay = codeContainer.querySelector('.collapse-overlay');\n\n \n let codeElement = codeContainer.querySelector('pre.chroma');\n if (!codeElement) {\n codeElement = codeContainer.querySelector('pre');\n }\n\n const defaultState = collapseBtn.dataset.defaultState || 'expanded';\n const isCollapsedAttr = collapseBtn.dataset.collapsed === 'true';\n const autoCollapseLines = parseInt(collapseBtn.dataset.autoCollapseLines) || 30;\n const autoCollapseHeight = parseInt(collapseBtn.dataset.autoCollapseHeight) || 400;\n const collapsedHeight = parseInt(collapseBtn.dataset.collapsedHeight) || 120;\n\n let isCollapsed = false;\n\n \n function initCollapse() {\n \n const shouldCollapse = isCollapsedAttr ||\n defaultState === 'collapsed' ||\n shouldAutoCollapse();\n\n if (shouldCollapse) {\n setCollapsed(true, false); \n }\n }\n\n function shouldAutoCollapse() {\n \n if (codeElement) {\n const lines = codeElement.querySelectorAll('.line, .cl');\n const height = codeElement.offsetHeight;\n return lines.length > autoCollapseLines || height > autoCollapseHeight;\n }\n\n \n const containerHeight = codeContainer.offsetHeight;\n if (containerHeight > autoCollapseHeight) {\n return true;\n }\n\n \n const textContent = codeContainer.textContent || codeContainer.innerText || '';\n const estimatedLines = textContent.split('\\n').length;\n return estimatedLines > autoCollapseLines;\n }\n\n function setCollapsed(collapsed, animate = true) {\n if (!collapseOverlay) return;\n\n isCollapsed = collapsed;\n\n if (collapsed) {\n \n codeContainer.style.maxHeight = collapsedHeight + 'px';\n codeContainer.style.overflow = 'hidden';\n collapseOverlay.style.opacity = '1';\n collapseOverlay.style.pointerEvents = 'auto';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath stroke-linecap=\\u0022round\\u0022 stroke-linejoin=\\u0022round\\u0022 stroke-width=\\u00222\\u0022 d=\\u0022M19 9l-7 7-7-7\\u0022 \\\/\\u003e\\n\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u5c55\u5f00';\n }\n collapseBtn.title = '\u5c55\u5f00';\n\n } else {\n \n codeContainer.style.maxHeight = '';\n codeContainer.style.overflow = '';\n collapseOverlay.style.opacity = '0';\n collapseOverlay.style.pointerEvents = 'none';\n\n \n collapseIcon.innerHTML = `\\n \\u003csvg class=\\u0022h-3 w-3\\u0022\\n fill=\\u0022none\\u0022\\n stroke=\\u0022currentColor\\u0022\\n viewBox=\\u00220 0 24 24\\u0022\\u003e\\u003cpath fill=\\u0022currentColor\\u0022 d=\\u0022M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6l-6 6z\\u0022\\\/\\u003e\\u003c\\\/svg\\u003e`;\n if (collapseText) {\n collapseText.textContent = '\u6298\u53e0';\n }\n collapseBtn.title = '\u6298\u53e0';\n }\n\n \n if (animate) {\n codeContainer.style.transition = 'max-height 0.3s ease-out';\n setTimeout(() => {\n codeContainer.style.transition = '';\n }, 300);\n }\n }\n\n function toggleCollapse() {\n setCollapsed(!isCollapsed, true);\n }\n\n \n collapseBtn.addEventListener('click', toggleCollapse);\n\n \n if (collapseOverlay) {\n collapseOverlay.addEventListener('click', () => {\n if (isCollapsed) {\n setCollapsed(false, true);\n }\n });\n }\n\n \n initCollapse();\n }\n})();\n<\/script>\n<h2 id=\"\u884c\u5185\u4ee3\u7801\">\u884c\u5185\u4ee3\u7801<\/h2>\n<p>\u8fd9\u662f\u4e00\u4e2a\u884c\u5185\u4ee3\u7801\u793a\u4f8b\uff1a<code>const x = 42;<\/code> \u548c <code>npm install<\/code> \u4ee5\u53ca <code>git commit -m &quot;\u66f4\u65b0&quot;<\/code>\u3002<\/p>"},{"title":"Markdown \u8bed\u6cd5\u6d4b\u8bd5\u6587\u6863","link":"https:\/\/zrs.me\/markdown-%E8%AF%AD%E6%B3%95%E6%B5%8B%E8%AF%95%E6%96%87%E6%A1%A3\/","pubDate":"Mon, 15 Jan 2024 10:00:00 +0800","guid":"https:\/\/zrs.me\/markdown-%E8%AF%AD%E6%B3%95%E6%B5%8B%E8%AF%95%E6%96%87%E6%A1%A3\/","description":"\u8fd9\u662f\u4e00\u4e2a\u5305\u542b\u5404\u79cd Markdown \u8bed\u6cd5\u7684\u6d4b\u8bd5\u6587\u6863\uff0c\u7528\u4e8e\u9a8c\u8bc1\u6587\u6863\u6837\u5f0f\u7684\u5b8c\u6574\u6027\u3002"},{"title":"GitHub \u98ce\u683c\u63d0\u793a\u6846\u6d4b\u8bd5","link":"https:\/\/zrs.me\/test-alert\/","pubDate":"Mon, 01 Jan 2024 00:00:00 +0800","guid":"https:\/\/zrs.me\/test-alert\/","description":"<h1 id=\"github-\u98ce\u683c\u63d0\u793a\u6846\u6d4b\u8bd5\">GitHub \u98ce\u683c\u63d0\u793a\u6846\u6d4b\u8bd5<\/h1>\n<p>\u672c\u6587\u7528\u4e8e\u6d4b\u8bd5\u65b0\u7684 GitHub \u98ce\u683c\u63d0\u793a\u6846\u529f\u80fd\u548c\u6298\u53e0\u529f\u80fd\u3002<\/p>\n<h2 id=\"\u63d0\u793a\u6846\u8bed\u6cd5\">\u63d0\u793a\u6846\u8bed\u6cd5<\/h2>\n<h3 id=\"\u6ce8\u610f\u63d0\u793a\u6846\">\u6ce8\u610f\u63d0\u793a\u6846<\/h3>\n<div\n class=\"alert alert-note my-6 overflow-hidden rounded-lg transition-all duration-200 ease-out hover:-translate-y-0.5 hover:shadow-md\"\n style=\"background-color: color-mix(in srgb, var(--color-note) 10%, transparent);\n border-left-color: var(--color-note);\n --hover-bg: color-mix(in srgb, var(--color-note) 15%, transparent);\"\n onmouseover=\"this.style.backgroundColor = this.style.getPropertyValue('--hover-bg')\"\n onmouseout=\"this.style.backgroundColor = 'color-mix(in srgb, var(--color-note) 10%, transparent)'\"\n role=\"alert\"\n aria-labelledby=\"alert-0-title\">\n \n <div\n class=\" flex items-center justify-between px-6 py-6\"\n >\n <div class=\"flex items-center gap-3\">\n \n <h4\n id=\"alert-0-title\"\n class=\"m-0 font-semibold text-foreground\/90\">\n \u6ce8\u610f\n <\/h4>\n <\/div>\n\n \n \n <\/div>\n\n \n <div\n id=\"alert-0-content\"\n class=\"alert-content px-6 pb-6\">\n <div class=\"prose prose-sm text-foreground\/90 max-w-none\">\n <p>\u8fd9\u662f\u4e00\u4e2a\u6ce8\u610f\u63d0\u793a\u6846\u3002\u7528\u4e8e\u663e\u793a\u7528\u6237\u5e94\u8be5\u6ce8\u610f\u7684\u6709\u7528\u4fe1\u606f\uff0c\u5373\u4f7f\u5728\u5feb\u901f\u6d4f\u89c8\u5185\u5bb9\u65f6\u4e5f\u5e94\u8be5\u6ce8\u610f\u3002<\/p>"},{"title":"\u56fe\u7247\u6e32\u67d3\u6d4b\u8bd5","link":"https:\/\/zrs.me\/%E5%9B%BE%E7%89%87%E6%B8%B2%E6%9F%93%E6%B5%8B%E8%AF%95\/","pubDate":"Mon, 01 Jan 2024 00:00:00 +0800","guid":"https:\/\/zrs.me\/%E5%9B%BE%E7%89%87%E6%B8%B2%E6%9F%93%E6%B5%8B%E8%AF%95\/","description":"<h1 id=\"\u56fe\u7247\u6e32\u67d3\u6d4b\u8bd5\">\u56fe\u7247\u6e32\u67d3\u6d4b\u8bd5<\/h1>\n<p>\u793a\u4f8b\u6765\u81ea <a href=\"https:\/\/www.lightgalleryjs.com\/demos\/thumbnails\/\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n>LightGallery\n <svg id=\"external-link\" class=\"h-3 w-3 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a>\n\u6240\u6709\u56fe\u7247\u6765\u81ea <a href=\"https:\/\/unsplash.com\/\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n>Unsplash\n <svg id=\"external-link\" class=\"h-3 w-3 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a><\/p>\n<h2 id=\"\u5355\u5f20\u56fe\u7247\">\u5355\u5f20\u56fe\u7247<\/h2>\n<p>\n<figure class=\"image-figure not-prose my-8\" \n data-lightbox-enabled=\"false\"\n data-gallery-type=\"auto\">\n <div class=\"image-container\">\n <img\n src=\"https:\/\/zrs.me\/%E5%9B%BE%E7%89%87%E6%B8%B2%E6%9F%93%E6%B5%8B%E8%AF%95\/bundle.avif\"\n alt=\"https:\/\/unsplash.com\/@danielleone\"\n title=\"\u6444\u5f71\u5e08 - Daniel Leone\"\n \n \n \n \n loading=\"lazy\"\n decoding=\"async\"\n data-gallery-src=\"https:\/\/zrs.me\/%E5%9B%BE%E7%89%87%E6%B8%B2%E6%9F%93%E6%B5%8B%E8%AF%95\/bundle.avif\"\n data-gallery-alt=\"https:\/\/unsplash.com\/@danielleone\"\n data-gallery-title=\"\u6444\u5f71\u5e08 - Daniel Leone\" \/><\/div>\n\n <figcaption class=\"image-caption\">\n \u6444\u5f71\u5e08 - Daniel Leone\n <\/figcaption><\/figure><\/p>"},{"title":"Archives","link":"https:\/\/zrs.me\/archives\/_index.fr\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/zrs.me\/archives\/_index.fr\/","description":{}}]}}