{"id":5872,"date":"2026-09-11T10:35:23","date_gmt":"2026-09-11T02:35:23","guid":{"rendered":"https:\/\/rubasseroasters.com\/?page_id=5872"},"modified":"2026-10-01T16:17:30","modified_gmt":"2026-10-01T08:17:30","slug":"coffee-education-page-zh","status":"publish","type":"page","link":"https:\/\/rubasseroasters.com\/zh\/coffee-education-page-zh\/","title":{"rendered":"\u9867\u554f\u6559\u5b78\u8ab2\u7a0b"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u5c0f\u6a19\uff1aRUBASSE \u9867\u554f\u6559\u5b78\u8ab2\u7a0b<br>\u6a19\u984c\uff1a\u5f9e\u7dda\u4e0a\u5b78\u7fd2\u5230\u5be6\u9ad4\u64cd\u4f5c\uff0c\u5b8c\u6574\u638c\u63e1\u70d8\u8c46\u5be6\u6230<br>\u8aaa\u660e\uff1a\u7dda\u4e0a\u76f4\u64ad\u3001\u5be6\u9ad4\u8ab2\u7a0b\u3001\u570b\u969b\u8a8d\u8b49\u3001\u514d\u8cbb\u9867\u554f\u670d\u52d9\uff0c\u5f9e\u70d8\u7119\u77e5\u8b58\u5230\u5be6\u6a5f\u64cd\u4f5c\uff0c\u5efa\u7acb\u5b8c\u6574\u7684\u70d8\u8c46\u80fd\u529b\u3002<br>LINE\uff1a<a href=\"https:\/\/line.me\/R\/ti\/p\/@833kjpir\" target=\"_blank\" rel=\"noopener\">https:\/\/line.me\/R\/ti\/p\/@833kjpir<\/a><br>\u6578\u64da\uff1a\u7dda\u4e0a|\u7dda\u4e0a\u8ab2\u7a0b<br>\u6578\u64da\uff1a\u8ab2\u7a0b|\u5be6\u9ad4\u8ab2\u7a0b<br>\u6578\u64da\uff1a\u8aee\u8a62|\u514d\u8cbb\u9867\u554f\u8aee\u8a62\u670d\u52d9<br>\u6578\u64da\uff1a\u64da\u9ede|\u5168\u53f0\u4e09\u8655\u64da\u9ede<br>\u4e3b\u8996\u89ba\u5716\u7247\uff1a<a href=\"https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgKFgXai.webp\">https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgKFgXai.webp<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u884c\u4e8b\u66c6\u6a19\u984c\uff1a\u8fd1\u671f\u958b\u8ab2\u884c\u4e8b\u66c6<br>\u884c\u4e8b\u66c6\u5716\u7247\uff1a<br>\u884c\u4e8b\u66c6\u8aaa\u660e\uff1a\u6bcf\u6708\u66f4\u65b0\uff0c\u5be6\u969b\u65e5\u671f\u8207\u5831\u540d\u622a\u6b62\u4ee5\u5404\u8ab2\u7a0b\u5831\u540d\u9801\u70ba\u6e96\u3002\u6b61\u8fce\u52a0\u5165\u6211\u5011<a href=\"https:\/\/line.me\/R\/ti\/p\/@833kjpir\" target=\"_blank\" rel=\"noopener\"><strong>\u5b98\u7db2LINE<\/strong><\/a>\u505a\u8aee\u8a62\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5340\u584a\uff1a\u7dda\u4e0a\u8ab2\u7a0b<br>\u5340\u584a\u8aaa\u660e\uff1a\u5f9e\u57fa\u790e\u5230\u9032\u968e\uff011 \u5c0f\u6642\u638c\u63e1\u5be6\u7528\u70d8\u8c46\u601d\u7dad\u3002<br>\u5340\u584a\u5716\u7247\uff1a<a href=\"https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgs2tSgo.webp\">https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgs2tSgo.webp<\/a><br>\u6a19\u7c64\uff1a\u514d\u8cbb\u53c3\u52a0<br>\u6a19\u7c64\uff1a\u7dda\u4e0a\u76f4\u64ad<br>\u6309\u9215\uff1a\u67e5\u770b\u8ab2\u7a0b\u8207\u5831\u540d<br>\u6309\u9215\u9023\u7d50\uff1a<br>\u4e3b\u6309\u9215\uff1a\u5426<br><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8ab2\u7a0b\uff1a\u521d\u968e\u73ed\uff5c\u5efa\u7acb\u6b63\u78ba\u70d8\u8c46\u57fa\u790e<br>1.1 \u5c0d\u8c61\uff1a\u9069\u5408\u525b\u63a5\u89f8\u70d8\u8c46\u7684\u65b0\u624b\uff0c\u5feb\u901f\u5efa\u7acb\u70d8\u8c46\u6d41\u7a0b\u3001\u7206\u8072\u5224\u8b80\u8207\u5b89\u5168\u64cd\u4f5c\u89c0\u5ff5\u3002<br>1.2 \u6642\u9577\uff1a60 \u5206\u9418<br>1.3 \u8cbb\u7528\uff1a\u514d\u8cbb<br>1.4 \u6536\u7a6b\uff1a\u70d8\u7119\u4e94\u5927\u968e\u6bb5\u89e3\u6790<br>1.5 \u6536\u7a6b\uff1a\u7206\u8072\u8207\u6c23\u5473\u7684\u5224\u8b80<br>1.6 \u6536\u7a6b\uff1a\u4e0b\u8c46\u6642\u6a5f\u5224\u65b7<br>1.7 \u5834\u6b21\uff1a2026\/09\/15\uff08\u4e00\uff0919:30-20:30 \u7dda\u4e0a<br>1.9 \u5831\u540d\uff1a<a href=\"https:\/\/rubasseroasters.com\/zh\/online-course-rubasse-roasting-signup-page-zh\/#online\">https:\/\/rubasseroasters.com\/zh\/online-course-rubasse-roasting-signup-page-zh\/#oncoursetime<\/a><br>1.10 \u986f\u793a\uff1a\u5426<\/li>\n\n\n\n<li>\u8ab2\u7a0b\uff1a\u9032\u968e\u73ed\uff5c\u638c\u63e1\u4e2d\u7119\u8207\u6975\u6dfa\u7119\u7684\u9ec3\u91d1\u98a8\u5473<br>2.1 \u5c0d\u8c61\uff1a\u9069\u5408\u5df2\u6709\u70d8\u8c46\u57fa\u790e\uff0c\u60f3\u63d0\u5347\u751c\u611f\u3001\u9999\u6c23\u8207\u5546\u696d\u7a69\u5b9a\u6027\u7684\u5496\u5561\u5de5\u4f5c\u8005\u3002<br>2.2 \u6642\u9577\uff1a60 \u5206\u9418<br>2.3 \u8cbb\u7528\uff1a\u514d\u8cbb<br>2.4 \u6536\u7a6b\uff1a\u706b\u529b\u8207\u98a8\u901f\u7684\u642d\u914d<br>2.5 \u6536\u7a6b\uff1aROR \u5224\u8b80\u8207\u7119\u5ea6\u63a7\u5236<br>2.6 \u6536\u7a6b\uff1a\u70d8\u7119\u66f2\u7dda\u5224\u8b80\u8207\u4fee\u6b63<br>2.7 \u5834\u6b21\uff1a2026\/09 \u6708\u958b\u8ab2\u62db\u751f\u4e2d<br>2.8 \u5831\u540d\uff1a<a href=\"https:\/\/rubasseroasters.com\/zh\/online-course-rubasse-roasting-signup-page-zh\/#online\">https:\/\/rubasseroasters.com\/zh\/online-course-rubasse-roasting-signup-page-zh\/#oncoursetime<\/a><br>2.9 \u986f\u793a\uff1a\u5426<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5340\u584a\uff1a\u5be6\u9ad4\u70d8\u8c46\u8ab2\u7a0b<br>\u5340\u584a\u8aaa\u660e\uff1a\u70ba\u5404\u968e\u6bb5\u91cf\u8eab\u6253\u9020\u7684\u5c08\u696d\u70d8\u8c46\u8ab2\uff0c\u5e36\u60a8\u7368\u7acb\u638c\u63e1\u70d8\u7119\u908f\u8f2f\uff0c\u7cbe\u6e96\u63a7\u5236\u5496\u5561\u98a8\u5473\u3002<br>\u5340\u584a\u5716\u7247\uff1a<a href=\"https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgTdMv8h.webp\">https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgTdMv8h.webp<\/a><br>\u6a19\u7c64\uff1a3 \u7a2e\u8ab2\u7a0b<br>\u6a19\u7c64\uff1a\u73fe\u6b63\u62db\u751f\u4e2d<br>\u6309\u9215\uff1a\u67e5\u770b\u8ab2\u8868\u8207\u5831\u540d<br>\u6309\u9215\u9023\u7d50\uff1a<br>\u4e3b\u6309\u9215\uff1a\u5426<br><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8ab2\u7a0b\uff1a\u70d8\u8c46 &amp; \u676f\u6e2c\u9ad4\u9a57\u8ab2\u7a0b\uff08\u57fa\u790e\uff09<br>1.1 \u5c0d\u8c61\uff1a\u9069\u5408\u7121\u7d93\u9a57\u60f3\u5728\u77ed\u6642\u9593\u5167\u4e86\u89e3\u70d8\u8c46\u8b8a\u5316\u3001\u5be6\u969b\u9ad4\u9a57\u676f\u6e2c\u7684\u5b78\u54e1\u3002<br>1.2 \u6642\u9577\uff1a\u534a\u5929 13:30-16:30<br>1.3 \u8cbb\u7528\uff1a\u4e00\u822c\u7968 500 \u5143\uff0f2 \u4eba\u5718\u5831 900 \u5143<br>1.4 \u6536\u7a6b\uff1a\u57fa\u790e\u70d8\u8c46\u89c0\u5ff5<br>1.5 \u6536\u7a6b\uff1a\u5be6\u969b\u57f7\u884c\u676f\u6e2c<br>1.6 \u6536\u7a6b\uff1a\u4e86\u89e3\u5b8c\u6574\u70d8\u8c46\u904e\u7a0b<br>1.7 \u5834\u6b21\uff1a2026\/12 \u6708\u958b\u8ab2\u62db\u751f\u4e2d<br>1.8 \u5831\u540d\uff1a<a href=\"https:\/\/rubasseroasters.com\/course-rubasse-basic-roasting-zh\/#form\">https:\/\/rubasseroasters.com\/course-rubasse-basic-roasting-zh\/#form<\/a><br>1.9 \u986f\u793a\uff1a\u662f<\/li>\n\n\n\n<li>\u8ab2\u7a0b\uff1a\u70d8\u8c46\u5be6\u4f5c\u8ab2\u7a0b<br>2.1 \u5c0d\u8c61\uff1a\u5df2\u6709\u57fa\u672c\u6982\u5ff5\uff0c\u5e0c\u671b\u63d0\u5347\u70d8\u7119\u6280\u80fd\u7684\u611b\u597d\u8005\uff0c\u6709\u5fd7\u65bc\u5496\u5561\u7522\u696d\u7684\u5275\u696d\u8005\u6216\u5f9e\u696d\u5496\u5561\u4eba\u3002<br>2.2 \u6642\u9577\uff1a\u534a\u5929 13:30-16:30<br>2.3 \u8cbb\u7528\uff1a\u4e00\u822c\u7968 2,000 \u5143\uff0f2 \u4eba\u5718\u5831 3,600 \u5143<br>2.4 \u6536\u7a6b\uff1a\u57fa\u790e\u77e5\u8b58\u8207\u5c08\u6709\u540d\u8a5e\u89e3\u6790<br>2.5 \u6536\u7a6b\uff1a\u70d8\u7119\u8a08\u756b\u5236\u5b9a<br>2.6 \u6536\u7a6b\uff1a\u5be6\u969b\u4e0a\u6a5f\u64cd\u4f5c<br>2.7 \u5834\u6b21\uff1a2026\/11 \u6708\u958b\u8ab2\u62db\u751f\u4e2d<br>2.8 \u5831\u540d\uff1a<a href=\"https:\/\/rubasseroasters.com\/course-rubasse-intermediate-roasting-zh\/#form\">https:\/\/rubasseroasters.com\/course-rubasse-intermediate-roasting-zh\/#form<\/a><br>2.9 \u986f\u793a\uff1a\u662f<\/li>\n\n\n\n<li>\u8ab2\u7a0b\uff1a\u9032\u968e\u70d8\u8c46\u5be6\u6230\u8ab2\u7a0b<br>3.1 \u5c0d\u8c61\uff1a\u5177\u5099\u70d8\u8c46\u7d93\u9a57\u3001\u60f3\u7cbe\u9032\u98a8\u5473\u6821\u6b63\u8207\u7cfb\u7d71\u5316\u908f\u8f2f\u7684\u5b78\u54e1\uff0c\u900f\u904e\u5be6\u6230\u6f14\u7df4\u9081\u5411\u5c08\u696d\u9818\u57df\uff01<br>3.2 \u6642\u9577\uff1a3 \u5929 10:00-16:00<br>3.3 \u8cbb\u7528\uff1a\u63a8\u5ee3\u50f9 9,000 \u5143\uff08\u539f\u50f9 18,000\uff09\uff0f2 \u4eba\u5718\u5831 17,000 \u5143(\u542b\u5348\u9910)<br>3.4 \u6536\u7a6b\uff1a\u7cfb\u7d71\u5316\u70d8\u8c46\u89c0\u5ff5<br>3.5 \u6536\u7a6b\uff1a\u9023\u7e8c\u70d8\u7119\u7684\u7a69\u5b9a\u63a7\u5236<br>3.6 \u6536\u7a6b\uff1a\u70d8\u7119\u8a08\u756b\u653b\u7565\u7d71\u6574<br>3.7 \u5834\u6b21\uff1a2026\/10\uff0c11\uff0c12\u6708\u958b\u8ab2\u62db\u751f\u4e2d<br>3.9 \u5831\u540d\uff1a<a href=\"https:\/\/rubasseroasters.com\/course-rubasse-advanced-roasting-zh\/#form\">https:\/\/rubasseroasters.com\/course-rubasse-advanced-roasting-zh\/#form<\/a><br>3.10 \u986f\u793a\uff1a\u662f<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5340\u584a\uff1aBarista Hustle (BH) \u570b\u969b\u8a8d\u8b49\u8ab2\u7a0b<br>\u5340\u584a\u8aaa\u660e\uff1a2012 \u4e16\u754c\u5496\u5561\u6c96\u716e\u8cfd\u51a0\u8ecd Matt Perger \u5275\u7acb\u7684\u570b\u969b\u5496\u5561\u6559\u80b2\u5e73\u53f0\uff0c\u4ee5\u79d1\u5b78\u65b9\u6cd5\u62c6\u89e3\u6c96\u716e\u8207\u8403\u53d6\uff0c\u8003\u8a66\u901a\u904e\u53d6\u5f97\u7dda\u4e0a\u8b49\u7167\u3002\u5168\u53f0\u552f\u4e00 BH \u8a8d\u8b49\u8b1b\u5e2b\u5728\u76e7\u8c9d\u601d\u3002<br>\u5340\u584a\u5716\u7247\uff1a<a href=\"https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgiFskRt.webp\">https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgiFskRt.webp<\/a><br>\u6a19\u7c64\uff1a3 \u5f35\u8b49\u7167<br>\u6a19\u7c64\uff1a\u5168\u53f0\u552f\u4e00Barista Hustle\u8a8d\u8b49<br>\u6309\u9215\uff1a\u4e86\u89e3\u8ab2\u7a0b\u8207\u5831\u540d\u65b9\u5f0f<br>\u6309\u9215\u9023\u7d50\uff1a<br>\u4e3b\u6309\u9215\uff1a\u5426<br><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8ab2\u7a0b\uff1a\u6d78\u6ce1\u8b49\u7167\u8ab2\u7a0b Immersion<br>1.1 \u6642\u9577\uff1a3 \u5929 10:00-16:00<br>1.2 \u8cbb\u7528\uff1a\u65e9\u9ce5\u50f9 9,000 \u5143\uff08\u539f\u50f9 18,000\uff09\uff0f2 \u4eba\u5718\u5831 17,000 \u5143<br>1.3 \u6536\u7a6b\uff1a\u6d78\u6ce1\u8403\u53d6\u539f\u7406<br>1.4 \u6536\u7a6b\uff1a\u6a19\u6e96\u676f\u6e2c\u6d41\u7a0b<br>1.5 \u6536\u7a6b\uff1a\u611b\u6a02\u58d3\u8207\u6cd5\u5f0f\u6ffe\u58d3\u5be6\u4f5c<br>1.6 \u5834\u6b21\uff1a2026\/09 \u6708\u958b\u8ab2\u62db\u751f\u4e2d<br>1.7 \u5831\u540d\uff1a<a href=\"https:\/\/rubasseroasters.com\/bh-immersion-course-signup-zh\/#form\">https:\/\/rubasseroasters.com\/bh-immersion-course-signup-zh\/#form<\/a><br>1.8 \u986f\u793a\uff1a\u5426<\/li>\n\n\n\n<li>\u8ab2\u7a0b\uff1a\u7fa9\u5f0f\u8b49\u7167\u8ab2\u7a0b Barista<br>2.1 \u6642\u9577\uff1a2 \u5929 10:00-16:00<br>2.2 \u8cbb\u7528\uff1a\u63a8\u5ee3\u50f9 9,000 \u5143\uff08\u539f\u50f9 18,000\uff09\uff0f2 \u4eba\u5718\u5831 17,000 \u5143<br>2.3 \u6536\u7a6b\uff1a\u7fa9\u5f0f\u6a5f\u7d50\u69cb\u8207\u53c3\u6578\u8a2d\u5b9a<br>2.4 \u6536\u7a6b\uff1a\u725b\u5976\u767c\u6ce1\u6280\u5de7<br>2.5 \u6536\u7a6b\uff1a\u5427\u53f0\u7ba1\u7406\u8207\u52d5\u7dda\u898f\u5283<br>2.6 \u5834\u6b21\uff1a2026\/08\/27\uff08\u56db\uff0910:00-16:00 \u9ad8\u96c4\u30fb2 \u5929<br>2.7 \u5831\u540d\uff1a<a href=\"https:\/\/rubasseroasters.com\/bh-barista-course-signup-zh\/#form\">https:\/\/rubasseroasters.com\/bh-barista-course-signup-zh\/#form<\/a><br>2.8 \u986f\u793a\uff1a\u5426<\/li>\n\n\n\n<li>\u8ab2\u7a0b\uff1a\u6ef4\u6ffe\u8b49\u7167\u8ab2\u7a0b Filter<br>3.1 \u6642\u9577\uff1a2 \u5929 10:00-16:00<br>3.2 \u8cbb\u7528\uff1a\u63a8\u5ee3\u50f9 4,500 \u5143\uff08\u539f\u50f9 8,000\uff09\uff0f2 \u4eba\u5718\u5831 8,000 \u5143<br>3.3 \u6536\u7a6b\uff1a\u8403\u53d6\u7387\u7684\u8a08\u7b97\u8207\u61c9\u7528<br>3.4 \u6536\u7a6b\uff1a\u6ffe\u676f\u8a2d\u8a08\u8207\u6d41\u901f\u63a7\u5236<br>3.5 \u6536\u7a6b\uff1a\u5404\u7522\u5340\u6c96\u716e\u7b56\u7565<br>3.6 \u5834\u6b21\uff1a2026\/10\u6708\uff0c11\u6708\uff0c12\u6708\u958b\u8ab2\u62db\u751f\u4e2d<br>3.7 \u5831\u540d\uff1a<a href=\"https:\/\/rubasseroasters.com\/bh-perlocation-course-signup-zh\/#form\">https:\/\/rubasseroasters.com\/bh-perlocation-course-signup-zh\/#form<\/a><br>3.8 \u986f\u793a\uff1a\u662f<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5340\u584a\uff1a\u5171\u4eab\u70d8\u8c46\u7a7a\u9593<br>\u5340\u584a\u8aaa\u660e\uff1a\u4e09\u8655\u5c55\u9593\u63d0\u4f9b\u5171\u4eab\u70d8\u8c46\u7a7a\u9593\uff0c\u8a2d\u5099\u3001\u6392\u7159\u8207\u64cd\u4f5c\u74b0\u5883\u7686\u5df2\u5099\u59a5\uff0c\u5e36\u751f\u8c46\u5373\u53ef\u70d8\u7119\u3002<br>\u5340\u584a\u5716\u7247\uff1a<a href=\"https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgshHBLH.webp\">https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgshHBLH.webp<\/a><br>\u6a19\u7c64\uff1a3 \u7a2e\u6a5f\u578b<br>\u6a19\u7c64\uff1a3 \u500b\u57ce\u5e02\u64da\u9ede<br>\u6a19\u7c64\uff1a<br>\u6309\u9215\uff1a\u67e5\u770b\u7d30\u5247\u4e26\u9810\u7d04<br>\u6309\u9215\u9023\u7d50\uff1a<a href=\"https:\/\/rubasseroasters.com\/zh\/coworking-roastery-zh\/\">https:\/\/rubasseroasters.com\/zh\/coworking-roastery-zh\/<\/a><br>LINE\u6309\u9215\uff1a\u662f<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8ab2\u7a0b\uff1aMicro 3kg<br>1.1 \u4ecb\u7d39\uff1a\u55ae\u934b\u5bb9\u91cf\u6700\u5927\uff0c\u9069\u5408\u8a66\u7522\u8207\u91cf\u7522\u524d\u7684\u6279\u6b21\u6e96\u5099\u3002<br>1.2 \u8cbb\u7528\uff1aNT$250 \/ \u934b<br>1.3 \u7167\u7247\uff1a<a href=\"https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgl7MSaM.webp\">https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgl7MSaM.webp<\/a><\/li>\n\n\n\n<li>\u8ab2\u7a0b\uff1aHyper 1.2kg<br>2.1 \u4ecb\u7d39\uff1a\u4e2d\u91cf\u6279\u6b21\uff0c\u5fae\u578b\u54c1\u724c\u7a69\u5b9a\u751f\u7522\u7684\u4e3b\u529b\u6a5f\u578b\u3002<br>2.2 \u8cbb\u7528\uff1aNT$200 \/ \u934b<br>2.3 \u7167\u7247\uff1a<a href=\"https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimg78khUm.webp\">https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimg78khUm.webp<\/a><\/li>\n\n\n\n<li>\u8ab2\u7a0b\uff1aNano 600g<br>3.1 \u4ecb\u7d39\uff1a\u5c0f\u91cf\u6e2c\u8a66\uff0c\u9069\u5408\u66f2\u7dda\u5be6\u9a57\u8207\u65b0\u8c46\u6a23\u54c1\u70d8\u7119\u3002<br>3.2 \u8cbb\u7528\uff1aNT$150 \/ \u934b<br>3.3 \u7167\u7247\uff1a<a href=\"https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgvlMY1V.webp\">https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgvlMY1V.webp<\/a><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5340\u584a\uff1a\u514d\u8cbb\u9867\u554f\u8aee\u8a62\u670d\u52d9<br>\u5340\u584a\u8aaa\u660e\uff1a\u4e0d\u9650\u8a2d\u5099\u54c1\u724c\uff0c\u7686\u53ef\u8aee\u8a62\u5496\u5561\u76f8\u95dc\u554f\u984c\u3002\u670d\u52d9\u6db5\u84cb\u70d8\u8c46\u6280\u8853\u3001\u6c96\u716e\u8403\u53d6\u3001\u958b\u5e97\u71df\u904b\u8207\u5ba2\u88fd\u5316\u9700\u6c42\uff0c\u63d0\u4f9b LINE\u3001\u96fb\u8a71\u3001\u8996\u8a0a\u53ca\u73fe\u5834\u5c08\u696d\u652f\u63f4\u3002<br>\u5340\u584a\u5716\u7247\uff1a<a href=\"https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgq0IGzf.webp\">https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgq0IGzf.webp<\/a><br>\u6a19\u7c64\uff1a\u4e0d\u9650\u6a5f\u578b<br>\u6a19\u7c64\uff1a\u7dda\u4e0a\u4e00\u5c0d\u4e00<br>\u6a19\u7c64\uff1a\u56db\u5927\u670d\u52d9\u65b9\u5411<br>\u6309\u9215\uff1a\u586b\u5beb\u8aee\u8a62\u8868\u55ae<br>\u6309\u9215\u9023\u7d50\uff1a<br>LINE\u6309\u9215\uff1a\u5426<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8b1b\u5e2b\uff1a\u5433\u6636\u9038<br>\u8b1b\u5e2b\u982d\u929c\uff1aBarista Hustle (BH) \u8a8d\u8b49\u8b1b\u5e2b<br>\u8b1b\u5e2b\u7167\u7247\uff1a<a href=\"https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimg9V0my3.webp\">https:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimg9V0my3.webp<\/a><br>\u8b1b\u5e2b\u4ecb\u7d39\uff1a\u64c5\u9577\u628a\u70d8\u7119\u79d1\u5b78\u62c6\u89e3\u6210\u65b0\u624b\u4e5f\u80fd\u4e0a\u624b\u7684\u5be6\u6230\u6846\u67b6\u3002\u7dda\u4e0a\u8ab2\u3001\u5be6\u9ad4\u73ed\u3001BH \u8b49\u7167\u8207\u9867\u554f\u8aee\u8a62\uff0c\u90fd\u7531\u4ed6\u89aa\u81ea\u6388\u8ab2\u8207\u56de\u8986\u3002<br>\u6bd4\u8cfd\u7d93\u6b77\uff1a2023 WCE \u4e16\u754c\u76c3\u70d8\u8c46\u8cfd\u53f0\u7063 \u5b63\u8ecd<br>\u6bd4\u8cfd\u7d93\u6b77\uff1a2020 WCE \u4e16\u754c\u76c3\u676f\u6e2c\u5e2b\u5927\u8cfd\u53f0\u7063\u9078\u62d4\u8cfd \u7b2c 7 \u540d<br>\u6bd4\u8cfd\u7d93\u6b77\uff1a2016 \u5927\u6e2f\u676f\u570b\u969b\u70d8\u7119\u4ea4\u6d41\u8cfd \u7b2c 13 \u540d<br>\u570b\u969b\u8b49\u7167\uff1aSCA \u7cbe\u54c1\u5496\u5561\u5354\u6703\u70d8\u7119\u521d\u7d1a\u8a8d\u8b49<br>\u570b\u969b\u8b49\u7167\uff1aSCA \u7cbe\u54c1\u5496\u5561\u5354\u6703\u70d8\u7119\u4e2d\u7d1a\u8a8d\u8b49<br>\u570b\u969b\u8b49\u7167\uff1aSCA \u7cbe\u54c1\u5496\u5561\u5354\u6703\u611f\u5b98\u521d\u7d1a\u8a8d\u8b49<br>\u570b\u969b\u8b49\u7167\uff1aSCA \u7cbe\u54c1\u5496\u5561\u5354\u6703\u611f\u5b98\u4e2d\u7d1a\u8a8d\u8b49<br>\u570b\u969b\u8b49\u7167\uff1aSCAE \u6b50\u6d32\u7cbe\u54c1\u5496\u5561\u5354\u6703\u5496\u5561\u5e2b\u521d\u7d1a\u8a8d\u8b49<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7d50\u8a9e\u6a19\u984c\uff1a\u9084\u4e0d\u78ba\u5b9a\u5f9e\u54ea\u4e00\u5802\u958b\u59cb\uff1f<br>\u7d50\u8a9e\u8aaa\u660e\uff1a\u52a0 LINE \u544a\u8a34\u6211\u5011\u4f60\u7684\u72c0\u6cc1\u8207\u76ee\u6a19\uff0c\u6211\u5011\u6703\u5efa\u8b70\u9069\u5408\u7684\u8ab2\u7a0b\uff0c\u53ea\u63a8\u85a6\u771f\u6b63\u9069\u5408\u60a8\u7684\u9078\u64c7\u3002<br>\u7d50\u8a9e\u6309\u9215\uff1a\u6b61\u8fce\u52a0 LINE \u8aee\u8a62<br>\u7d50\u8a9e\u6309\u9215\u9023\u7d50\uff1a<a href=\"https:\/\/line.me\/R\/ti\/p\/@833kjpir\" target=\"_blank\" rel=\"noopener\">https:\/\/line.me\/R\/ti\/p\/@833kjpir<\/a><br>\u7d50\u8a9e\u6b21\u8981\u6309\u9215\uff1a\u586b\u5beb\u8aee\u8a62\u8868\u55ae<br>\u7d50\u8a9e\u6b21\u8981\u6309\u9215\u9023\u7d50\uff1a<a href=\"https:\/\/rubasseroasters.com\/zh\/free-coffee-consulting-zh\/\">https:\/\/rubasseroasters.com\/zh\/free-coffee-consulting-zh\/<\/a><\/p>\n\n\n\n<!-- ================================================================\n     \u8ab2\u7a0b\u884c\u4e8b\u66c6 block\uff08zh\uff09\n     \u8cc7\u6599\u4f86\u6e90\uff1a\u7368\u7acb\u5b98\u7db2\u516c\u958b Google Sheet\uff1b\u767c\u5e03\u5f8c\u7db2\u7ad9\u91cd\u65b0\u8f09\u5165\u5373\u66f4\u65b0\n     \u26a0\ufe0f sheetId \/ gid \u4ecd\u662f PASTE_ \u958b\u982d\u6642\u4e0d\u53ef\u8cbc\u4e0a\u6b63\u5f0f\u7ad9\n     ================================================================ -->\n\n<!-- \u25bc\u25bc\u25bc\u25bc\u25bc\u25bc  \u7368\u7acb\u516c\u958b\u8868\u5efa\u7acb\u5f8c\uff0c\u53ea\u6539\u9019\u4e00\u6bb5  \u25bc\u25bc\u25bc\u25bc\u25bc\u25bc -->\n<script>\nwindow.RBSCAL_CONFIG = {\n\n  \/\/ \u3010\u7368\u7acb\u5b98\u7db2\u516c\u958b\u8868\u3011\u7db2\u5740\u5217 \/d\/ \u8207 \/edit \u4e2d\u9593\u90a3\u4e00\u9577\u4e32\n  sheetId: \"17uERN5prdDdHNwsy0ecaqfZ05M0GPmTWKFxk9sP3Jiw\",\n\n  \/\/ \u3010\u5b98\u7db2\u8ab2\u7a0b\u516c\u958b\u8cc7\u6599\u3011\u5206\u9801\u7684 gid\uff08\u7db2\u5740 #gid= \u5f8c\u9762\u7684\u6578\u5b57\uff09\n  gid: \"0\",\n\n  \/\/ \u820a\u7248\u76f8\u5bb9\u6b04\uff1b\u6b63\u5f0f\u67b6\u69cb\u4e0d\u90e8\u7f72\u516c\u958b Apps Script Web App\uff0c\u4fdd\u6301\u7a7a\u767d\n  apiUrl: \"\"\n\n};\n<\/script>\n<!-- \u25b2\u25b2\u25b2\u25b2\u25b2\u25b2  \u4ee5\u4e0a\u662f\u552f\u4e00\u9700\u8981\u6539\u7684\u5730\u65b9\uff0c\u4ee5\u4e0b\u8acb\u52ff\u624b\u6539  \u25b2\u25b2\u25b2\u25b2\u25b2\u25b2 -->\n\n<div class=\"rbscal\" id=\"rbscal-zh\">\n  <div class=\"rbscal-bar\">\n    <button type=\"button\" class=\"rbscal-nav rbscal-prev\">\u4e0a\u500b\u6708<\/button>\n    <div class=\"rbscal-title\">\u8ab2\u7a0b\u884c\u4e8b\u66c6<\/div>\n    <button type=\"button\" class=\"rbscal-nav rbscal-next\">\u4e0b\u500b\u6708<\/button>\n  <\/div>\n  <div class=\"rbscal-grid-wrap\"><\/div>\n  <div class=\"rbscal-list\"><\/div>\n  <div class=\"rbscal-msg\">\u8ab2\u7a0b\u8f09\u5165\u4e2d\u2026<\/div>\n<\/div>\n\n<style>\n.rbscal{--rbscal-main:#7a4f28;--rbscal-accent:#b8341f;--rbscal-bg:#f1e7da;\n  --rbscal-line:#b9a88f;--rbscal-ink:#241f1a;--rbscal-mute:#5f5850;\n  --rbscal-out:#e8e2d9;\n  font-family:\"Noto Sans TC\",system-ui,-apple-system,sans-serif;\n  color:var(--rbscal-ink);max-width:1100px;margin:0 auto}\n.rbscal *{box-sizing:border-box}\n.rbscal-bar{display:flex;align-items:center;justify-content:center;gap:16px;\n  margin-bottom:14px}\n.rbscal-title{font-size:20px;font-weight:700;min-width:180px;text-align:center;\n  letter-spacing:.5px}\n.rbscal-nav{border:1px solid var(--rbscal-line);background:#fff;cursor:pointer;\n  border-radius:6px;padding:7px 14px;font-size:14px;color:var(--rbscal-main);\n  font-family:inherit}\n.rbscal-nav:hover{background:var(--rbscal-main);color:#fff;\n  border-color:var(--rbscal-main)}\n.rbscal-msg{text-align:center;color:var(--rbscal-mute);padding:36px 12px;\n  font-size:15px}\n\n\/* \u683c\u7dda\u523b\u610f\u7528\u5be6\u8272\u6df1\u7dda\uff1a\u6dfa\u8272\u683c\u7dda\u5728 WP \u4f48\u666f\u7684\u6dfa\u5e95\u4e0a\u5e7e\u4e4e\u770b\u4e0d\u898b\uff082026-07-31 \u4f7f\u7528\u8005\u56de\u5831\uff09 *\/\n.rbscal-grid{width:100%;border-collapse:collapse;table-layout:fixed;\n  background:#fff;border:2px solid var(--rbscal-main)}\n.rbscal-grid th{background:var(--rbscal-main);color:#fff;\n  font-size:13px;font-weight:700;padding:10px 4px;letter-spacing:1px;\n  border:1px solid var(--rbscal-main)}\n.rbscal-grid td{border:1px solid var(--rbscal-line);vertical-align:top;\n  height:112px;padding:5px;width:14.28%}\n.rbscal-out{background:var(--rbscal-out)}\n.rbscal-daynum{font-size:13px;color:#4a4038;margin-bottom:4px;\n  font-weight:700}\n.rbscal-today .rbscal-daynum{background:var(--rbscal-main);color:#fff;\n  border-radius:50%;width:21px;height:21px;line-height:21px;text-align:center}\n\n.rbscal-ev{display:block;text-decoration:none;color:inherit;\n  border:1px solid var(--rbscal-line);border-left:4px solid var(--rbscal-main);\n  background:var(--rbscal-bg);\n  border-radius:3px;padding:4px 6px;margin-bottom:4px;font-size:12px;\n  line-height:1.35}\na.rbscal-ev:hover{background:var(--rbscal-main);color:#fff}\na.rbscal-ev:hover .rbscal-ev-meta{color:#fff}\n.rbscal-ev-name{font-weight:600;display:block}\n.rbscal-ev-meta{color:var(--rbscal-mute);display:block;font-size:11px;\n  margin-top:1px}\n.rbscal-ev-online{border-left-color:var(--rbscal-accent)}\n.rbscal-ev-past{opacity:.45}\n.rbscal-badge{display:inline-block;font-size:10px;padding:0 5px;\n  border-radius:8px;margin-left:4px;vertical-align:1px;line-height:15px}\n.rbscal-badge-full{background:#ddd;color:#666}\n.rbscal-badge-extra{background:var(--rbscal-accent);color:#fff}\n.rbscal-badge-past{background:#eee;color:#999}\n\n.rbscal-list{display:none}\n.rbscal-item{display:block;text-decoration:none;color:inherit;background:#fff;\n  border:1px solid var(--rbscal-line);border-left:4px solid var(--rbscal-main);\n  border-radius:6px;padding:11px 13px;margin-bottom:9px}\n.rbscal-item-date{font-size:12px;color:var(--rbscal-main);font-weight:700}\n\/* name\/meta \u662f <span>\uff0c\u4e0d\u7d66 display:block \u6703\u8ddf\u524d\u4e00\u6bb5\u64e0\u5728\u540c\u4e00\u884c *\/\n.rbscal-item-name{display:block;font-size:15px;font-weight:600;margin:3px 0 2px}\n.rbscal-item-meta{display:block;font-size:13px;color:var(--rbscal-mute)}\n.rbscal-item-online{border-left-color:var(--rbscal-accent)}\n.rbscal-item-past{opacity:.5}\n\n@media (max-width:767px){\n  .rbscal-grid-wrap{display:none}\n  .rbscal-list{display:block}\n  .rbscal-title{font-size:17px;min-width:130px}\n  .rbscal-nav{padding:6px 11px;font-size:13px}\n}\n<\/style>\n\n<script>\n(function(){\n  var CFG = {\"rootId\": \"rbscal-zh\", \"sheetId\": \"17uERN5prdDdHNwsy0ecaqfZ05M0GPmTWKFxk9sP3Jiw\", \"gid\": \"0\", \"lang\": \"\u4e2d\u6587\", \"locale\": \"zh\", \"i18n\": {\"prev\": \"\u4e0a\u500b\u6708\", \"next\": \"\u4e0b\u500b\u6708\", \"today\": \"\u672c\u6708\", \"empty\": \"\u672c\u6708\u5c1a\u7121\u8ab2\u7a0b\", \"loading\": \"\u8ab2\u7a0b\u8f09\u5165\u4e2d\u2026\", \"error\": \"\u8ab2\u7a0b\u8cc7\u6599\u8f09\u5165\u5931\u6557\uff0c\u8acb\u7a0d\u5f8c\u518d\u8a66\", \"full\": \"\u984d\u6eff\", \"extra\": \"\u52a0\u958b\u5834\", \"open\": \"\u53ef\u5831\u540d\", \"past\": \"\u5df2\u7d50\u675f\", \"venue\": \"\u5834\u5730\", \"days\": \"\u5929\", \"weekdays\": [\"\u65e5\", \"\u4e00\", \"\u4e8c\", \"\u4e09\", \"\u56db\", \"\u4e94\", \"\u516d\"]}};\n\n  var root = document.getElementById(CFG.rootId);\n  if(!root){ return; }\n  var msgEl   = root.querySelector('.rbscal-msg');\n  var titleEl = root.querySelector('.rbscal-title');\n  var gridWrap= root.querySelector('.rbscal-grid-wrap');\n  var listEl  = root.querySelector('.rbscal-list');\n\n  \/\/ \u6a94\u982d window.RBSCAL_CONFIG \u512a\u5148\uff1b\u6c92\u586b\u624d\u7528\u7522\u751f\u6642\u71d2\u9032\u4f86\u7684\u9810\u8a2d\u503c\n  var USER = window.RBSCAL_CONFIG;\n  if(!USER){ USER = {}; }\n  var sheetId = CFG.sheetId;\n  if(USER.sheetId){ sheetId = USER.sheetId; }\n  var gid = CFG.gid;\n  if(USER.gid){ gid = USER.gid; }\n  var apiUrl = '';\n  if(USER.apiUrl){ apiUrl = USER.apiUrl; }\n\n  \/\/ URL \u7684 ampersand \u5fc5\u9808\u7528 charCode \u4e32\uff0c\u4e0d\u80fd\u76f4\u63a5\u5beb\uff08\u898b\u624b\u518a\u7b2c\u4e00\u9435\u5f8b\uff09\n  var AMP = String.fromCharCode(38);\n  var CSV_URL = 'https:\/\/docs.google.com\/spreadsheets\/d\/' + sheetId +\n                '\/export?format=csv' + AMP + 'gid=' + gid;\n\n  var events = [];\n  var view = null;\n\n  function parseCsv(text){\n    var rows=[], row=[], cur='', inQ=false, i=0;\n    while(i < text.length){\n      var c = text.charAt(i);\n      if(inQ){\n        if(c === '\"'){\n          if(text.charAt(i+1) === '\"'){ cur += '\"'; i += 2; continue; }\n          inQ = false; i++; continue;\n        }\n        cur += c; i++; continue;\n      }\n      if(c === '\"'){ inQ = true; i++; continue; }\n      if(c === ','){ row.push(cur); cur=''; i++; continue; }\n      if(c === '\\r'){ i++; continue; }\n      if(c === '\\n'){ row.push(cur); rows.push(row); row=[]; cur=''; i++; continue; }\n      cur += c; i++;\n    }\n    if(row.length > 0){ row.push(cur); rows.push(row); }\n    else if(cur !== ''){ rows.push([cur]); }\n    return rows;\n  }\n\n  function toNum(iso){\n    var p = String(iso).split('-');\n    if(p.length !== 3){ return 0; }\n    return (+p[0]) * 10000 + (+p[1]) * 100 + (+p[2]);\n  }\n  function pad(n){ if(n < 10){ return '0' + n; } return '' + n; }\n\n  \/\/ CSV \u8207 Apps Script JSON \u5169\u7a2e\u4f86\u6e90\uff0c\u5148\u6b63\u898f\u5316\u6210\u540c\u4e00\u7a2e\u300c\u4e00\u5217\u4e00\u7269\u4ef6\u300d\n  function csvToObjects(rows){\n    if(rows.length < 2){ return []; }\n    var head = rows[0].map(function(h){ return h.replace(\/^\\ufeff\/,'').trim(); });\n    var out = [];\n    rows.slice(1).forEach(function(r){\n      var o = {};\n      head.forEach(function(h, i){\n        var v = '';\n        if(i < r.length){ v = r[i]; }\n        o[h] = String(v).trim();\n      });\n      out.push(o);\n    });\n    return out;\n  }\n\n  function buildEvents(recs){\n    if(recs.length === 0){ return []; }\n    var need = ['\u958b\u59cb\u65e5\u671f','\u7d50\u675f\u65e5\u671f','\u8ab2\u7a0b\u540d\u7a31','\u9023\u7d50','\u8a9e\u8a00'];\n    var missing = need.filter(function(k){ return recs[0][k] === undefined; });\n    if(missing.length > 0){ throw new Error('\u7f3a\u6b04\u4f4d: ' + missing.join(',')); }\n\n    var out = [];\n    recs.forEach(function(o){\n      function get(k){\n        var v = o[k];\n        if(v === undefined){ return ''; }\n        if(v === null){ return ''; }\n        return String(v).trim();\n      }\n      var s = get('\u958b\u59cb\u65e5\u671f');\n      if(s === ''){ return; }\n\n      \/\/ \u65b0\u7248\u8cc7\u6599\u6709 M \u6b04\u6642\u53ea\u986f\u793a\u52fe\u9078\u5217\uff1b\u820a\u8cc7\u6599\u6c92\u6709\u6b64\u6b04\u5247\u5168\u90e8\u986f\u793a\uff0c\u907f\u514d\u5347\u7d1a\u77ac\u9593\u6e05\u7a7a\u3002\n      if(o['\u662f\u5426\u52a0\u5165\u524d\u53f0\u884c\u4e8b\u66c6'] !== undefined){\n        var enabled = get('\u662f\u5426\u52a0\u5165\u524d\u53f0\u884c\u4e8b\u66c6').toLowerCase();\n        var checked = false;\n        if(enabled === 'true'){ checked = true; }\n        if(enabled === '1'){ checked = true; }\n        if(enabled === 'yes'){ checked = true; }\n        if(enabled === 'y'){ checked = true; }\n        if(enabled === '\u662f'){ checked = true; }\n        if(enabled === '\u52fe\u9078'){ checked = true; }\n        if(enabled === '\u5df2\u52fe\u9078'){ checked = true; }\n        if(!checked){ return; }\n      }\n\n      var lang = get('\u8a9e\u8a00');\n      if(CFG.lang !== ''){\n        if(lang !== CFG.lang){ return; }\n      }\n      var e = get('\u7d50\u675f\u65e5\u671f');\n      if(e === ''){ e = s; }\n      out.push({\n        start: s, end: e, sNum: toNum(s), eNum: toNum(e),\n        level: get('\u7b49\u7d1a'), name: get('\u8ab2\u7a0b\u540d\u7a31'), venue: get('\u5834\u5730'),\n        t1: get('\u958b\u59cb\u6642\u9593'), t2: get('\u7d50\u675f\u6642\u9593'), status: get('\u72c0\u614b'),\n        url: get('\u9023\u7d50'), type: get('\u985e\u578b'), note: get('\u5099\u8a3b')\n      });\n    });\n    out.sort(function(a,b){ return a.sNum - b.sNum; });\n    return out;\n  }\n\n  function todayNum(){\n    var d = new Date();\n    return d.getFullYear()*10000 + (d.getMonth()+1)*100 + d.getDate();\n  }\n\n  \/\/ YYYYMMDD -> YYYYMM\n  function monthNum(n){ return Math.floor(n \/ 100); }\n\n  \/**\n   * \u521d\u59cb\u986f\u793a\u54ea\u500b\u6708\uff1a\n   *   1. \u7576\u6708\u6709\u8ab2\uff08\u542b\u8de8\u6708\u8ab2\u7a0b\uff09\u5c31\u7559\u5728\u7576\u6708\n   *   2. \u5426\u5247\u8df3\u5230\u6700\u8fd1\u7684\u672a\u4f86\u8ab2\u7a0b\u6240\u5728\u6708\u4efd\n   *   3. \u5168\u90e8\u90fd\u662f\u904e\u53bb\u7684\u8ab2\u5c31\u505c\u5728\u6700\u5f8c\u4e00\u7b46\n   *   4. \u5b8c\u5168\u6c92\u6709\u8ab2\uff08\u4f8b\u5982\u82f1\u6587\u7248\u76ee\u524d\u7121\u8cc7\u6599\uff09\u5c31\u986f\u793a\u7576\u6708\n   * \u76ee\u7684\u662f\u907f\u514d\u8a2a\u5ba2\u4e00\u9032\u4f86\u770b\u5230\u7a7a\u6708\u66c6\uff0c\u9084\u5f97\u81ea\u5df1\u6309\u4e0a\/\u4e0b\u500b\u6708\u627e\u3002\n   *\/\n  function initialView(evs){\n    var d = new Date();\n    var curY = d.getFullYear();\n    var curM = d.getMonth() + 1;\n    var cur = curY * 100 + curM;\n    if(evs.length === 0){ return {y: curY, m: curM}; }\n    var inCur = evs.filter(function(ev){\n      if(monthNum(ev.sNum) > cur){ return false; }\n      if(monthNum(ev.eNum) < cur){ return false; }\n      return true;\n    });\n    if(inCur.length > 0){ return {y: curY, m: curM}; }\n    var pick = null;\n    for(var i = 0; i < evs.length; i++){\n      if(monthNum(evs[i].sNum) > cur){ pick = evs[i]; break; }\n    }\n    if(pick === null){ pick = evs[evs.length - 1]; }\n    var mn = monthNum(pick.sNum);\n    return {y: Math.floor(mn \/ 100), m: mn % 100};\n  }\n\n  function statusInfo(ev){\n    if(ev.eNum < todayNum()){ return {cls:'past', text:CFG.i18n.past}; }\n    if(ev.status.indexOf('\u984d\u6eff') >= 0){ return {cls:'full', text:CFG.i18n.full}; }\n    if(ev.status.indexOf('\u52a0\u958b') >= 0){ return {cls:'extra', text:CFG.i18n.extra}; }\n    return null;\n  }\n\n  function displayName(ev){\n    if(ev.level === ''){ return ev.name; }\n    return '\u3010' + ev.level + '\u3011' + ev.name;\n  }\n\n  function metaText(ev){\n    var bits = [];\n    if(ev.venue !== ''){ bits.push(ev.venue); }\n    if(ev.t1 !== ''){\n      if(ev.t2 !== ''){ bits.push(ev.t1 + '-' + ev.t2); }\n      else { bits.push(ev.t1); }\n    }\n    var span = (ev.eNum - ev.sNum);\n    if(span > 0){\n      var n = Math.round((new Date(ev.end) - new Date(ev.start)) \/ 86400000) + 1;\n      bits.push(n + CFG.i18n.days);\n    }\n    return bits.join(' \/ ');\n  }\n\n  \/\/ \u4e00\u5f8b createElement + textContent\uff1a\u8cc7\u6599\u542b ampersand \u4e5f\u4e0d\u6703\u58de\uff08\u8ab2\u540d\u300c\u70d8\u8c46X\u676f\u6e2c\u9ad4\u9a57\u300d\uff09\n  function makeNode(ev, kind){\n    var isLink = (ev.url !== '');\n    var el = document.createElement(isLink ? 'a' : 'div');\n    if(isLink){\n      el.setAttribute('href', ev.url);\n      el.setAttribute('rel', 'noopener');\n    }\n    var base = (kind === 'grid') ? 'rbscal-ev' : 'rbscal-item';\n    var cls = [base];\n    if(ev.type.indexOf('\u7dda\u4e0a') >= 0){ cls.push(base + '-online'); }\n    var st = statusInfo(ev);\n    if(st){ if(st.cls === 'past'){ cls.push(base + '-past'); } }\n    el.className = cls.join(' ');\n\n    if(kind === 'list'){\n      var d = document.createElement('div');\n      d.className = 'rbscal-item-date';\n      var txt = ev.start;\n      if(ev.end !== ev.start){ txt = ev.start + ' ~ ' + ev.end; }\n      d.textContent = txt;\n      el.appendChild(d);\n    }\n\n    var nameEl = document.createElement('span');\n    nameEl.className = (kind === 'grid') ? 'rbscal-ev-name' : 'rbscal-item-name';\n    nameEl.textContent = displayName(ev);\n    if(st){\n      var b = document.createElement('span');\n      b.className = 'rbscal-badge rbscal-badge-' + st.cls;\n      b.textContent = st.text;\n      nameEl.appendChild(b);\n    }\n    el.appendChild(nameEl);\n\n    var meta = metaText(ev);\n    if(meta !== ''){\n      var m = document.createElement('span');\n      m.className = (kind === 'grid') ? 'rbscal-ev-meta' : 'rbscal-item-meta';\n      m.textContent = meta;\n      el.appendChild(m);\n    }\n    return el;\n  }\n\n  function eventsOn(y, m, d){\n    var n = y*10000 + m*100 + d;\n    return events.filter(function(ev){\n      if(ev.sNum > n){ return false; }\n      if(ev.eNum < n){ return false; }\n      return true;\n    });\n  }\n\n  function renderGrid(y, m){\n    var tbl = document.createElement('table');\n    tbl.className = 'rbscal-grid';\n    var thead = document.createElement('thead');\n    var htr = document.createElement('tr');\n    CFG.i18n.weekdays.forEach(function(w){\n      var th = document.createElement('th');\n      th.textContent = w;\n      htr.appendChild(th);\n    });\n    thead.appendChild(htr);\n    tbl.appendChild(thead);\n\n    var first = new Date(y, m-1, 1).getDay();\n    var total = new Date(y, m, 0).getDate();\n    var tbody = document.createElement('tbody');\n    var tr = document.createElement('tr');\n    var col = 0;\n    var i;\n    for(i = 0; i < first; i++){\n      var pad0 = document.createElement('td');\n      pad0.className = 'rbscal-out';\n      tr.appendChild(pad0);\n      col++;\n    }\n    var tn = todayNum();\n    for(i = 1; i <= total; i++){\n      if(col === 7){ tbody.appendChild(tr); tr = document.createElement('tr'); col = 0; }\n      var td = document.createElement('td');\n      if(y*10000 + m*100 + i === tn){ td.className = 'rbscal-today'; }\n      var num = document.createElement('div');\n      num.className = 'rbscal-daynum';\n      num.textContent = '' + i;\n      td.appendChild(num);\n      eventsOn(y, m, i).forEach(function(ev){\n        td.appendChild(makeNode(ev, 'grid'));\n      });\n      tr.appendChild(td);\n      col++;\n    }\n    while(col < 7){\n      var pad1 = document.createElement('td');\n      pad1.className = 'rbscal-out';\n      tr.appendChild(pad1);\n      col++;\n    }\n    tbody.appendChild(tr);\n    tbl.appendChild(tbody);\n    return tbl;\n  }\n\n  function renderList(y, m){\n    var frag = document.createDocumentFragment();\n    var lo = y*10000 + m*100 + 1;\n    var hi = y*10000 + m*100 + 31;\n    var mine = events.filter(function(ev){\n      if(ev.eNum < lo){ return false; }\n      if(ev.sNum > hi){ return false; }\n      return true;\n    });\n    mine.forEach(function(ev){ frag.appendChild(makeNode(ev, 'list')); });\n    return frag;\n  }\n\n  function monthLabel(y, m){\n    if(CFG.locale === 'zh'){ return y + ' \u5e74 ' + m + ' \u6708'; }\n    var names = ['January','February','March','April','May','June','July',\n                 'August','September','October','November','December'];\n    return names[m-1] + ' ' + y;\n  }\n\n  function render(){\n    titleEl.textContent = monthLabel(view.y, view.m);\n    gridWrap.textContent = '';\n    listEl.textContent = '';\n    gridWrap.appendChild(renderGrid(view.y, view.m));\n    var frag = renderList(view.y, view.m);\n    if(frag.childNodes.length === 0){\n      var p = document.createElement('div');\n      p.className = 'rbscal-msg';\n      p.textContent = CFG.i18n.empty;\n      listEl.appendChild(p);\n    } else {\n      listEl.appendChild(frag);\n    }\n    msgEl.style.display = 'none';\n  }\n\n  function shift(delta){\n    var m = view.m + delta;\n    var y = view.y;\n    if(m < 1){ m = 12; y = y - 1; }\n    if(m > 12){ m = 1; y = y + 1; }\n    view = {y:y, m:m};\n    render();\n  }\n\n  root.querySelector('.rbscal-prev').addEventListener('click', function(){ shift(-1); });\n  root.querySelector('.rbscal-next').addEventListener('click', function(){ shift(1); });\n\n  function loadRecords(){\n    if(apiUrl !== ''){\n      \/\/ \u79c1\u6709\u8a66\u7b97\u8868\uff1a\u8d70 Apps Script Web App\uff08\u898b course-calendar-apps-script.gs\uff09\n      return fetch(apiUrl).then(function(r){\n        if(!r.ok){ throw new Error('HTTP ' + r.status); }\n        return r.json();\n      }).then(function(j){\n        if(j.rows){ return j.rows; }\n        return j;\n      });\n    }\n    return fetch(CSV_URL).then(function(r){\n      if(!r.ok){ throw new Error('HTTP ' + r.status); }\n      return r.text();\n    }).then(function(text){\n      return csvToObjects(parseCsv(text));\n    });\n  }\n\n  loadRecords().then(function(recs){\n    events = buildEvents(recs);\n    view = initialView(events);\n    render();\n  }).catch(function(err){\n    msgEl.textContent = CFG.i18n.error;\n    if(window.console){ console.error('[rbscal]', err); }\n  });\n})();\n<\/script>\n\n\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     \u9867\u554f\u6559\u5b78\u8ab2\u7a0b \u6bcd\u9801 \u986f\u793a\u7a0b\u5f0f\n     \u8cbc\u9032 WordPress \u7684\u300c\u81ea\u8a02 HTML \/ Custom HTML\u300d\u5340\u584a\u3002\n     \u9019\u500b\u5340\u584a\u8981\u653e\u5728\u300c\u6587\u5b57\u5340\u584a\u300d\u7684\u4e0b\u9762\u3002\u8a2d\u5b9a\u4e00\u6b21\u5c31\u597d\uff0c\u4e4b\u5f8c\u90fd\u4e0d\u7528\u518d\u52d5\u5b83\u3002\n     \u8981\u6539\u5167\u5bb9\u8acb\u6539\u4e0a\u9762\u90a3\u500b\u6587\u5b57\u5340\u584a\u3002\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<style>\n.ch{--red:#a32b2b;--red-d:#8b1e24;--red-l:#ab2c27;--gold:#c9a24a;--ink:#2a2320;--m:#6f665f;--l:#e4ddd4;--paper:#fdfbf8;\n\t\/* \u8996\u7a97\u5bec\u5ea6\uff1bJS \u6703\u63db\u6210\u4e0d\u542b\u6372\u8ef8\u7684\u7cbe\u78ba\u503c\uff0c\u6c92\u6709 JS \u6642\u9000\u56de 100vw *\/\n\t--ch-vw:100vw;\n\tmargin:0 auto;color:var(--ink);\n\tfont-family:\"Noto Sans TC\",-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Microsoft JhengHei\",sans-serif}\n.ch,.ch *{box-sizing:border-box}\n.ch a{color:inherit}\n.ch-wrap{max-width:1160px;margin:0 auto;padding:0 22px}\n\n\/* \u2500\u2500 \u4e3b\u8996\u89ba \u2500\u2500 *\/\n.ch-hero{position:relative;overflow:hidden;background:linear-gradient(135deg,var(--red-d) 0%,var(--red-l) 100%);color:#fff}\n\/* \u5168\u5bec\uff1a\u7528\u5de6\u53f3\u8ca0\u908a\u754c\u8df3\u51fa\u4f48\u666f\u7684\u5167\u5bb9\u6b04\uff0c\u92ea\u6eff\u6574\u500b\u8996\u7a97\u5bec\u5ea6\u3002\n   \u5167\u6587\u4ecd\u7531 .ch-wrap \u7684 max-width \u6536\u5728\u4e2d\u592e\uff0c\u53ea\u6709\u80cc\u666f\uff08\u8207\u5e95\u5716\uff09\u8b8a\u5bec\u3002\n   \u4e3b\u8996\u89ba\u8207\u9328\u9ede\u5c0e\u89bd\u5171\u7528\u9019\u689d\uff0c\u5169\u584a\u7684\u5e95\u8272\u624d\u6703\u9023\u6210\u4e00\u6574\u689d\u3002 *\/\n.ch-hero,\n.ch-jump{margin-left:calc(50% - var(--ch-vw) \/ 2);margin-right:calc(50% - var(--ch-vw) \/ 2);border-radius:0}\n.ch-hero:after{content:\"\";position:absolute;right:-120px;top:-120px;width:420px;height:420px;border-radius:50%;background:rgba(255,255,255,.06)}\n.ch-hero .ch-wrap{position:relative;z-index:2;padding-top:56px;padding-bottom:52px}\n\/* \u4e3b\u8996\u89ba\u6bd4\u4f8b\u56fa\u5b9a 1920:520\uff08\u8996\u7a97 1920 \u5bec\u6642\u525b\u597d 520 \u9ad8\uff09\uff0c\u5167\u5bb9\u5782\u76f4\u7f6e\u4e2d\u3002\n   \u7528 min-height \u800c\u975e aspect-ratio\uff1a\u7a84\u87a2\u5e55\u7b97\u51fa\u4f86\u7684\u9ad8\u5ea6\u6703\u6bd4\u6587\u5b57\u9084\u77ee\uff0c\n   aspect-ratio \u6703\u88ab overflow:hidden \u88c1\u6389\u5167\u5bb9\uff0cmin-height \u5247\u8b93\u6587\u5b57\u628a\u5b83\u6490\u958b\u3002 *\/\n.ch-hero{min-height:calc(var(--ch-vw) * 520 \/ 1920);display:flex;align-items:center}\n.ch-hero > .ch-wrap{width:100%}\n\/* \u6709\u8a2d\u5b9a\u300c\u4e3b\u8996\u89ba\u5716\u7247\u300d\u6642\uff1a\u5e95\u5716\u92ea\u6eff\uff0c\u4e0a\u9762\u58d3\u4e00\u5c64\u6697\u8272\u906e\u7f69\u7dad\u6301\u6587\u5b57\u53ef\u8b80\u6027 *\/\n.ch-hero.has-bg{background:#2a2320}\n.ch-hero.has-bg:after{display:none}\n.ch-hero-bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;margin:0;max-width:none;z-index:0}\n.ch-hero.has-bg .ch-hero-mask{position:absolute;inset:0;z-index:1;\n\tbackground:linear-gradient(100deg,rgba(42,35,32,.82) 0%,rgba(42,35,32,.62) 55%,rgba(42,35,32,.42) 100%)}\n.ch-badge{display:inline-block;color:#fff;margin-bottom:16px;padding:6px 12px;border-radius:99px;background:rgba(255,255,255,.16);font-size:12px;font-weight:700;letter-spacing:.1em}\n.ch-h1{margin:0;color:#fff;font-size:clamp(28px,4.2vw,44px);line-height:1.25;font-weight:900}\n.ch-hero > .ch-wrap > p{max-width:660px;margin:18px 0 0;color:rgba(255,255,255,.86);line-height:1.9}\n.ch-stats{display:flex;flex-wrap:wrap;gap:44px;margin-top:34px}\n.ch-stat b{display:block;font-size:34px;font-weight:900;color:var(--gold);line-height:1}\n.ch-stat span{display:block;margin-top:8px;font-size:13.5px;color:rgba(255,255,255,.82)}\n\/* \u55ae\u8272\u7dda\u689d\u5716\u793a\uff0c\u8ddf\u91d1\u8272\u6587\u5b57\u540c\u8272\u7cfb *\/\n.ch-stat i{display:block;color:var(--gold);line-height:0}\n.ch-stat i svg{width:30px;height:30px;display:block;\n\tfill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}\n\n\/* \u2500\u2500 \u9328\u9ede\u5c0e\u89bd \u2500\u2500 *\/\n\/* \u6574\u689d\u7d05\u5e95\uff0c\u6309\u9215\u5e73\u6642\u662f\u7d05\u5e95\u767d\u5b57\u767d\u6846\uff1b\u6ed1\u904e\u6216\u6309\u4e0b\u624d\u7ffb\u6210\u767d\u5e95\u7d05\u5b57 *\/\n.ch-jump{position:sticky;top:0;z-index:5;background:var(--red);border-bottom:1px solid var(--red-d)}\n.ch-jump .ch-wrap{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding-top:12px;padding-bottom:12px}\n.ch-jump small{color:rgba(255,255,255,.82);font-size:12px;white-space:nowrap}\n.ch-jump a{padding:7px 14px;border:1px solid rgba(255,255,255,.55);border-radius:99px;\n\tbackground:transparent;color:#fff;font-size:13px;font-weight:700;\n\ttext-decoration:none;white-space:nowrap;\n\ttransition:background .18s ease,border-color .18s ease,color .18s ease}\n\/* :focus-visible \u8b93\u9375\u76e4\u64cd\u4f5c\u4e5f\u770b\u5f97\u5230\uff1b:active \u5c0d\u61c9\u624b\u6307\u6309\u4e0b\u7684\u77ac\u9593 *\/\n.ch-jump a:hover,\n.ch-jump a:focus-visible,\n.ch-jump a:active{background:#fff;border-color:#fff;color:var(--red)}\n\n\/* \u2500\u2500 \u884c\u4e8b\u66c6\uff08\u7f6e\u9802\uff09\u2500\u2500 \u975c\u614b\u5716\u7247\u6a21\u5f0f \u2500\u2500 *\/\n.ch-cal{background:var(--paper);border-bottom:1px solid var(--l)}\n.ch-cal .ch-wrap{padding-top:38px;padding-bottom:38px}\n.ch-cal h2{margin:0 0 6px;font-size:21px;font-weight:900}\n.ch-cal .ch-cal-note{max-width:760px;margin:0 0 20px;color:var(--m);font-size:14px;line-height:1.9}\n.ch-cal-img{display:block;width:100%;height:auto;border:1px solid var(--l);border-radius:14px;background:#fff}\n.ch-cal-ph{display:grid;place-items:center;min-height:280px;border:1px dashed var(--l);border-radius:14px;background:#fff;color:var(--m);font-size:13px;text-align:center;padding:20px;line-height:1.9}\n\n\/* \u2500\u2500 \u884c\u4e8b\u66c6\u63d2\u69fd\uff08\u5916\u639b HTML \u884c\u4e8b\u66c6\u7528\uff09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   \u523b\u610f\u653e\u5728 .ch \u4e4b\u5916\uff0c\u4e14\u4e00\u5f8b\u7528\u300c>\u300d\u76f4\u63a5\u5b50\u5143\u7d20\u9078\u64c7\u5668\uff0c\n   \u78ba\u4fdd\u4e0d\u6703\u78b0\u5230\u642c\u9032\u4f86\u7684\u884c\u4e8b\u66c6\u5167\u90e8\u4efb\u4f55\u5143\u7d20\uff08\u9023 button\u3001a\u3001table \u90fd\u4e0d\u78b0\uff09\u3002 *\/\n.ch-calslot{background:#fdfbf8;border-bottom:1px solid #e4ddd4;\n\tfont-family:\"Noto Sans TC\",-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Microsoft JhengHei\",sans-serif}\n.ch-calslot > .ch-calslot-in{max-width:1160px;margin:0 auto;padding:38px 22px}\n.ch-calslot > .ch-calslot-in > h2{margin:0 0 6px;font-size:21px;font-weight:900;color:#2a2320}\n.ch-calslot > .ch-calslot-in > p{max-width:760px;margin:0 0 20px;color:#6f665f;font-size:14px;line-height:1.9}\n.ch-calslot > .ch-calslot-in > .ch-calslot-box{min-height:40px}\n.ch-calslot > .ch-calslot-in > .ch-calslot-wait{padding:28px 20px;border:1px dashed #e4ddd4;\n\tborder-radius:14px;background:#fff;color:#6f665f;font-size:13px;line-height:1.9;text-align:center}\n\n\/* \u2500\u2500 \u5340\u584a \u2500\u2500 *\/\n\/* \u9328\u9ede\u8df3\u8f49\u6642\u9810\u7559\u56fa\u5b9a\u9801\u9996\uff0b\u5c0e\u89bd\u7684\u9ad8\u5ea6\uff0c\u6a19\u984c\u624d\u4e0d\u6703\u88ab\u84cb\u4f4f\uff08JS \u6703\u586b\u5165\u5be6\u969b\u503c\uff09 *\/\n.ch-sec{padding-top:46px;scroll-margin-top:var(--ch-anchor-off,80px)}\n.ch-banner{position:relative;overflow:hidden;padding:30px 32px;border-radius:16px;background:linear-gradient(135deg,#3a2b26 0%,#5c3b31 60%,#7a4a34 100%);color:#fff}\n.ch-banner h2{margin:0 0 10px;color:#fff;font-size:26px;font-weight:900;position:relative;z-index:2}\n.ch-banner p{margin:0;max-width:820px;color:rgba(255,255,255,.82);font-size:14.5px;line-height:1.95;position:relative;z-index:2}\n\/* \u6709\u8a2d\u5b9a\u300c\u5340\u584a\u5716\u7247\u300d\u6642\uff1a\u5e95\u5716\u92ea\u6eff\uff0c\u58d3\u4e00\u5c64\u6697\u8272\u906e\u7f69\u7dad\u6301\u6587\u5b57\u53ef\u8b80\u6027 *\/\n.ch-banner.has-bg{background:#2a2320}\n.ch-banner-bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;margin:0;max-width:none;z-index:0}\n.ch-banner-mask{position:absolute;inset:0;z-index:1;\n\tbackground:linear-gradient(100deg,rgba(42,35,32,.86) 0%,rgba(42,35,32,.66) 55%,rgba(42,35,32,.44) 100%)}\n.ch-tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px;position:relative;z-index:2}\n.ch-tag{display:inline-block;padding:6px 12px;border-radius:99px;background:rgba(255,255,255,.14);color:#fff;font-size:12px;font-weight:700}\n.ch-tag.is-free{background:rgba(201,162,74,.22);color:#ffe9b8}\n\n\/* \u4e00\u6a6b\u4e09\u5217\u7684\u5361\u7247 *\/\n.ch-list{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:18px}\n.ch-row{display:flex;flex-direction:column;padding:22px 20px;border:1px solid var(--l);border-radius:16px;background:#fff}\n\/* \u53ea\u6709\u5167\u5bb9\u5916\u6846\u8981\u5403\u6389\u5269\u9918\u9ad8\u5ea6\uff1b\u7de8\u865f\u672c\u8eab\u4e0d\u80fd\u88ab\u6490\u958b *\/\n.ch-row > div:not(.ch-no){display:flex;flex-direction:column;flex:1}\n.ch-no{flex:none;margin-bottom:8px;color:var(--red);font-size:20px;font-weight:900;line-height:1}\n.ch-row h3{margin:0 0 10px;font-size:16.5px;line-height:1.55;font-weight:900}\n\n.ch-intro{margin:0 0 14px;color:#4a423c;font-size:13.5px;line-height:1.95}\n\n\/* \u5361\u7247\u9802\u90e8\u5be6\u6a5f\u7167\u7247 *\/\n.ch-shot{margin:-22px -20px 16px;aspect-ratio:16\/10;overflow:hidden;background:var(--paper);\n\tborder-bottom:1px solid var(--l);border-radius:15px 15px 0 0}\n.ch-shot img{width:100%;height:100%;object-fit:cover;display:block;margin:0;max-width:none}\n\n\/* \u898f\u683c\u5217\uff1a\u6a19\u7c64\u8207\u5167\u5bb9\u5de6\u53f3\u5c0d\u9f4a\uff0c\u4e00\u884c\u4e00\u9805\u3002\u6846\u7684\u5de6\u53f3\u908a\u7de3\u8207\u5361\u7247\u5176\u4ed6\u6587\u5b57\u5207\u9f4a\u3002 *\/\n.ch-spec{display:grid;grid-template-columns:auto 1fr;gap:6px 12px;margin:0 0 14px;\n\tpadding:12px 14px;border-radius:10px;background:var(--paper);border:1px solid var(--l)}\n.ch-spec dt{color:var(--m);font-size:12px;font-weight:700;white-space:nowrap;line-height:1.7}\n.ch-spec dd{margin:0;color:var(--ink);font-size:12.5px;line-height:1.7}\n\n.ch-gains{margin:0 0 14px}\n.ch-gains b{display:block;margin:0 0 6px;font-size:11.5px;font-weight:700;color:var(--m);letter-spacing:.1em}\n.ch-gains ul{margin:0;padding-left:17px;color:var(--ink);font-size:12.5px;line-height:1.9}\n.ch-gains li::marker{color:var(--red)}\n\n.ch-when{display:flex;flex-wrap:wrap;align-items:center;gap:7px}\n.ch-when span{padding:4px 10px;border-radius:99px;border:1px solid var(--l);font-size:12px;font-weight:700;color:#6a5240;background:#fff}\n.ch-when .is-none{border-style:dashed;color:var(--m);font-weight:400}\n\n.ch-rowgo{margin-top:auto;padding-top:14px}\n.ch-rowgo a{display:inline-flex;align-items:center;gap:6px;padding:9px 16px;border:1px solid var(--red);border-radius:99px;color:var(--red);font-size:13px;font-weight:700;text-decoration:none}\n.ch-rowgo a:hover{background:var(--red);color:#fff}\n\n.ch-empty{margin-top:18px;padding:26px 24px;border:1px dashed var(--l);border-radius:16px;background:#fff;color:var(--m);font-size:14px;line-height:2}\n\n.ch-act{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-top:18px}\n.ch-act .ch-main{display:inline-flex;align-items:center;gap:7px;padding:13px 26px;border-radius:99px;background:var(--red);color:#fff;font-size:14.5px;font-weight:700;text-decoration:none}\n.ch-act .ch-main:hover{background:var(--red-d)}\n.ch-act .ch-line{display:inline-flex;align-items:center;gap:7px;padding:13px 22px;border-radius:99px;border:1px solid #06c755;color:#06a548;font-size:14px;font-weight:700;text-decoration:none;background:#fff}\n.ch-act .ch-line:hover{background:#06c755;color:#fff}\n\n\/* \u2500\u2500 \u8b1b\u5e2b \u2500\u2500 *\/\n.ch-teacher{margin-top:56px;display:grid;grid-template-columns:240px 1fr;gap:28px;padding:26px;border:1px solid var(--l);border-radius:16px;background:#fff}\n.ch-thumb{position:relative;min-height:240px;border-radius:14px;overflow:hidden;background:repeating-linear-gradient(45deg,#efe9e1,#efe9e1 12px,#e6ded4 12px,#e6ded4 24px)}\n.ch-thumb:after{content:\"\u7167\u7247\u9810\u7559\u5340\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);color:var(--m);font-size:11px}\n.ch-thumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;max-width:none;margin:0}\n.ch-thumb.has-img:after{display:none}\n.ch-teacher h2{margin:0 0 4px;font-size:22px}\n.ch-teacher .ch-role{margin:0 0 12px;color:var(--red);font-size:14px;font-weight:700}\n.ch-teacher .ch-bio{margin:0 0 18px;color:#4a423c;font-size:14px;line-height:1.95}\n.ch-cols{display:grid;gap:12px}\n.ch-cols h4{margin:0 0 4px;font-size:12px;font-weight:700;color:var(--m);letter-spacing:.1em}\n.ch-cols p{margin:0;color:var(--ink);font-size:13.5px;line-height:1.95}\n\n\/* \u2500\u2500 \u9801\u5c3e CTA \u2500\u2500 *\/\n.ch-cta{margin-top:60px;padding:54px 0 62px;background:linear-gradient(135deg,#3a2b26 0%,#5c3b31 100%);color:#fff;text-align:center}\n.ch-cta h2{margin:0 0 10px;color:#fff;font-size:26px;font-weight:900}\n.ch-cta p{max-width:620px;margin:0 auto 24px;color:rgba(255,255,255,.82);line-height:1.9}\n.ch-btn{display:inline-block;margin:0 6px 10px;padding:14px 26px;border-radius:99px;font-size:14.5px;font-weight:700;text-decoration:none}\n.ch-btn.is-main{background:var(--gold);color:#3a2b26}\n\/* \u7d50\u8a9e\u6309\u9215\u9023\u5230 LINE \u6642\u6539\u7528 LINE \u5b98\u65b9\u7da0\uff0c\u8ddf\u5361\u7247\u88e1\u7684\u300c\u52a0 LINE \u76f4\u63a5\u554f\u300d\u540c\u8272\u7cfb *\/\n.ch-btn.is-main.is-line{background:#06c755;color:#fff}\n.ch-btn.is-ghost{border:1px solid rgba(255,255,255,.5);color:#fff}\n\n\/* \u56de\u5230\u9802\u7aef\u6309\u9215\u5df2\u79fb\u9664\uff1a\u4f48\u666f\u672c\u8eab\u53f3\u4e0b\u89d2\u5c31\u6709\u4e00\u9846\uff0c\u5169\u9846\u6703\u758a\u5728\u4e00\u8d77\uff082026-09-15\uff09 *\/\n\n\/* \u2500\u2500 \u9632\u4f48\u666f\u8986\u84cb \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   \u6df1\u8272\u5e95\u4e0a\u7684\u6587\u5b57\u82e5\u88ab\u4f48\u666f\u7684 h1\/h2 \u984f\u8272\u898f\u5247\u84cb\u6389\u5c31\u6703\u770b\u4e0d\u898b\u3002\n   \u4f48\u666f\u5e38\u898b\u7684 `.entry-content h1`\uff08\u6b0a\u91cd 0,1,1\uff09\u6703\u58d3\u904e\u55ae\u4e00 class\uff080,1,0\uff09\uff0c\n   \u6545\u9019\u88e1\u7528\u7956\u5148\u93c8\u63d0\u9ad8\u6b0a\u91cd\u4e26\u52a0 !important \u2014\u2014 \u53ea\u7528\u5728\u300c\u932f\u4e86\u5c31\u8b80\u4e0d\u5230\u300d\u7684\u984f\u8272\u4e0a\u3002 *\/\n.ch .ch-hero .ch-h1{color:#fff !important}\n.ch .ch-hero .ch-badge{color:#fff !important}\n.ch .ch-hero .ch-wrap > p{color:rgba(255,255,255,.86) !important}\n.ch .ch-hero .ch-stat b{color:var(--gold) !important}\n.ch .ch-hero .ch-stat span{color:rgba(255,255,255,.82) !important}\n.ch .ch-sec .ch-banner h2{color:#fff !important}\n.ch .ch-sec .ch-banner p{color:rgba(255,255,255,.82) !important}\n.ch .ch-sec .ch-banner .ch-tag{color:#fff !important}\n.ch .ch-cta h2{color:#fff !important}\n.ch .ch-cta p{color:rgba(255,255,255,.82) !important}\n.ch .ch-cta .ch-btn.is-main{color:#3a2b26 !important}\n.ch .ch-cta .ch-btn.is-main.is-line{color:#fff !important}\n.ch .ch-cta .ch-btn.is-ghost{color:#fff !important}\n\/* \u5c0e\u89bd\u662f\u7d05\u5e95\u767d\u5b57\uff1b\u4f48\u666f\u82e5\u7d71\u4e00\u6539\u9023\u7d50\u984f\u8272\uff0c\u767d\u5b57\u6703\u4e0d\u898b\u3002\n   \u5c0e\u89bd\u672c\u8eab\u5c31\u662f .ch\uff08\u7368\u7acb\u9802\u5c64\u5143\u7d20\uff09\uff0c\u6240\u4ee5\u7528 .ch-jump.ch \u800c\u4e0d\u662f .ch .ch-jump\u3002\n   \u6ed1\u904e\uff0f\u6309\u4e0b\u7ffb\u767d\u5e95\u6642\u8981\u63db\u56de\u7d05\u5b57\uff0c\u6240\u4ee5 hover \u90a3\u7d44\u4e5f\u8981\u4e00\u4f75\u5ba3\u544a\u3002 *\/\n.ch-jump.ch a{color:#fff !important}\n.ch-jump.ch a:hover,\n.ch-jump.ch a:focus-visible,\n.ch-jump.ch a:active{color:var(--red) !important}\n\n.ch-warn{max-width:1160px;margin:0 auto;padding:18px 22px;border-left:4px solid #a32b2b;background:#fdf1f0;color:#7a2018;font-family:-apple-system,BlinkMacSystemFont,\"Noto Sans TC\",sans-serif;line-height:1.9}\n\n@media(max-width:1000px){\n\t.ch-list{grid-template-columns:repeat(2,1fr)}\n}\n@media(max-width:900px){\n\t.ch-teacher{grid-template-columns:1fr}\n\t.ch-thumb{min-height:180px}\n\t.ch-stats{gap:26px}\n\t.ch-banner{padding:24px 22px}\n\t.ch-banner h2{font-size:22px}\n}\n@media(max-width:650px){\n\t.ch-list{grid-template-columns:1fr}\n\t.ch-row{padding:20px 18px}\n\t.ch-shot{margin:-20px -18px 16px}\n\t.ch-act .ch-main,.ch-act .ch-line{width:100%;justify-content:center}\n}\n<\/style>\n\n<script>\n(function () {\n'use strict';\n\nvar me = document.currentScript;\nif (!me) return;\n\n\/* \u2500\u2500 1. \u8b80\u53d6\u4e0a\u65b9\u6587\u5b57\u5340\u584a \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n\nvar LINE_RE = \/^(?:\\d+(?:\\.\\d+)*\\s*[.\u3001)]?\\s*)?([^\uff1a:]{1,10})\\s*[\uff1a:]\\s*([\\s\\S]*)$\/;\n\nvar KEYS = {\n\t\/\/ \u9801\u9762\n\t'\u5c0f\u6a19': 1, '\u6a19\u984c': 1, '\u8aaa\u660e': 1, 'LINE': 1, '\u6578\u64da': 1, '\u4e3b\u8996\u89ba\u5716\u7247': 1,\n\t'\u884c\u4e8b\u66c6\u6a19\u984c': 1, '\u884c\u4e8b\u66c6\u5716\u7247': 1, '\u884c\u4e8b\u66c6\u8aaa\u660e': 1,\n\t\/\/ \u5340\u584a\n\t'\u5340\u584a': 1, '\u5340\u584a\u8aaa\u660e': 1, '\u6a19\u7c64': 1, '\u6309\u9215': 1, '\u6309\u9215\u9023\u7d50': 1, '\u7a7a\u72c0\u614b': 1, 'LINE\u6309\u9215': 1, '\u6536\u7a6b\u6a19\u984c': 1, '\u4e3b\u6309\u9215': 1, '\u5340\u584a\u5716\u7247': 1,\n\t'\u986f\u793a': 1, '\u5831\u540d\u6309\u9215': 1,\n\t\/\/ \u8ab2\u7a0b\n\t'\u8ab2\u7a0b': 1, '\u5c0d\u8c61': 1, '\u6642\u9577': 1, '\u8cbb\u7528': 1, '\u5f62\u5f0f': 1, '\u4ecb\u7d39': 1, '\u6536\u7a6b': 1, '\u5834\u6b21': 1, '\u5831\u540d': 1, '\u7167\u7247': 1,\n\t\/\/ \u8b1b\u5e2b\n\t'\u8b1b\u5e2b': 1, '\u8b1b\u5e2b\u982d\u929c': 1, '\u8b1b\u5e2b\u4ecb\u7d39': 1, '\u8b1b\u5e2b\u7167\u7247': 1, '\u6bd4\u8cfd\u7d93\u6b77': 1, '\u570b\u969b\u8b49\u7167': 1,\n\t\/\/ \u9801\u5c3e\n\t'\u7d50\u8a9e\u6a19\u984c': 1, '\u7d50\u8a9e\u8aaa\u660e': 1, '\u7d50\u8a9e\u6309\u9215': 1, '\u7d50\u8a9e\u6309\u9215\u9023\u7d50': 1,\n\t'\u7d50\u8a9e\u6b21\u8981\u6309\u9215': 1, '\u7d50\u8a9e\u6b21\u8981\u6309\u9215\u9023\u7d50': 1\n};\n\nfunction collectFrom(node) {\n\tvar els = [], text = [];\n\tvar p = node.previousElementSibling;\n\twhile (p) {\n\t\tvar t = (p.innerText || p.textContent || '');\n\t\tvar hit = t.split(\/\\r?\\n\/).some(function (l) {\n\t\t\tvar m = l.trim().match(LINE_RE);\n\t\t\treturn m && KEYS[m[1].trim()];\n\t\t});\n\t\tif (hit) { els.unshift(p); text.unshift(t); }\n\t\telse if (els.length) break;\n\t\tp = p.previousElementSibling;\n\t}\n\treturn { els: els, text: text.join('\\n') };\n}\n\nvar src = collectFrom(me);\nif (!src.els.length && me.parentElement) src = collectFrom(me.parentElement);\n\nfunction warn(msg) {\n\tvar d = document.createElement('div');\n\td.className = 'ch-warn';\n\td.innerHTML = msg;\n\tme.parentNode.insertBefore(d, me);\n}\n\nif (!src.els.length) {\n\twarn('<strong>\u627e\u4e0d\u5230\u8ab2\u7a0b\u8cc7\u6599\u3002<\/strong><br>\u8acb\u78ba\u8a8d\u300c\u81ea\u8a02 HTML\u300d\u5340\u584a\u7684<strong>\u4e0a\u65b9<\/strong>\u6709\u4e00\u500b\u6587\u5b57\u5340\u584a\uff0c'\n\t\t+ '\u800c\u4e14\u88e1\u9762\u6bcf\u4e00\u884c\u90fd\u662f\u300c\u9805\u76ee\uff1a\u5167\u5bb9\u300d\u7684\u683c\u5f0f\uff08\u4f8b\u5982\u300c\u6a19\u984c\uff1a\u9867\u554f\u6559\u5b78\u8ab2\u7a0b\u300d\uff09\u3002');\n\treturn;\n}\n\n\/* \u2500\u2500 2. \u89e3\u6790 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n\nvar YES = \/^(\u662f|y|yes|true|1|v|\u2713|\u986f\u793a|\u958b)$\/i;\n\nfunction parse(text) {\n\tvar d = {\n\t\tkicker: '', title: '', lead: '', line: '', stats: [],\n\t\theroImg: '', calTitle: '', calImg: '', calNote: '',\n\t\tsections: [],\n\t\tteacher: null,\n\t\tctaTitle: '', ctaText: '', ctaBtn: '', ctaUrl: '', ctaBtn2: '', ctaUrl2: ''\n\t};\n\tvar sec = null, course = null, inTeacher = false;\n\n\ttext.split(\/\\r?\\n\/).forEach(function (raw) {\n\t\tvar line = raw.replace(\/ \/g, ' ').trim();\n\t\tif (!line) return;\n\t\tvar m = line.match(LINE_RE);\n\t\tif (!m) return;\n\t\tvar k = m[1].trim(), v = m[2].trim();\n\t\tif (!KEYS[k]) return;\n\n\t\tswitch (k) {\n\t\t\t\/* \u9801\u9762 *\/\n\t\t\tcase '\u5c0f\u6a19': d.kicker = v; return;\n\t\t\tcase '\u6a19\u984c': d.title = v; return;\n\t\t\tcase '\u8aaa\u660e': d.lead = v; return;\n\t\t\tcase 'LINE': d.line = v; return;\n\t\t\tcase '\u6578\u64da':\n\t\t\t\tvar parts = v.split(\/[|\uff5c]\/);\n\t\t\t\tif (parts.length >= 2) d.stats.push({ n: parts[0].trim(), t: parts[1].trim() });\n\t\t\t\treturn;\n\t\t\tcase '\u4e3b\u8996\u89ba\u5716\u7247': d.heroImg = v; return;\n\t\t\tcase '\u884c\u4e8b\u66c6\u6a19\u984c': d.calTitle = v; return;\n\t\t\tcase '\u884c\u4e8b\u66c6\u5716\u7247': d.calImg = v; return;\n\t\t\tcase '\u884c\u4e8b\u66c6\u8aaa\u660e': d.calNote = v; return;\n\n\t\t\t\/* \u5340\u584a *\/\n\t\t\tcase '\u5340\u584a':\n\t\t\t\tsec = { name: v, desc: '', tags: [], btn: '', url: '', empty: '', lineBtn: false, gainsTitle: '', mainBtn: true, show: true, img: '', courses: [] };\n\t\t\t\td.sections.push(sec); course = null; inTeacher = false; return;\n\t\t\tcase '\u5340\u584a\u8aaa\u660e': if (sec) sec.desc = v; return;\n\t\t\tcase '\u6a19\u7c64': if (sec && v) sec.tags.push(v); return;\n\t\t\tcase '\u6309\u9215': if (sec) sec.btn = v; return;\n\t\t\tcase '\u6309\u9215\u9023\u7d50': if (sec) sec.url = v; return;\n\t\t\tcase '\u7a7a\u72c0\u614b': if (sec) sec.empty = v; return;\n\t\t\tcase 'LINE\u6309\u9215': if (sec) sec.lineBtn = YES.test(v); return;\n\t\t\tcase '\u4e3b\u6309\u9215': if (sec) sec.mainBtn = YES.test(v); return;\n\t\t\tcase '\u5340\u584a\u5716\u7247': if (sec) sec.img = v; return;\n\t\t\t\/\/ \u300c\u986f\u793a\u300d\u5beb\u5728\u8ab2\u7a0b\u5e95\u4e0b\u5c31\u7ba1\u90a3\u5802\u8ab2\uff0c\u5beb\u5728\u5340\u584a\u6a19\u984c\u5e95\u4e0b\u5c31\u7ba1\u6574\u500b\u5340\u584a\n\t\t\tcase '\u986f\u793a':\n\t\t\t\tif (course) course.show = YES.test(v);\n\t\t\t\telse if (sec) sec.show = YES.test(v);\n\t\t\t\treturn;\n\t\t\tcase '\u6536\u7a6b\u6a19\u984c': if (sec) sec.gainsTitle = v; return;\n\n\t\t\t\/* \u8ab2\u7a0b *\/\n\t\t\tcase '\u8ab2\u7a0b':\n\t\t\t\tif (!sec) return;\n\t\t\t\tcourse = { name: v, target: '', duration: '', price: '', format: '', intro: '', gains: [], sessions: [], url: '', btnText: '', img: '', show: true };\n\t\t\t\tsec.courses.push(course); inTeacher = false; return;\n\t\t\tcase '\u5c0d\u8c61': if (course) course.target = v; return;\n\t\t\tcase '\u6642\u9577': if (course) course.duration = v; return;\n\t\t\tcase '\u8cbb\u7528': if (course) course.price = v; return;\n\t\t\tcase '\u5f62\u5f0f': if (course) course.format = v; return;\n\t\t\tcase '\u4ecb\u7d39': if (course) course.intro = v; return;\n\t\t\tcase '\u6536\u7a6b': if (course && v) course.gains.push(v); return;\n\t\t\tcase '\u5834\u6b21': if (course && v) course.sessions.push(v); return;\n\t\t\tcase '\u5831\u540d': if (course) course.url = v; return;\n\t\t\tcase '\u5831\u540d\u6309\u9215': if (course) course.btnText = v; return;\n\t\t\tcase '\u7167\u7247': if (course) course.img = v; return;\n\n\t\t\t\/* \u8b1b\u5e2b *\/\n\t\t\tcase '\u8b1b\u5e2b':\n\t\t\t\td.teacher = { name: v, role: '', bio: '', photo: '', comps: [], certs: [] };\n\t\t\t\tinTeacher = true; sec = null; course = null; return;\n\t\t\tcase '\u8b1b\u5e2b\u982d\u929c': if (d.teacher) d.teacher.role = v; return;\n\t\t\tcase '\u8b1b\u5e2b\u4ecb\u7d39': if (d.teacher) d.teacher.bio = v; return;\n\t\t\tcase '\u8b1b\u5e2b\u7167\u7247': if (d.teacher) d.teacher.photo = v; return;\n\t\t\tcase '\u6bd4\u8cfd\u7d93\u6b77': if (d.teacher && v) d.teacher.comps.push(v); return;\n\t\t\tcase '\u570b\u969b\u8b49\u7167': if (d.teacher && v) d.teacher.certs.push(v); return;\n\n\t\t\t\/* \u9801\u5c3e *\/\n\t\t\tcase '\u7d50\u8a9e\u6a19\u984c': d.ctaTitle = v; return;\n\t\t\tcase '\u7d50\u8a9e\u8aaa\u660e': d.ctaText = v; return;\n\t\t\tcase '\u7d50\u8a9e\u6309\u9215': d.ctaBtn = v; return;\n\t\t\tcase '\u7d50\u8a9e\u6309\u9215\u9023\u7d50': d.ctaUrl = v; return;\n\t\t\tcase '\u7d50\u8a9e\u6b21\u8981\u6309\u9215': d.ctaBtn2 = v; return;\n\t\t\tcase '\u7d50\u8a9e\u6b21\u8981\u6309\u9215\u9023\u7d50': d.ctaUrl2 = v; return;\n\t\t}\n\t});\n\n\treturn d;\n}\n\nvar D = parse(src.text);\n\nif (!D.sections.length) {\n\twarn('<strong>\u8b80\u5230\u6587\u5b57\u4e86\uff0c\u4f46\u6c92\u6709\u627e\u5230\u4efb\u4f55\u8ab2\u7a0b\u5340\u584a\u3002<\/strong><br>'\n\t\t+ '\u6bcf\u4e00\u500b\u670d\u52d9\u8981\u7528\u300c<strong>\u5340\u584a\uff1a<\/strong>\u300d\u958b\u982d\uff0c\u5e95\u4e0b\u7684\u8ab2\u7a0b\u7528\u300c<strong>\u8ab2\u7a0b\uff1a<\/strong>\u300d\u958b\u982d\u3002');\n\treturn;\n}\n\n\/* \u2500\u2500 3. \u7522\u751f\u756b\u9762 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n\nfunction esc(s) {\n\treturn String(s == null ? '' : s)\n\t\t.replace(\/&\/g, '&amp;').replace(\/<\/g, '&lt;').replace(\/>\/g, '&gt;').replace(\/\"\/g, '&quot;');\n}\nfunction isFree(s) { return \/\u514d\u8cbb|free\/i.test(s); }\n\n\/* \u55ae\u8272\u7dda\u689d\u5716\u793a\uff08\u5167\u5d4c SVG\uff0c\u7121\u5916\u90e8\u76f8\u4f9d\uff09\u3002\u6587\u5b57\u8a2d\u5b9a\u5beb\u300c\u6578\u64da\uff1a\u8ab2\u7a0b|\u4e94\u5927\u670d\u52d9\u300d\u5373\u53ef *\/\nvar ICONS = {\n\t'\u8ab2\u7a0b': '<path d=\"M12 4 2.5 8.5 12 13l9.5-4.5z\"\/><path d=\"M6 10.6V15c0 1.4 2.7 2.6 6 2.6s6-1.2 6-2.6v-4.4\"\/><path d=\"M21.5 8.5v5\"\/>',\n\t'\u514d\u8cbb': '<path d=\"M3.5 12.6 12 4h7.5v7.5L11 20a1.6 1.6 0 0 1-2.3 0l-5.2-5.1a1.6 1.6 0 0 1 0-2.3z\"\/><circle cx=\"16\" cy=\"8\" r=\"1.2\"\/>',\n\t'\u8b49\u7167': '<circle cx=\"12\" cy=\"9\" r=\"5\"\/><path d=\"M9 13.5 7.5 21l4.5-2.4L16.5 21 15 13.5\"\/>',\n\t'\u64da\u9ede': '<path d=\"M12 21s6.5-5.7 6.5-11a6.5 6.5 0 1 0-13 0c0 5.3 6.5 11 6.5 11z\"\/><circle cx=\"12\" cy=\"10\" r=\"2.4\"\/>',\n\t'\u6642\u9593': '<circle cx=\"12\" cy=\"12\" r=\"8.5\"\/><path d=\"M12 7.5V12l3 1.8\"\/>',\n\t'\u4eba\u6578': '<circle cx=\"10\" cy=\"8.5\" r=\"3.5\"\/><path d=\"M3.5 20a6.5 6.5 0 0 1 13 0\"\/><path d=\"M17 5.6a3.5 3.5 0 0 1 0 6.3\"\/><path d=\"M18.5 20a6.4 6.4 0 0 0-2-4.6\"\/>',\n\t'\u5496\u5561': '<path d=\"M4 9h13v5.5A4.5 4.5 0 0 1 12.5 19h-4A4.5 4.5 0 0 1 4 14.5z\"\/><path d=\"M17 10.5h1.8a2.2 2.2 0 0 1 0 4.4H17\"\/><path d=\"M8 3.5v2.2\"\/><path d=\"M12 3.5v2.2\"\/>',\n\t'\u7dda\u4e0a': '<rect x=\"3\" y=\"4.5\" width=\"18\" height=\"12\" rx=\"1.8\"\/><path d=\"M9 20h6\"\/><path d=\"M12 16.5V20\"\/>',\n\t'\u8aee\u8a62': '<path d=\"M20.5 12.5a7.5 7.5 0 0 1-10.9 6.7L4 20.5l1.4-5.4A7.5 7.5 0 1 1 20.5 12.5z\"\/><path d=\"M9 11.5h6\"\/><path d=\"M9 14.5h3.5\"\/>',\n\t'\u9810\u8a2d': '<circle cx=\"12\" cy=\"12\" r=\"7.5\"\/>'\n};\n\nfunction statMark(v) {\n\t\/\/ \u7d14\u6578\u5b57\u6cbf\u7528\u539f\u672c\u7684\u5927\u5b57\u6a23\u5f0f\uff0c\u5176\u9918\u8996\u70ba\u5716\u793a\u540d\u7a31\n\tif (\/^[0-9\uff10-\uff19]+\\+?$\/.test(v)) return '<b>' + esc(v) + '<\/b>';\n\tvar paths = ICONS[v] || ICONS['\u9810\u8a2d'];\n\treturn '<i><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">' + paths + '<\/svg><\/i>';\n}\n\n\/\/ \u591a\u500b\u77ed\u53e5\u4e32\u6210\u4e00\u53e5\uff0c\u53bb\u6389\u5404\u81ea\u53e5\u5c3e\u6a19\u9ede\u5f8c\u7528\u9813\u865f\u63a5\u8d77\u4f86\nfunction joinLine(arr) {\n\treturn arr.map(function (x) { return esc(x).replace(\/[\u3002\uff0c,\u3001]$\/, ''); }).join('\u3001') + '\u3002';\n}\n\nvar html = '';\n\n\/* \u4e3b\u8996\u89ba *\/\nhtml += '<header class=\"ch-hero' + (D.heroImg ? ' has-bg' : '') + '\">'\n\t+ (D.heroImg ? '<img decoding=\"async\" class=\"ch-hero-bg\" src=\"' + esc(D.heroImg) + '\" alt=\"\"><div class=\"ch-hero-mask\"><\/div>' : '')\n\t+ '<div class=\"ch-wrap\">'\n\t+ (D.kicker ? '<span class=\"ch-badge\">' + esc(D.kicker) + '<\/span>' : '')\n\t+ '<h1 class=\"ch-h1\">' + esc(D.title) + '<\/h1>'\n\t+ (D.lead ? '<p>' + esc(D.lead) + '<\/p>' : '');\nif (D.stats.length) {\n\thtml += '<div class=\"ch-stats\">' + D.stats.map(function (s) {\n\t\treturn '<div class=\"ch-stat\">' + statMark(s.n) + '<span>' + esc(s.t) + '<\/span><\/div>';\n\t}).join('') + '<\/div>';\n}\nhtml += '<\/div><\/header>';\n\n\/* \u9328\u9ede\u5c0e\u89bd *\/\nvar shownSections = D.sections.filter(function (s) { return s.show; });\n\n\/\/ \u5c0e\u89bd\u4e0d\u5beb\u9032 html\uff0c\u6539\u6210\u7368\u7acb\u7684\u9802\u5c64\u5143\u7d20\u63d2\u5165\uff08\u898b\u4e0b\u65b9\uff09\u3002\n\/\/ position:sticky \u53ea\u5728\u300c\u81ea\u5df1\u7684\u7236\u5143\u7d20\u300d\u7bc4\u570d\u5167\u6709\u6548\uff0c\u82e5\u8ddf\u4e3b\u8996\u89ba\u5305\u5728\u540c\u4e00\u500b .ch \u88e1\uff0c\n\/\/ \u6372\u904e\u4e3b\u8996\u89ba\u5c31\u8ddf\u8457\u7236\u5143\u7d20\u4e00\u8d77\u96e2\u958b\u8996\u7a97\uff1b\u62c9\u6210\u9802\u5c64\u5143\u7d20\u5f8c\u7236\u5143\u7d20\u662f\u6574\u7bc7\u5167\u5bb9\uff0c\u624d\u6703\u5168\u9801\u8ddf\u8457\u3002\nvar navAt = html.length;\nvar navHtml = '<div class=\"ch-wrap\"><small>\u2193 \u5feb\u901f\u8df3\u5230<\/small>'\n\t+ shownSections.map(function (s, i) {\n\t\treturn '<a href=\"#ch-s' + (i + 1) + '\">' + esc(s.name) + '<\/a>';\n\t}).join('') + '<\/div>';\n\n\/* \u884c\u4e8b\u66c6\uff08\u7f6e\u9802\uff09\n   \u6709\u586b\u300c\u884c\u4e8b\u66c6\u5716\u7247\u300d\u2192 \u6cbf\u7528\u975c\u614b\u5716\u7247\uff0c\u6574\u9801\u7dad\u6301\u55ae\u4e00\u5bb9\u5668\u3002\n   \u6c92\u586b \u2192 \u9019\u88e1\u5207\u958b\uff0c\u884c\u4e8b\u66c6\u6539\u7528\u7368\u7acb\u63d2\u69fd\uff08\u898b\u4e0b\u65b9 slotHtml\uff09\uff0c\n         \u907f\u514d\u5916\u639b\u884c\u4e8b\u66c6\u88ab .ch \u7684\u6a23\u5f0f\u5f71\u97ff\u3002 *\/\nvar useSlot = (!D.calImg && D.calTitle);\nvar slotHtml = '';\nvar htmlLower = '';\n\nif (D.calImg) {\n\thtml += '<section class=\"ch-cal\"><div class=\"ch-wrap\">'\n\t\t+ '<h2>' + esc(D.calTitle || '\u8fd1\u671f\u958b\u8ab2\u884c\u4e8b\u66c6') + '<\/h2>'\n\t\t+ (D.calNote ? '<p class=\"ch-cal-note\">' + esc(D.calNote) + '<\/p>' : '')\n\t\t+ '<img decoding=\"async\" class=\"ch-cal-img\" src=\"' + esc(D.calImg) + '\" alt=\"' + esc(D.calTitle || '\u958b\u8ab2\u884c\u4e8b\u66c6') + '\" loading=\"lazy\">'\n\t\t+ '<\/div><\/section>';\n} else if (useSlot) {\n\tslotHtml = '<div class=\"ch-calslot-in\">'\n\t\t+ '<h2>' + esc(D.calTitle) + '<\/h2>'\n\t\t+ (D.calNote ? '<p>' + esc(D.calNote) + '<\/p>' : '')\n\t\t+ '<div class=\"ch-calslot-box\"><div class=\"ch-calslot-wait\">'\n\t\t+ '\u884c\u4e8b\u66c6\u5c1a\u672a\u8f09\u5165\u3002<br>\u8acb\u5728\u9019\u500b\u5340\u584a\u7684<strong>\u4e0b\u65b9<\/strong>\u53e6\u958b\u4e00\u500b\u300c\u81ea\u8a02 HTML\u300d\u5340\u584a\uff0c\u8cbc\u4e0a\u884c\u4e8b\u66c6\u7a0b\u5f0f\u78bc\u3002'\n\t\t+ '<\/div><\/div><\/div>';\n}\n\n\/\/ \u884c\u4e8b\u66c6\u63d2\u69fd\u7684\u63d2\u5165\u9ede\uff08\u9328\u9ede\u5c0e\u89bd\u4e4b\u5f8c\u3001\u670d\u52d9\u5340\u584a\u4e4b\u524d\uff09\nvar splitAt = html.length;\n\n\/* \u5404\u670d\u52d9\u5340\u584a *\/\nhtml += '<div class=\"ch-wrap\">';\n\nshownSections.forEach(function (sec, i) {\n\t\/\/ \u8a2d\u300c\u986f\u793a\uff1a\u5426\u300d\u7684\u8ab2\u7a0b\u5b8c\u5168\u4e0d\u8f38\u51fa\uff0c\u7de8\u865f\u53ea\u7b97\u770b\u5f97\u5230\u7684\n\tvar courses = sec.courses.filter(function (c) { return c.show; });\n\tvar anySession = courses.some(function (c) { return c.sessions.length; });\n\n\thtml += '<section class=\"ch-sec\" id=\"ch-s' + (i + 1) + '\">';\n\n\thtml += '<div class=\"ch-banner' + (sec.img ? ' has-bg' : '') + '\">'\n\t\t+ (sec.img ? '<img decoding=\"async\" class=\"ch-banner-bg\" src=\"' + esc(sec.img) + '\" alt=\"\"><div class=\"ch-banner-mask\"><\/div>' : '')\n\t\t+ '<h2>' + esc(sec.name) + '<\/h2>'\n\t\t+ (sec.desc ? '<p>' + esc(sec.desc) + '<\/p>' : '');\n\tif (sec.tags.length) {\n\t\thtml += '<div class=\"ch-tags\">' + sec.tags.map(function (t) {\n\t\t\treturn '<span class=\"ch-tag' + (isFree(t) ? ' is-free' : '') + '\">' + esc(t) + '<\/span>';\n\t\t}).join('') + '<\/div>';\n\t}\n\thtml += '<\/div>';\n\n\tif (courses.length) {\n\t\thtml += '<div class=\"ch-list\">' + courses.map(function (c, j) {\n\t\t\tvar s = '<article class=\"ch-row\">';\n\t\t\tif (c.img) {\n\t\t\t\ts += '<div class=\"ch-shot\"><img decoding=\"async\" src=\"' + esc(c.img) + '\" alt=\"' + esc(c.name) + '\" loading=\"lazy\"><\/div>';\n\t\t\t}\n\t\t\ts += '<div class=\"ch-no\">' + ('0' + (j + 1)).slice(-2) + '<\/div><div>';\n\t\t\ts += '<h3>' + esc(c.name) + '<\/h3>';\n\n\t\t\tif (c.intro) s += '<p class=\"ch-intro\">' + esc(c.intro) + '<\/p>';\n\n\t\t\t\/\/ \u898f\u683c\u5217\uff1a\u4e00\u884c\u4e00\u9805\uff0c\u6a19\u7c64\u5c0d\u9f4a\uff0c\u6bd4\u64e0\u6210\u4e00\u6392\u5c0f\u65b9\u584a\u597d\u8b80\n\t\t\tvar rows = [];\n\t\t\tif (c.target) rows.push(['\u9069\u5408\u5c0d\u8c61', c.target]);\n\t\t\tif (c.duration) rows.push(['\u4e0a\u8ab2\u6642\u9577', c.duration]);\n\t\t\tif (c.format) rows.push(['\u4e0a\u8ab2\u5f62\u5f0f', c.format]);\n\t\t\tif (c.price) rows.push(['\u5831\u540d\u8cbb\u7528', c.price]);\n\t\t\tif (rows.length) {\n\t\t\t\ts += '<dl class=\"ch-spec\">' + rows.map(function (r) {\n\t\t\t\t\treturn '<dt>' + esc(r[0]) + '<\/dt><dd>' + esc(r[1]) + '<\/dd>';\n\t\t\t\t}).join('') + '<\/dl>';\n\t\t\t}\n\n\t\t\t\/\/ \u91cd\u9ede\u8cc7\u8a0a\u4e32\u6210\u4e00\u53e5\uff0c\u4e0d\u505a\u76f4\u5f0f\u689d\u5217\n\t\t\tif (c.gains.length) {\n\t\t\t\ts += '<div class=\"ch-gains\"><b>' + esc(sec.gainsTitle || '\u4e0a\u8ab2\u5167\u5bb9') + '<\/b><ul>'\n\t\t\t\t\t+ c.gains.map(function (g) { return '<li>' + esc(g) + '<\/li>'; }).join('')\n\t\t\t\t\t+ '<\/ul><\/div>';\n\t\t\t}\n\n\t\t\t\/\/ \u6709\u5834\u6b21\u5c31\u5217\u51fa\u4f86\uff1b\u6c92\u5834\u6b21\u4f46\u9019\u662f\u53ef\u5831\u540d\u7684\u8ab2\u7a0b\uff0c\u624d\u986f\u793a\u300c\u5c1a\u672a\u6392\u5b9a\u300d\n\t\t\t\/\/ \uff08\u9867\u554f\u670d\u52d9\u3001\u64da\u9ede\u8aaa\u660e\u9019\u985e\u6c92\u6709\u5831\u540d\u9023\u7d50\u7684\u9805\u76ee\u4e0d\u6703\u51fa\u73fe\u5834\u6b21\u5217\uff09\n\t\t\t\/\/ \u53ea\u986f\u793a\u6700\u65b0\u4e00\u5834\uff0c\u5176\u9918\u7559\u5728\u5831\u540d\u9801\n\t\t\tif (c.sessions.length || c.url) {\n\t\t\t\ts += '<div class=\"ch-when\">';\n\t\t\t\ts += c.sessions.length\n\t\t\t\t\t? '<span>' + esc(c.sessions[0]) + '<\/span>'\n\t\t\t\t\t: '<span class=\"is-none\">\u5c1a\u672a\u6392\u5b9a\uff0c\u53ef\u7559\u8a00\u5019\u88dc<\/span>';\n\t\t\t\ts += '<\/div>';\n\t\t\t}\n\n\t\t\t\/\/ \u6709\u586b\u5831\u540d\u7db2\u5740\u5c31\u7d66\u9019\u5802\u8ab2\u4e00\u9846\u81ea\u5df1\u7684\u6309\u9215\n\t\t\tif (c.url) {\n\t\t\t\ts += '<div class=\"ch-rowgo\"><a href=\"' + esc(c.url) + '\">'\n\t\t\t\t\t+ esc(c.btnText || '\u7acb\u5373\u5831\u540d') + ' \u2192<\/a><\/div>';\n\t\t\t}\n\n\t\t\treturn s + '<\/div><\/article>';\n\t\t}).join('') + '<\/div>';\n\t}\n\n\t\/\/ \u6574\u500b\u5340\u584a\u90fd\u6c92\u6709\u5834\u6b21\u6642\uff0c\u986f\u793a\u7a7a\u72c0\u614b\u8aaa\u660e\n\tif (!anySession && sec.empty) {\n\t\thtml += '<div class=\"ch-empty\">' + esc(sec.empty) + '<\/div>';\n\t}\n\n\t\/\/ \u5340\u584a\u4e3b\u6309\u9215\uff08\u53ef\u7528\u300c\u4e3b\u6309\u9215\uff1a\u5426\u300d\u95dc\u6389\uff09\u8207 LINE \u6309\u9215\u5404\u81ea\u7368\u7acb\n\tvar acts = '';\n\tif (sec.mainBtn && sec.btn && sec.url) {\n\t\tacts += '<a class=\"ch-main\" href=\"' + esc(sec.url) + '\">' + esc(sec.btn) + ' \u2192<\/a>';\n\t}\n\tif (sec.lineBtn && D.line) {\n\t\tacts += '<a class=\"ch-line\" href=\"' + esc(D.line) + '\" target=\"_blank\" rel=\"noopener\">\u6b61\u8fce\u52a0 LINE \u8aee\u8a62<\/a>';\n\t}\n\tif (acts) html += '<div class=\"ch-act\">' + acts + '<\/div>';\n\n\thtml += '<\/section>';\n});\n\n\/* \u8b1b\u5e2b *\/\nif (D.teacher) {\n\tvar t = D.teacher;\n\thtml += '<section class=\"ch-teacher\">'\n\t\t+ '<div class=\"ch-thumb' + (t.photo ? ' has-img' : '') + '\">'\n\t\t+ (t.photo ? '<img decoding=\"async\" src=\"' + esc(t.photo) + '\" alt=\"' + esc(t.name) + '\" loading=\"lazy\">' : '')\n\t\t+ '<\/div><div>'\n\t\t+ '<h2>\u670d\u52d9\u9867\u554f\uff5c' + esc(t.name) + '<\/h2>'\n\t\t+ (t.role ? '<p class=\"ch-role\">' + esc(t.role) + '<\/p>' : '')\n\t\t+ (t.bio ? '<p class=\"ch-bio\">' + esc(t.bio) + '<\/p>' : '')\n\t\t+ '<div class=\"ch-cols\">'\n\t\t+ (t.comps.length ? '<div><h4>\u6bd4\u8cfd\u7d93\u6b77<\/h4><p>' + joinLine(t.comps) + '<\/p><\/div>' : '')\n\t\t+ (t.certs.length ? '<div><h4>\u570b\u969b\u8b49\u7167<\/h4><p>' + joinLine(t.certs) + '<\/p><\/div>' : '')\n\t\t+ '<\/div><\/div><\/section>';\n}\n\nhtml += '<\/div>';   \/\/ \/.ch-wrap\n\n\/* \u9801\u5c3e CTA *\/\nif (D.ctaTitle) {\n\thtml += '<section class=\"ch-cta\"><div class=\"ch-wrap\">'\n\t\t+ '<h2>' + esc(D.ctaTitle) + '<\/h2>'\n\t\t+ (D.ctaText ? '<p>' + esc(D.ctaText) + '<\/p>' : '')\n\t\t\/\/ \u9023\u7d50\u6307\u5411 LINE \u5c31\u639b is-line\uff0c\u6309\u9215\u81ea\u52d5\u8b8a\u6210 LINE \u7da0\n\t\t+ (D.ctaBtn && D.ctaUrl ? '<a class=\"ch-btn is-main'\n\t\t\t+ (\/line\\.me|lin\\.ee\/i.test(D.ctaUrl) ? ' is-line' : '')\n\t\t\t+ '\" href=\"' + esc(D.ctaUrl) + '\" target=\"_blank\" rel=\"noopener\">' + esc(D.ctaBtn) + '<\/a>' : '')\n\t\t+ (D.ctaBtn2 && D.ctaUrl2 ? '<a class=\"ch-btn is-ghost\" href=\"' + esc(D.ctaUrl2) + '\">' + esc(D.ctaBtn2) + '<\/a>' : '')\n\t\t+ '<\/div><\/section>';\n}\n\nvar box = document.createElement('div');\nbox.className = 'ch';\n\nvar anchorEl = src.els[0];\nvar parent = anchorEl.parentNode;\nvar slotBox = null;\n\n\/\/ \u4e3b\u8996\u89ba \u2192 \u5c0e\u89bd\uff08\u7368\u7acb\u9802\u5c64\u5143\u7d20\uff0csticky \u624d\u80fd\u5168\u9801\u8ddf\u8457\uff09\u2192 \u884c\u4e8b\u66c6 \u2192 \u5176\u9918\u5167\u5bb9\nbox.innerHTML = html.slice(0, navAt);\nparent.insertBefore(box, anchorEl);\n\nvar navEl = document.createElement('nav');\n\/\/ ch\uff1d\u5403\u5f97\u5230\u8272\u7968\u8207\u5b57\u9ad4\u8b8a\u6578\uff1balignfull\uff1dWordPress\uff0f\u4f48\u666f\u8a8d\u5f97\u7684\u300c\u6574\u9801\u5bec\u300d\u9003\u751f\u9580\u3002\n\/\/ \u5340\u584a\u7de8\u8f2f\u5668\u7684\u7248\u9762 CSS \u6703\u5c0d .entry-content \u7684\u6bcf\u500b\u76f4\u63a5\u5b50\u5143\u7d20\u4e0b\n\/\/ `margin-left:auto !important` \u8207 `width:var(--theme-block-width)`\uff0c\u628a\u8ca0\u908a\u754c\u58d3\u6389\uff1b\n\/\/ \u90a3\u689d\u9078\u64c7\u5668\u5beb\u4e86 :not(.alignfull)\uff0c\u639b\u4e0a\u9019\u500b class \u6574\u689d\u5c31\u4e0d\u5957\u7528\u3002\n\/\/ \u6c92\u6709\u9019\u500b\u6a5f\u5236\u7684\u74b0\u5883\uff08\u4f8b\u5982\u672c\u6a5f\u9810\u89bd\uff09\u9019\u500b class \u7121\u4f5c\u7528\uff0c\u5168\u5bec\u4ecd\u7531\u8ca0\u908a\u754c\u898f\u5247\u8ca0\u8cac\u3002\nnavEl.className = 'ch ch-jump alignfull';\nnavEl.innerHTML = navHtml;\nparent.insertBefore(navEl, anchorEl);\n\n\/\/ \u5c0e\u89bd\u8207\u670d\u52d9\u5340\u584a\u4e4b\u9593\u7684\u6771\u897f\uff08\u975c\u614b\u5716\u7247\u6a21\u5f0f\u7684\u884c\u4e8b\u66c6\uff1b\u63d2\u69fd\u6a21\u5f0f\u70ba\u7a7a\uff09\nvar middle = html.slice(navAt, splitAt);\nif (middle) {\n\tvar midBox = document.createElement('div');\n\tmidBox.className = 'ch';\n\tmidBox.innerHTML = middle;\n\tparent.insertBefore(midBox, anchorEl);\n}\n\nif (useSlot) {\n\tslotBox = document.createElement('div');\n\tslotBox.className = 'ch-calslot';\n\tslotBox.innerHTML = slotHtml;\n\tparent.insertBefore(slotBox, anchorEl);\n}\n\nvar lower = document.createElement('div');\nlower.className = 'ch';\nlower.innerHTML = html.slice(splitAt);\nparent.insertBefore(lower, anchorEl);\n\nsrc.els.forEach(function (el) { el.style.display = 'none'; });\n\n\/* \u2500\u2500 4. \u628a\u5916\u639b\u7684\u884c\u4e8b\u66c6\u642c\u9032\u63d2\u69fd \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   \u4f7f\u7528\u8005\u6703\u53e6\u5916\u958b\u4e00\u500b\u300c\u81ea\u8a02 HTML\u300d\u5340\u584a\u8cbc\u884c\u4e8b\u66c6\u7a0b\u5f0f\u78bc\u3002\n   \u90a3\u500b\u5340\u584a\u5728\u9801\u9762\u4e0a\u7684\u4f4d\u7f6e\u5728\u6211\u5011\u5f8c\u9762\uff0c\u9019\u88e1\u628a\u5b83\u6574\u584a\u642c\u9032\u63d2\u69fd\uff0c\n   \u4f4d\u7f6e\u5c31\u6703\u6b63\u78ba\uff1b\u56e0\u70ba\u63d2\u69fd\u5728 .ch \u4e4b\u5916\uff0c\u884c\u4e8b\u66c6\u7684\u6a23\u5f0f\u4e5f\u4e0d\u6703\u88ab\u6211\u5011\u5f71\u97ff\u3002 *\/\n\nif (slotBox) {\n\tvar slotTarget = slotBox.querySelector('.ch-calslot-box');\n\n\tfunction adopt() {\n\t\tif (!slotTarget || slotTarget.getAttribute('data-filled')) return true;\n\t\t\/\/ \u8a8d .rbscal\uff08\u73fe\u884c\u884c\u4e8b\u66c6\u7684\u6839\u7bc0\u9ede\uff09\u6216\u81ea\u8a02\u7684 #ch-calendar \u5305\u88dd\n\t\tvar cal = document.querySelector('#ch-calendar, .rbscal');\n\t\tif (!cal || slotBox.contains(cal)) return false;\n\n\t\t\/\/ \u82e5\u884c\u4e8b\u66c6\u5916\u9762\u9084\u6709\u4e00\u5c64 WordPress \u7684\u5340\u584a\u5305\u88dd\uff0c\u9023\u5305\u88dd\u4e00\u8d77\u642c\uff0c\u907f\u514d\u7559\u4e0b\u7a7a\u6bbc\n\t\tvar node = cal;\n\t\twhile (node.parentNode\n\t\t\t&& node.parentNode !== document.body\n\t\t\t&& node.parentNode.children.length === 1\n\t\t\t&& !node.parentNode.classList.contains('entry-content')) {\n\t\t\tnode = node.parentNode;\n\t\t}\n\n\t\tslotTarget.textContent = '';\n\t\tslotTarget.appendChild(node);\n\t\tslotTarget.setAttribute('data-filled', '1');\n\t\treturn true;\n\t}\n\n\t\/\/ \u884c\u4e8b\u66c6\u5340\u584a\u53ef\u80fd\u9084\u6c92\u88ab\u700f\u89bd\u5668\u89e3\u6790\u5230\uff0c\u6700\u591a\u7b49 5 \u79d2\n\tif (!adopt()) {\n\t\tvar tries = 0;\n\t\tvar timer = setInterval(function () {\n\t\t\ttries++;\n\t\t\tif (adopt() || tries > 50) clearInterval(timer);\n\t\t}, 100);\n\t\tdocument.addEventListener('DOMContentLoaded', adopt);\n\t}\n}\n\n\/* \u2500\u2500 5.\uff08\u5df2\u79fb\u9664\uff09\u56de\u5230\u9802\u7aef \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   \u4f48\u666f\u53f3\u4e0b\u89d2\u672c\u4f86\u5c31\u6709\u4e00\u9846\u56de\u5230\u9802\u7aef\uff0c\u5169\u9846\u6703\u758a\u5728\u4e00\u8d77\uff0c\u6545\u6574\u6bb5\u62ff\u6389\u3002\n   \u8981\u5fa9\u539f\u7684\u8a71\uff1aCSS \u7684 .ch-top \u5340\u584a\u3001html \u5c3e\u7aef\u7684 <a class=\"ch-top\"> \u8f38\u51fa\u3001\n   \u4ee5\u53ca\u9019\u88e1\u7684\u6372\u52d5\u6de1\u5165\u8207 scrollTo \u4e09\u8655\u4e00\u8d77\u88dc\u56de\u4f86\u3002 *\/\n\n\/* \u2500\u2500 6. \u4e3b\u8996\u89ba\u5168\u5bec\u7684\u8996\u7a97\u5bec\u5ea6 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   CSS \u9810\u8a2d\u7528 100vw\uff0c\u4f46 100vw \u542b\u76f4\u5411\u6372\u8ef8\u5bec\u5ea6\uff0c\u5728\u6703\u986f\u793a\u5be6\u9ad4\u6372\u8ef8\u7684\n   \u7cfb\u7d71\u4e0a\u6703\u591a\u51fa\u5e7e px \u800c\u9577\u51fa\u6a6b\u5411\u6372\u8ef8\u3002\u9019\u88e1\u6539\u7528 clientWidth\uff08\u4e0d\u542b\u6372\u8ef8\uff09\n   \u5beb\u9032 --ch-vw\uff1b\u6c92\u6709 JS \u6642\u7dad\u6301 100vw \u4ecd\u662f\u5168\u5bec\uff0c\u53ea\u662f\u53ef\u80fd\u591a\u90a3\u5e7e px\u3002 *\/\n\nvar boxes = document.querySelectorAll('.ch');\nfunction syncVw() {\n\tvar w = document.documentElement.clientWidth + 'px';\n\tArray.prototype.forEach.call(boxes, function (el) {\n\t\tel.style.setProperty('--ch-vw', w);\n\t});\n}\nsyncVw();\nwindow.addEventListener('resize', syncVw, { passive: true });\ndocument.addEventListener('DOMContentLoaded', syncVw);\n\n\/* \u2500\u2500 7. \u5c0e\u89bd\u907f\u958b\u4f48\u666f\u7684\u56fa\u5b9a\u9801\u9996 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   \u4f48\u666f\u5e38\u6709\u4e00\u689d position:fixed \u7684\u9801\u9996\u3002\u5c0e\u89bd\u82e5\u4e5f\u505c\u5728 top:0\uff0c\n   \u6703\u6574\u689d\u88ab\u58d3\u5728\u9801\u9996\u5e95\u4e0b\u770b\u4e0d\u898b\uff08\u770b\u8d77\u4f86\u5c31\u50cf\u300c\u6c92\u6709\u51cd\u7d50\u300d\uff09\u3002\n   \u9019\u88e1\u91cf\u51fa\u90a3\u689d\u9801\u9996\u7684\u5be6\u969b\u9ad8\u5ea6\uff0c\u628a\u5c0e\u89bd\u7684 top \u5f80\u4e0b\u632a\u540c\u6a23\u7684\u8ddd\u96e2\u3002\n   \u9ad8\u5ea6\u7528\u91cf\u7684\u3001\u4e0d\u5beb\u6b7b\uff0c\u4f48\u666f\u63db\u7248\u6216\u6372\u52d5\u6642\u7e2e\u9ad8\u90fd\u6703\u8ddf\u8457\u5c0d\u3002 *\/\n\nvar jumpEl = document.querySelector('.ch-jump');\nif (jumpEl) {\n\tvar bars = [];           \/\/ \u5feb\u53d6\u6240\u6709\u9802\u7aef\u56fa\u5b9a\u5217\uff0c\u4e4b\u5f8c\u53ea\u8b80\u5b83\u5011\u7684\u4f4d\u7f6e\uff0c\u4e0d\u518d\u5168\u9801\u6383\u63cf\n\tvar lastScan = 0;\n\n\t\/\/ \u26a0\ufe0f \u9019\u652f\u7a0b\u5f0f\u8cbc\u5728 WordPress \u7684\u300c\u81ea\u8a02 HTML\u300d\u5340\u584a\u88e1\uff0c**\u4e0d\u53ef\u4ee5\u51fa\u73fe\u88f8\u7684\u5c0f\u65bc\u7b26\u865f**\u3002\n\t\/\/ WordPress \u6703\u628a\u5c0f\u65bc\u7b26\u865f\u7576\u6210 HTML \u6a19\u7c64\u7684\u958b\u982d\uff0c\u4e00\u8def\u5403\u5230\u4e0b\u4e00\u500b\u5927\u65bc\u7b26\u865f\u70ba\u6b62\uff0c\n\t\/\/ \u4e26\u628a\u90a3\u6bb5\u7bc4\u570d\u5167\u7684\u6bcf\u500b and \u7b26\u865f\u8f49\u6210 HTML \u5be6\u9ad4\uff0c\u908f\u8f2f and \u5c31\u88ab\u6253\u65b7\u3001\u6574\u652f\u8173\u672c SyntaxError\u3002\n\t\/\/ \u6240\u4ee5\u4e00\u5f8b\u628a\u5927\u5c0f\u6bd4\u8f03\u5beb\u6210\u5927\u65bc\uff0f\u5927\u65bc\u7b49\u65bc\u7684\u5f62\u5f0f\uff08\u5de6\u53f3\u5c0d\u8abf\uff09\u3002\n\n\t\/\/ \u5019\u9078\u689d\u4ef6\uff1aposition:fixed\u3001\u9760\u8fd1\u8996\u7a97\u9802\u7aef\u3001\u5bec\u5ea6\u4f54\u8996\u7a97\u516d\u6210\u4ee5\u4e0a\u3001\u9ad8\u5ea6\u4e0d\u50cf\u6574\u9801\u906e\u7f69\u3002\n\t\/\/ \u9019\u88e1\u653e\u5bec\u300c\u8cbc\u9f4a\u9802\u7aef\u300d\u7684\u9650\u5236\uff08\u767b\u5165\u6642\u4f48\u666f\u9801\u9996\u6703\u88ab\u7ba1\u7406\u5217\u5f80\u4e0b\u63a8\u5230 top:32\uff09\uff0c\n\t\/\/ \u5be6\u969b\u8981\u4e0d\u8981\u7b97\u9032\u53bb\u4ea4\u7d66\u4e0b\u9762\u7684 barsBottom() \u4f9d\u300c\u662f\u5426\u63a5\u7e8c\u5728\u524d\u4e00\u689d\u5e95\u4e0b\u300d\u5224\u65b7\u3002\n\tfunction looksLikeTopBar(el) {\n\t\tif (el === jumpEl || jumpEl.contains(el)) return false;\n\t\tif (getComputedStyle(el).position !== 'fixed') return false;\n\t\tvar r = el.getBoundingClientRect();\n\t\treturn r.height > 0 && 300 >= r.height\n\t\t\t&& r.width >= window.innerWidth * 0.6\n\t\t\t&& 200 >= r.top && r.bottom > 0;\n\t}\n\n\t\/\/ \u26a0\ufe0f \u9802\u7aef\u56fa\u5b9a\u5217\u53ef\u80fd\u4e0d\u53ea\u4e00\u689d\uff1a\u767b\u5165\u4e2d\u7684\u7ba1\u7406\u8005\u6703\u591a\u4e00\u689d WordPress \u7ba1\u7406\u5217\uff0832px\uff09\uff0c\n\t\/\/ \u4f48\u666f\u9801\u9996\u758a\u5728\u5b83\u4e0b\u9762\u3002\u6240\u4ee5\u8981\u8490\u96c6\u5168\u90e8\u3001\u53d6**\u6700\u4f4e\u7684\u90a3\u4e00\u689d\u5e95\u7de3**\uff0c\n\t\/\/ \u53ea\u53d6\u7b2c\u4e00\u500b\u627e\u5230\u7684\u6703\u62ff\u5230\u7ba1\u7406\u5217\uff08DOM \u9806\u5e8f\u5728\u524d\uff09\uff0c\u5c0e\u89bd\u5c31\u88ab\u58d3\u5728\u4f48\u666f\u9801\u9996\u5e95\u4e0b\u770b\u4e0d\u898b\u3002\n\tfunction findBars() {\n\t\tvar found = [];\n\t\tvar all = document.body.getElementsByTagName('*');\n\t\tfor (var i = 0; all.length > i; i++) {\n\t\t\tif (looksLikeTopBar(all[i])) found.push(all[i]);\n\t\t}\n\t\treturn found;\n\t}\n\n\t\/\/ \u5f9e\u8996\u7a97\u9802\u7aef\u5f80\u4e0b\u5806\u758a\uff1a\u53ea\u63a1\u7d0d\u300c\u63a5\u5728\u76ee\u524d\u5e95\u7de3\u4e4b\u4e0b\u300d\u7684\u56fa\u5b9a\u5217\uff0c\n\t\/\/ \u4e00\u689d\u63a5\u4e00\u689d\u628a\u5e95\u7de3\u5f80\u4e0b\u63a8\uff08\u7ba1\u7406\u5217 0\u201332 \u2192 \u4f48\u666f\u9801\u9996 32\u2013135 \u2192 \u5e95\u7de3 135\uff09\u3002\n\t\/\/ \u9019\u6a23\u6d6e\u5728\u534a\u7a7a\u4e2d\u7684\u56fa\u5b9a\u5143\u7d20\uff08\u4f8b\u5982\u7f6e\u5e95\u6309\u9215\u3001\u5074\u908a\u6d6e\u5c64\uff09\u4e0d\u6703\u88ab\u8aa4\u7b97\u3002\n\tfunction barsBottom() {\n\t\tvar bottom = 0, changed = true, guard = 0;\n\t\twhile (changed && 6 > guard) {\n\t\t\tchanged = false; guard++;\n\t\t\tfor (var i = 0; bars.length > i; i++) {\n\t\t\t\tvar el = bars[i];\n\t\t\t\tif (!el.isConnected || !looksLikeTopBar(el)) continue;\n\t\t\t\tvar r = el.getBoundingClientRect();\n\t\t\t\tif (bottom + 2 >= r.top && r.bottom > bottom) {\n\t\t\t\t\tbottom = r.bottom; changed = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn Math.round(bottom);\n\t}\n\n\tfunction syncJumpTop(rescan) {\n\t\t\/\/ \u5168\u9801\u6383\u63cf\u8f03\u8cb4\uff1a\u5e73\u5e38\u53ea\u8b80\u5feb\u53d6\u5143\u7d20\u7684\u4f4d\u7f6e\uff08\u9ad8\u5ea6\u6703\u8b8a\u7684\u9801\u9996\u4e5f\u8ddf\u5f97\u4e0a\uff09\uff1b\n\t\t\/\/ \u6c92\u627e\u5230\u4efb\u4f55\u4e00\u689d\u6642\u624d\u91cd\u6383\uff0c\u6700\u591a\u6bcf\u79d2\u4e00\u6b21\uff08\u6709\u4e9b\u4f48\u666f\u7684\u9801\u9996\u662f\u6372\u52d5\u5f8c\u624d\u51fa\u73fe\uff09\u3002\n\t\tvar now = Date.now();\n\t\tif (rescan || !bars.length) {\n\t\t\tif (rescan || now - lastScan > 1000) { lastScan = now; bars = findBars(); }\n\t\t}\n\t\tvar h = barsBottom();\n\t\t\/\/ \u5f80\u4e0a\u591a\u758a 1px\uff1a\u5c0f\u6578\u9ede\u56db\u6368\u4e94\u5165\u6216\u7e2e\u653e\u6bd4\u4f8b\u9020\u6210\u7684\u9aee\u7d72\u7e2b\u6703\u88ab\u84cb\u6389\u3002\n\t\t\/\/ \u5c0e\u89bd\u6709\u4e0d\u900f\u660e\u767d\u5e95\uff0c\u84cb\u4f4f\u9801\u9996\u6700\u5e95\u4e0b\u90a3 1px \u770b\u4e0d\u51fa\u4f86\u3002\n\t\tvar top = h > 0 ? h - 1 : 0;\n\t\tjumpEl.style.top = top + 'px';\n\t\t\/\/ \u9328\u9ede\u8df3\u8f49\u8981\u518d\u591a\u8b93\u958b\u5c0e\u89bd\u672c\u8eab\u7684\u9ad8\u5ea6\n\t\tvar off = (top + Math.round(jumpEl.getBoundingClientRect().height) + 12) + 'px';\n\t\tjumpEl.style.setProperty('--ch-anchor-off', off);\n\t\tdocument.documentElement.style.setProperty('--ch-anchor-off', off);\n\t}\n\n\t\/\/ \u6709\u4e9b\u4f48\u666f\u7684\u9801\u9996\u6703\u5728\u6372\u52d5\u6642\u6539\u8b8a\u9ad8\u5ea6\uff08\u7e2e\u5c0f\u3001\u6536\u5408\u3001\u8df3\u51fa\u516c\u544a\u5217\uff09\uff0c\u800c\u4e14\u591a\u534a\u5e36 CSS transition\u3002\n\t\/\/ \u53ea\u5728\u6372\u52d5\u4e8b\u4ef6\u7576\u4e0b\u91cf\uff0c\u6703\u91cf\u5230\u52d5\u756b\u4e2d\u9014\u7684\u503c\uff0c\u5c0e\u89bd\u5c31\u505c\u5728\u820a\u4f4d\u7f6e\u3001\u8ddf\u9801\u9996\u4e4b\u9593\u9732\u51fa\u4e00\u689d\u7e2b\u3002\n\t\/\/ \u6240\u4ee5\u9664\u4e86\u6372\u52d5\u5373\u6642\u540c\u6b65\uff0c\u518d\u52a0\u5169\u9053\uff1aResizeObserver \u76ef\u4f4f\u6bcf\u689d\u56fa\u5b9a\u5217\u7684\u5c3a\u5bf8\u8b8a\u5316\u3001\n\t\/\/ \u4ee5\u53ca\u6372\u52d5\u505c\u6b62\u5f8c\u88dc\u91cf\u4e00\u6b21\u3002\n\tvar ro = null;\n\tif (window.ResizeObserver) {\n\t\tro = new ResizeObserver(function () { syncJumpTop(false); });\n\t}\n\tfunction observeBars() {\n\t\tif (!ro) return;\n\t\tro.disconnect();\n\t\tfor (var i = 0; bars.length > i; i++) ro.observe(bars[i]);\n\t}\n\n\tvar settleTimer = null;\n\tfunction syncAfterSettle() {\n\t\tif (settleTimer) clearTimeout(settleTimer);\n\t\tsettleTimer = setTimeout(function () { syncJumpTop(true); observeBars(); }, 220);\n\t}\n\n\tfunction rescan() { syncJumpTop(true); observeBars(); }\n\n\trescan();\n\tvar jumpTicking = false;\n\twindow.addEventListener('scroll', function () {\n\t\tif (!jumpTicking) {\n\t\t\tjumpTicking = true;\n\t\t\trequestAnimationFrame(function () { jumpTicking = false; syncJumpTop(false); });\n\t\t}\n\t\tsyncAfterSettle();   \/\/ \u6372\u52d5\u505c\u6b62\u5f8c\u518d\u88dc\u91cf\uff0c\u907f\u958b\u9801\u9996\u7e2e\u653e\u52d5\u756b\u7684\u4e2d\u9014\u503c\n\t}, { passive: true });\n\twindow.addEventListener('resize', rescan, { passive: true });\n\tdocument.addEventListener('DOMContentLoaded', rescan);\n\t\/\/ \u4f48\u666f\uff0f\u7ba1\u7406\u5217\u6709\u6642\u665a\u4e00\u9ede\u624d\u5c31\u4f4d\uff0c\u8f09\u5165\u5f8c\u518d\u91cd\u6383\u5169\u6b21\n\tsetTimeout(rescan, 800);\n\tsetTimeout(rescan, 2500);\n}\n\n})();\n<\/script>\n\n\n\n<style>\n\/* 2026-09-23\uff1a\u5feb\u901f\u8df3\u5230\u5217\u7d71\u4e00\u6210\u5168\u7ad9\u898f\u683c\uff08\u6210\u529f\u6848\u4f8b\u90a3\u5957\uff09\u3002\n   \u672c\u9801\u7684\u5f15\u64ce\uff08ch- \u90a3\u5957\uff09\u672c\u5c08\u6848\u6c92\u6709\u539f\u59cb\u78bc\uff0c\u6240\u4ee5\u4e0d\u52d5\u5f15\u64ce\uff0c\u6539\u5728\u6700\u5f8c\u9644\u52a0\u8986\u5beb\u3002\n   \u26a0\ufe0f \u5f15\u64ce\u6709 `.ch-jump.ch a{color:#fff !important}`\uff080,2,1 \uff0b !important\uff09\uff0c\n      \u8986\u5beb\u5fc5\u9808\u540c\u6a23\u5e36 !important \u4e14\u6392\u5728\u5f8c\u9762\u624d\u58d3\u5f97\u904e\u3002 *\/\n.ch-jump{background:#fbfaf8 !important;border-bottom:1px solid #e6e3df !important}\n.ch-jump .ch-wrap{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;\n  -webkit-overflow-scrolling:touch;gap:10px;padding-top:10px;padding-bottom:10px}\n.ch-jump .ch-wrap::-webkit-scrollbar{display:none}\n.ch-jump small{flex:0 0 auto;color:#6b6b70;font-size:12.5px;font-weight:400;letter-spacing:.06em}\n.ch-jump.ch a{flex:0 0 auto;line-height:1.6;padding:7px 16px;border-radius:999px;border:1px solid #e6e3df;\n  background:#fff;font-size:13.5px;font-weight:700;color:#6b6b70 !important}\n.ch-jump.ch a:hover,\n.ch-jump.ch a:focus-visible,\n.ch-jump.ch a:active{background:#fff;border-color:#8B1E24;color:#8B1E24 !important}\n\/* \u9078\u4e2d\u614b (0,3,1) \u58d3\u5f97\u904e\u4e0a\u9762\u90a3\u689d (0,2,1)\uff1bhover \u4e5f\u4e00\u8d77\u5ba3\u544a\uff0c\u514d\u5f97\u6ed1\u904e\u53bb\u8b8a\u56de\u767d\u5e95 *\/\n.ch-jump.ch a.rbs-on,\n.ch-jump.ch a.rbs-on:hover{background:#8B1E24;border-color:#8B1E24;color:#fff !important}\n@media (max-width:560px){\n  .ch-jump .ch-wrap{gap:8px;padding-top:8px;padding-bottom:8px}\n  .ch-jump small{display:none}\n  .ch-jump.ch a{padding:6px 13px;font-size:13px}\n}\n<\/style>\n<script>\n\/* \u6372\u5230\u54ea\u4e00\u6bb5\u5c31\u4eae\u54ea\u4e00\u9846\uff0c\u4e26\u628a\u4eae\u7684\u90a3\u9846\u6c34\u5e73\u6372\u9032\u756b\u9762\u3002\u672c\u9801\u539f\u672c\u5b8c\u5168\u6c92\u6709\u9019\u500b\u884c\u70ba\u3002\n   \u26d4 \u5168\u6bb5\u4e0d\u4f7f\u7528 ampersand \u5b57\u5143\uff08WP \u6703\u8f49\u7fa9\u6389\u3001\u70b8\u6389 inline script\uff09\uff0c\u689d\u4ef6\u5f0f\u4e00\u5f8b\u62c6\u5de2\u72c0 if\u3002 *\/\n(function(){\n  function start(){\n    var nav = document.querySelector('.ch-jump');\n    if (!nav) { return; }\n    var box = nav.querySelector('.ch-wrap');\n    if (!box) { return; }\n    var links = [].slice.call(nav.querySelectorAll('a'));\n    if (links.length === 0) { return; }\n\n    var items = [];\n    for (var i = 0; i < links.length; i++) {\n      var href = links[i].getAttribute('href') || '';\n      var hash = href.indexOf('#');\n      if (hash < 0) { continue; }\n      var sec = document.getElementById(href.slice(hash + 1));\n      if (!sec) { continue; }\n      items.push({link: links[i], sec: sec});\n    }\n    if (items.length === 0) { return; }\n\n    var LAST = '';\n    function centerPill(link){\n      if (!link) { return; }\n      if (box.scrollWidth <= box.clientWidth + 2) { return; }\n      var key = link.getAttribute('href') || '';\n      if (key === LAST) { return; }\n      LAST = key;\n      var want = link.offsetLeft - box.offsetLeft - (box.clientWidth - link.offsetWidth) \/ 2;\n      if (want < 0) { want = 0; }\n      var max = box.scrollWidth - box.clientWidth;\n      if (want > max) { want = max; }\n      if (box.scrollTo) { box.scrollTo({left: want, behavior: 'smooth'}); }\n      else { box.scrollLeft = want; }\n    }\n\n    function paint(){\n      var y = window.pageYOffset;\n      var maxY = document.documentElement.scrollHeight - window.innerHeight;\n      var line = nav.getBoundingClientRect().bottom + 20;\n      var cur = null;\n      if (y >= maxY - 2) { cur = items[items.length - 1]; }\n      else {\n        for (var i = 0; i < items.length; i++) {\n          if (items[i].sec.getBoundingClientRect().top - line <= 0) { cur = items[i]; }\n        }\n      }\n      for (var j = 0; j < items.length; j++) {\n        if (items[j] === cur) { items[j].link.classList.add('rbs-on'); }\n        else { items[j].link.classList.remove('rbs-on'); }\n      }\n      if (cur) { centerPill(cur.link); }\n    }\n\n    var ticking = false;\n    window.addEventListener('scroll', function(){\n      if (ticking) { return; }\n      ticking = true;\n      window.requestAnimationFrame(function(){ ticking = false; paint(); });\n    }, {passive:true});\n    window.addEventListener('resize', paint);\n    paint();\n  }\n  \/* \u5c0e\u89bd\u5217\u662f\u5f15\u64ce\u5728\u57f7\u884c\u6642\u624d\u751f\u51fa\u4f86\u7684\uff0c\u6240\u4ee5\u8981\u7b49\u5b83\u756b\u5b8c\uff1b\u6293\u4e0d\u5230\u5c31\u9694\u4e00\u6bb5\u518d\u8a66\uff0c\u6700\u591a\u8a66\u5341\u6b21\u3002 *\/\n  var tries = 0;\n  function boot(){\n    tries = tries + 1;\n    if (document.querySelector('.ch-jump a')) { start(); return; }\n    if (tries > 10) { return; }\n    setTimeout(boot, 300);\n  }\n  if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', boot); }\n  else { boot(); }\n})();\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5c0f\u6a19\uff1aRUBASSE \u9867\u554f\u6559\u5b78\u8ab2\u7a0b\u6a19\u984c\uff1a\u5f9e\u7dda\u4e0a\u5b78\u7fd2\u5230\u5be6\u9ad4\u64cd\u4f5c\uff0c\u5b8c\u6574\u638c\u63e1\u70d8\u8c46\u5be6\u6230\u8aaa\u660e\uff1a\u7dda\u4e0a\u76f4\u64ad\u3001\u5be6\u9ad4\u8ab2\u7a0b\u3001\u570b\u969b\u8a8d\u8b49\u3001\u514d\u8cbb\u9867\u554f\u670d\u52d9\uff0c\u5f9e\u70d8\u7119\u77e5\u8b58\u5230\u5be6\u6a5f\u64cd\u4f5c\uff0c\u5efa\u7acb\u5b8c\u6574\u7684\u70d8\u8c46\u80fd\u529b\u3002LINE\uff1ahttps:\/\/line.me\/R\/ti\/p\/@833kjpir\u6578\u64da\uff1a\u7dda\u4e0a|\u7dda\u4e0a\u8ab2\u7a0b\u6578\u64da\uff1a\u8ab2\u7a0b|\u5be6\u9ad4\u8ab2\u7a0b\u6578\u64da\uff1a\u8aee\u8a62|\u514d\u8cbb\u9867\u554f\u8aee\u8a62\u670d\u52d9\u6578\u64da\uff1a\u64da\u9ede|\u5168\u53f0\u4e09\u8655\u64da\u9ede\u4e3b\u8996\u89ba\u5716\u7247\uff1ahttps:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgKFgXai.webp \u884c\u4e8b\u66c6\u6a19\u984c\uff1a\u8fd1\u671f\u958b\u8ab2\u884c\u4e8b\u66c6\u884c\u4e8b\u66c6\u5716\u7247\uff1a\u884c\u4e8b\u66c6\u8aaa\u660e\uff1a\u6bcf\u6708\u66f4\u65b0\uff0c\u5be6\u969b\u65e5\u671f\u8207\u5831\u540d\u622a\u6b62\u4ee5\u5404\u8ab2\u7a0b\u5831\u540d\u9801\u70ba\u6e96\u3002\u6b61\u8fce\u52a0\u5165\u6211\u5011\u5b98\u7db2LINE\u505a\u8aee\u8a62\u3002 \u5340\u584a\uff1a\u7dda\u4e0a\u8ab2\u7a0b\u5340\u584a\u8aaa\u660e\uff1a\u5f9e\u57fa\u790e\u5230\u9032\u968e\uff011 \u5c0f\u6642\u638c\u63e1\u5be6\u7528\u70d8\u8c46\u601d\u7dad\u3002\u5340\u584a\u5716\u7247\uff1ahttps:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgs2tSgo.webp\u6a19\u7c64\uff1a\u514d\u8cbb\u53c3\u52a0\u6a19\u7c64\uff1a\u7dda\u4e0a\u76f4\u64ad\u6309\u9215\uff1a\u67e5\u770b\u8ab2\u7a0b\u8207\u5831\u540d\u6309\u9215\u9023\u7d50\uff1a\u4e3b\u6309\u9215\uff1a\u5426 \u5340\u584a\uff1a\u5be6\u9ad4\u70d8\u8c46\u8ab2\u7a0b\u5340\u584a\u8aaa\u660e\uff1a\u70ba\u5404\u968e\u6bb5\u91cf\u8eab\u6253\u9020\u7684\u5c08\u696d\u70d8\u8c46\u8ab2\uff0c\u5e36\u60a8\u7368\u7acb\u638c\u63e1\u70d8\u7119\u908f\u8f2f\uff0c\u7cbe\u6e96\u63a7\u5236\u5496\u5561\u98a8\u5473\u3002\u5340\u584a\u5716\u7247\uff1ahttps:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgTdMv8h.webp\u6a19\u7c64\uff1a3 \u7a2e\u8ab2\u7a0b\u6a19\u7c64\uff1a\u73fe\u6b63\u62db\u751f\u4e2d\u6309\u9215\uff1a\u67e5\u770b\u8ab2\u8868\u8207\u5831\u540d\u6309\u9215\u9023\u7d50\uff1a\u4e3b\u6309\u9215\uff1a\u5426 \u5340\u584a\uff1aBarista Hustle (BH) \u570b\u969b\u8a8d\u8b49\u8ab2\u7a0b\u5340\u584a\u8aaa\u660e\uff1a2012 \u4e16\u754c\u5496\u5561\u6c96\u716e\u8cfd\u51a0\u8ecd Matt Perger \u5275\u7acb\u7684\u570b\u969b\u5496\u5561\u6559\u80b2\u5e73\u53f0\uff0c\u4ee5\u79d1\u5b78\u65b9\u6cd5\u62c6\u89e3\u6c96\u716e\u8207\u8403\u53d6\uff0c\u8003\u8a66\u901a\u904e\u53d6\u5f97\u7dda\u4e0a\u8b49\u7167\u3002\u5168\u53f0\u552f\u4e00 BH \u8a8d\u8b49\u8b1b\u5e2b\u5728\u76e7\u8c9d\u601d\u3002\u5340\u584a\u5716\u7247\uff1ahttps:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgiFskRt.webp\u6a19\u7c64\uff1a3 \u5f35\u8b49\u7167\u6a19\u7c64\uff1a\u5168\u53f0\u552f\u4e00Barista Hustle\u8a8d\u8b49\u6309\u9215\uff1a\u4e86\u89e3\u8ab2\u7a0b\u8207\u5831\u540d\u65b9\u5f0f\u6309\u9215\u9023\u7d50\uff1a\u4e3b\u6309\u9215\uff1a\u5426 \u5340\u584a\uff1a\u5171\u4eab\u70d8\u8c46\u7a7a\u9593\u5340\u584a\u8aaa\u660e\uff1a\u4e09\u8655\u5c55\u9593\u63d0\u4f9b\u5171\u4eab\u70d8\u8c46\u7a7a\u9593\uff0c\u8a2d\u5099\u3001\u6392\u7159\u8207\u64cd\u4f5c\u74b0\u5883\u7686\u5df2\u5099\u59a5\uff0c\u5e36\u751f\u8c46\u5373\u53ef\u70d8\u7119\u3002\u5340\u584a\u5716\u7247\uff1ahttps:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgshHBLH.webp\u6a19\u7c64\uff1a3 \u7a2e\u6a5f\u578b\u6a19\u7c64\uff1a3 \u500b\u57ce\u5e02\u64da\u9ede\u6a19\u7c64\uff1a\u6309\u9215\uff1a\u67e5\u770b\u7d30\u5247\u4e26\u9810\u7d04\u6309\u9215\u9023\u7d50\uff1ahttps:\/\/rubasseroasters.com\/zh\/coworking-roastery-zh\/LINE\u6309\u9215\uff1a\u662f \u5340\u584a\uff1a\u514d\u8cbb\u9867\u554f\u8aee\u8a62\u670d\u52d9\u5340\u584a\u8aaa\u660e\uff1a\u4e0d\u9650\u8a2d\u5099\u54c1\u724c\uff0c\u7686\u53ef\u8aee\u8a62\u5496\u5561\u76f8\u95dc\u554f\u984c\u3002\u670d\u52d9\u6db5\u84cb\u70d8\u8c46\u6280\u8853\u3001\u6c96\u716e\u8403\u53d6\u3001\u958b\u5e97\u71df\u904b\u8207\u5ba2\u88fd\u5316\u9700\u6c42\uff0c\u63d0\u4f9b LINE\u3001\u96fb\u8a71\u3001\u8996\u8a0a\u53ca\u73fe\u5834\u5c08\u696d\u652f\u63f4\u3002\u5340\u584a\u5716\u7247\uff1ahttps:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimgq0IGzf.webp\u6a19\u7c64\uff1a\u4e0d\u9650\u6a5f\u578b\u6a19\u7c64\uff1a\u7dda\u4e0a\u4e00\u5c0d\u4e00\u6a19\u7c64\uff1a\u56db\u5927\u670d\u52d9\u65b9\u5411\u6309\u9215\uff1a\u586b\u5beb\u8aee\u8a62\u8868\u55ae\u6309\u9215\u9023\u7d50\uff1aLINE\u6309\u9215\uff1a\u5426 \u8b1b\u5e2b\uff1a\u5433\u6636\u9038\u8b1b\u5e2b\u982d\u929c\uff1aBarista Hustle (BH) \u8a8d\u8b49\u8b1b\u5e2b\u8b1b\u5e2b\u7167\u7247\uff1ahttps:\/\/rubasseroasters.com\/wp-content\/uploads\/2026\/09\/scimg9V0my3.webp\u8b1b\u5e2b\u4ecb\u7d39\uff1a\u64c5\u9577\u628a\u70d8\u7119\u79d1\u5b78\u62c6\u89e3\u6210\u65b0\u624b\u4e5f\u80fd\u4e0a\u624b\u7684\u5be6\u6230\u6846\u67b6\u3002\u7dda\u4e0a\u8ab2\u3001\u5be6\u9ad4\u73ed\u3001BH \u8b49\u7167\u8207\u9867\u554f\u8aee\u8a62\uff0c\u90fd\u7531\u4ed6\u89aa\u81ea\u6388\u8ab2\u8207\u56de\u8986\u3002\u6bd4\u8cfd\u7d93\u6b77\uff1a2023 WCE \u4e16\u754c\u76c3\u70d8\u8c46\u8cfd\u53f0\u7063 \u5b63\u8ecd\u6bd4\u8cfd\u7d93\u6b77\uff1a2020 WCE \u4e16\u754c\u76c3\u676f\u6e2c\u5e2b\u5927\u8cfd\u53f0\u7063\u9078\u62d4\u8cfd \u7b2c 7 \u540d\u6bd4\u8cfd\u7d93\u6b77\uff1a2016 \u5927\u6e2f\u676f\u570b\u969b\u70d8\u7119\u4ea4\u6d41\u8cfd \u7b2c 13 \u540d\u570b\u969b\u8b49\u7167\uff1aSCA \u7cbe\u54c1\u5496\u5561\u5354\u6703\u70d8\u7119\u521d\u7d1a\u8a8d\u8b49\u570b\u969b\u8b49\u7167\uff1aSCA \u7cbe\u54c1\u5496\u5561\u5354\u6703\u70d8\u7119\u4e2d\u7d1a\u8a8d\u8b49\u570b\u969b\u8b49\u7167\uff1aSCA \u7cbe\u54c1\u5496\u5561\u5354\u6703\u611f\u5b98\u521d\u7d1a\u8a8d\u8b49\u570b\u969b\u8b49\u7167\uff1aSCA \u7cbe\u54c1\u5496\u5561\u5354\u6703\u611f\u5b98\u4e2d\u7d1a\u8a8d\u8b49\u570b\u969b\u8b49\u7167\uff1aSCAE \u6b50\u6d32\u7cbe\u54c1\u5496\u5561\u5354\u6703\u5496\u5561\u5e2b\u521d\u7d1a\u8a8d\u8b49 \u7d50\u8a9e\u6a19\u984c\uff1a\u9084\u4e0d\u78ba\u5b9a\u5f9e\u54ea\u4e00\u5802\u958b\u59cb\uff1f\u7d50\u8a9e\u8aaa\u660e\uff1a\u52a0 LINE \u544a\u8a34\u6211\u5011\u4f60\u7684\u72c0\u6cc1\u8207\u76ee\u6a19\uff0c\u6211\u5011\u6703\u5efa\u8b70\u9069\u5408\u7684\u8ab2\u7a0b\uff0c\u53ea\u63a8\u85a6\u771f\u6b63\u9069\u5408\u60a8\u7684\u9078\u64c7\u3002\u7d50\u8a9e\u6309\u9215\uff1a\u6b61\u8fce\u52a0 LINE \u8aee\u8a62\u7d50\u8a9e\u6309\u9215\u9023\u7d50\uff1ahttps:\/\/line.me\/R\/ti\/p\/@833kjpir\u7d50\u8a9e\u6b21\u8981\u6309\u9215\uff1a\u586b\u5beb\u8aee\u8a62\u8868\u55ae\u7d50\u8a9e\u6b21\u8981\u6309\u9215\u9023\u7d50\uff1ahttps:\/\/rubasseroasters.com\/zh\/free-coffee-consulting-zh\/ \u4e0a\u500b\u6708 \u8ab2\u7a0b\u884c\u4e8b\u66c6 \u4e0b\u500b\u6708 \u8ab2\u7a0b\u8f09\u5165\u4e2d\u2026<\/p>","protected":false},"author":10,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_gspb_post_css":"","footnotes":""},"class_list":["post-5872","page","type-page","status-publish","hentry"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8}},"acf":[],"_links":{"self":[{"href":"https:\/\/rubasseroasters.com\/zh\/wp-json\/wp\/v2\/pages\/5872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rubasseroasters.com\/zh\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rubasseroasters.com\/zh\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rubasseroasters.com\/zh\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/rubasseroasters.com\/zh\/wp-json\/wp\/v2\/comments?post=5872"}],"version-history":[{"count":6,"href":"https:\/\/rubasseroasters.com\/zh\/wp-json\/wp\/v2\/pages\/5872\/revisions"}],"predecessor-version":[{"id":6322,"href":"https:\/\/rubasseroasters.com\/zh\/wp-json\/wp\/v2\/pages\/5872\/revisions\/6322"}],"wp:attachment":[{"href":"https:\/\/rubasseroasters.com\/zh\/wp-json\/wp\/v2\/media?parent=5872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}