UNPKG

patchwork-mapconverter

Version:

Executable wrapper for https://github.com/ChiefOfGxBxL/WC3MapTranslator

202 lines 20.1 kB
"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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