mirror of
https://github.com/rubickCenter/rubick
synced 2025-06-08 11:34:10 +08:00
121 lines
3.6 KiB
TypeScript
121 lines
3.6 KiB
TypeScript
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
// @ts-ignore
|
|
import getMacApps from './get-mac-app';
|
|
import fs from 'fs';
|
|
import path from 'path';
|
|
|
|
import os from 'os';
|
|
|
|
const icondir = path.join(os.tmpdir(), 'ProcessIcon');
|
|
|
|
const exists = fs.existsSync(icondir);
|
|
if (!exists) {
|
|
fs.mkdirSync(icondir);
|
|
}
|
|
|
|
const isZhRegex = /[\u4e00-\u9fa5]/;
|
|
|
|
async function getAppIcon(appPath: string, nativeImage: any, name: string) {
|
|
try {
|
|
const iconpath = path.join(icondir, `${name}.png`);
|
|
const iconnone = path.join(icondir, `${name}.none`);
|
|
const exists = fs.existsSync(iconpath);
|
|
const existsnone = fs.existsSync(iconnone);
|
|
if (exists) return true;
|
|
if (existsnone) return false;
|
|
// const appName: string = appPath.split('/').pop() || '';
|
|
// const extname: string = path.extname(appName);
|
|
// const appSubStr: string = appName.split(extname)[0];
|
|
// const path1 = path.join(appPath, `/Contents/Resources/App.icns`);
|
|
// const path2 = path.join(appPath, `/Contents/Resources/AppIcon.icns`);
|
|
// const path3 = path.join(appPath, `/Contents/Resources/${appSubStr}.icns`);
|
|
// const path4 = path.join(
|
|
// appPath,
|
|
// `/Contents/Resources/${appSubStr.replace(' ', '')}.icns`
|
|
// );
|
|
// let iconPath: string = path1;
|
|
// if (fs.existsSync(path1)) {
|
|
// iconPath = path1;
|
|
// } else if (fs.existsSync(path2)) {
|
|
// iconPath = path2;
|
|
// } else if (fs.existsSync(path3)) {
|
|
// iconPath = path3;
|
|
// } else if (fs.existsSync(path4)) {
|
|
// iconPath = path4;
|
|
// } else {
|
|
// // 性能最低的方式
|
|
// const resourceList = fs.readdirSync(
|
|
// path.join(appPath, `/Contents/Resources`)
|
|
// );
|
|
// const iconName = resourceList.filter(
|
|
// (file) => path.extname(file) === '.icns'
|
|
// )[0];
|
|
// if (!iconName) {
|
|
// fs.writeFileSync(iconnone, '');
|
|
// return false;
|
|
// }
|
|
// iconPath = path.join(appPath, `/Contents/Resources/${iconName}`);
|
|
// }
|
|
await getMacApps.app2png(appPath, iconpath);
|
|
return true;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export default async (nativeImage: any) => {
|
|
let apps: any = await getMacApps.getApps();
|
|
|
|
apps = apps.filter((app: any) => {
|
|
const extname = path.extname(app.path);
|
|
return extname === '.app' || extname === '.prefPane';
|
|
});
|
|
for (const app of apps) {
|
|
if (await getAppIcon(app.path, nativeImage, app._name)) {
|
|
app.icon =
|
|
'image://' +
|
|
path.join(
|
|
os.tmpdir(),
|
|
'ProcessIcon',
|
|
`${encodeURIComponent(app._name)}.png`
|
|
);
|
|
}
|
|
// todo getApp size
|
|
}
|
|
apps = apps.filter((app: any) => !!app.icon);
|
|
|
|
apps = apps.map((app: any) => {
|
|
const appName: any = app.path.split('/').pop();
|
|
const extname = path.extname(appName);
|
|
const appSubStr = appName.split(extname)[0];
|
|
let fileOptions = {
|
|
...app,
|
|
value: 'plugin',
|
|
desc: app.path,
|
|
pluginType: 'app',
|
|
action: `open ${app.path.replace(/ /g, '\\ ') as string}`,
|
|
keyWords: [appSubStr],
|
|
};
|
|
|
|
if (app._name && isZhRegex.test(app._name)) {
|
|
// const [, pinyinArr] = translate(app._name);
|
|
// const firstLatter = pinyinArr.map((py) => py[0]);
|
|
// // 拼音
|
|
// fileOptions.keyWords.push(pinyinArr.join(''));
|
|
// // 缩写
|
|
// fileOptions.keyWords.push(firstLatter.join(''));
|
|
// 中文
|
|
fileOptions.keyWords.push(app._name);
|
|
}
|
|
|
|
fileOptions = {
|
|
...fileOptions,
|
|
name: app._name,
|
|
names: JSON.parse(JSON.stringify(fileOptions.keyWords)),
|
|
};
|
|
return fileOptions;
|
|
});
|
|
|
|
return apps;
|
|
};
|