mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-01-06 11:39:49 -06:00
123 lines
3.2 KiB
JavaScript
123 lines
3.2 KiB
JavaScript
var USAGE_TEXT = '\n\
|
|
USAGE:\n\
|
|
node spice2mission.js <input directory> [,<ckbrief arguments...>] \n\
|
|
\n\
|
|
PURPOSE:\n\
|
|
This script takes a root directory containing SPICE files (*.bc) \n\
|
|
and prints lua code representing the contents for a .mission-file\n\
|
|
to std out. The directory structure is used to create the hierarchy\n\
|
|
of mission phases.\
|
|
';
|
|
|
|
const exec = require('child_process').exec;
|
|
|
|
var KEY_START = 'start';
|
|
var KEY_END = 'end';
|
|
var FILE_START = 'Summary for: ';
|
|
var TIME_START = 'Begin ET: ';
|
|
var SPACES = ' ';
|
|
|
|
var inputDir = process.argv[2];
|
|
var additionalArguments = process.argv.splice(3);
|
|
|
|
|
|
run();
|
|
|
|
function run(){
|
|
if(process.argv.length == 2){
|
|
console.log('Error: expected at least one (1) argument');
|
|
console.log(USAGE_TEXT);
|
|
return;
|
|
}
|
|
|
|
execute('find ' + inputDir + ' -type f -name *.bc*', (files) => {
|
|
files = files.split('\n').join(' ');
|
|
//console.log(files);
|
|
var cmd = "ckbrief.exe " + additionalArguments.join(" ") + " " + files + '-g';
|
|
execute(cmd, handleCkbriefOutput);
|
|
});
|
|
}
|
|
|
|
function onSuccess(cb){
|
|
return (error, stdout, stderr) => {
|
|
if(error) return console.error('exec error: ' + error);
|
|
if(stderr) return console.error(stderr);
|
|
cb(stdout);
|
|
}
|
|
}
|
|
|
|
function execute(cmd, cb){
|
|
//console.log('executing: ' + cmd);
|
|
exec(cmd, onSuccess(cb));
|
|
}
|
|
|
|
/**
|
|
* Handles the output from the shell command
|
|
* $ find <inputDit> -type f -name *.bc | xargs ckbrief.exe <additional arguments...> -g
|
|
*/
|
|
function handleCkbriefOutput(output){
|
|
var mission = {};
|
|
var currentLeaf = null;
|
|
var lines = output.split('\n');
|
|
for (var i = 0; i < lines.length; i++) {
|
|
var line = lines[i].trim();
|
|
if(line.startsWith(FILE_START)){
|
|
var pathToFile = line.substr(FILE_START.length);
|
|
//console.log(currentLeaf);
|
|
currentLeaf = addPathToTree(mission, pathToFile);
|
|
}
|
|
else if(line.startsWith(TIME_START)){
|
|
var startTime = line.substr(TIME_START.length + 0, TIME_START.length + 14);
|
|
var endTime = line.substr(TIME_START.length + 34).trim();
|
|
if(currentLeaf[KEY_START] === undefined) {
|
|
currentLeaf[KEY_START] = startTime;
|
|
}
|
|
currentLeaf[KEY_END] = endTime;
|
|
}
|
|
}
|
|
//console.log(JSON.stringify(mission, null, 2));
|
|
|
|
var luaStr = toLuaTable(mission, 0);
|
|
console.log(luaStr);
|
|
}
|
|
|
|
function toLuaTable(mission, d){
|
|
if(d === undefined) d = 0;
|
|
if(mission === undefined) return '';
|
|
//if(d > 2) return '';
|
|
var str = d ? "" : "return ";
|
|
|
|
var indent = SPACES.substr(0, d*2);
|
|
for (var phaseName in mission) {
|
|
if (mission.hasOwnProperty(phaseName)) {
|
|
var phase = mission[phaseName];
|
|
str += '\n' + indent + '{ Name = "' + phaseName + '", ';
|
|
if(phase[KEY_START] !== undefined && phase[KEY_END] !== undefined){
|
|
str += 'TimeRange = { Start = "' + phase[KEY_START] + '", End = "' + phase[KEY_END] + '" }';
|
|
}
|
|
else {
|
|
str += 'Phases = {' + toLuaTable(phase, d + 1) + '\n' + indent + '}';
|
|
}
|
|
str += '},';
|
|
}
|
|
}
|
|
|
|
// strip out last ','.
|
|
return str.substr(0, str.length-1);
|
|
}
|
|
|
|
function addPathToTree(obj, components){
|
|
if(typeof components === 'string') {
|
|
components = components.split('/');
|
|
}
|
|
|
|
var o = obj;
|
|
var key;
|
|
for (var i = 0; i < components.length; i++) {
|
|
key = components[i];
|
|
if(o[key] === undefined) o[key] = {};
|
|
o = o[key];
|
|
}
|
|
|
|
return o; // returning the leaf component
|
|
} |