diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 41d3855..12ecc69 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,6 +2,8 @@ + + \ No newline at end of file diff --git a/cool-unix/.cool/icons/iconfont.zip b/cool-unix/.cool/icons/iconfont.zip new file mode 100644 index 0000000..c25e8c3 Binary files /dev/null and b/cool-unix/.cool/icons/iconfont.zip differ diff --git a/cool-unix/.cool/icons/remixicon.zip b/cool-unix/.cool/icons/remixicon.zip new file mode 100644 index 0000000..1b0be45 Binary files /dev/null and b/cool-unix/.cool/icons/remixicon.zip differ diff --git a/cool-unix/.cool/remixicon/RemixIcon_Collection_2509090754.remixicon b/cool-unix/.cool/remixicon/RemixIcon_Collection_2509090754.remixicon new file mode 100644 index 0000000..31fd400 --- /dev/null +++ b/cool-unix/.cool/remixicon/RemixIcon_Collection_2509090754.remixicon @@ -0,0 +1 @@ +arrow-left-up-line,arrow-up-line,arrow-right-up-line,arrow-right-line,arrow-right-down-line,arrow-down-line,arrow-left-down-line,arrow-left-line,arrow-up-circle-line,arrow-right-circle-line,arrow-down-circle-line,arrow-left-circle-line,arrow-up-circle-fill,arrow-right-circle-fill,arrow-down-circle-fill,arrow-left-circle-fill,arrow-up-s-line,arrow-right-s-line,arrow-down-s-line,arrow-left-s-line,arrow-left-s-fill,arrow-down-s-fill,arrow-right-s-fill,arrow-up-s-fill,arrow-up-down-line,arrow-left-right-line,arrow-right-double-line,arrow-up-double-line,skip-up-line,expand-up-down-line,expand-left-right-line,expand-left-line,expand-right-line,arrow-go-back-line,arrow-go-forward-line,home-2-line,home-2-fill,store-2-line,store-2-fill,store-3-fill,store-3-line,ancient-pavilion-line,ancient-pavilion-fill,tent-line,tent-fill,hospital-fill,hospital-line,ancient-gate-line,ancient-gate-fill,mail-line,mail-fill,mail-send-line,mail-send-fill,mail-unread-fill,mail-unread-line,mail-add-fill,mail-add-line,mail-ai-line,mail-ai-fill,inbox-line,inbox-fill,inbox-archive-line,inbox-archive-fill,inbox-unarchive-line,inbox-unarchive-fill,cloud-line,cloud-fill,cloud-off-line,cloud-off-fill,archive-line,archive-fill,profile-fill,profile-line,award-line,award-fill,at-line,at-fill,medal-fill,medal-line,verified-badge-line,verified-badge-fill,bar-chart-line,bar-chart-horizontal-line,bar-chart-2-line,pie-chart-line,bubble-chart-line,bar-chart-grouped-line,donut-chart-line,line-chart-line,bookmark-fill,bookmark-line,briefcase-fill,briefcase-line,donut-chart-fill,line-chart-fill,calendar-line,calendar-fill,calculator-fill,calculator-line,customer-service-line,customer-service-fill,flag-fill,flag-line,flag-off-line,flag-off-fill,global-line,global-fill,links-fill,links-line,printer-line,printer-fill,reply-line,reply-fill,send-plane-line,send-plane-fill,slideshow-fill,slideshow-line,window-line,window-fill,stack-fill,stack-line,service-fill,service-line,registered-fill,registered-line,trademark-fill,trademark-line,advertisement-fill,advertisement-line,copyright-line,copyright-fill,creative-commons-nd-line,creative-commons-nd-fill,id-card-line,id-card-fill,info-card-line,info-card-fill,pass-pending-fill,pass-pending-line,pass-expired-fill,pass-expired-line,pass-valid-fill,pass-valid-line,megaphone-fill,megaphone-line,creative-commons-by-fill,creative-commons-by-line,creative-commons-fill,creative-commons-line,creative-commons-nc-line,creative-commons-nc-fill,copyleft-fill,copyleft-line,message-2-line,message-2-fill,chat-check-line,chat-check-fill,chat-unread-fill,chat-unread-line,chat-new-line,chat-new-fill,chat-delete-fill,chat-delete-line,message-fill,message-line,chat-4-line,chat-4-fill,chat-settings-fill,chat-settings-line,chat-download-fill,chat-download-line,chat-upload-line,chat-upload-fill,chat-forward-fill,chat-forward-line,chat-heart-line,chat-heart-fill,chat-off-line,chat-off-fill,feedback-line,feedback-fill,question-answer-line,question-answer-fill,questionnaire-line,questionnaire-fill,speak-fill,speak-line,chat-thread-line,chat-thread-fill,chat-history-fill,chat-history-line,chat-private-line,chat-private-fill,emoji-sticker-line,emoji-sticker-fill,edit-line,edit-fill,markup-line,markup-fill,edit-box-fill,edit-box-line,computer-line,computer-fill,tv-line,tv-fill,smartphone-line,smartphone-fill,device-fill,device-line,phone-line,phone-fill,instance-fill,instance-line,database-2-line,database-2-fill,keyboard-box-fill,keyboard-box-line,shut-down-line,shut-down-fill,fingerprint-line,fingerprint-fill,barcode-box-line,barcode-box-fill,qr-code-line,qr-code-fill,qr-scan-fill,qr-scan-line,draft-line,draft-fill,file-paper-line,file-paper-fill,file-line,file-fill,sticky-note-fill,sticky-note-line,file-edit-line,file-edit-fill,file-copy-fill,file-copy-line,bill-fill,bill-line,article-fill,article-line,survey-fill,survey-line,clipboard-line,clipboard-fill,news-fill,news-line,file-zip-fill,file-zip-line,todo-fill,todo-line,book-marked-line,book-marked-fill,task-fill,task-line,double-quotes-l,double-quotes-r,single-quotes-l,single-quotes-r,list-check,list-ordered,list-radio,sort-asc,sort-desc,send-backward,bring-forward,wallet-line,wallet-fill,bank-card-line,bank-card-fill,refund-line,refund-fill,safe-fill,safe-line,price-tag-line,price-tag-fill,ticket-line,ticket-fill,coupon-line,coupon-fill,shopping-bag-line,shopping-bag-fill,shopping-cart-line,shopping-cart-fill,vip-line,vip-fill,vip-crown-2-line,vip-crown-2-fill,vip-diamond-fill,vip-diamond-line,exchange-fill,exchange-line,trophy-fill,trophy-line,swap-line,swap-fill,exchange-cny-line,exchange-dollar-line,exchange-funds-line,copper-coin-line,copper-coin-fill,money-cny-box-line,money-cny-box-fill,money-cny-circle-line,money-cny-circle-fill,money-dollar-circle-line,money-dollar-circle-fill,increase-decrease-fill,increase-decrease-line,red-packet-fill,red-packet-line,auction-fill,auction-line,gift-line,gift-fill,24-hours-line,nft-line,nft-fill,heart-fill,heart-line,heart-add-line,heart-add-fill,rest-time-fill,rest-time-line,apple-line,apple-fill,alipay-fill,alipay-line,wechat-fill,wechat-line,wechat-pay-line,wechat-pay-fill,mini-program-fill,mini-program-line,android-line,android-fill,map-pin-line,map-pin-fill,map-pin-time-fill,map-pin-time-line,pushpin-fill,pushpin-line,unpin-line,unpin-fill,compass-fill,compass-line,earth-line,earth-fill,parking-box-fill,parking-box-line,navigation-fill,navigation-line,image-line,image-fill,multi-image-line,multi-image-fill,video-on-line,video-on-fill,clapperboard-line,clapperboard-fill,film-fill,film-line,movie-fill,movie-line,live-line,live-fill,vidicon-line,vidicon-fill,video-off-line,video-off-fill,camera-fill,camera-line,camera-off-fill,camera-off-line,camera-lens-fill,camera-lens-line,mv-line,mv-fill,music-2-fill,music-2-line,headphone-fill,headphone-line,mic-line,mic-fill,mic-off-line,mic-off-fill,volume-down-fill,volume-down-line,volume-mute-line,volume-mute-fill,notification-4-line,notification-4-fill,notification-off-fill,notification-off-line,play-circle-line,play-circle-fill,pause-circle-line,pause-circle-fill,record-circle-line,record-circle-fill,stop-circle-fill,stop-circle-line,fullscreen-line,fullscreen-exit-line,equalizer-2-line,equalizer-2-fill,apps-line,apps-fill,function-line,function-fill,dashboard-horizontal-line,dashboard-horizontal-fill,menu-line,menu-add-line,star-line,star-fill,star-off-line,star-off-fill,more-line,more-fill,more-2-line,more-2-fill,settings-fill,settings-line,forbid-fill,forbid-line,prohibited-line,prohibited-fill,information-2-line,information-2-fill,error-warning-fill,error-warning-line,question-fill,question-line,checkbox-blank-circle-line,checkbox-blank-circle-fill,checkbox-circle-fill,checkbox-circle-line,checkbox-blank-line,checkbox-blank-fill,checkbox-line,checkbox-fill,add-circle-line,add-circle-fill,indeterminate-circle-fill,indeterminate-circle-line,close-circle-line,close-circle-fill,radio-button-line,radio-button-fill,check-line,close-line,add-line,subtract-line,divide-line,equal-line,upload-line,download-line,upload-cloud-2-line,upload-cloud-2-fill,download-cloud-2-line,download-cloud-2-fill,login-box-line,login-box-fill,shield-cross-line,shield-cross-fill,shield-check-fill,shield-check-line,delete-bin-fill,delete-bin-line,lock-line,lock-fill,lock-unlock-line,lock-unlock-fill,lock-password-line,lock-password-fill,eye-fill,eye-line,eye-off-line,eye-off-fill,search-line,search-fill,share-line,share-fill,share-box-line,share-box-fill,share-circle-line,share-circle-fill,time-fill,time-line,thumb-up-line,thumb-up-fill,notification-badge-fill,notification-badge-line,toggle-line,toggle-fill,filter-line,filter-fill,history-line,loop-left-line,loader-2-line,loader-4-line,reset-right-line,loader-fill,user-3-line,user-3-fill,sun-fill,sun-line,moon-fill,moon-line,shining-line,shining-fill,fire-fill,fire-line,sparkling-line,sparkling-fill,box-1-line,box-1-fill,account-box-line,account-box-fill,account-circle-fill,account-circle-line,account-pin-box-fill,account-pin-box-line,skip-up-fill,arrow-left-right-fill,arrow-up-down-fill,arrow-up-double-fill,arrow-right-double-fill,expand-left-fill,expand-right-fill,expand-up-down-fill,expand-left-right-fill,arrow-go-back-fill,arrow-go-forward-fill,contract-left-line,contract-right-line,contract-right-fill,contract-left-fill,drag-move-line,drag-move-fill,home-line,home-fill,mail-open-line,mail-open-fill,attachment-line,attachment-fill,bar-chart-fill,bar-chart-horizontal-fill,bar-chart-2-fill,bar-chart-grouped-fill,bubble-chart-fill,pie-chart-fill,calendar-schedule-line,calendar-schedule-fill,calendar-todo-line,calendar-todo-fill,calendar-event-fill,calendar-event-line,calendar-close-fill,calendar-check-fill,calendar-check-line,calendar-close-line,message-3-line,message-3-fill,chat-3-fill,chat-3-line,chat-1-fill,chat-1-line,chat-2-fill,chat-2-line,crop-line,crop-fill,palette-line,palette-fill,anticlockwise-line,anticlockwise-fill,clockwise-line,clockwise-fill,code-s-slash-fill,code-s-slash-line,puzzle-fill,puzzle-line,server-fill,server-line,qr-scan-2-fill,qr-scan-2-line,scan-line,scan-fill,phone-find-fill,phone-find-line,barcode-line,barcode-fill,file-list-fill,file-list-line,file-text-line,file-text-fill,book-fill,book-line,text,font-family,link,translate,copper-diamond-fill,copper-diamond-line,dislike-fill,dislike-line,heart-3-fill,heart-3-line,hearts-fill,hearts-line,map-line,map-fill,image-circle-fill,image-circle-line,image-edit-fill,image-edit-line,image-add-line,image-add-fill,landscape-line,landscape-fill,check-double-line,check-double-fill,close-fill,add-fill,subtract-fill,divide-fill,equal-fill,logout-circle-line,logout-circle-fill,shield-fill,shield-line,timer-line,timer-fill,delete-back-2-line,delete-back-2-fill,volume-vibrate-line,volume-vibrate-fill,volume-off-vibrate-line,volume-off-vibrate-fill,truck-line,truck-fill,flight-takeoff-line,flight-takeoff-fill,road-map-line,road-map-fill,pushpin-2-line,pushpin-2-fill,map-pin-2-line,map-pin-2-fill,compass-discover-line,compass-discover-fill,signpost-fill,signpost-line,qq-line,qq-fill,tiktok-line,tiktok-fill,user-smile-line,user-smile-fill,user-line,user-fill,user-add-fill,user-add-line,user-minus-line,user-minus-fill,user-follow-fill,user-follow-line,user-unfollow-line,user-unfollow-fill,user-shared-fill,user-shared-line,user-received-fill,user-received-line,user-search-line,user-search-fill,user-location-line,user-location-fill,user-star-line,user-star-fill,user-settings-fill,user-settings-line,user-heart-line,user-heart-fill,user-forbid-line,user-forbid-fill,group-fill,group-line,user-2-fill,user-2-line,shield-user-line,shield-user-fill,circle-line,circle-fill,sketching,align-bottom,restart-line,restart-fill,refresh-line,refresh-fill,reset-left-line,reset-left-fill,skip-down-line,skip-down-fill,skip-right-line,skip-right-fill,skip-left-fill,skip-left-line,text-snippet,input-method-line,input-method-fill,font-size,font-size-2,font-color,node-tree,price-tag-3-line,price-tag-3-fill,input-field,timeline-view,progress-2-line,progress-2-fill,t-box-line,t-box-fill,edit-2-fill,edit-2-line,layout-2-line,layout-2-fill,layout-column-fill,layout-column-line,mouse-line,mouse-fill,file-upload-line,file-upload-fill,page-separator,carousel-view,list-view,text-block,percent-line,percent-fill,upload-fill,t-shirt-line,t-shirt-fill,number-1,check-fill,checkbox-multiple-line,checkbox-multiple-fill,collapse-vertical-line,align-top,window-2-line,window-2-fill,seo-line,seo-fill,shadow-line,shadow-fill,puzzle-2-line,puzzle-2-fill,markdown-line,markdown-fill,stacked-view,dropdown-list,timer-2-line,timer-2-fill,parent-line,parent-fill,function-add-line,function-add-fill,arrow-up-box-line,arrow-up-box-fill,layout-bottom-fill,layout-right-fill,layout-right-line,layout-top-fill,layout-top-line,layout-left-line,layout-left-fill,layout-top-2-line,layout-top-2-fill,layout-right-2-line,layout-right-2-fill,layout-bottom-2-line,layout-bottom-2-fill,layout-left-2-line,layout-left-2-fill,layout-row-fill,layout-row-line,table-fill,table-line,layout-bottom-line,picture-in-picture-line,picture-in-picture-fill,arrow-down-double-line,arrow-down-double-fill,arrow-left-double-fill,arrow-left-double-line \ No newline at end of file diff --git a/cool-unix/.cool/scripts/icon.js b/cool-unix/.cool/scripts/icon.js new file mode 100644 index 0000000..fc19deb --- /dev/null +++ b/cool-unix/.cool/scripts/icon.js @@ -0,0 +1,349 @@ +const fs = require("fs"); +const path = require("path"); +const AdmZip = require("adm-zip"); + +// 清理所有临时文件 +function cleanupTempDir() { + const tempDir = path.join(".cool", "temp"); + if (fs.existsSync(tempDir)) { + try { + fs.rmSync(tempDir, { recursive: true, force: true }); + } catch (error) { + console.warn(`❌ 清理临时目录失败: ${ tempDir }`, error); + } + } +} + +// 确保临时目录存在 +function ensureTempDir() { + const tempDir = path.join(".cool", "temp"); + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + } +} + +// 创建icons目录和子目录 +function ensureDistDir(folderName = "") { + const iconsPath = folderName ? path.join("icons", folderName) : "icons"; + if (!fs.existsSync(iconsPath)) { + fs.mkdirSync(iconsPath, { recursive: true }); + } +} + +// 读取zip文件列表 +function getZipFiles() { + const iconsDir = path.join(".cool", "icons"); + if (!fs.existsSync(iconsDir)) { + console.error(`❌ 目录不存在: ${ iconsDir }`); + return []; + } + + return fs.readdirSync(iconsDir).filter((item) => { + const filePath = path.join(iconsDir, item); + const stats = fs.statSync(filePath); + return stats.isFile() && item.endsWith(".zip"); + }); +} + +// 解压zip文件到临时目录 +function extractZipFile(zipPath, folderName) { + try { + const zip = new AdmZip(zipPath); + const tempDir = path.join(".cool", "temp", folderName); + + // 确保临时目录存在 + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + } + + // 解压到临时目录 + zip.extractAllTo(tempDir, true); + + // 检查是否有额外的顶层文件夹 + const extractedItems = fs.readdirSync(tempDir); + + // 如果只有一个项目且是文件夹,则可能是额外的包装文件夹 + if (extractedItems.length === 1) { + const singleItem = extractedItems[0]; + const singleItemPath = path.join(tempDir, singleItem); + const stats = fs.statSync(singleItemPath); + + if (stats.isDirectory()) { + // 检查这个文件夹是否包含我们需要的文件 + const innerItems = fs.readdirSync(singleItemPath); + const hasIconFiles = innerItems.some( + (item) => + item.endsWith(".ttf") || item.endsWith(".json") || item.endsWith(".css") + ); + + if (hasIconFiles) { + return singleItemPath; + } + } + } + + return tempDir; + } catch (error) { + console.error(`❌ 解压失败: ${ zipPath }`, error); + return null; + } +} + +// 将TTF文件转换为base64 +function ttfToBase64(ttfPath) { + try { + const ttfBuffer = fs.readFileSync(ttfPath); + return ttfBuffer.toString("base64"); + } catch (error) { + console.error(`❌ 读取TTF文件失败: ${ ttfPath }`, error); + return null; + } +} + +// 生成TypeScript文件 +function generateTypeScript(originalFolderName, camelCaseName, iconData, iconPrefix) { + const tsContent = `export const ${ camelCaseName } = {\n${ iconData + .map((item) => `\t"${ iconPrefix }${ item.name }": "${ item.unicode }"`) + .join(",\n") }\n};\n`; + + const outputPath = path.join("icons", originalFolderName, "index.ts"); + fs.writeFileSync(outputPath, tsContent); +} + +// 生成SCSS文件 +function generateSCSS(originalFolderName, base64Data) { + const scssContent = `@font-face {\n\tfont-family: "${ toCamelCase(originalFolderName) }";\n\tsrc: url("data:font/ttf;base64,${ base64Data }") format("woff");\n}\n`; + + const outputPath = path.join("icons", originalFolderName, "index.scss"); + fs.writeFileSync(outputPath, scssContent); +} + +// 从CSS文件提取图标数据(用于remixicon等) +function extractIconsFromCSS(cssPath) { + try { + const cssContent = fs.readFileSync(cssPath, "utf8"); + const iconData = []; + + // 匹配CSS中的图标规则,例如:.ri-home-line:before { content: "\ee2b"; } + const regex = /\.ri-([^:]+):before\s*{\s*content:\s*"\\([^"]+)"/g; + let match; + + while ((match = regex.exec(cssContent)) !== null) { + const iconName = match[1]; + const unicode = match[2]; + + iconData.push({ + name: iconName, + unicode: unicode + }); + } + + return iconData; + } catch (error) { + console.error(`❌ 读取CSS文件失败: ${ cssPath }`, error); + return []; + } +} + +// 读取和处理图标数据 +function processIconData(jsonPath) { + try { + const jsonData = JSON.parse(fs.readFileSync(jsonPath, "utf8")); + return jsonData.glyphs.map((item) => ({ + name: item.font_class, + unicode: item.unicode + })); + } catch (error) { + console.error(`❌ 读取JSON文件失败: ${ jsonPath }`, error); + return []; + } +} + +// 读取iconfont图标前缀 +function getIconPrefix(jsonPath) { + try { + const jsonData = JSON.parse(fs.readFileSync(jsonPath, "utf8")); + return jsonData.css_prefix_text; + } catch (error) { + console.error(`❌ 读取JSON文件失败: ${jsonPath}`, error); + return []; + } +} + +// 将连字符转换为驼峰命名的函数 +function toCamelCase(str) { + return str.replace(/-([a-z])/g, (match, letter) => letter.toUpperCase()); +} + +// 处理单个zip文件 +function processZipFile(zipFileName) { + const originalFolderName = path.basename(zipFileName, ".zip"); + const folderName = toCamelCase(originalFolderName); // 转换为驼峰命名用于变量名 + const zipPath = path.join(".cool", "icons", zipFileName); + + // 解压zip文件 (使用原始文件夹名称) + const tempDir = extractZipFile(zipPath, originalFolderName); + if (!tempDir) { + return null; + } + + // 图标库名称 + const ptName = ["iconfont", "remixicon"]; + + // 获取文件路径 + const getFilePath = (ext) => { + let filePath = null; + for (const name of ptName) { + const tempPath = path.join(tempDir, `${ name }.${ ext }`); + if (fs.existsSync(tempPath)) { + filePath = tempPath; + break; + } + } + return filePath; + }; + + // 在解压后的目录中查找文件 + const jsonPath = getFilePath("json"); + const cssPath = getFilePath("css"); + const ttfPath = getFilePath("ttf"); + + if (!ttfPath) { + console.warn(`⚠️跳过 ${ folderName }: 缺少 TTF 文件`); + return null; + } + + let iconData = []; + + let iconPrefix = ""; + + // 优先使用JSON文件 + if (jsonPath) { + iconData = processIconData(jsonPath); + if (originalFolderName !== "iconfont") { + iconPrefix = getIconPrefix(jsonPath); + } + } + // 如果没有则尝试CSS文件 + else if (cssPath) { + iconData = extractIconsFromCSS(cssPath); + } else { + console.warn(`⚠️ 跳过 ${ folderName }: 缺少 ${ jsonPath } 或 ${ cssPath }`); + return null; + } + + if (iconData.length === 0) { + console.warn(`⚠️ ${ folderName }: 没有找到图标数据`); + return null; + } + + console.log(`✅ ${ zipFileName } 找到 ${ iconData.length } 个图标`); + + // 转换TTF为base64 + const base64Data = ttfToBase64(ttfPath); + if (!base64Data) { + console.error(`❌ ${ folderName }: TTF转换失败`); + return null; + } + + // 为该文件夹创建icons子目录 (使用原始文件夹名称) + ensureDistDir(originalFolderName); + + // 生成TypeScript文件 (使用驼峰命名作为变量名,原始名称作为路径) + generateTypeScript(originalFolderName, folderName, iconData, iconPrefix); + + // 生成SCSS文件 (使用原始名称作为路径和字体名称) + generateSCSS(originalFolderName, base64Data); + + return { originalName: originalFolderName, camelName: folderName }; +} + +// 生成主index.ts文件 +function generateIndexTS(actualFolders) { + const imports = actualFolders + .map((folder) => { + const camelName = toCamelCase(folder); + return `import { ${ camelName } } from "./${ folder }";`; + }) + .join("\n"); + + const exports = `export const icons = {\n${ actualFolders + .map((folder) => `\t${ toCamelCase(folder) }`) + .join(",\n") }\n};\n`; + + const content = `${ imports }\n\n${ exports }`; + fs.writeFileSync("icons/index.ts", content); +} + +// 生成主index.scss文件 +function generateIndexSCSS(actualFolders) { + const imports = actualFolders.map((folder) => `@import "./${ folder }/index.scss";`).join("\n"); + + fs.writeFileSync("icons/index.scss", imports + "\n"); +} + +// 扫描icons目录下的实际文件夹 +function getActualIconFolders() { + const iconsDir = "icons"; + if (!fs.existsSync(iconsDir)) { + return []; + } + + return fs.readdirSync(iconsDir).filter((item) => { + const itemPath = path.join(iconsDir, item); + const stats = fs.statSync(itemPath); + return stats.isDirectory(); + }); +} + +// 主函数 +function main() { + console.log("🚀 开始处理字体文件...\n"); + + // 确保临时目录存在 + ensureTempDir(); + + // 确保icons目录存在 + ensureDistDir(); + + try { + // 获取所有zip文件 + const zipFiles = getZipFiles(); + + // 处理每个zip文件 + const processedFolders = []; + for (const zipFile of zipFiles) { + const result = processZipFile(zipFile); + if (result) { + processedFolders.push(result); + } + } + + // 扫描icons目录下的实际文件夹 + const actualFolders = getActualIconFolders(); + + if (actualFolders.length > 0) { + // 生成主index文件 + generateIndexTS(actualFolders); + generateIndexSCSS(actualFolders); + } + + if (processedFolders.length > 0) { + const folderNames = processedFolders.map((f) => + typeof f === "string" ? f : f.originalName + ); + console.log( + `\n🎉 成功处理了 ${ processedFolders.length } 个字体包: ${ folderNames.join(", ") }` + ); + } + } catch (error) { + console.error("❌ 脚本执行出错:", error); + } finally { + cleanupTempDir(); + } +} + +// 运行脚本 +if (require.main === module) { + main(); +} diff --git a/cool-unix/.cursor/mcp.json b/cool-unix/.cursor/mcp.json new file mode 100644 index 0000000..31c3365 --- /dev/null +++ b/cool-unix/.cursor/mcp.json @@ -0,0 +1,10 @@ +{ + "mcpServers": { + "uni-app-x": { + "command": "npx", + "args": [ + "uni-app-x-mcp" + ] + } + } +} \ No newline at end of file diff --git a/cool-unix/.cursor/rules/api.mdc b/cool-unix/.cursor/rules/api.mdc new file mode 100644 index 0000000..f58a273 --- /dev/null +++ b/cool-unix/.cursor/rules/api.mdc @@ -0,0 +1,13 @@ +--- +description: Uni-App X api +globs: *.uts,*.uvue +alwaysApply: false +--- +# API +- 可以使用uts的api,但注意版本和平台的兼容性。 +- 可以使用uni-app x的api,但注意版本和平台的兼容性。 +- 可以使用vue3的api,但注意版本和平台的兼容性。 +- 可以使用操作系统的api,但注意版本和平台的兼容性。尽量在uts插件中调用系统原生API,而不是在uvue页面中直接调用系统原生API。 +- 特定平台或特定版本以上才能使用的代码,需使用条件编译包围这些代码,或者放置在平台专用的目录文件中。 +- 通过mcp工具查询项目下可用的插件。 +- 跨页面通信优先使用eventbus。 \ No newline at end of file diff --git a/cool-unix/.cursor/rules/conditional-compilation.mdc b/cool-unix/.cursor/rules/conditional-compilation.mdc new file mode 100644 index 0000000..c5783df --- /dev/null +++ b/cool-unix/.cursor/rules/conditional-compilation.mdc @@ -0,0 +1,37 @@ +--- +description: Uni-App X conditional compilation +globs: *.uts,*.uvue,*.css,*.less,*.scss,*.ts,*.js,*.sass,*.json +alwaysApply: false +--- +# conditional compilation + +## core syntax +``` +// Platform basic judgment +#ifdef APP || MP + //Mini programs/APP common code + #ifdef APP-ANDROID + // Android-specific logic + #endif + #ifdef APP-IOS + // IOS-specific logic + #endif +#endif +``` + +## Core Platform Identifier +uniVersion is used to distinguish the version of the compiler Details HBuilderX 3.9.0 +APP App +APP-ANDROID App Android Platform Details +APP-IOS App iOS Platform Details +APP-HARMONY App HarmonyOS Next platform +WEB web (same as H5) HBuilderX 3.6.3 +MP-WEIXIN WeChat Mini Program +MP-ALIPAY APPLET +MP-BAIDU BAIDU MINI PROGRAM +MP-TUTIAO TIKTOK MINI PROGRAM +MP-KUAISHOU Kuaishou Mini Program +MP-JD JD Mini Program +MP-HARMONY Harmony Atom Service HBuilderX 4.34 +MP-XHS Xiaohongshu Mini Program +MP WeChat Mini Program/Alipay Mini Program/Baidu Mini Program/Douyin Mini Program/Feishu Mini Program/QQ Mini Program/360 Mini Program/Hongmeng atom Service \ No newline at end of file diff --git a/cool-unix/.cursor/rules/cool.mdc b/cool-unix/.cursor/rules/cool.mdc new file mode 100644 index 0000000..e36d179 --- /dev/null +++ b/cool-unix/.cursor/rules/cool.mdc @@ -0,0 +1,46 @@ +--- +description: +globs: *.uts,*.uvue +alwaysApply: false +--- + +# ts | uts + +- 所有方法必须在被调用之前进行定义,避免出现“先调用后定义”的情况。 +- 当使用 {} 进行对象赋值时,必须显式声明类型,例如:{} as Data,确保类型安全与规范。 + +# setup + +- 页面参数请通过 props 接收,避免使用 onLoad 接口。 + +#