132 lines
3.6 KiB
JavaScript
132 lines
3.6 KiB
JavaScript
|
const fs = require("fs");
|
|||
|
const path = require("path");
|
|||
|
const AdmZip = require("adm-zip"); // 用于解压和打包 .jar 文件
|
|||
|
const { execSync } = require("child_process");
|
|||
|
|
|||
|
// 读取文件并解析为 JSON
|
|||
|
function readJson(filePath) {
|
|||
|
try {
|
|||
|
const content = fs.readFileSync(filePath, "utf8");
|
|||
|
return JSON.parse(content);
|
|||
|
} catch (err) {
|
|||
|
console.error(`无法读取或解析文件: ${filePath}`);
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 获取 .jar 文件列表
|
|||
|
function getJarFiles(dirPath) {
|
|||
|
const files = fs.readdirSync(dirPath);
|
|||
|
return files.filter((file) => file.endsWith(".jar"));
|
|||
|
}
|
|||
|
|
|||
|
// 复制文件
|
|||
|
function copyFile(source, destination) {
|
|||
|
try {
|
|||
|
fs.copyFileSync(source, destination);
|
|||
|
} catch (err) {
|
|||
|
console.error(`复制文件失败: ${source} 到 ${destination}`);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 将 zh_cn.json 文件添加到 jar 包
|
|||
|
/*function addToJar(jarPath, modId, zhJsonPath) {
|
|||
|
const zip = new AdmZip(jarPath);
|
|||
|
|
|||
|
// 读取 zh_cn.json 文件内容
|
|||
|
const zhJson = readJson(zhJsonPath);
|
|||
|
if (!zhJson) return;
|
|||
|
|
|||
|
// 将 zh_cn.json 写入到 zip 包的指定位置
|
|||
|
const entryPath = `assets/${modId}/lang/zh_cn.json`;
|
|||
|
zip.addFile(
|
|||
|
entryPath,
|
|||
|
Buffer.from(JSON.stringify(zhJson, null, 2), "utf8")
|
|||
|
);
|
|||
|
|
|||
|
// 保存新的 .jar 文件
|
|||
|
const newJarPath = path.join(
|
|||
|
"./mods_translated",
|
|||
|
`[Translated]${path.basename(jarPath)}`
|
|||
|
);
|
|||
|
zip.writeZip(newJarPath);
|
|||
|
|
|||
|
console.log(`${jarPath} 已重新打包到 ${newJarPath}`);
|
|||
|
}*/
|
|||
|
|
|||
|
// 将 zh_cn.json 文件添加到 jar 包
|
|||
|
function addToJar(jarPath, modId, zhJsonPath) {
|
|||
|
// 新的 .jar 文件路径
|
|||
|
const translatedJarPath = path.join(
|
|||
|
"./mods_translated",
|
|||
|
`[Translated]${path.basename(jarPath)}`
|
|||
|
);
|
|||
|
|
|||
|
// 复制原始 jar 文件到 mods_translated 目录
|
|||
|
copyFile(jarPath, translatedJarPath);
|
|||
|
|
|||
|
// 使用 jar 命令行工具将 zh_cn.json 添加到 jar 包内
|
|||
|
const assetsPath = `assets/${modId}/lang/zh_cn.json`;
|
|||
|
|
|||
|
// 生成的命令:jar -cf <新文件路径> <要添加的文件路径> <原始 jar 文件路径>
|
|||
|
try {
|
|||
|
if (fs.existsSync(path.join(__dirname, "assets"))) {
|
|||
|
fs.rmSync(path.join(__dirname, "assets"), { recursive: true, force: true });
|
|||
|
}
|
|||
|
fs.mkdirSync(path.join(__dirname, path.dirname(assetsPath)), { recursive: true });
|
|||
|
copyFile(zhJsonPath, assetsPath);
|
|||
|
execSync(
|
|||
|
`jar -uf "${translatedJarPath}" assets`
|
|||
|
);
|
|||
|
console.log(
|
|||
|
`${jarPath} 已重新打包到 ${translatedJarPath},并添加了 ${assetsPath}`
|
|||
|
);
|
|||
|
} catch (err) {
|
|||
|
console.error(`打包失败: ${err.message}`);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function removeJsonLineBreak(str) {
|
|||
|
const regex = /"([^"]*)"/g;
|
|||
|
return str.replace(regex, (match, p1) => {
|
|||
|
return `"${p1.replace(/[\r\n]+/g, "")}"`;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// 处理 mods 目录下的 .jar 文件
|
|||
|
function processMods() {
|
|||
|
const modsDir = "./mods";
|
|||
|
const translatedDir = "./mods_translated";
|
|||
|
if (!fs.existsSync(translatedDir)) {
|
|||
|
fs.mkdirSync(translatedDir, { recursive: true });
|
|||
|
}
|
|||
|
|
|||
|
const jarFiles = getJarFiles(modsDir);
|
|||
|
|
|||
|
jarFiles.forEach((jarFile) => {
|
|||
|
const jarPath = path.join(modsDir, jarFile);
|
|||
|
console.log(`正在读取 ${jarPath}`);
|
|||
|
|
|||
|
// 解压 jar 包并读取 fabric.mod.json 文件
|
|||
|
const zip = new AdmZip(jarPath);
|
|||
|
const modJsonEntry = zip.getEntry("fabric.mod.json");
|
|||
|
if (!modJsonEntry) {
|
|||
|
console.log(`未找到 fabric.mod.json: ${jarPath}`);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
const modJsonContent = zip.readAsText(modJsonEntry);
|
|||
|
const modJson = JSON.parse(removeJsonLineBreak(modJsonContent));
|
|||
|
const modId = modJson.id;
|
|||
|
|
|||
|
// 检查是否存在 zh_cn.json 文件
|
|||
|
const zhJsonPath = path.join("./lang/zh_cn", `${modId}.json`);
|
|||
|
if (fs.existsSync(zhJsonPath)) {
|
|||
|
// 将 zh_cn.json 文件打包进新的 jar 文件
|
|||
|
addToJar(jarPath, modId, zhJsonPath);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
processMods();
|