1
0
mirror of https://github.com/teoxoy/factorio-blueprint-editor.git synced 2025-11-23 22:15:01 +02:00
Files
factorio-blueprint-editor/parser/exportRawData.js
2018-03-29 07:54:56 +02:00

110 lines
3.5 KiB
JavaScript

const fse = require('fs-extra')
const lua_parser = require('./luajs/lua_parser_umd').parser
const execSync = require('child_process').execSync
//const factorioDirectory = 'C:/SteamLibrary/steamapps/common/Factorio/data/'
const factorioDirectory = 'C:/_Programs/Steam/steamapps/common/Factorio/data/'
//run /c game.write_file("defines.lua", serpent.block(_G.defines, {comments=false}))
//_tree_data_320 -> _tree_data_1
// Load Order:
// data.lua
// data-updates.lua
// data-final-fixes.lua
const reqLualibRegex = /.*?require\s*\(*['"]([^.]+?)['"]\)*/g
const reqRegex = /require\s*\(*['"](.+?)['"]\)*/g
let loadedModules = []
function searchLoadRemoveDependencies(contents, regex, baseFolder) {
let newModules = []
let match = regex.exec(contents)
while (match !== null) {
let dep = match[1]
if (!loadedModules.includes(dep)) {
//load module
loadedModules.push(dep)
newModules.push({
index: match.index,
name: dep
})
}
match = regex.exec(contents)
}
let offset = 0
for (let i = 0; i < newModules.length; i++) {
let startPart = contents.slice(0, newModules[i].index + offset)
let endPart = contents.slice(newModules[i].index + offset)
let depData = readRequireOfFile(baseFolder, newModules[i].name.replace(/\./g, '/') + '.lua') + '\n'
contents = startPart + depData + endPart
offset += depData.length
}
// remove all requires
contents = contents.replace(regex, '')
return contents
}
function readRequireOfFile(baseFolder, pathCon) {
let contents = fse.readFileSync(factorioDirectory + baseFolder + pathCon).toString()
contents = searchLoadRemoveDependencies(contents, reqLualibRegex, 'core/lualib/')
contents = searchLoadRemoveDependencies(contents, reqRegex, baseFolder)
// remove last return
contents = contents.replace(/return\s*\b.+?\b\s*$/g, '')
// if a return is an obj, convert the return with the filename
contents = contents.replace(/return\s(\{(.|\n)+?\})\s*$/g, function(match, capture){
let split = pathCon.split('/')
return split[split.length - 1].replace('.lua', '') + ' = ' + capture
})
if (pathCon.includes('autoplace_utils')) {
contents = contents.replace(/M/g, 'autoplace_utils')
}
return contents
}
const fileOrder = [
'core/lualib/dataloader.lua',
'core/data.lua',
'base/data.lua',
'base/data-updates.lua'
]
let mainFileData = ''
for (let i = 0; i < fileOrder.length; i++) {
let splitPath = fileOrder[i].split('/')
let data = readRequireOfFile(splitPath[0] + '/', splitPath.slice(1).join('/'))
mainFileData += data + '\n'
}
mainFileData = mainFileData
// var = require(...) results in var = var = {}
.replace(/\b[a-zA-Z_-]+?\b\s*(=\s*\b[a-zA-Z_-]+?\b\s*)=\s*\{/g, function(match, capture){
return match.replace(capture, '')
})
mainFileData = fse.readFileSync('./defines.lua').toString() + mainFileData
fse.writeFileSync('./temp.lua', mainFileData)
let parsedData = lua_parser.parse(mainFileData).replace(/_tree_data_320/g, '_tree_data_1')
let script = "var fs = require('fs');\n" +
fse.readFileSync('./luajs/lua.js').toString() + "\n" +
"var lua_script = (function() {\n" +
" " + parsedData.split("\n").join("\n ") + "\n" +
"})()[0];\n" +
"fs.writeFileSync('./temp.json', JSON.stringify(lua_tabletoJson(lua_tableget(lua_tableget(lua_script, 'data'), 'raw')), null, 2))"
fse.writeFileSync('./temp.js', script)
execSync('node temp.js')