patchwork-mapconverter
Version:
Executable wrapper for https://github.com/ChiefOfGxBxL/WC3MapTranslator
202 lines • 20.1 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
const LoggerFactory_1 = require("../logging/LoggerFactory");
const directory_tree_1 = __importDefault(require("directory-tree"));
const TranslatorRecord_1 = require("./TranslatorRecord");
const FileCopier_1 = require("./FileCopier");
const promises_1 = require("fs/promises");
const EnhancementManager_1 = __importDefault(require("../enhancements/EnhancementManager"));
const ImportComposer_1 = __importDefault(require("../enhancements/ImportComposer"));
const TriggerTranslator_1 = require("../translator/TriggerTranslator");
const CustomScriptsTranslator_1 = require("../translator/CustomScriptsTranslator");
const TriggerContent_1 = require("../translator/data/content/TriggerContent");
const WriteAndCreatePath_1 = require("../util/WriteAndCreatePath");
const FileBlacklist_1 = require("../enhancements/FileBlacklist");
const TriggerComposer_1 = require("../enhancements/TriggerComposer");
const translators_1 = require("../wc3maptranslator/translators");
const FormatConverters_1 = require("./formats/FormatConverters");
const log = LoggerFactory_1.LoggerFactory.createLogger('Json2War');
let translatorCount = 0;
async function processFile(input, translator, output) {
const asyncLog = log.getSubLogger({ name: `${translator.constructor.name}-${translatorCount++}` });
asyncLog.info('Processing', input);
const buffer = FormatConverters_1.FormatConverters[EnhancementManager_1.default.mapDataExtension].parse(await (0, promises_1.readFile)(input, { encoding: 'utf8' }));
const result = translator.jsonToWar(buffer);
if (result.errors != null && result.errors.length > 0) {
for (const error of result.errors) {
asyncLog.error(error);
}
}
else {
await (0, WriteAndCreatePath_1.WriteAndCreatePath)(output, result.buffer);
asyncLog.info('Finished processing', output);
}
}
async function exportImportsFile(data, output) {
const translator = translators_1.ImportsTranslator.getInstance();
const asyncLog = log.getSubLogger({ name: `${translator.constructor.name}-${translatorCount++}` });
asyncLog.info('Exporting generated war3map.imp file.');
const result = translator.jsonToWar(data);
if (result.errors != null && result.errors.length > 0) {
for (const error of result.errors) {
asyncLog.error(error);
}
}
else {
await (0, WriteAndCreatePath_1.WriteAndCreatePath)(output, result.buffer);
asyncLog.info('Finished exporting', output);
}
}
function getAllContentForScriptFile(root) {
const triggerStack = [root];
const result = [];
while (triggerStack.length > 0) {
const currentTrigger = triggerStack.pop();
if (currentTrigger == null)
continue;
switch (currentTrigger.contentType) {
case TriggerContent_1.ContentType.HEADER:
result.push(currentTrigger);
// eslint-disable-next-line no-fallthrough
case TriggerContent_1.ContentType.LIBRARY:
case TriggerContent_1.ContentType.CATEGORY:
triggerStack.push(...currentTrigger.children.reverse());
break;
case TriggerContent_1.ContentType.CUSTOM_SCRIPT:
case TriggerContent_1.ContentType.TRIGGER:
case TriggerContent_1.ContentType.TRIGGER_SCRIPTED:
result.push(currentTrigger);
break;
}
}
return result;
}
async function exportTriggers(triggersJson, output) {
const tasks = [];
const triggerTranslator = TriggerTranslator_1.TriggersTranslator.getInstance();
const triggerLog = log.getSubLogger({ name: `${triggerTranslator.constructor.name}-${translatorCount++}` });
const triggerAndScript = {
roots: [triggersJson],
scriptReferences: getAllContentForScriptFile(triggersJson)
};
const triggerResult = triggerTranslator.jsonToWar(triggerAndScript);
tasks.push((0, WriteAndCreatePath_1.WriteAndCreatePath)(path_1.default.join(output, 'war3map.wtg'), triggerResult.buffer)
.then(() => triggerLog.info('Finished exporting triggers.')));
const scriptTranslator = CustomScriptsTranslator_1.CustomScriptsTranslator.getInstance();
const scriptLog = log.getSubLogger({ name: `${scriptTranslator.constructor.name}-${translatorCount++}` });
const scriptArg = { headerComments: [], scripts: [] };
for (const trigger of triggerAndScript.scriptReferences) {
if (trigger != null) {
if (trigger.children != null) { // Found header
scriptArg.headerComments.push(trigger.description);
}
scriptArg.scripts.push(trigger.script);
}
else {
scriptArg.scripts.push('');
}
}
const scriptResult = scriptTranslator.jsonToWar(scriptArg);
tasks.push((0, WriteAndCreatePath_1.WriteAndCreatePath)(path_1.default.join(output, 'war3map.wct'), scriptResult.buffer)
.then(() => scriptLog.info('Finished exporting custom scripts.')));
await Promise.all(tasks);
}
async function processTriggers(input, output) {
log.info('Reading triggers file');
const buffer = FormatConverters_1.FormatConverters[EnhancementManager_1.default.mapDataExtension].parse(await (0, promises_1.readFile)(input, { encoding: 'utf8' }));
await exportTriggers(buffer[0], output);
}
const Json2WarService = {
convert: async function (inputPath, outputPath) {
log.info(`Converting Warcraft III json data in '${inputPath}' and outputting to '${outputPath}'`);
const promises = [];
const fileStack = [(0, directory_tree_1.default)(inputPath, { attributes: ['type', 'extension'] })];
let importDirectoryTree = null;
while (fileStack.length > 0) {
const file = fileStack.pop();
if (file == null)
break;
if (FileBlacklist_1.FileBlacklist.isDirectoryTreeBlacklisted(file))
continue;
if (file.type === 'directory') {
if (EnhancementManager_1.default.smartImport && file.path.endsWith(EnhancementManager_1.default.importFolder)) {
importDirectoryTree = file;
continue; // skip imports
}
if (EnhancementManager_1.default.composeTriggers && file.path.endsWith(EnhancementManager_1.default.sourceFolder)) {
log.debug('ComposeTriggers requested');
promises.push((async () => {
const triggerJson = await TriggerComposer_1.TriggerComposer.composeTriggerJson(file);
await exportTriggers(triggerJson, outputPath);
})());
continue; // skip triggers
}
const children = file.children;
if (children != null) {
for (const child of children) {
fileStack.push(child);
}
}
}
else {
let translator = null;
if (!EnhancementManager_1.default.composeTriggers && file.name.endsWith(`triggers${EnhancementManager_1.default.mapDataExtension}`)) {
promises.push(processTriggers(file.path, outputPath));
continue;
}
for (const [extension, thisTranslator] of Object.entries(TranslatorRecord_1.translatorRecord)) {
if (file.name.endsWith(extension)) {
translator = thisTranslator;
break;
}
}
let outputFile = path_1.default.join(outputPath, path_1.default.relative(inputPath, file.path));
if (translator != null) {
outputFile = outputFile.substring(0, outputFile.lastIndexOf('.')); // remove final extension
if (!EnhancementManager_1.default.smartImport || !(translator instanceof translators_1.ImportsTranslator)) {
promises.push(processFile(file.path, translator, outputFile));
}
}
else {
promises.push((0, FileCopier_1.copyFileWithDirCreation)(file.path, outputFile));
}
}
}
if (EnhancementManager_1.default.smartImport) {
log.debug('SmartImports requested');
const importFileOutputPath = path_1.default.join(outputPath, 'war3map.imp');
if (importDirectoryTree != null) {
const importedFiles = ImportComposer_1.default.composeImportRegistry(importDirectoryTree);
promises.push(exportImportsFile(importedFiles, importFileOutputPath));
fileStack.push(importDirectoryTree);
while (fileStack.length > 0) {
const file = fileStack.pop();
if (file == null)
break;
if (file.type === 'directory') {
const children = file.children;
if (children != null) {
for (const child of children) {
fileStack.push(child);
}
}
}
else {
const outputFile = path_1.default.join(outputPath, path_1.default.relative(importDirectoryTree.path, file.path));
promises.push((0, FileCopier_1.copyFileWithDirCreation)(file.path, outputFile));
}
}
}
else {
promises.push(exportImportsFile([], importFileOutputPath));
}
}
await Promise.all(promises);
}
};
exports.default = Json2WarService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSnNvbjJXYXJTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnZlcnRlci9Kc29uMldhclNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxnREFBdUI7QUFDdkIsNERBQXdEO0FBQ3hELG9FQUFrRTtBQUNsRSx5REFBcUQ7QUFDckQsNkNBQXNEO0FBQ3RELDBDQUFzQztBQUN0Qyw0RkFBbUU7QUFDbkUsb0ZBQTJEO0FBQzNELHVFQUFrRztBQUNsRyxtRkFBK0U7QUFFL0UsOEVBQTRGO0FBRzVGLG1FQUErRDtBQUMvRCxpRUFBNkQ7QUFDN0QscUVBQWlFO0FBRWpFLGlFQUFvRjtBQUNwRixpRUFBNkQ7QUFDN0QsTUFBTSxHQUFHLEdBQUcsNkJBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7QUFFbEQsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFBO0FBQ3ZCLEtBQUssVUFBVSxXQUFXLENBQUssS0FBYSxFQUFFLFVBQXlCLEVBQUUsTUFBYztJQUNyRixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDbEcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDbEMsTUFBTSxNQUFNLEdBQUcsbUNBQWdCLENBQUMsNEJBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFBLG1CQUFRLEVBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQU0sQ0FBQTtJQUM1SCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzNDLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksTUFB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