EngineersDecor/scripts/sanatize-sync-languages.js

122 lines
4.4 KiB
JavaScript

#!/usr/bin/djs
if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod source directory.");
function load() {
var lang_data = {};
fs.find("./src/main/resources/assets/engineersdecor/lang", '*.lang', function(f){
var lang_code = fs.basename(f).replace(/\..*$/,"").trim().toLowerCase();
var lines = fs.readfile(f).trim().split("\n");
var was_eol_escape = false;
for(var i in lines) {
if(was_eol_escape) {
var k=0;
for(k=i-1; k>=0; --k) {
if(lines[k] != null) {
lines[k] += "\n" + lines[i];
break;
}
}
was_eol_escape = lines[i].match(/[^\\][\\]$/) != null;
lines[i] = null;
} else {
lines[i] = lines[i].trim();
was_eol_escape = lines[i].match(/[^\\][\\]$/) != null;
}
}
lang_data[lang_code] = lines.filter(function(l){return (l!==null);});
return false;
});
return lang_data;
}
function reference_content(lang_data, reflang_code) {
var lang_lines = [];
for(var i in lang_data[reflang_code]) {
var txt = lang_data[reflang_code][i].trim();
if((txt.search(/^#/)>=0) || (txt.search("=")<0)) { lang_lines.push(txt); continue; }; // comment "#" or empty line in the ref lang file
var kv = txt.split("=", 2);
var key = kv[0].trim();
var val = kv[1].trim();
var o = {key:key, tr:{}};
o.tr[reflang_code] = val;
lang_lines.push(o);
}
delete lang_data[reflang_code];
return lang_lines;
}
function add_language(lang_lines, lang_name, lang_data) {
const find_line = function(lines, key) {
for(var i in lines) {
if((typeof(lines[i]) !== "object")) continue;
if(lines[i].key.toLowerCase()==key.toLowerCase()) return i;
}
return -1;
};
for(var i in lang_data) {
var txt = lang_data[i].trim();
if(txt.search(/^#/)>=0) continue;
if(txt.search("=")<0) continue;
var kv = txt.split("=", 2);
var key = kv[0].trim();
var val = kv[1].trim();
var line_i = find_line(lang_lines, key);
if(line_i >= 0) {
lang_data[i] = undefined;
lang_lines[line_i].tr[lang_name] = val;
}
}
return lang_data;
}
function complete_lang_lines(lang_lines, lang_names, reflang_code) {
var lang_outputs = {};
for(var i in lang_names) lang_outputs[lang_names[i]] = [];
for(var i_line in lang_lines) {
var entry = lang_lines[i_line];
if(typeof(entry) !== "object") {
for(var i in lang_names) lang_outputs[lang_names[i]].push(entry);
} else {
for(var i in lang_names) {
var name = lang_names[i];
if(entry.tr[name] !== undefined) {
lang_outputs[name].push(entry.key + "=" + entry.tr[name]);
} else {
var added = entry.key + "=" + entry.tr[reflang_code];
if((entry.key.search(/\.tip$/)>0) || (entry.key.search(/\.help$/)>0)) added = "#" + added;
lang_outputs[name].push(added);
if(added.search(/^#/)<0) print("[warn] Lang: Added default language for missing entry in " + name + ": '" + added + "'");
}
}
}
}
return lang_outputs;
}
const reflang_code = "en_us";
var lang_data = load();
var lang_names = Object.keys(lang_data);
var lang_lines = reference_content(lang_data, reflang_code);
for(var lang_name in lang_data) {
lang_data[lang_name] = add_language(lang_lines, lang_name, lang_data[lang_name]);
lang_data[lang_name] = lang_data[lang_name].filter(function(l){ return !!l; });
if(lang_data[lang_name].length == 0) delete lang_data[lang_name];
}
var output_data = complete_lang_lines(lang_lines, lang_names, reflang_code);
for(var i in output_data) output_data[i] = output_data[i].join("\n") + "\n\n";
// Remaining lines in lang files (not in the reference lang file)
for(var lang_name in lang_data) {
for(var i in lang_data[lang_name]) {
if(lang_data[lang_name][i].search(/^#/)<0) {
var added = "# " + lang_data[lang_name][i].replace(/^[#\s]+/,"");
output_data[lang_name] += added + "\n";
print("[warn] Lang: Commented out unknown key in " + lang_name + ": '" + added + "'");
}
}
}
for(var name in output_data) output_data[name] = output_data[name].trim() + "\n";
for(var name in output_data) {
fs.writefile("./src/main/resources/assets/engineersdecor/lang/" + name + ".lang", output_data[name]);
}