uTools-quickcommand/src/js/commandManager.js
2025-02-13 18:00:40 +08:00

259 lines
7.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { reactive } from "vue";
import quickcommandParser from "js/common/quickcommandParser.js";
import importAll from "js/common/importAll.js";
import { utoolsFull, dbManager } from "js/utools.js";
import { getUniqueId } from "js/common/uuid.js";
import outputTypes from "js/options/outputTypes.js";
// 默认命令
const defaultCommands = importAll(
require.context("../json/", false, /\.json$/)
);
// 响应式状态
const state = reactive({
allQuickCommands: {},
allQuickCommandTags: [],
activatedQuickCommandFeatureCodes: [],
activatedQuickPanels: [],
});
const getCmdType = (cmds) => {
const firstCmdType = cmds[0].type || "key";
if (!cmds.find((x) => typeof x !== "string")) return "key";
if (!cmds.find((x) => x.type !== firstCmdType)) return firstCmdType;
return "professional";
};
const getFeatureCode = (cmds) => {
return `${getCmdType(cmds)}_${getUniqueId({ short: true })}`;
};
const getLabeledCmds = (cmds, explain) => {
if (cmds.length === 0) return [explain];
return cmds.map((cmd) => {
if (typeof cmd === "string") {
return cmd || explain;
}
return {
...cmd,
label: cmd.label || explain,
};
});
};
export const getValidCommand = (command) => {
const { cmds, explain } = command.features;
if (!explain) throw "名称不能为空";
if (!Array.isArray(cmds)) throw "匹配规则格式错误";
// 未配置label或关键字时直接使用名称
command.features.cmds = getLabeledCmds(cmds, explain);
// 不需要显示输入框的输入类型添加mainHide属性
if (outputTypes[command.output].outPlugin) {
command.features.mainHide = true;
}
// 生成唯一code
if (!command.features.code) {
command.features.code = getFeatureCode(cmds);
}
return window.lodashM.cloneDeep(command);
};
// 使用函数工厂模式,确保每个组件获取自己的状态副本
export function useCommandManager() {
// 获取已启用的命令
const getActivatedFeatures = () => {
let features = utoolsFull.getFeatures();
let currentFts = [];
let quickpanels = [];
features.forEach((x) =>
x.code.slice(0, 6) == "panel_"
? quickpanels.push(window.hexDecode(x.code.slice(6)))
: currentFts.push(x)
);
state.activatedQuickCommandFeatureCodes = currentFts.map((f) => f.code);
state.activatedQuickPanels = quickpanels;
};
// 清除所有命令
const clearAllFeatures = () => {
for (var feature of utoolsFull.getFeatures()) {
if (feature.code.slice(0, 8) === "feature_") continue;
utoolsFull.removeFeature(feature.code);
}
state.activatedQuickCommandFeatureCodes = [];
};
// 获取所有的命令
const getAllQuickCommands = () => {
state.allQuickCommands = window.lodashM.cloneDeep(defaultCommands);
dbManager.getAll("qc_").forEach((x) => {
if (x.data.features.code.includes("default_")) return;
state.allQuickCommands[x.data.features.code] = x.data;
});
getAllQuickCommandTags();
};
// 获取所有标签
const getAllQuickCommandTags = () => {
state.allQuickCommandTags = window.lodashM
.union(...Object.values(state.allQuickCommands).map((x) => x.tags))
.concat(["未分类"])
.filter((x) => x);
};
// 保存命令
const saveCommand = (command) => {
try {
command = getValidCommand(command);
} catch (e) {
return quickcommand.showMessageBox(e.toString(), "error");
}
const code = command.features.code;
state.allQuickCommands[code] = command;
if (!state.activatedQuickCommandFeatureCodes.includes(code)) {
state.activatedQuickCommandFeatureCodes.push(code);
}
utoolsFull.removeFeature(code);
utoolsFull.setFeature(command.features);
if (!isDefaultCommand(code)) {
dbManager.putDB(command, "qc_" + code);
}
getAllQuickCommandTags();
return code;
};
// 删除命令
const removeCommand = (code) => {
utoolsFull.copyText(JSON.stringify(state.allQuickCommands[code], null, 4));
delete state.allQuickCommands[code];
dbManager.delDB("qc_" + code);
removeCommandFromHistory(code);
disableCommand(code);
getAllQuickCommandTags();
quickcommand.showMessageBox(
"删除成功,为防止误操作,已将删除的命令复制到剪贴板",
"success",
1000,
"bottom-right"
);
};
// 从历史记录中删除命令
const removeCommandFromHistory = (code) => {
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
if (key.startsWith("editor_history_" + code)) {
localStorage.removeItem(key);
}
}
};
// 启用命令
const enableCommand = (code) => {
utoolsFull.setFeature(
window.lodashM.cloneDeep(state.allQuickCommands[code].features)
);
state.activatedQuickCommandFeatureCodes.push(code);
};
// 禁用命令
const disableCommand = (code) => {
utoolsFull.removeFeature(code);
state.activatedQuickCommandFeatureCodes =
state.activatedQuickCommandFeatureCodes.filter((x) => x !== code);
};
// 导入命令
const importCommand = async (quickCommandInfo) => {
if (!quickCommandInfo) {
quickcommand.showMessageBox("导入未完成!", "warning");
return false;
}
let parsedData = await quickcommandParser(quickCommandInfo);
if (!parsedData) {
quickcommand.showMessageBox("格式错误", "error");
return false;
}
let dataToPushed = {};
if (parsedData.single) {
if (isDefaultCommand(parsedData.qc.features.code)) {
quickcommand.showMessageBox("默认命令不能导入!", "error");
return false;
}
dataToPushed[parsedData.qc.features.code] = parsedData.qc;
} else {
dataToPushed = parsedData.qc;
}
for (var code of Object.keys(dataToPushed)) {
if (isDefaultCommand(code)) continue;
dbManager.putDB(dataToPushed[code], "qc_" + code);
}
Object.assign(state.allQuickCommands, dataToPushed);
getAllQuickCommandTags();
quickcommand.showMessageBox("导入成功!");
return parsedData.qc;
};
// 是否为默认命令
const isDefaultCommand = (code) => {
return code.slice(0, 8) === "default_";
};
// 导出所有命令
const exportAllCommands = (saveAsFile = true) => {
let options = {
title: "选择保存位置",
defaultPath: "quickCommand",
filters: [{ name: "json", extensions: ["json"] }],
};
let commandsToExport = window.lodashM.cloneDeep(state.allQuickCommands);
Object.keys(commandsToExport).forEach((code) => {
if (isDefaultCommand(code)) delete commandsToExport[code];
});
let stringifyCommands = JSON.stringify(commandsToExport);
if (saveAsFile) {
return window.saveFile(stringifyCommands, options);
} else {
utoolsFull.copyText(stringifyCommands);
return true;
}
};
// 清空所有命令
const clearAllCommands = () => {
exportAllCommands(false);
dbManager.delAll("qc_");
clearAllFeatures();
getAllQuickCommands();
};
return {
state,
getAllQuickCommands,
getAllQuickCommandTags,
saveCommand,
removeCommand,
enableCommand,
disableCommand,
importCommand,
isDefaultCommand,
exportAllCommands,
getActivatedFeatures,
clearAllFeatures,
clearAllCommands,
};
}