mirror of
https://github.com/fofolee/uTools-quickcommand.git
synced 2025-09-02 04:04:42 +08:00
preload分割
This commit is contained in:
parent
3ffe0d2c82
commit
e1c31de4c1
44
plugin/lib/getCommandToLaunchTerminal.js
Normal file
44
plugin/lib/getCommandToLaunchTerminal.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
const getCommandToLaunchTerminal = (cmdline, dir) => {
|
||||||
|
let cd, command;
|
||||||
|
if (window.utools.isWindows()) {
|
||||||
|
let appPath = path.join(
|
||||||
|
window.utools.getPath("home"),
|
||||||
|
"/AppData/Local/Microsoft/WindowsApps/"
|
||||||
|
);
|
||||||
|
// 直接 existsSync wt.exe 无效
|
||||||
|
if (fs.existsSync(appPath) && fs.readdirSync(appPath).includes("wt.exe")) {
|
||||||
|
cmdline = cmdline.replace(/"/g, `\\"`);
|
||||||
|
cd = dir ? `-d "${dir.replace(/\\/g, "/")}"` : "";
|
||||||
|
command = `${appPath}wt.exe ${cd} cmd /k "${cmdline}"`;
|
||||||
|
} else {
|
||||||
|
cmdline = cmdline.replace(/"/g, `^"`);
|
||||||
|
cd = dir ? `cd /d "${dir.replace(/\\/g, "/")}" &&` : "";
|
||||||
|
command = `${cd} start "" cmd /k "${cmdline}"`;
|
||||||
|
}
|
||||||
|
} else if (window.utools.isMacOs()) {
|
||||||
|
cmdline = cmdline.replace(/"/g, `\\"`);
|
||||||
|
cd = dir ? `cd ${dir.replace(/ /g, "\\\\ ")} &&` : "";
|
||||||
|
command = fs.existsSync("/Applications/iTerm.app")
|
||||||
|
? `osascript -e 'tell application "iTerm"
|
||||||
|
if application "iTerm" is running then
|
||||||
|
create window with default profile
|
||||||
|
end if
|
||||||
|
tell current session of first window to write text "clear && ${cd} ${cmdline}"
|
||||||
|
activate
|
||||||
|
end tell'`
|
||||||
|
: `osascript -e 'tell application "Terminal"
|
||||||
|
if application "Terminal" is running then
|
||||||
|
do script "clear && ${cd} ${cmdline}"
|
||||||
|
else
|
||||||
|
do script "clear && ${cd} ${cmdline}" in window 1
|
||||||
|
end if
|
||||||
|
activate
|
||||||
|
end tell'`;
|
||||||
|
}
|
||||||
|
return command;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = getCommandToLaunchTerminal;
|
12
plugin/lib/getQuickcommandTempFile.js
Normal file
12
plugin/lib/getQuickcommandTempFile.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const os = require("os");
|
||||||
|
|
||||||
|
const getQuickcommandTempFile = (ext, name, dir = "quickcommandTempDir") => {
|
||||||
|
if (!name) name = new Date().getTime() + (Math.random() * 10 ** 6).toFixed();
|
||||||
|
let tempDir = path.join(os.tmpdir(), dir);
|
||||||
|
if (!fs.existsSync(tempDir)) fs.mkdirSync(tempDir);
|
||||||
|
return path.join(tempDir, `${name}.${ext}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = getQuickcommandTempFile;
|
47
plugin/lib/getUtoolsPlugins.js
Normal file
47
plugin/lib/getUtoolsPlugins.js
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const os = require("os");
|
||||||
|
const _ = require("lodash");
|
||||||
|
|
||||||
|
const pluginInfo = () => {
|
||||||
|
return JSON.parse(fs.readFileSync(path.join(__dirname, "plugin.json")));
|
||||||
|
};
|
||||||
|
|
||||||
|
const getUtoolsPlugins = () => {
|
||||||
|
let root = window.utools.isMacOs()
|
||||||
|
? path.join(os.homedir(), "Library/Application Support/uTools/plugins/")
|
||||||
|
: window.utools.isWindows()
|
||||||
|
? path.join(os.homedir(), "AppData/Roaming/uTools/plugins")
|
||||||
|
: path.join(os.homedir(), ".config/uTools/plugins");
|
||||||
|
let plugins = {};
|
||||||
|
let files = fs.readdirSync(root);
|
||||||
|
let deleted = path.join(root, "deleted");
|
||||||
|
let deletedList = fs.existsSync(deleted)
|
||||||
|
? fs.readFileSync(path.join(root, "deleted"), "utf8").split("|")
|
||||||
|
: [];
|
||||||
|
files.forEach((file) => {
|
||||||
|
if (/[a-zA-Z0-9\-]+\.asar$/.test(file) && !deletedList.includes(file)) {
|
||||||
|
let pluginInfo = JSON.parse(
|
||||||
|
fs.readFileSync(path.join(root, file, "plugin.json"))
|
||||||
|
);
|
||||||
|
pluginInfo.logoPath = path.join(root, file, pluginInfo.logo);
|
||||||
|
let keyWordFeatures = [];
|
||||||
|
pluginInfo.features.forEach((f) => {
|
||||||
|
f.cmds.some((c) => {
|
||||||
|
c.length && keyWordFeatures.push(c);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (!_.isEmpty(keyWordFeatures)) {
|
||||||
|
pluginInfo["keyWordFeatures"] = keyWordFeatures;
|
||||||
|
plugins[pluginInfo.pluginName] = pluginInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return plugins;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
pluginInfo,
|
||||||
|
getUtoolsPlugins,
|
||||||
|
};
|
38
plugin/lib/imageprocessor.js
Normal file
38
plugin/lib/imageprocessor.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
const Jimp = require("jimp");
|
||||||
|
|
||||||
|
const imageProcessor = async (imagePath) => {
|
||||||
|
try {
|
||||||
|
// 读取图片
|
||||||
|
const image = await Jimp.read(imagePath);
|
||||||
|
|
||||||
|
// 获取原始尺寸
|
||||||
|
const originalWidth = image.getWidth();
|
||||||
|
const originalHeight = image.getHeight();
|
||||||
|
const ratio = originalWidth / originalHeight;
|
||||||
|
|
||||||
|
// 设置目标尺寸
|
||||||
|
let targetWidth = 1280;
|
||||||
|
let targetHeight = 720;
|
||||||
|
|
||||||
|
if (ratio > 16 / 9) {
|
||||||
|
targetHeight = Math.min(720, Math.round(targetWidth / ratio));
|
||||||
|
} else {
|
||||||
|
targetWidth = Math.min(1280, Math.round(targetHeight * ratio));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 调整大小并压缩
|
||||||
|
await image
|
||||||
|
.resize(targetWidth, targetHeight, Jimp.RESIZE_BICUBIC)
|
||||||
|
.quality(80);
|
||||||
|
|
||||||
|
// 转换为 base64
|
||||||
|
const base64 = await image.getBase64Async(Jimp.MIME_JPEG);
|
||||||
|
|
||||||
|
return base64;
|
||||||
|
} catch (error) {
|
||||||
|
console.error("处理图片失败:", error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = imageProcessor;
|
240
plugin/lib/quickcommand.js
Normal file
240
plugin/lib/quickcommand.js
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
const child_process = require("child_process");
|
||||||
|
const electron = require("electron");
|
||||||
|
const fs = require("fs");
|
||||||
|
const kill = require("tree-kill");
|
||||||
|
const iconv = require("iconv-lite");
|
||||||
|
const getQuickcommandTempFile = require("./getQuickcommandTempFile");
|
||||||
|
const getCommandToLaunchTerminal = require("./getCommandToLaunchTerminal");
|
||||||
|
|
||||||
|
const ctlKey = window.utools.isMacOs() ? "command" : "control";
|
||||||
|
|
||||||
|
const getSleepCodeByShell = (ms) => {
|
||||||
|
var cmd, tempFilePath;
|
||||||
|
if (window.utools.isWindows()) {
|
||||||
|
tempFilePath = getQuickcommandTempFile("vbs", "SleepVBSScript");
|
||||||
|
cmd = `echo set ws=CreateObject("Wscript.Shell") > ${tempFilePath} && echo Wscript.sleep ${ms} >> ${tempFilePath} && cscript /nologo ${tempFilePath}`;
|
||||||
|
} else {
|
||||||
|
cmd = `sleep ${ms / 1000}`;
|
||||||
|
}
|
||||||
|
return cmd;
|
||||||
|
};
|
||||||
|
|
||||||
|
const quickcommand = {
|
||||||
|
// 模拟复制操作
|
||||||
|
simulateCopy: function () {
|
||||||
|
window.utools.simulateKeyboardTap("c", ctlKey);
|
||||||
|
},
|
||||||
|
|
||||||
|
// 模拟粘贴操作
|
||||||
|
simulatePaste: function () {
|
||||||
|
window.utools.simulateKeyboardTap("v", ctlKey);
|
||||||
|
},
|
||||||
|
|
||||||
|
// setTimout 不能在 vm2 中使用,同时在 electron 中有 bug
|
||||||
|
sleep: function (ms) {
|
||||||
|
var start = new Date().getTime();
|
||||||
|
try {
|
||||||
|
// node 16.13.1
|
||||||
|
child_process.execSync(getSleepCodeByShell(ms), {
|
||||||
|
timeout: ms,
|
||||||
|
windowsHide: true,
|
||||||
|
});
|
||||||
|
} catch (ex) {}
|
||||||
|
var end = new Date().getTime();
|
||||||
|
return end - start;
|
||||||
|
},
|
||||||
|
|
||||||
|
// 重写 setTimeout
|
||||||
|
setTimeout: function (callback, ms) {
|
||||||
|
var start = new Date().getTime();
|
||||||
|
child_process.exec(
|
||||||
|
getSleepCodeByShell(ms),
|
||||||
|
{
|
||||||
|
timeout: ms,
|
||||||
|
},
|
||||||
|
(err, stdout, stderr) => {
|
||||||
|
var end = new Date().getTime();
|
||||||
|
callback(end - start);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
// 关闭进程
|
||||||
|
kill: function (pid, signal = "SIGTERM", cb) {
|
||||||
|
kill(pid, signal, cb);
|
||||||
|
},
|
||||||
|
|
||||||
|
// dom 解析
|
||||||
|
htmlParse: function (html) {
|
||||||
|
return new DOMParser().parseFromString(html, "text/html");
|
||||||
|
},
|
||||||
|
|
||||||
|
// 下载文件
|
||||||
|
downloadFile: function (url, file = {}) {
|
||||||
|
return new Promise((reslove, reject) => {
|
||||||
|
if (file instanceof Object)
|
||||||
|
file = window.utools.showSaveDialog(JSON.parse(JSON.stringify(file)));
|
||||||
|
axios({
|
||||||
|
method: "get",
|
||||||
|
url: url,
|
||||||
|
responseType: "arraybuffer",
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
var filebuffer = Buffer.from(res.data);
|
||||||
|
fs.writeFile(file, filebuffer, (err) => {
|
||||||
|
if (err) reject(err);
|
||||||
|
else reslove(filebuffer);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// 上传文件
|
||||||
|
uploadFile: function (url, file = {}, name = "file", formData = {}) {
|
||||||
|
return new Promise((reslove, reject) => {
|
||||||
|
var objfile;
|
||||||
|
if (file instanceof File) {
|
||||||
|
objfile = file;
|
||||||
|
} else {
|
||||||
|
if (file instanceof Object)
|
||||||
|
file = window.utools.showOpenDialog(
|
||||||
|
JSON.parse(JSON.stringify(file))
|
||||||
|
)[0];
|
||||||
|
if (!fs.existsSync(file)) return reject("文件不存在");
|
||||||
|
var arraybuffer = fs.readFileSync(file).buffer;
|
||||||
|
var objfile = new File([arraybuffer], path.basename(file));
|
||||||
|
}
|
||||||
|
var form = new FormData();
|
||||||
|
form.append(name, objfile);
|
||||||
|
var keys = Object.keys(formData);
|
||||||
|
if (keys.length) keys.forEach((k) => form.append(k, formData[k]));
|
||||||
|
axios
|
||||||
|
.post(url, form, {
|
||||||
|
headers: {
|
||||||
|
accept: "application/json",
|
||||||
|
"Content-Type": `multipart/form-data; boundary=${formData._boundary}`,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
reslove(res);
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// 载入在线资源
|
||||||
|
loadRemoteScript: async function (url) {
|
||||||
|
if (
|
||||||
|
!/^((ht|f)tps?):\/\/([\w\-]+(\.[\w\-]+)*\/)*[\w\-]+(\.[\w\-]+)*\/?(\?([\w\-\.,@?^=%&:\/~\+#]*)+)?/.test(
|
||||||
|
url
|
||||||
|
)
|
||||||
|
)
|
||||||
|
throw "url 不合法";
|
||||||
|
let local = getQuickcommandTempFile("js");
|
||||||
|
await this.downloadFile(url, local);
|
||||||
|
let source = require(local);
|
||||||
|
fs.unlinkSync(local);
|
||||||
|
return source;
|
||||||
|
},
|
||||||
|
|
||||||
|
// 唤醒 uTools
|
||||||
|
wakeUtools: function () {
|
||||||
|
let uToolsPath = window.utools.isMacOs()
|
||||||
|
? process.execPath.replace(/\/Frameworks\/.*/, "/MacOS/uTools")
|
||||||
|
: process.execPath;
|
||||||
|
child_process.exec(uToolsPath, () => {});
|
||||||
|
},
|
||||||
|
|
||||||
|
readClipboard: function () {
|
||||||
|
return electron.clipboard.readText();
|
||||||
|
},
|
||||||
|
|
||||||
|
writeClipboard: function (text) {
|
||||||
|
electron.clipboard.writeText(text.toString());
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
if (process.platform === "win32") {
|
||||||
|
// 运行vbs脚本
|
||||||
|
quickcommand.runVbs = function (script) {
|
||||||
|
return new Promise((reslove, reject) => {
|
||||||
|
var tempfile = getQuickcommandTempFile("vbs", "TempVBSScript");
|
||||||
|
fs.writeFile(tempfile, iconv.encode(script, "gbk"), (err) => {
|
||||||
|
child_process.exec(
|
||||||
|
`cscript.exe /nologo "${tempfile}"`,
|
||||||
|
{
|
||||||
|
encoding: "buffer",
|
||||||
|
windowsHide: true,
|
||||||
|
},
|
||||||
|
(err, stdout, stderr) => {
|
||||||
|
if (err) reject(iconv.decode(stderr, "gbk"));
|
||||||
|
else reslove(iconv.decode(stdout, "gbk"));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
// 运行powershell脚本
|
||||||
|
quickcommand.runPowerShell = function (script) {
|
||||||
|
return new Promise((reslove, reject) => {
|
||||||
|
let base64str = Buffer.from(script, "utf16le").toString("base64");
|
||||||
|
child_process.exec(
|
||||||
|
`powershell.exe -e "${base64str}"`,
|
||||||
|
{
|
||||||
|
encoding: "buffer",
|
||||||
|
windowsHide: true,
|
||||||
|
},
|
||||||
|
(err, stdout, stderr) => {
|
||||||
|
if (err) reject(iconv.decode(stderr, "gbk"));
|
||||||
|
else reslove(iconv.decode(stdout, "gbk"));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.platform === "darwin") {
|
||||||
|
// 运行AppleScript脚本
|
||||||
|
quickcommand.runAppleScript = function (script) {
|
||||||
|
return new Promise((reslove, reject) => {
|
||||||
|
child_process.execFile(
|
||||||
|
"osascript",
|
||||||
|
["-e", script],
|
||||||
|
(err, stdout, stderr) => {
|
||||||
|
if (err) reject(stderr);
|
||||||
|
else reslove(stdout);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// python -c
|
||||||
|
window.runPythonCommand = (py) => {
|
||||||
|
try {
|
||||||
|
let result = child_process.execFileSync("python", ["-c", py], {
|
||||||
|
windowsHide: true,
|
||||||
|
encoding: "buffer",
|
||||||
|
});
|
||||||
|
return iconv
|
||||||
|
.decode(result, window.utools.isWindows() ? "gbk" : "utf8")
|
||||||
|
.trim();
|
||||||
|
} catch (e) {
|
||||||
|
alert(e);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 在终端中执行
|
||||||
|
if (process.platform !== "linux")
|
||||||
|
quickcommand.runInTerminal = function (cmdline, dir) {
|
||||||
|
let command = getCommandToLaunchTerminal(cmdline, dir);
|
||||||
|
child_process.exec(command);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = quickcommand;
|
35
plugin/lib/shortCodes.js
Normal file
35
plugin/lib/shortCodes.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
const electron = require("electron");
|
||||||
|
const child_process = require("child_process");
|
||||||
|
const iconv = require("iconv-lite");
|
||||||
|
|
||||||
|
const shortCodes = {
|
||||||
|
open: (path) => {
|
||||||
|
window.utools.shellOpenItem(path);
|
||||||
|
},
|
||||||
|
locate: (path) => {
|
||||||
|
window.utools.shellShowItemInFolder(path);
|
||||||
|
},
|
||||||
|
visit: (url) => {
|
||||||
|
window.utools.shellOpenExternal(url);
|
||||||
|
},
|
||||||
|
system: (cmd) => {
|
||||||
|
let result = child_process.execSync(cmd, {
|
||||||
|
windowsHide: true,
|
||||||
|
encoding: "buffer",
|
||||||
|
});
|
||||||
|
return iconv.decode(result, window.utools.isWindows() ? "gbk" : "utf8");
|
||||||
|
},
|
||||||
|
message: (msg) => {
|
||||||
|
window.utools.showNotification(msg);
|
||||||
|
},
|
||||||
|
keyTap: (key, ...modifier) =>
|
||||||
|
window.utools.simulateKeyboardTap(key, ...modifier),
|
||||||
|
copyTo: (text) => {
|
||||||
|
electron.clipboard.writeText(text);
|
||||||
|
},
|
||||||
|
send: (text) => {
|
||||||
|
window.utools.hideMainWindowTypeString(text);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = shortCodes;
|
38
plugin/lib/showDocs.js
Normal file
38
plugin/lib/showDocs.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
const runUbrowser = (path) => {
|
||||||
|
window.utools.ubrowser
|
||||||
|
.goto(path)
|
||||||
|
.css(
|
||||||
|
`
|
||||||
|
.ant-modal-content,
|
||||||
|
.ant-modal-mask,
|
||||||
|
[class*='index-module_contentWrapper'],
|
||||||
|
[class*='index-module_reward'],
|
||||||
|
[class*='ReaderLayout-module_asideWrapper'],
|
||||||
|
[class*='CornerBubble-module_cornerBubble'],
|
||||||
|
[class*='DocReader-module_comment'],
|
||||||
|
#header,
|
||||||
|
#footer {
|
||||||
|
display: none
|
||||||
|
}`
|
||||||
|
)
|
||||||
|
.run({
|
||||||
|
width: 980,
|
||||||
|
height: 750,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const docsRepoUrl = "https://www.yuque.com/fofolee/qcdocs3";
|
||||||
|
|
||||||
|
const showUb = {
|
||||||
|
help: function (path = "") {
|
||||||
|
runUbrowser(docsRepoUrl + "/bg31vl" + path);
|
||||||
|
},
|
||||||
|
docs: function (path = "") {
|
||||||
|
runUbrowser(docsRepoUrl + "/pt589p" + path);
|
||||||
|
},
|
||||||
|
changelog: function (path = "") {
|
||||||
|
runUbrowser(docsRepoUrl + "/ucnd2o" + path);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = showUb;
|
107
plugin/lib/utils.js
Normal file
107
plugin/lib/utils.js
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const iconv = require("iconv-lite");
|
||||||
|
const child_process = require("child_process");
|
||||||
|
|
||||||
|
const getBase64Ico = (filepath) => {
|
||||||
|
let sourceImage,
|
||||||
|
ext = path.extname(filepath).slice(1);
|
||||||
|
if (["png", "jpg", "jpeg", "bmp", "ico", "gif", "svg"].includes(ext)) {
|
||||||
|
if (ext == "svg") ext = "svg+xml";
|
||||||
|
sourceImage =
|
||||||
|
`data:image/${ext};base64,` + fs.readFileSync(filepath, "base64");
|
||||||
|
if (ext == "png") return sourceImage;
|
||||||
|
} else {
|
||||||
|
sourceImage = window.utools.getFileIcon(filepath);
|
||||||
|
return sourceImage;
|
||||||
|
}
|
||||||
|
return sourceImage;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getFileInfo = (options) => {
|
||||||
|
var file;
|
||||||
|
if (options.type == "file") {
|
||||||
|
file = options.argvs;
|
||||||
|
} else if (options.type == "dialog") {
|
||||||
|
var dialog = window.utools.showOpenDialog(options.argvs);
|
||||||
|
if (!dialog) return false;
|
||||||
|
file = dialog[0];
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var information = {
|
||||||
|
name: path.basename(file),
|
||||||
|
ext: path.extname(file),
|
||||||
|
path: file,
|
||||||
|
};
|
||||||
|
if (options.readfile) {
|
||||||
|
var codec =
|
||||||
|
information.ext == ".bat" || information == ".ps1" ? "gbk" : "utf8";
|
||||||
|
information.data = iconv.decode(fs.readFileSync(file), codec);
|
||||||
|
}
|
||||||
|
return information;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getCurrentFolderPathFix = () => {
|
||||||
|
let pwd = window.utools.getCurrentFolderPath();
|
||||||
|
let pwdFix = pwd ? pwd : path.join(window.utools.getPath("home"), "desktop");
|
||||||
|
return pwdFix.replace(/\\/g, "\\\\");
|
||||||
|
};
|
||||||
|
|
||||||
|
const saveFile = (content, file) => {
|
||||||
|
if (file instanceof Object) file = window.utools.showSaveDialog(file);
|
||||||
|
if (!file) return false;
|
||||||
|
try {
|
||||||
|
fs.writeFileSync(file, content);
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const getSelectFile = (hwnd) => {
|
||||||
|
if (window.utools.isWindows()) {
|
||||||
|
var cmd = `powershell.exe -NoProfile "(New-Object -COM 'Shell.Application').Windows() | Where-Object { $_.HWND -eq ${hwnd} } | Select-Object -Expand Document | select @{ n='SelectItems'; e={$_.SelectedItems()} } | select -Expand SelectItems | select -Expand Path "`;
|
||||||
|
let result = child_process.execSync(cmd, {
|
||||||
|
encoding: "buffer",
|
||||||
|
windowsHide: true,
|
||||||
|
});
|
||||||
|
return iconv.decode(result, "GBK").trim().replace(/\\/g, "/");
|
||||||
|
} else {
|
||||||
|
var cmd = `osascript -e 'tell application "Finder" to set selectedItems to selection as alias list
|
||||||
|
if selectedItems is {} then return
|
||||||
|
set parentPath to do shell script "dirname " & quoted form of POSIX path of (item 1 of selectedItems)
|
||||||
|
set pathData to ""
|
||||||
|
repeat with theItem in selectedItems
|
||||||
|
set pathData to pathData & POSIX path of theItem & linefeed
|
||||||
|
end repeat
|
||||||
|
'
|
||||||
|
`;
|
||||||
|
let result = child_process.execSync(cmd, {
|
||||||
|
encoding: "utf8",
|
||||||
|
windowsHide: true,
|
||||||
|
});
|
||||||
|
return result ? result.trim() : "";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const convertFilePathToUtoolsPayload = (files) => {
|
||||||
|
return files.map((file) => {
|
||||||
|
let isFile = fs.statSync(file).isFile();
|
||||||
|
return {
|
||||||
|
isFile: isFile,
|
||||||
|
isDirectory: !isFile,
|
||||||
|
name: path.basename(file),
|
||||||
|
path: file,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
getBase64Ico,
|
||||||
|
getFileInfo,
|
||||||
|
getCurrentFolderPathFix,
|
||||||
|
saveFile,
|
||||||
|
getSelectFile,
|
||||||
|
convertFilePathToUtoolsPayload,
|
||||||
|
};
|
@ -9,24 +9,39 @@ const path = require("path");
|
|||||||
const axios = require("axios");
|
const axios = require("axios");
|
||||||
const http = require("http");
|
const http = require("http");
|
||||||
const url = require("url");
|
const url = require("url");
|
||||||
const kill = require("tree-kill");
|
|
||||||
const crypto = require("crypto");
|
const crypto = require("crypto");
|
||||||
require("ses");
|
require("ses");
|
||||||
const Jimp = require("jimp");
|
|
||||||
const md5 = (input) => {
|
const md5 = (input) => {
|
||||||
return crypto.createHash("md5").update(input, "utf8").digest("hex");
|
return crypto.createHash("md5").update(input, "utf8").digest("hex");
|
||||||
};
|
};
|
||||||
|
|
||||||
window._ = require("lodash");
|
window._ = require("lodash");
|
||||||
|
|
||||||
|
const getCommandToLaunchTerminal = require("./lib/getCommandToLaunchTerminal");
|
||||||
|
const shortCodes = require("./lib/shortCodes");
|
||||||
|
const { pluginInfo, getUtoolsPlugins } = require("./lib/getUtoolsPlugins");
|
||||||
|
const {
|
||||||
|
getBase64Ico,
|
||||||
|
getFileInfo,
|
||||||
|
getCurrentFolderPathFix,
|
||||||
|
saveFile,
|
||||||
|
getSelectFile,
|
||||||
|
convertFilePathToUtoolsPayload,
|
||||||
|
} = require("./lib/utils");
|
||||||
|
window.pluginInfo = pluginInfo;
|
||||||
|
window.getUtoolsPlugins = getUtoolsPlugins;
|
||||||
|
window.getBase64Ico = getBase64Ico;
|
||||||
|
window.getFileInfo = getFileInfo;
|
||||||
|
window.getCurrentFolderPathFix = getCurrentFolderPathFix;
|
||||||
|
window.saveFile = saveFile;
|
||||||
|
window.getSelectFile = getSelectFile;
|
||||||
|
window.convertFilePathToUtoolsPayload = convertFilePathToUtoolsPayload;
|
||||||
|
|
||||||
window.getuToolsLite = require("./lib/utoolsLite");
|
window.getuToolsLite = require("./lib/utoolsLite");
|
||||||
// window.yuQueClient = axios.create({
|
window.quickcommand = require("./lib/quickcommand");
|
||||||
// baseURL: 'https://www.yuque.com/api/v2/',
|
window.getQuickcommandTempFile = require("./lib/getQuickcommandTempFile");
|
||||||
// headers: {
|
window.imageProcessor = require("./lib/imageprocessor");
|
||||||
// 'Content-Type': 'application/json',
|
window.showUb = require("./lib/showDocs");
|
||||||
// // 只读权限
|
|
||||||
// 'X-Auth-Token': 'WNrd0Z4kfCZLFrGLVAaas93DZ7sbG6PirKq7VxBL'
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
|
|
||||||
window.getSharedQcById = async (id) => {
|
window.getSharedQcById = async (id) => {
|
||||||
const url = "https://qc.qaz.ink/home/quick/script/getScript";
|
const url = "https://qc.qaz.ink/home/quick/script/getScript";
|
||||||
@ -66,310 +81,12 @@ window.multiProcessDetection = () => {
|
|||||||
|
|
||||||
// axios.defaults.adapter = require('axios/lib/adapters/http')
|
// axios.defaults.adapter = require('axios/lib/adapters/http')
|
||||||
|
|
||||||
if (!utools.isWindows())
|
if (!window.utools.isWindows())
|
||||||
process.env.PATH = `/usr/local/bin:/usr/local/sbin:${process.env.PATH}`;
|
process.env.PATH = `/usr/local/bin:/usr/local/sbin:${process.env.PATH}`;
|
||||||
|
|
||||||
if (utools.isMacOS())
|
if (window.utools.isMacOS())
|
||||||
process.env.PATH = `/opt/homebrew/bin:/opt/homebrew/sbin:${process.env.PATH}`;
|
process.env.PATH = `/opt/homebrew/bin:/opt/homebrew/sbin:${process.env.PATH}`;
|
||||||
|
|
||||||
const shortCodes = {
|
|
||||||
open: (path) => {
|
|
||||||
utools.shellOpenItem(path);
|
|
||||||
},
|
|
||||||
locate: (path) => {
|
|
||||||
utools.shellShowItemInFolder(path);
|
|
||||||
},
|
|
||||||
visit: (url) => {
|
|
||||||
utools.shellOpenExternal(url);
|
|
||||||
},
|
|
||||||
system: (cmd) => {
|
|
||||||
let result = child_process.execSync(cmd, {
|
|
||||||
windowsHide: true,
|
|
||||||
encoding: "buffer",
|
|
||||||
});
|
|
||||||
return iconv.decode(result, utools.isWindows() ? "gbk" : "utf8");
|
|
||||||
},
|
|
||||||
message: (msg) => {
|
|
||||||
utools.showNotification(msg);
|
|
||||||
},
|
|
||||||
keyTap: (key, ...modifier) => utools.simulateKeyboardTap(key, ...modifier),
|
|
||||||
copyTo: (text) => {
|
|
||||||
electron.clipboard.writeText(text);
|
|
||||||
},
|
|
||||||
send: (text) => {
|
|
||||||
utools.hideMainWindowTypeString(text);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const ctlKey = utools.isMacOs() ? "command" : "control";
|
|
||||||
|
|
||||||
window.quickcommand = {
|
|
||||||
// 模拟复制操作
|
|
||||||
simulateCopy: function () {
|
|
||||||
utools.simulateKeyboardTap("c", ctlKey);
|
|
||||||
},
|
|
||||||
|
|
||||||
// 模拟粘贴操作
|
|
||||||
simulatePaste: function () {
|
|
||||||
utools.simulateKeyboardTap("v", ctlKey);
|
|
||||||
},
|
|
||||||
|
|
||||||
// setTimout 不能在 vm2 中使用,同时在 electron 中有 bug
|
|
||||||
sleep: function (ms) {
|
|
||||||
var start = new Date().getTime();
|
|
||||||
try {
|
|
||||||
// node 16.13.1
|
|
||||||
child_process.execSync(getSleepCodeByShell(ms), {
|
|
||||||
timeout: ms,
|
|
||||||
windowsHide: true,
|
|
||||||
});
|
|
||||||
} catch (ex) {}
|
|
||||||
var end = new Date().getTime();
|
|
||||||
return end - start;
|
|
||||||
},
|
|
||||||
|
|
||||||
// 重写 setTimeout
|
|
||||||
setTimeout: function (callback, ms) {
|
|
||||||
var start = new Date().getTime();
|
|
||||||
child_process.exec(
|
|
||||||
getSleepCodeByShell(ms),
|
|
||||||
{
|
|
||||||
timeout: ms,
|
|
||||||
},
|
|
||||||
(err, stdout, stderr) => {
|
|
||||||
var end = new Date().getTime();
|
|
||||||
callback(end - start);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
// 关闭进程
|
|
||||||
kill: function (pid, signal = "SIGTERM", cb) {
|
|
||||||
kill(pid, signal, cb);
|
|
||||||
},
|
|
||||||
|
|
||||||
// dom 解析
|
|
||||||
htmlParse: function (html) {
|
|
||||||
return new DOMParser().parseFromString(html, "text/html");
|
|
||||||
},
|
|
||||||
|
|
||||||
// 下载文件
|
|
||||||
downloadFile: function (url, file = {}) {
|
|
||||||
return new Promise((reslove, reject) => {
|
|
||||||
if (file instanceof Object)
|
|
||||||
file = utools.showSaveDialog(JSON.parse(JSON.stringify(file)));
|
|
||||||
axios({
|
|
||||||
method: "get",
|
|
||||||
url: url,
|
|
||||||
responseType: "arraybuffer",
|
|
||||||
})
|
|
||||||
.then((res) => {
|
|
||||||
var filebuffer = Buffer.from(res.data);
|
|
||||||
fs.writeFile(file, filebuffer, (err) => {
|
|
||||||
if (err) reject(err);
|
|
||||||
else reslove(filebuffer);
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
reject(err);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
// 上传文件
|
|
||||||
uploadFile: function (url, file = {}, name = "file", formData = {}) {
|
|
||||||
return new Promise((reslove, reject) => {
|
|
||||||
var objfile;
|
|
||||||
if (file instanceof File) {
|
|
||||||
objfile = file;
|
|
||||||
} else {
|
|
||||||
if (file instanceof Object)
|
|
||||||
file = utools.showOpenDialog(JSON.parse(JSON.stringify(file)))[0];
|
|
||||||
if (!fs.existsSync(file)) return reject("文件不存在");
|
|
||||||
var arraybuffer = fs.readFileSync(file).buffer;
|
|
||||||
var objfile = new File([arraybuffer], path.basename(file));
|
|
||||||
}
|
|
||||||
var form = new FormData();
|
|
||||||
form.append(name, objfile);
|
|
||||||
var keys = Object.keys(formData);
|
|
||||||
if (keys.length) keys.forEach((k) => form.append(k, formData[k]));
|
|
||||||
axios
|
|
||||||
.post(url, form, {
|
|
||||||
headers: {
|
|
||||||
accept: "application/json",
|
|
||||||
"Content-Type": `multipart/form-data; boundary=${formData._boundary}`,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.then((res) => {
|
|
||||||
reslove(res);
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
reject(err);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
// 载入在线资源
|
|
||||||
loadRemoteScript: async function (url) {
|
|
||||||
if (
|
|
||||||
!/^((ht|f)tps?):\/\/([\w\-]+(\.[\w\-]+)*\/)*[\w\-]+(\.[\w\-]+)*\/?(\?([\w\-\.,@?^=%&:\/~\+#]*)+)?/.test(
|
|
||||||
url
|
|
||||||
)
|
|
||||||
)
|
|
||||||
throw "url 不合法";
|
|
||||||
let local = getQuickcommandTempFile("js");
|
|
||||||
await this.downloadFile(url, local);
|
|
||||||
let source = require(local);
|
|
||||||
fs.unlinkSync(local);
|
|
||||||
return source;
|
|
||||||
},
|
|
||||||
|
|
||||||
// 唤醒 uTools
|
|
||||||
wakeUtools: function () {
|
|
||||||
let uToolsPath = utools.isMacOs()
|
|
||||||
? process.execPath.replace(/\/Frameworks\/.*/, "/MacOS/uTools")
|
|
||||||
: process.execPath;
|
|
||||||
child_process.exec(uToolsPath, () => {});
|
|
||||||
},
|
|
||||||
|
|
||||||
readClipboard: function () {
|
|
||||||
return electron.clipboard.readText();
|
|
||||||
},
|
|
||||||
|
|
||||||
writeClipboard: function (text) {
|
|
||||||
electron.clipboard.writeText(text.toString());
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
if (process.platform === "win32") {
|
|
||||||
// 运行vbs脚本
|
|
||||||
quickcommand.runVbs = function (script) {
|
|
||||||
return new Promise((reslove, reject) => {
|
|
||||||
var tempfile = getQuickcommandTempFile("vbs", "TempVBSScript");
|
|
||||||
fs.writeFile(tempfile, iconv.encode(script, "gbk"), (err) => {
|
|
||||||
child_process.exec(
|
|
||||||
`cscript.exe /nologo "${tempfile}"`,
|
|
||||||
{
|
|
||||||
encoding: "buffer",
|
|
||||||
},
|
|
||||||
(err, stdout, stderr) => {
|
|
||||||
if (err) reject(iconv.decode(stderr, "gbk"));
|
|
||||||
else reslove(iconv.decode(stdout, "gbk"));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
// 运行powershell脚本
|
|
||||||
quickcommand.runPowerShell = function (script) {
|
|
||||||
return new Promise((reslove, reject) => {
|
|
||||||
let base64str = Buffer.from(script, "utf16le").toString("base64");
|
|
||||||
child_process.exec(
|
|
||||||
`powershell.exe -e "${base64str}"`,
|
|
||||||
{
|
|
||||||
encoding: "buffer",
|
|
||||||
},
|
|
||||||
(err, stdout, stderr) => {
|
|
||||||
if (err) reject(iconv.decode(stderr, "gbk"));
|
|
||||||
else reslove(iconv.decode(stdout, "gbk"));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.platform === "darwin") {
|
|
||||||
// 运行AppleScript脚本
|
|
||||||
quickcommand.runAppleScript = function (script) {
|
|
||||||
return new Promise((reslove, reject) => {
|
|
||||||
child_process.execFile(
|
|
||||||
"osascript",
|
|
||||||
["-e", script],
|
|
||||||
(err, stdout, stderr) => {
|
|
||||||
if (err) reject(stderr);
|
|
||||||
else reslove(stdout);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// python -c
|
|
||||||
window.runPythonCommand = (py) => {
|
|
||||||
try {
|
|
||||||
let result = child_process.execFileSync("python", ["-c", py], {
|
|
||||||
windowsHide: true,
|
|
||||||
encoding: "buffer",
|
|
||||||
});
|
|
||||||
return iconv.decode(result, utools.isWindows() ? "gbk" : "utf8").trim();
|
|
||||||
} catch (e) {
|
|
||||||
alert(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// 在终端中执行
|
|
||||||
if (process.platform !== "linux")
|
|
||||||
quickcommand.runInTerminal = function (cmdline, dir) {
|
|
||||||
let command = getCommandToLaunchTerminal(cmdline, dir);
|
|
||||||
child_process.exec(command);
|
|
||||||
};
|
|
||||||
|
|
||||||
let getCommandToLaunchTerminal = (cmdline, dir) => {
|
|
||||||
let cd, command;
|
|
||||||
if (utools.isWindows()) {
|
|
||||||
let appPath = path.join(
|
|
||||||
utools.getPath("home"),
|
|
||||||
"/AppData/Local/Microsoft/WindowsApps/"
|
|
||||||
);
|
|
||||||
// 直接 existsSync wt.exe 无效
|
|
||||||
if (fs.existsSync(appPath) && fs.readdirSync(appPath).includes("wt.exe")) {
|
|
||||||
cmdline = cmdline.replace(/"/g, `\\"`);
|
|
||||||
cd = dir ? `-d "${dir.replace(/\\/g, "/")}"` : "";
|
|
||||||
command = `${appPath}wt.exe ${cd} cmd /k "${cmdline}"`;
|
|
||||||
} else {
|
|
||||||
cmdline = cmdline.replace(/"/g, `^"`);
|
|
||||||
cd = dir ? `cd /d "${dir.replace(/\\/g, "/")}" &&` : "";
|
|
||||||
command = `${cd} start "" cmd /k "${cmdline}"`;
|
|
||||||
}
|
|
||||||
} else if (utools.isMacOs()) {
|
|
||||||
cmdline = cmdline.replace(/"/g, `\\"`);
|
|
||||||
cd = dir ? `cd ${dir.replace(/ /g, "\\\\ ")} &&` : "";
|
|
||||||
command = fs.existsSync("/Applications/iTerm.app")
|
|
||||||
? `osascript -e 'tell application "iTerm"
|
|
||||||
if application "iTerm" is running then
|
|
||||||
create window with default profile
|
|
||||||
end if
|
|
||||||
tell current session of first window to write text "clear && ${cd} ${cmdline}"
|
|
||||||
activate
|
|
||||||
end tell'`
|
|
||||||
: `osascript -e 'tell application "Terminal"
|
|
||||||
if application "Terminal" is running then
|
|
||||||
do script "clear && ${cd} ${cmdline}"
|
|
||||||
else
|
|
||||||
do script "clear && ${cd} ${cmdline}" in window 1
|
|
||||||
end if
|
|
||||||
activate
|
|
||||||
end tell'`;
|
|
||||||
}
|
|
||||||
return command;
|
|
||||||
};
|
|
||||||
|
|
||||||
window.pluginInfo = () => {
|
|
||||||
return JSON.parse(fs.readFileSync(path.join(__dirname, "plugin.json")));
|
|
||||||
};
|
|
||||||
|
|
||||||
let getSleepCodeByShell = (ms) => {
|
|
||||||
var cmd, tempFilePath;
|
|
||||||
if (utools.isWindows()) {
|
|
||||||
tempFilePath = getQuickcommandTempFile("vbs", "SleepVBSScript");
|
|
||||||
cmd = `echo set ws=CreateObject("Wscript.Shell") > ${tempFilePath} && echo Wscript.sleep ${ms} >> ${tempFilePath} && cscript /nologo ${tempFilePath}`;
|
|
||||||
} else {
|
|
||||||
cmd = `sleep ${ms / 1000}`;
|
|
||||||
}
|
|
||||||
return cmd;
|
|
||||||
};
|
|
||||||
|
|
||||||
window.htmlEncode = (value) => {
|
window.htmlEncode = (value) => {
|
||||||
let dom = quickcommand.htmlParse().querySelector("body");
|
let dom = quickcommand.htmlParse().querySelector("body");
|
||||||
dom.innerText = value;
|
dom.innerText = value;
|
||||||
@ -387,188 +104,12 @@ window.base64Decode = (text) => Buffer.from(text, "base64").toString("utf8");
|
|||||||
window.processPlatform = process.platform;
|
window.processPlatform = process.platform;
|
||||||
window.joinPath = path.join;
|
window.joinPath = path.join;
|
||||||
|
|
||||||
window.getUtoolsPlugins = () => {
|
|
||||||
let root = utools.isMacOs()
|
|
||||||
? path.join(os.homedir(), "Library/Application Support/uTools/plugins/")
|
|
||||||
: utools.isWindows()
|
|
||||||
? path.join(os.homedir(), "AppData/Roaming/uTools/plugins")
|
|
||||||
: path.join(os.homedir(), ".config/uTools/plugins");
|
|
||||||
let plugins = {};
|
|
||||||
let files = fs.readdirSync(root);
|
|
||||||
let deleted = path.join(root, "deleted");
|
|
||||||
let deletedList = fs.existsSync(deleted)
|
|
||||||
? fs.readFileSync(path.join(root, "deleted"), "utf8").split("|")
|
|
||||||
: [];
|
|
||||||
files.forEach((file) => {
|
|
||||||
if (/[a-zA-Z0-9\-]+\.asar$/.test(file) && !deletedList.includes(file)) {
|
|
||||||
let pluginInfo = JSON.parse(
|
|
||||||
fs.readFileSync(path.join(root, file, "plugin.json"))
|
|
||||||
);
|
|
||||||
pluginInfo.logoPath = path.join(root, file, pluginInfo.logo);
|
|
||||||
let keyWordFeatures = [];
|
|
||||||
pluginInfo.features.forEach((f) => {
|
|
||||||
f.cmds.some((c) => {
|
|
||||||
c.length && keyWordFeatures.push(c);
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
if (!_.isEmpty(keyWordFeatures)) {
|
|
||||||
pluginInfo["keyWordFeatures"] = keyWordFeatures;
|
|
||||||
plugins[pluginInfo.pluginName] = pluginInfo;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return plugins;
|
|
||||||
};
|
|
||||||
|
|
||||||
window.getQuickcommandTempFile = (ext, name, dir = "quickcommandTempDir") => {
|
|
||||||
if (!name) name = new Date().getTime() + (Math.random() * 10 ** 6).toFixed();
|
|
||||||
let tempDir = path.join(os.tmpdir(), dir);
|
|
||||||
if (!fs.existsSync(tempDir)) fs.mkdirSync(tempDir);
|
|
||||||
return path.join(tempDir, `${name}.${ext}`);
|
|
||||||
};
|
|
||||||
|
|
||||||
window.delTempFile = (...args) => {
|
|
||||||
let tmpPath = path.join(os.tmpdir(), ...args);
|
|
||||||
if (fs.existsSync(tmpPath)) fs.unlinkSync(tmpPath);
|
|
||||||
};
|
|
||||||
|
|
||||||
window.getBase64Ico = (filepath) => {
|
|
||||||
let sourceImage,
|
|
||||||
ext = path.extname(filepath).slice(1);
|
|
||||||
if (["png", "jpg", "jpeg", "bmp", "ico", "gif", "svg"].includes(ext)) {
|
|
||||||
if (ext == "svg") ext = "svg+xml";
|
|
||||||
sourceImage =
|
|
||||||
`data:image/${ext};base64,` + fs.readFileSync(filepath, "base64");
|
|
||||||
if (ext == "png") return sourceImage;
|
|
||||||
} else {
|
|
||||||
sourceImage = utools.getFileIcon(filepath);
|
|
||||||
return sourceImage;
|
|
||||||
}
|
|
||||||
return sourceImage;
|
|
||||||
};
|
|
||||||
|
|
||||||
window.getFileInfo = (options) => {
|
|
||||||
var file;
|
|
||||||
if (options.type == "file") {
|
|
||||||
file = options.argvs;
|
|
||||||
} else if (options.type == "dialog") {
|
|
||||||
var dialog = utools.showOpenDialog(options.argvs);
|
|
||||||
if (!dialog) return false;
|
|
||||||
file = dialog[0];
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
var information = {
|
|
||||||
name: path.basename(file),
|
|
||||||
ext: path.extname(file),
|
|
||||||
path: file,
|
|
||||||
};
|
|
||||||
if (options.readfile) {
|
|
||||||
var codec =
|
|
||||||
information.ext == ".bat" || information == ".ps1" ? "gbk" : "utf8";
|
|
||||||
information.data = iconv.decode(fs.readFileSync(file), codec);
|
|
||||||
}
|
|
||||||
return information;
|
|
||||||
};
|
|
||||||
|
|
||||||
window.getCurrentFolderPathFix = () => {
|
|
||||||
let pwd = utools.getCurrentFolderPath();
|
|
||||||
let pwdFix = pwd ? pwd : path.join(utools.getPath("home"), "desktop");
|
|
||||||
return pwdFix.replace(/\\/g, "\\\\");
|
|
||||||
};
|
|
||||||
|
|
||||||
window.saveFile = (content, file) => {
|
|
||||||
if (file instanceof Object) file = utools.showSaveDialog(file);
|
|
||||||
if (!file) return false;
|
|
||||||
try {
|
|
||||||
fs.writeFileSync(file, content);
|
|
||||||
return true;
|
|
||||||
} catch (error) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
window.getSelectFile = (hwnd) => {
|
|
||||||
if (utools.isWindows()) {
|
|
||||||
var cmd = `powershell.exe -NoProfile "(New-Object -COM 'Shell.Application').Windows() | Where-Object { $_.HWND -eq ${hwnd} } | Select-Object -Expand Document | select @{ n='SelectItems'; e={$_.SelectedItems()} } | select -Expand SelectItems | select -Expand Path "`;
|
|
||||||
let result = child_process.execSync(cmd, {
|
|
||||||
encoding: "buffer",
|
|
||||||
windowsHide: true,
|
|
||||||
});
|
|
||||||
return iconv.decode(result, "GBK").trim().replace(/\\/g, "/");
|
|
||||||
} else {
|
|
||||||
var cmd = `osascript -e 'tell application "Finder" to set selectedItems to selection as alias list
|
|
||||||
if selectedItems is {} then return
|
|
||||||
set parentPath to do shell script "dirname " & quoted form of POSIX path of (item 1 of selectedItems)
|
|
||||||
set pathData to ""
|
|
||||||
repeat with theItem in selectedItems
|
|
||||||
set pathData to pathData & POSIX path of theItem & linefeed
|
|
||||||
end repeat
|
|
||||||
'
|
|
||||||
`;
|
|
||||||
let result = child_process.execSync(cmd, {
|
|
||||||
encoding: "utf8",
|
|
||||||
windowsHide: true,
|
|
||||||
});
|
|
||||||
return result ? result.trim() : "";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let runUbrowser = (path) => {
|
|
||||||
utools.ubrowser
|
|
||||||
.goto(path)
|
|
||||||
.css(
|
|
||||||
`
|
|
||||||
.ant-modal-content,
|
|
||||||
.ant-modal-mask,
|
|
||||||
[class*='index-module_contentWrapper'],
|
|
||||||
[class*='index-module_reward'],
|
|
||||||
[class*='ReaderLayout-module_asideWrapper'],
|
|
||||||
[class*='CornerBubble-module_cornerBubble'],
|
|
||||||
[class*='DocReader-module_comment'],
|
|
||||||
#header,
|
|
||||||
#footer {
|
|
||||||
display: none
|
|
||||||
}`
|
|
||||||
)
|
|
||||||
.run({
|
|
||||||
width: 980,
|
|
||||||
height: 750,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const docsRepoUrl = "https://www.yuque.com/fofolee/qcdocs3";
|
|
||||||
|
|
||||||
window.showUb = {
|
|
||||||
help: function (path = "") {
|
|
||||||
runUbrowser(docsRepoUrl + "/bg31vl" + path);
|
|
||||||
},
|
|
||||||
docs: function (path = "") {
|
|
||||||
runUbrowser(docsRepoUrl + "/pt589p" + path);
|
|
||||||
},
|
|
||||||
changelog: function (path = "") {
|
|
||||||
runUbrowser(docsRepoUrl + "/ucnd2o" + path);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
window.clipboardReadText = () => electron.clipboard.readText();
|
window.clipboardReadText = () => electron.clipboard.readText();
|
||||||
|
|
||||||
window.convertFilePathToUtoolsPayload = (files) =>
|
|
||||||
files.map((file) => {
|
|
||||||
let isFile = fs.statSync(file).isFile();
|
|
||||||
return {
|
|
||||||
isFile: isFile,
|
|
||||||
isDirectory: !isFile,
|
|
||||||
name: path.basename(file),
|
|
||||||
path: file,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
let getSandboxFuns = () => {
|
let getSandboxFuns = () => {
|
||||||
var sandbox = {
|
var sandbox = {
|
||||||
fetch: fetch.bind(window),
|
fetch: fetch.bind(window),
|
||||||
utools: getuToolsLite(),
|
utools: window.getuToolsLite(),
|
||||||
electron,
|
electron,
|
||||||
axios,
|
axios,
|
||||||
Audio,
|
Audio,
|
||||||
@ -787,38 +328,3 @@ window.quickcommandHttpServer = () => {
|
|||||||
stop,
|
stop,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
window.imageProcessor = async (imagePath) => {
|
|
||||||
try {
|
|
||||||
// 读取图片
|
|
||||||
const image = await Jimp.read(imagePath);
|
|
||||||
|
|
||||||
// 获取原始尺寸
|
|
||||||
const originalWidth = image.getWidth();
|
|
||||||
const originalHeight = image.getHeight();
|
|
||||||
const ratio = originalWidth / originalHeight;
|
|
||||||
|
|
||||||
// 设置目标尺寸
|
|
||||||
let targetWidth = 1280;
|
|
||||||
let targetHeight = 720;
|
|
||||||
|
|
||||||
if (ratio > 16 / 9) {
|
|
||||||
targetHeight = Math.min(720, Math.round(targetWidth / ratio));
|
|
||||||
} else {
|
|
||||||
targetWidth = Math.min(1280, Math.round(targetHeight * ratio));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 调整大小并压缩
|
|
||||||
await image
|
|
||||||
.resize(targetWidth, targetHeight, Jimp.RESIZE_BICUBIC)
|
|
||||||
.quality(80);
|
|
||||||
|
|
||||||
// 转换为 base64
|
|
||||||
const base64 = await image.getBase64Async(Jimp.MIME_JPEG);
|
|
||||||
|
|
||||||
return base64;
|
|
||||||
} catch (error) {
|
|
||||||
console.error("处理图片失败:", error);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user