mirror of
https://github.com/fofolee/uTools-quickcommand.git
synced 2025-06-29 20:32:44 +08:00
291 lines
12 KiB
JavaScript
291 lines
12 KiB
JavaScript
import qcprograms from "./qcprograms.js"
|
|
import init from "./init.js"
|
|
import UTOOLS from "./utools.js"
|
|
import qccommands from "./qccommands.js"
|
|
import qcfeatures from "./qcfeatures.js"
|
|
import qcpanel from "./qcpanel.js"
|
|
import qcparser from "./qcparser.js"
|
|
|
|
! function () {
|
|
// 春节彩蛋
|
|
let showSpringFestivalEgg = () => {
|
|
let eggs = UTOOLS.getDB(UTOOLS.DBPRE.CFG + 'eggs')
|
|
let thisYear = (new Date()).getFullYear()
|
|
if (!eggs.years) eggs.years = []
|
|
if (eggs.years.includes(thisYear)) return
|
|
let egg = window.springFestivalEgg()
|
|
if (!egg.springFestival) return
|
|
utools.showNotification(egg.msg)
|
|
eggs.years.push(thisYear)
|
|
UTOOLS.putDB(eggs, UTOOLS.DBPRE.CFG + 'eggs')
|
|
}
|
|
// 进入插件
|
|
utools.onPluginEnter(async ({ code, type, payload }) => {
|
|
showSpringFestivalEgg()
|
|
// 暗黑模式
|
|
if (utools.isDarkColors()) {
|
|
!$('#darkmode').length && $('head').append(`
|
|
<link id="darkmode" rel="stylesheet" href="assets/style/darkmode.css">
|
|
<link id="darkswal" rel="stylesheet" href="assets/plugins/sweetalert2/dark.min.css">`)
|
|
} else {
|
|
$('#darkmode').length && $('#darkmode, #darkswal').remove()
|
|
}
|
|
if (init.isRunningAtFirstTime()) {
|
|
// init.showChangeLog()
|
|
// init.oldVersionFix()
|
|
qcfeatures.importDefaultCommands()
|
|
}
|
|
var handleEnter
|
|
utools.onPluginOut(() => {
|
|
// 暂存 codeRunner 的内容
|
|
if (code == "code") {
|
|
var cmd = window.editor.getValue();
|
|
var program = $('#program').val(),
|
|
scptarg = $('#scptarg').val(),
|
|
customoptions;
|
|
if (program == 'custom') customoptions = {
|
|
custombin: $('#custombin').val(),
|
|
customarg: $('#customarg').val(),
|
|
customext: $('#customext').val()
|
|
}
|
|
UTOOLS.putDB({ cmd: cmd, program: program, scptarg: scptarg, customoptions: customoptions }, UTOOLS.DBPRE.CFG + 'codeHistory')
|
|
}
|
|
// 初始化
|
|
$("#options, #out, #quickpanel").empty()
|
|
$('body').children(':not(#wrapper)').remove()
|
|
$('body').css({ overflow: 'hidden' })
|
|
if (handleEnter) document.removeEventListener('keydown', handleEnter)
|
|
})
|
|
// 配置页面
|
|
if (code == 'options') {
|
|
utools.setExpendHeight(550);
|
|
$("#quickpanel").hide()
|
|
// $("#options").show();
|
|
qcfeatures.showFeatureList();
|
|
} else if (code == 'code') {
|
|
var file = ""
|
|
// utools.setExpendHeight(550);
|
|
if (type == 'files') file = payload[0].path
|
|
qccommands.showCodeEditor(file)
|
|
} else if (code == 'newcommand') {
|
|
utools.setExpendHeight(550)
|
|
$("#quickpanel").hide()
|
|
$("#options").empty().fadeIn();
|
|
let qc = { "program": "quickcommand", "cmd": "", "output": "ignore" }
|
|
if (payload != 'NewCommand' && payload != '新建快捷命令') {
|
|
let parser = qcparser(payload, false)
|
|
if (parser.single) qc = parser.qc
|
|
}
|
|
qccommands.editCurrentCommand(qc, false)
|
|
} else if (code.slice(0, 6) == 'panel_') {
|
|
utools.setExpendHeight(550)
|
|
qcpanel.showPanel(hexDecode(code.slice(6)))
|
|
} else {
|
|
// console.log(new Date().getTime() - window.startTime);
|
|
$('body').css({ overflow: 'auto' })
|
|
utools.setExpendHeight(0);
|
|
$("#options, #quickpanel").hide();
|
|
var db = UTOOLS.getDB(UTOOLS.DBPRE.QC + code);
|
|
var cmd = db.cmd;
|
|
var option
|
|
if (db.program == "custom") {
|
|
option = db.customOptions;
|
|
} else if (db.program == "quickcommand") {
|
|
option = { mode: "quickcommand", enterData: { code, type, payload } };
|
|
} else {
|
|
option = qcprograms[db.program];
|
|
}
|
|
option.scptarg = db.scptarg
|
|
option.charset = db.charset ? db.charset : qccommands.setCommandCharset(db.program)
|
|
cmd = window.special(cmd);
|
|
if (cmd.includes('{{type}}')) {
|
|
cmd = cmd.replace(/\{\{type\}\}/mg, type)
|
|
}
|
|
if (cmd.includes('{{payload}}')) {
|
|
cmd = cmd.replace(/\{\{payload\}\}/mg, typeof payload == 'object' ? (payload = JSON.stringify(payload)) : (payload = payload.replace('\\', '\\\\')))
|
|
}
|
|
// 正则
|
|
if (type == 'regex') cmd = cmd.replace(/\{\{input\}\}/mg, payload);
|
|
// 文件
|
|
if (type == 'files' && cmd.includes('{{MatchedFiles')) {
|
|
let MatchedFiles = payload
|
|
let Matched = cmd.match(/\{\{MatchedFiles(\[\d+\]){0,1}(\.\w{1,11}){0,1}\}\}/g)
|
|
Matched && Matched.forEach(m => {
|
|
repl = eval(m.slice(2, -2))
|
|
typeof repl == 'object' ? (repl = JSON.stringify(repl)) : (repl = repl.replace('\\', '\\\\'))
|
|
cmd = cmd.replace(m, repl.replace('$', '$$$'))
|
|
})
|
|
}
|
|
// 窗口
|
|
var repl
|
|
if (type == 'window') {
|
|
// 获取选中的文件
|
|
if (cmd.includes('{{SelectFile}}')) {
|
|
repl = await window.getSelectFile(payload.id);
|
|
cmd = cmd.replace(/\{\{SelectFile\}\}/mg, repl)
|
|
}
|
|
// 获取资源管理器或访达当前目录
|
|
if (cmd.includes('{{pwd}}')) {
|
|
repl = window.getCurrentFolderPathFix();
|
|
cmd = cmd.replace(/\{\{pwd\}\}/mg, repl)
|
|
}
|
|
// 获取窗口信息
|
|
if (cmd.includes('{{WindowInfo')) {
|
|
let WindowInfo = payload
|
|
let Matched = cmd.match(/\{\{WindowInfo(\.\w{1,7}){0,1}\}\}/g)
|
|
Matched && Matched.forEach(m => {
|
|
repl = eval(m.slice(2, -2))
|
|
typeof repl == 'object' && (repl = JSON.stringify(repl))
|
|
cmd = cmd.replace(m, repl)
|
|
})
|
|
}
|
|
}
|
|
// 无输出的批处理
|
|
// if (db.output == 'ignore' && option.ext == 'bat') option.bin = 'explorer';
|
|
if (db.hasSubInput) {
|
|
// 启动子命令输入
|
|
// 清空输出
|
|
// $("#out").empty();
|
|
var rule = String.raw`\{\{subinput(:.+?){0,1}\}\}`
|
|
var matched = cmd.match(new RegExp(rule))
|
|
var placeholder = matched[1] || ':请输入'
|
|
var subinput = '';
|
|
var setSubInput = () => {
|
|
utools.setSubInput(({ text }) => {
|
|
subinput = text;
|
|
}, placeholder.slice(1));
|
|
}
|
|
var querySubInput = () => {
|
|
$("#out").append(`<p style="color: #438eff">>> ${new Date()}</p>`);
|
|
var cmdToRun = cmd.replace(new RegExp(rule, 'g'), subinput);
|
|
runQuickCommand(cmdToRun, option, db.output, true);
|
|
}
|
|
// 自动粘贴的情况下自动执行
|
|
setTimeout(() => {
|
|
if (subinput) querySubInput()
|
|
}, 100)
|
|
handleEnter = event => {
|
|
if (event.keyCode == 13) querySubInput()
|
|
};
|
|
setSubInput();
|
|
document.addEventListener('keydown', handleEnter);
|
|
} else {
|
|
runQuickCommand(cmd, option, db.output, false);
|
|
}
|
|
}
|
|
});
|
|
|
|
let runQuickCommand = (cmd, option, output, autoScroll = false, autoHeight = true) => {
|
|
// 不需要输出的,提前关闭窗口
|
|
if (['ignore', 'clip', 'send', 'notice', 'terminal'].indexOf(output) !== -1) {
|
|
utools.hideMainWindow();
|
|
setTimeout(() => { utools.outPlugin(); }, 500);
|
|
}
|
|
var outputOpts = { type: output, autoScroll: autoScroll, autoHeight: autoHeight }
|
|
if (option.mode) {
|
|
// 内置环境
|
|
window.runCodeInVm(cmd, (stdout, stderr) => {
|
|
if (cmd.includes("utools.setExpendHeight")) outputOpts.autoHeight = false
|
|
switchQuickCommandResult(stdout, stderr, outputOpts)
|
|
}, option.enterData)
|
|
} else {
|
|
var terminal = output == 'terminal' ? true : false
|
|
outputOpts.scriptPath = window.getQuickcommandTempFile(option.ext)
|
|
// 执行脚本
|
|
window.runCodeFile(cmd, option, terminal, (stdout, stderr) => {
|
|
switchQuickCommandResult(stdout, stderr, outputOpts)
|
|
})
|
|
}
|
|
}
|
|
|
|
let switchQuickCommandResult = (stdout, stderr, outputOpts) => {
|
|
var output = outputOpts.type,
|
|
autoScroll = outputOpts.autoScroll,
|
|
autoHeight = outputOpts.autoHeight;
|
|
var outputAutoFix = (autoScroll, autoHeight) => {
|
|
var outputHeight = $("#out").outerHeight()
|
|
if (outputHeight > 600) outputHeight = 600
|
|
if (autoHeight && $('#options').is(':hidden')) utools.setExpendHeight(outputHeight);
|
|
if (outputHeight == 600 && autoScroll) $(document).scrollTop($(document).height());
|
|
}
|
|
if (stderr) {
|
|
$("#out").addClass('error')
|
|
// 报错
|
|
if (output == 'text' || output == 'html') {
|
|
$("#out").append(stderr)
|
|
outputAutoFix(autoScroll, autoHeight)
|
|
} else {
|
|
var index = utools.showMessageBox({
|
|
type: 'error',
|
|
title: '啊嘞?!',
|
|
message: stderr,
|
|
buttons: outputOpts.scriptPath ? ['转至脚本目录', '退出'] : ['退出']
|
|
})
|
|
if (outputOpts.scriptPath && index == 0) {
|
|
window.locate(outputOpts.scriptPath);
|
|
}
|
|
window.copyTo(stderr);
|
|
window.message("已复制报错信息");
|
|
utools.outPlugin();
|
|
}
|
|
} else if (stdout) {
|
|
$("#out").removeClass("error")
|
|
// 有输出
|
|
switch (output) {
|
|
case "text":
|
|
$("#out").append(window.htmlEncode(stdout, true))
|
|
outputAutoFix(autoScroll, autoHeight)
|
|
break;
|
|
case "html":
|
|
$("#out").append(stdout)
|
|
outputAutoFix(autoScroll, autoHeight)
|
|
break;
|
|
case "clip":
|
|
window.copyTo(stdout)
|
|
break;
|
|
case "send":
|
|
window.send(stdout)
|
|
break;
|
|
case "notice":
|
|
// 发送系统通知
|
|
window.message(stdout)
|
|
break;
|
|
case "ignore":
|
|
case "nothing":
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
// } else {
|
|
// // 无输出
|
|
// utools.outPlugin()
|
|
}
|
|
}
|
|
|
|
// 输出搜索
|
|
let showSearchBox = () => {
|
|
if ($('#options').is(':hidden') && $('#out').is(":parent")) {
|
|
$('#out').append(`<div id="outputSearch"><input autofocus="autofocus"><kbd id="find-next">↓</kbd><kbd id="find-prev">↑</kbd><kbd id="find-close">✕</kbd></div>`)
|
|
$('#outputSearch').animate({ opacity: 1, top: '10px', })
|
|
document.getElementById('find-next').onclick = () => {
|
|
utools.findInPage($('#outputSearch > input').val())
|
|
}
|
|
document.getElementById('find-prev').onclick = () => {
|
|
utools.findInPage($('#outputSearch > input').val(), { forward: false })
|
|
}
|
|
document.getElementById('find-close').onclick = () => {
|
|
utools.stopFindInPage()
|
|
$('#outputSearch').animate({ opacity: 0, top: '-30px', }, () => {
|
|
$('#outputSearch').remove()
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
Mousetrap.bind('ctrl+f', () => {
|
|
showSearchBox()
|
|
return false
|
|
});
|
|
|
|
}()
|