ldjtool
Version:
**ludingji tool**
194 lines (178 loc) • 6.4 kB
JavaScript
var xlsx = require("node-xlsx");
var path = require("path");
var fs = require("fs");
var util = require("./util");
var outJson = {}; //记录合并导出json obj
var sheetHeads = 3; //表头所占据的行数
var outFileName = "tpl.json"; //合并导出的文件名
var sheetTags = {
client: "CLIENT",
server: "SERVER",
double: "DOUBLE",
no: "NO"
};
var nameIgnore = "NO";
var nameTags = {
client: ".C",
server: ".S",
}
var cfg; //read config
var inDir;
var outDir;
//-------------enter---------------------------------
function main(usrCfg, cmds) {
cfg = usrCfg;
inDir = cfg.excelInDir;
outDir = cfg.excelOutDir;
if (cmds && cmds.length) {
if (cmds.length)
inDir = cmds.shift();
if (cmds.length)
outDir = cmds.shift();
} else {
//默认读取与客户端分支对应名称的配表目录
process.chdir(cfg.clientDir);
var clientBr = require("child_process").execSync('git branch', { encoding: "utf-8" });
clientBr = clientBr.match(/\*\s\w+/)[0].replace(/\*\s+/g, '');
inDir = inDir.replace(/branches\/\w+/, "branches/" + clientBr);
console.log("尝试使用配表目录>>>" + inDir + "生成配置")
}
try {
process.chdir(inDir);
} catch (e) {
console.warn("警告:未找到与当前客户端分支" + clientBr + "对应的配表目录>>>" + inDir);
console.warn("将使用默认的目录" + cfg.excelInDir + "的配表");
inDir = cfg.excelInDir;
process.chdir(inDir);
}
fs.readdir(inDir, listFiles);
}
function listFiles(err, files) {
if (err) {
util.err(err);
}
//如果未配置输出目录,则输出到当前位置的output文件夹下
if (!outDir) {
outDir = path.resolve("./output");
}
//如果导出目录不存在,则创建
util.mkdirs(outDir, function() {
for (var i in files) {
parseFile(files[i]);
}
//写入文件
var outStr = JSON.stringify(outJson); //导出json
var outFile = path.resolve(outDir, outFileName);
fs.appendFile(outFile, outStr, { flag: "w" }, function(err) {
if (err) {
error(err);
}
});
});
}
function parseFile(fl) {
var extName = path.extname(fl);
var flPath = path.resolve(inDir, fl);
if (/^[a-zA-Z]+/.test(fl) == false) {
return;
}
if (extName == ".xlsx") {
var sheets = xlsx.parse(flPath);
//先筛选出有效的工作表
var validSheets = {};
for (var i = 0; i < sheets.length; i++) {
var sht = sheets[i];
if (/Sheet[0-9]+/.test(sht.name)) {
continue;
}
if (sht.data.length < 2) {
continue;
}
if (validSheets[sht.name]) {
util.err(fl + "中出现了已存在过的导出表名>>" + sht.name);
} else {
validSheets[sht.name] = sht.data;
mergeToJson(sht.data, sht.name, flPath);
}
}
} else if (fl == "SceneTemplate.xml") {
//将地编生成的配置文件,也并到tpl.json里
var xml = require("pixl-xml");
var data = xml.parse(flPath);
var scene = {};
for (var node in data) {
if (data[node].constructor == Array) {
var list = data[node];
for (var i = 0; i < list.length; i++) {
var sceneCfg = list[i];
var obj = {};
for (var key in sceneCfg) {
var oKey = key.toLowerCase();
var oVal = sceneCfg[key];
if (oKey == "sceneid") {
oKey = "id";
} else if (oKey == "maskdata") {
oKey = "mask";
} else if (oKey == "image") {
oKey = "img";
oVal = oVal.split(".")[0];
} else if (oKey == "width" || oKey == "height") {
oVal = parseInt(oVal);
}
obj[oKey] = oVal;
}
scene[obj.id] = obj;
}
outJson.scene = scene;
}
}
}
}
function mergeToJson(sht, name, fl) {
//sht==其中一个工作表的内容
//检测该表是否有内容
if (sht.length <= sheetHeads) {
return;
}
var shtFlag = sht[0][0]
if (!shtFlag || (shtFlag != sheetTags.client && shtFlag != sheetTags.double)) {
return; //目前只处理客户端表
}
//先读掉前几行配置、类型、注释等
outJson[name] = {};
var shtHeads = sht.slice(0, sheetHeads); //表头
data = sht.slice(sheetHeads); //数据
var colFlags = shtHeads[0]; //字段导出标识
var colComments = shtHeads[1]; //中文字段名
var colNames = shtHeads[2]; //字段名
//确定有效数据的起始列索引
var colStart = 0;
while (!colNames[colStart] || (colFlags[colStart] == nameIgnore || colFlags[colStart].indexOf(nameTags.server) != -1) && colStart < 9) {
colStart++;
}
//每行数据生成一个包装单元
for (var i in data) {
var cell = {};
var line = data[i];
for (var k = colStart; k < colNames.length; k++) {
var clName = colNames[k];
var clFlag = colFlags[k];
//字段过滤
if (clName && clFlag && clFlag != nameIgnore && clFlag.indexOf(nameTags.server) == -1) {
var clData = line[k];
cell[clName] = parseType(clFlag, clData);
}
}
if (line[colStart]) {
outJson[name][line[colStart]] = cell;
}
}
}
function parseType(type, data) {
if (type.indexOf("STRING") != -1) {
return data ? (data + "").replace(/&n/g, "\n") : "";
} else if (type.indexOf("INT") != -1 || type.indexOf("NUMBER") != -1) {
return parseInt(data);
}
}
module.exports = main;