Add plugin 编码小助手 v2.1.1#174
Conversation
There was a problem hiding this comment.
Code Review
This pull request introduces the utools-fork-codehelper plugin, which is a mirror of the uTools "codehelper" adapted for ZTools. The changes include the plugin configuration, an HTML entry point that maps window.ztools to window.utools, and a preload.js script containing core utility functions for hashing and base64 processing. Feedback for preload.js identifies a logic error in base64EncodeImageFile that could cause multiple callback executions, the use of deprecated new Buffer() APIs, fragile regex handling in imageBase64ToFile, and a recommendation to use fs.createReadStream for standard stream creation.
| @@ -0,0 +1 @@ | |||
| const crypto=require("crypto"),fs=require("fs"),path=require("path");window.services={textHashs:(e,a)=>{const t={};return a?e.forEach((e=>{t[e]=crypto.createHash(e).update(a).digest("hex")})):e.forEach((e=>{t[e]=""})),t},fileHashs:(e,a,t)=>{if(!fs.existsSync(a))return t(null);const o=[];for(const a of e)o.push(crypto.createHash(a));try{const s=fs.ReadStream(a);s.on("data",(e=>{o.forEach((a=>a.update(e)))})),s.on("end",(()=>{const a=o.map((e=>e.digest("hex"))),s={};e.forEach(((e,t)=>{s[e]=a[t]})),t(s)}))}catch(e){t(null)}},base64Encode:e=>Buffer.from(e).toString("base64"),base64EncodeImageFile:(e,a)=>{fs.existsSync(e)||a(null),fs.readFile(e,((t,o)=>{t&&a(null);const s="data:image/"+path.extname(e).replace(".","").toLowerCase()+";base64,";a(s+new Buffer(o).toString("base64"))}))},base64Decode:e=>Buffer.from(e,"base64").toString(),imageBase64ToFile:e=>{const a=Buffer.from(e.replace(/^data:image\/([a-z]+?);base64,/,""),"base64"),t=path.join(window.utools.getPath("downloads"),Date.now()+"."+RegExp.$1);fs.writeFileSync(t,a),window.utools.shellShowItemInFolder(t)}}; No newline at end of file | |||
There was a problem hiding this comment.
在 preload.js 中发现以下问题:
- 逻辑错误: 在
base64EncodeImageFile中,如果文件不存在或读取出错,回调函数a(null)会被调用,但由于缺乏return语句且使用了逗号运算符,程序会继续执行fs.readFile或后续逻辑,导致回调可能被多次触发,并引发潜在的运行时错误。 - API 弃用:
new Buffer()已在 Node.js 中弃用,建议使用Buffer.from()。 - 代码健壮性:
imageBase64ToFile依赖全局RegExp.$1来获取文件后缀,这在并发或复杂逻辑下非常脆弱。建议使用.match()明确获取匹配组。 - Stream 创建: 建议使用标准的
fs.createReadStream代替fs.ReadStream构造函数。
| const crypto=require("crypto"),fs=require("fs"),path=require("path");window.services={textHashs:(e,a)=>{const t={};return a?e.forEach((e=>{t[e]=crypto.createHash(e).update(a).digest("hex")})):e.forEach((e=>{t[e]=""})),t},fileHashs:(e,a,t)=>{if(!fs.existsSync(a))return t(null);const o=[];for(const a of e)o.push(crypto.createHash(a));try{const s=fs.ReadStream(a);s.on("data",(e=>{o.forEach((a=>a.update(e)))})),s.on("end",(()=>{const a=o.map((e=>e.digest("hex"))),s={};e.forEach(((e,t)=>{s[e]=a[t]})),t(s)}))}catch(e){t(null)}},base64Encode:e=>Buffer.from(e).toString("base64"),base64EncodeImageFile:(e,a)=>{fs.existsSync(e)||a(null),fs.readFile(e,((t,o)=>{t&&a(null);const s="data:image/"+path.extname(e).replace(".","").toLowerCase()+";base64,";a(s+new Buffer(o).toString("base64"))}))},base64Decode:e=>Buffer.from(e,"base64").toString(),imageBase64ToFile:e=>{const a=Buffer.from(e.replace(/^data:image\/([a-z]+?);base64,/,""),"base64"),t=path.join(window.utools.getPath("downloads"),Date.now()+"."+RegExp.$1);fs.writeFileSync(t,a),window.utools.shellShowItemInFolder(t)}}; | |
| const crypto=require("crypto"),fs=require("fs"),path=require("path");window.services={textHashs:(e,a)=>{const t={};return a?e.forEach((e=>{t[e]=crypto.createHash(e).update(a).digest("hex")})):e.forEach((e=>{t[e]=""})),t},fileHashs:(e,a,t)=>{if(!fs.existsSync(a))return t(null);const o=[];for(const a of e)o.push(crypto.createHash(a));try{const s=fs.createReadStream(a);s.on("data",(e=>{o.forEach((a=>a.update(e)))})),s.on("end",(()=>{const a=o.map((e=>e.digest("hex"))),s={};e.forEach(((e,t)=>{s[e]=a[t]})),t(s)}))}catch(e){t(null)}},base64Encode:e=>Buffer.from(e).toString("base64"),base64EncodeImageFile:(e,a)=>{if(!fs.existsSync(e))return a(null);fs.readFile(e,((t,o)=>{if(t)return a(null);const s="data:image/"+path.extname(e).replace(".","").toLowerCase()+";base64,";a(s+Buffer.from(o).toString("base64"))}))},base64Decode:e=>Buffer.from(e,"base64").toString(),imageBase64ToFile:e=>{const r=e.match(/^data:image\/([a-z]+?);base64,/);if(!r)return;const a=Buffer.from(e.replace(r[0],""),"base64"),t=path.join(window.utools.getPath("downloads"),Date.now()+"."+r[1]);fs.writeFileSync(t,a),window.utools.shellShowItemInFolder(t)}}; |
|
尝试了已有的插件“开发百宝箱”和“开发加解密编码工具”,但是无奈这两个都没有实现任何匹配指令,也没有复制快捷键,所以只好把 uTools 官方的搬过来了。 |
插件信息
本次变更
截图 / 演示
自检清单
plugins/utools-fork-codehelper/目录此 PR 由 ztools-plugin-cli 自动管理:每次
ztools publish在分支上追加一个 commit,PR 链接保持不变。