mirror of
https://github.com/rubickCenter/rubick
synced 2025-06-16 16:36:57 +08:00
222 lines
6.7 KiB
JavaScript
222 lines
6.7 KiB
JavaScript
const {ipcRenderer, nativeImage, remote, clipboard} = require('electron')
|
|
const rp = require("request-promise");
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const { spawn } = require ('child_process');
|
|
const mineType = require("mime-types");
|
|
const {extend} = require('../../utils');
|
|
|
|
new Vue({
|
|
el: '#app',
|
|
data: {
|
|
code: '',
|
|
current: {},
|
|
selectData: {
|
|
translate: {},
|
|
optionPlugin: [],
|
|
},
|
|
options: {
|
|
translate: [],
|
|
common: [
|
|
{
|
|
type: 'default',
|
|
name: '终端中打开',
|
|
icon: './assets/terminal.png',
|
|
click: (fileUrl) => {
|
|
spawn('open', [ '-a', 'Terminal', fileUrl ]);
|
|
}
|
|
},
|
|
{
|
|
type: 'default',
|
|
name: '新建文件',
|
|
icon: './assets/new.png',
|
|
click: (fileUrl) => {
|
|
remote.dialog.showSaveDialog({
|
|
title: "请选择要保存的文件名",
|
|
buttonLabel: "保存",
|
|
defaultPath: fileUrl.replace('file://', ''),
|
|
showsTagField: false,
|
|
nameFieldLabel: '',
|
|
}).then(result => {
|
|
fs.writeFileSync(result.filePath, '');
|
|
});
|
|
}
|
|
},
|
|
{
|
|
type: 'default',
|
|
name: '复制当前路径',
|
|
icon: './assets/link.png',
|
|
click: (fileUrl) => {
|
|
clipboard.writeText(fileUrl.replace('file://', ''))
|
|
}
|
|
}
|
|
],
|
|
selected: [
|
|
{
|
|
type: 'default',
|
|
name: '复制当前路径',
|
|
icon: './assets/link.png',
|
|
click: (fileUrl) => {
|
|
clipboard.writeText(fileUrl.replace('file://', ''))
|
|
}
|
|
}
|
|
]
|
|
},
|
|
targetOptions: [],
|
|
loading: false,
|
|
},
|
|
created() {
|
|
// 简单唤起超级面板
|
|
ipcRenderer.on('trigger-super-panel', (e, args) => {
|
|
this.selectData = args;
|
|
const ext = path.extname(this.selectData.fileUrl);
|
|
// 剪切板只有文本时,显示翻译
|
|
if (!this.selectData.fileUrl) {
|
|
this.loading = true;
|
|
const word = this.selectData.text;
|
|
this.translate(word);
|
|
this.targetOptions = JSON.parse(JSON.stringify(this.options.translate));
|
|
(this.selectData.optionPlugin || []).forEach(plugin => {
|
|
plugin.features.forEach(fe => {
|
|
fe.cmds.forEach(cmd => {
|
|
if (cmd.type === 'regex' && eval(cmd.match).test(word)) {
|
|
this.targetOptions.push({
|
|
type: 'ext',
|
|
name: cmd.label,
|
|
icon: plugin.icon,
|
|
click: () => {
|
|
ipcRenderer.send('superPanel-openPlugin', {
|
|
cmd: cmd,
|
|
plugin: plugin,
|
|
feature: fe,
|
|
data: word
|
|
})
|
|
}
|
|
});
|
|
}
|
|
if (cmd.type === 'over') {
|
|
this.targetOptions.push({
|
|
type: 'ext',
|
|
name: cmd.label,
|
|
icon: plugin.icon,
|
|
click: () => {
|
|
ipcRenderer.send('superPanel-openPlugin', {
|
|
cmd: cmd,
|
|
plugin: plugin,
|
|
feature: fe,
|
|
data: word
|
|
})
|
|
}
|
|
});
|
|
}
|
|
})
|
|
});
|
|
});
|
|
} else if (!ext || path.parse(this.selectData.fileUrl).base === 'Desktop') {
|
|
// 如果在桌面上或者没有选择任何文件,则展示通用选项
|
|
this.targetOptions = this.options.common;
|
|
} else {
|
|
// 有文件选择
|
|
this.targetOptions = [];
|
|
extend(this.targetOptions, this.options.selected, true);
|
|
// 检测上传
|
|
(this.selectData.optionPlugin || []).forEach(plugin => {
|
|
plugin.features.forEach(fe => {
|
|
fe.cmds.forEach(cmd => {
|
|
// 如果是图片,则唤起图片选项
|
|
const regImg = /\.(png|jpg|gif|jpeg|webp)$/;
|
|
if (cmd.type === 'img' && regImg.test(ext)) {
|
|
this.targetOptions.push({
|
|
type: 'ext',
|
|
name: cmd.label,
|
|
icon: plugin.icon,
|
|
click: (fileUrl) => {
|
|
const base64 = this.fileToBase64(fileUrl);
|
|
ipcRenderer.send('superPanel-openPlugin', {
|
|
cmd: cmd,
|
|
plugin: plugin,
|
|
feature: fe,
|
|
data: base64,
|
|
});
|
|
}
|
|
})
|
|
}
|
|
// 如果是文件,且符合文件正则类型
|
|
if (cmd.type === 'file' && new RegExp(cmd.match).test(ext)) {
|
|
this.targetOptions.push({
|
|
type: 'ext',
|
|
name: cmd.label,
|
|
icon: '',
|
|
click: () => {
|
|
ipcRenderer.send('superPanel-openPlugin', {
|
|
cmd: cmd,
|
|
plugin: plugin,
|
|
feature: fe,
|
|
data: {
|
|
isFile: true,
|
|
isDirectory: false,
|
|
name: path.basename(this.selectData.fileUrl),
|
|
path: this.selectData.fileUrl
|
|
}
|
|
})
|
|
}
|
|
})
|
|
}
|
|
})
|
|
});
|
|
});
|
|
}
|
|
});
|
|
|
|
},
|
|
|
|
methods: {
|
|
translate(msg) {
|
|
const params = encodeURI(
|
|
`q=${msg}&keyfrom=neverland&key=969918857&type=data&doctype=json&version=1.1`
|
|
);
|
|
const options = {
|
|
uri: `http://fanyi.youdao.com/openapi.do?${params}`,
|
|
};
|
|
return rp(options).then((res) => {
|
|
this.$set(this.selectData, 'translate', {
|
|
...JSON.parse(res),
|
|
src: msg,
|
|
});
|
|
}).catch(() => {
|
|
this.$set(this.selectData, 'translate', null);
|
|
}).finally(() => {
|
|
this.loading = false;
|
|
})
|
|
},
|
|
commonClick(item, fileUrl) {
|
|
ipcRenderer.send('superPanel-hidden')
|
|
item.click(fileUrl);
|
|
},
|
|
|
|
fileToBase64 (filePath) {
|
|
let data = fs.readFileSync(filePath.replace('file://', ''));
|
|
data = new Buffer(data).toString("base64");
|
|
let base64 = "data:" + mineType.lookup(filePath) + ";base64," + data;
|
|
return base64;
|
|
},
|
|
|
|
openMainWindow() {
|
|
ipcRenderer.send('msg-trigger', {
|
|
type: 'showMainWindow',
|
|
});
|
|
}
|
|
},
|
|
|
|
watch: {
|
|
selectData: {
|
|
deep: true,
|
|
handler() {
|
|
this.$nextTick(() => {
|
|
ipcRenderer.send('superPanel-setSize', parseInt(getComputedStyle(document.getElementById('app')).height))
|
|
})
|
|
}
|
|
}
|
|
}
|
|
})
|