'use strict'; const fs = require("fs"); const path = require("path"); const icongen = require("icon-gen"); class IconGen { constructor() { this._init(); } /** * _init */ _init() { // ---> 处理参数 const args = process.argv.splice(3); let params = { input: "/public/images/logo.png", output: "/build/icons/", size: "16,32,64,256,512", clear: false, imagesDir: "/public/images/", }; try { const len = args.length; for (let i = 0; i < len; i++) { const arg = args[i]; if (arg.match(/^-i/) || arg.match(/^-input/)) { params["input"] = args[i + 1]; i++; continue; } if (arg.match(/^-o/) || arg.match(/^-output/)) { params["output"] = args[i + 1]; i++; continue; } if (arg.match(/^-s/) || arg.match(/^-size/)) { params["size"] = args[i + 1]; i++; continue; } if (arg.match(/^-c/) || arg.match(/^-clear/)) { params["clear"] = true; continue; } if (arg.match(/^-img/) || arg.match(/^-images/)) { params["imagesDir"] = args[i + 1]; i++; continue; } } } catch (e) { console.error("[ee-bin] [icon-gen] args: ", args); console.error("[ee-bin] [icon-gen] ERROR: ", e); throw new Error("参数错误!!"); } this.params = params; // ---> 组装参数 console.log("[ee-bin] [icon-gen] icon 当前路径: ", process.cwd()); this.input = path.join(process.cwd(), params.input); this.output = path.join(process.cwd(), params.output); this.imagesDir = path.join(process.cwd(), params.imagesDir); const sizeList = params.size.split(",").map((item) => parseInt(item)); this.iconOptions = { report: false, ico: { name: "icon", sizes: [256], }, favicon: { name: "logo-", pngSizes: sizeList, }, }; } /** * 生成图标 */ generateIcons() { console.log("[ee-bin] [icon-gen] iconGen 开始处理生成logo图片"); if (!fs.existsSync(this.input)) { console.error("[ee-bin] [icon-gen] input: ", this.input); throw new Error("输入的图片不存在或路径错误"); } if (!fs.existsSync(this.output)) { fs.mkdirSync(this.output, { recursive: true }); } else { // 清空目录 this.params.clear && this.deleteGenFile(this.output); } if (!fs.existsSync(this.imagesDir)) { fs.mkdirSync(this.imagesDir, { recursive: true }); } icongen(this.input, this.output, this.iconOptions) .then((results) => { console.log("[ee-bin] [icon-gen] iconGen 已生成下方图片资源"); console.log(results); this._renameForEE(results); }) .catch((err) => { console.error(err); throw new Error("[ee-bin] [icon-gen] iconGen 生成失败!"); }); } /** * 删除生成的文件(.ico .png) */ deleteGenFile(dirPath) { if (fs.existsSync(dirPath)) { // 读取文件夹下的文件目录 const files = fs.readdirSync(dirPath); files.forEach((file) => { const curPath = path.join(dirPath, file); // 判断是不是文件夹,如果是,继续递归 if (fs.lstatSync(curPath).isDirectory()) { this.deleteGenFile(curPath); } else { // 删除文件 if ([".ico", ".png"].includes(path.extname(curPath))) { fs.unlinkSync(curPath); } } }); } } /** * 为生成的资源重命名 (logo-32.png -> 32x32.png) */ _renameForEE(filesPath) { console.log("[ee-bin] [icon-gen] iconGen 开始重新命名logo图片资源"); try { const len = filesPath.length; for (let i = 0; i < len; i++) { const filePath = filesPath[i]; const extname = path.extname(filePath); if ([".png"].includes(extname)) { const filename = path.basename(filePath, extname); const basename = filename.split("-")[1]; const dirname = path.dirname(filePath); // 处理 tray 图标 --> 复制到 public/images 目录下 if ("16" === basename) { const newName = "tray" + extname; fs.copyFileSync(filePath, path.join(this.imagesDir, newName)); console.log(`${filename}${extname} --> ${this.params.imagesDir}/${newName} 复制成功!`); fs.unlinkSync(filePath); continue; } // 处理 win 窗口图标 --> 复制到 public/images 目录下 if ("32" === basename) { const newName = filename + extname; fs.copyFileSync(filePath, path.join(this.imagesDir, newName)); console.log(`${filename}${extname} --> ${this.params.imagesDir}/${newName} 复制成功!`); } // 重命名 --> 32x32.png const newName = basename + "x" + basename + extname; const newPath = path.join(dirname, newName); fs.renameSync(filePath, newPath); console.log(`${filename}${extname} --> ${newName} 重命名成功!`); } } console.log("[ee-bin] [icon-gen] iconGen 资源处理完成!"); } catch (e) { console.error("[ee-bin] [icon-gen] ERROR: ", e); throw new Error("重命名logo图片资源失败!!"); } } } const run = () => { const i = new IconGen(); i.generateIcons(); } module.exports = { run, };