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(` `) } 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(`
>> ${new Date()}
`); 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(`