"use strict"; var lua2json = require("lua-json"); var fs = require("fs"); var path = require("path"); var options = process.argv; if (options.length < 4) { console.log("需要2个参数(src out)"); process.exit(); } var srcDir = options[2]; var outDir = options[3]; var lang = {}; var compactMap = { "MonstersConfig": "MonstersConfig_keys", "Monsters2sConfig": "MonstersConfig_keys2", "InstanceConfig": "InstanceConfig_keys", "EffectsConfig": "EffectsConfig_keys", "SkillsConfig": "SkillsConfig_keys", "SkillsExeConfig": "SkillsExeConfig_keys", }; function shouldBeArray(obj) { var cv = Object.values(obj); if (cv.length == 0) { return false; } var cv2 = Object.values(cv[0]); if (cv2.length == 0) { return false; } var innerObj = cv2[0]; if (innerObj == undefined) { return false; } var max = -2; var count = 0; var firstNumber = -999; for (var key in innerObj) { var id = parseInt(key); //console.log(key, id); if (isNaN(id)) { return false; } if (firstNumber == -999) { firstNumber = id; } if (id > max) { max = id; } count++; } //console.log(count, max, count==(firstNumber==0?1+max:max)); return count > 1 && count == (firstNumber == 0 ? 1 + max : max); } function runCompact(obj) { var objName = Object.keys(obj)[0]; if (compactMap.hasOwnProperty(objName)) { var tagId = 0; var objKeysName = compactMap[objName]; var tagMap = {}; var objMap = {}; var oldMap = obj[objName]; for (var key in oldMap) { objMap[key] = []; for (var tagKey in oldMap[key]) { var id = tagId; if (tagMap.hasOwnProperty(tagKey)) { id = tagMap[tagKey]; } else { tagMap[tagKey] = tagId; tagId++; } objMap[key][id] = oldMap[key][tagKey]; } } var newObj = {}; newObj[objKeysName] = tagMap; newObj[objName] = objMap; return newObj; /*/ } else if(shouldBeArray(obj)) { var oldMap = obj[objName]; var objMap = {}; for (var key in oldMap) { objMap[key] = []; for(var id in oldMap[key]) { objMap[key][id - 1] = oldMap[key][id]; } } var newObj = {}; newObj[objName] = objMap; return newObj; //*/ } else { return obj; } } function mkdirs(dirname, callback) { if (fs.existsSync(dirname)) { if (callback != undefined) { callback(); } } else { mkdirs(path.dirname(dirname), function () { fs.mkdirSync(dirname); if (callback != undefined) { callback(); } }); } } function insertStr(soure, start, newStr) { return soure.slice(0, start) + newStr + soure.slice(start); } function encodeQuote(str) { if (str[0] != '"' || str[str.length - 1] != '"') { return str; } var i = 1; var f; while ((f = str.indexOf('"', i)) != -1 && f < str.length - 1) { str = insertStr(str, f, "\\"); //console.log(f, str); i = f + 2; } return str; } var countExport = 0; function handleFile(fileDir) { var content = fs.readFileSync(fileDir, "utf8"); content = content.replace(/(LAN.\w+.\w+)/g, function ($0, $1) { var str = $1; //console.log(str); str = `"${lang[str]}"`; str = encodeQuote(str); //console.log($1, str); return str; }); //return; //console.log(content); //var exportFile1 = 'out_test/' + countExport + '.lua'; //mkdirs(path.dirname(exportFile1)); //fs.writeFileSync(exportFile1, content, 'utf-8'); var obj = lua2json.parse(`return {${content}}`); obj = runCompact(obj); var outStr = JSON.stringify(obj); countExport++; var exportFile = outDir + "/" + countExport + ".json"; console.log(fileDir, "->", exportFile); mkdirs(path.dirname(exportFile)); fs.writeFileSync(exportFile, outStr, "utf-8"); } function handleLanguage(fileDir) { console.log("lang:" + fileDir); var content = fs.readFileSync(fileDir, "utf8"); //console.log(content); var obj = lua2json.parse(`return {${content}}`); //console.log(obj); for (var key in obj) { //console.log(key); for (var key2 in obj[key]) { lang[`LAN.${key}.${key2}`] = obj[key][key2].replace(/\n/g, "\\n"); } } //console.log(Object.keys(lang).length); } function handleDir(filePath, callback, except) { //根据文件路径读取文件,返回文件列表 try { var files = fs.readdirSync(filePath); //遍历读取到的文件列表 files.forEach(function (filename) { if (except != undefined && filename.includes(except)) { return; } //获取当前文件的绝对路径 var filedir = path.join(filePath, filename); //根据文件路径获取文件信息,返回一个fs.Stats对象 var stats = fs.statSync(filedir); var isFile = stats.isFile(); //是文件 var isDir = stats.isDirectory(); //是文件夹 if (isFile) { //console.log(filedir); callback(filedir); } if (isDir) { handleDir(filedir, callback, except); //递归,如果是文件夹,就继续遍历该文件夹下面的文件 } }); } catch (e) { //not found console.warn(`Err occurs: ${e}`); } } function removeDir(p) { if (!fs.existsSync(p)) { return; } let statObj = fs.statSync(p); // fs.statSync同步读取文件状态,判断是文件目录还是文件。 if (statObj.isDirectory()) { //如果是目录 let dirs = fs.readdirSync(p); //fs.readdirSync()同步的读取目标下的文件 返回一个不包括 '.' 和 '..' 的文件名的数组['b','a'] dirs = dirs.map((dir) => path.join(p, dir)); //拼上完整的路径 for (let i = 0; i < dirs.length; i++) { // 深度 先将儿子移除掉 再删除掉自己 removeDir(dirs[i]); } fs.rmdirSync(p); //删除目录 } else { fs.unlinkSync(p); //删除文件 } } removeDir(outDir); var lang_dir = `${srcDir}/language/lang`; if (fs.existsSync(lang_dir)) { console.log("importing language"); handleDir(lang_dir, handleLanguage); console.log("imported language item:", Object.keys(lang).length); } handleDir(srcDir, handleFile, "language");