93 lines
2.9 KiB
JavaScript
93 lines
2.9 KiB
JavaScript
import color from "picocolors";
|
||
import boxen from "boxen";
|
||
import figlet from "figlet";
|
||
import { gridSelect } from "./grid.js";
|
||
import * as convertTool from "./convert/index.js";
|
||
import * as ktx2Tool from "./ktx2/index.js";
|
||
import * as gltfTool from "./gltf/index.js";
|
||
import * as modelTool from "./model/index.js";
|
||
import * as imageTool from "./image/index.js";
|
||
import * as spriteTool from "./sprite/index.js";
|
||
import * as lodTool from "./lod/index.js";
|
||
import * as audioTool from "./audio/index.js";
|
||
import * as scaffoldTool from "./scaffold/index.js";
|
||
|
||
let poemConfig = {
|
||
lines: ["你我皆牛马", "生在人世间", "终日奔波苦", "一刻不得闲"],
|
||
perLine: 2,
|
||
padding: { top: 2, bottom: 2, left: 6, right: 6 },
|
||
borderStyle: "double",
|
||
borderColor: "cyan",
|
||
};
|
||
|
||
let titleConfig = {
|
||
text: "Zguiy Tool Box",
|
||
font: "Standard",
|
||
color: "magenta",
|
||
};
|
||
|
||
const tools = [
|
||
{ name: "格式转换", desc: "支持多种模型格式转换", tool: convertTool },
|
||
{ name: "KTX2 纹理压缩", desc: "图片转KTX2格式", tool: ktx2Tool },
|
||
{ name: "glTF扩展", desc: "添加KHR_texture_basisu", tool: gltfTool },
|
||
{ name: "模型压缩", desc: "压缩glTF/GLB模型", tool: modelTool },
|
||
{ name: "图片批量处理", desc: "裁剪/缩放/转换", tool: imageTool },
|
||
{ name: "Sprite图集", desc: "合并精灵图集", tool: spriteTool },
|
||
{ name: "LOD生成器", desc: "生成多级细节", tool: lodTool },
|
||
{ name: "音频压缩", desc: "压缩音频文件", tool: audioTool },
|
||
{ name: "项目脚手架", desc: "快速创建项目模板", tool: scaffoldTool },
|
||
];
|
||
|
||
export function setPoem(lines, perLine = 2) {
|
||
poemConfig.lines = lines;
|
||
poemConfig.perLine = perLine;
|
||
}
|
||
|
||
export function setPoemStyle(style) {
|
||
Object.assign(poemConfig, style);
|
||
}
|
||
|
||
export function setTitle(text, font = "Standard", titleColor = "magenta") {
|
||
titleConfig.text = text;
|
||
titleConfig.font = font;
|
||
titleConfig.color = titleColor;
|
||
}
|
||
|
||
function renderPoem() {
|
||
const merged = [];
|
||
for (let i = 0; i < poemConfig.lines.length; i += poemConfig.perLine) {
|
||
merged.push(poemConfig.lines.slice(i, i + poemConfig.perLine).join(","));
|
||
}
|
||
return boxen(color.yellow(merged.join("\n")), {
|
||
padding: poemConfig.padding,
|
||
borderStyle: poemConfig.borderStyle,
|
||
borderColor: poemConfig.borderColor,
|
||
textAlignment: "center",
|
||
float: "center",
|
||
});
|
||
}
|
||
|
||
function renderTitle() {
|
||
const art = figlet.textSync(titleConfig.text, { font: titleConfig.font });
|
||
const termWidth = process.stdout.columns || 80;
|
||
return art.split("\n").map(line => {
|
||
const pad = Math.max(0, Math.floor((termWidth - line.length) / 2));
|
||
return " ".repeat(pad) + color[titleConfig.color](line);
|
||
}).join("\n");
|
||
}
|
||
|
||
function renderHeader() {
|
||
return renderPoem() + "\n\n" + renderTitle();
|
||
}
|
||
|
||
export async function showMainMenu() {
|
||
return gridSelect({
|
||
items: tools,
|
||
cols: 3,
|
||
colWidth: 24,
|
||
renderHeader: renderHeader,
|
||
});
|
||
}
|
||
|
||
export { tools, poemConfig, titleConfig };
|