109 lines
2.7 KiB
JavaScript
109 lines
2.7 KiB
JavaScript
var async = require("async");
|
|
var csv = require("fast-csv");
|
|
var fs = require("fs");
|
|
var through = require("through2");
|
|
|
|
module.exports = function(input, output, feedFile, opts) {
|
|
async.waterfall([function(next) {
|
|
var feeds = {};
|
|
var buf = "";
|
|
|
|
var section = -1;
|
|
var sections = [[], [], [], []];
|
|
|
|
fs.createReadStream(feedFile, { encoding: "latin1" })
|
|
.on("data", function(data) {
|
|
buf += data.toString();
|
|
|
|
var lines = buf.split("\r\n");
|
|
buf = lines.pop();
|
|
|
|
for(var i = 0; i < lines.length; i++) {
|
|
let line = lines[i].replace(/[\r\n]+$/, "");
|
|
|
|
if(line.length === 0) continue;
|
|
|
|
if(line.slice(0, 2) === "%,") {
|
|
section++;
|
|
}
|
|
|
|
if(section === 3 && sections[3].length > 0) continue;
|
|
|
|
if(section === -1) { // input can be either just the CSV section or the entire pnp file
|
|
sections[1].push(line);
|
|
} else {
|
|
sections[section].push(line);
|
|
}
|
|
}
|
|
})
|
|
.on("end", function() {
|
|
next(null, sections);
|
|
})
|
|
}, function(sections, next) {
|
|
var components = [];
|
|
var len = sections[1].length;
|
|
|
|
for(var i = 0; i < len; i++) {
|
|
let section = sections[1][i].split(",");
|
|
|
|
components[section[6]] = {
|
|
x: section[3],
|
|
y: section[4],
|
|
feed: section[5],
|
|
slot: section[2]
|
|
}
|
|
}
|
|
|
|
next(null, components, sections);
|
|
}, function(feeds, sections, next) {
|
|
var data = "";
|
|
var seq = 0;
|
|
|
|
var tr = through(function(chunk, enc, done) {
|
|
data += chunk.toString();
|
|
|
|
var lines = data.split("\n");
|
|
data = lines.pop();
|
|
|
|
for(var i = 0, line; i < lines.length; i++) {
|
|
line = lines[i];
|
|
|
|
var match = line.replace(/[\ ]+/g, " ").split(" ");
|
|
var p = match[1];
|
|
var x = match[3];
|
|
var y = match[4];
|
|
var r = Math.round(match[5] - 90);
|
|
|
|
if(r < 0) r += 360;
|
|
|
|
if(!feeds[p]) {
|
|
if(!opts.quite)
|
|
console.warn("No feed found for part: %s", p);
|
|
|
|
continue;
|
|
}
|
|
|
|
var feed = feeds[p];
|
|
|
|
this.push([ ++seq, 1, feed.slot, Math.abs(x), Math.abs(y), r, 0.50, 0, 100, null, null, null ].join(",") + "\r\n");
|
|
};
|
|
|
|
done();
|
|
});
|
|
|
|
next(null, tr, sections);
|
|
}], function(err, tr, sections) {
|
|
var rs = fs.createReadStream(input, { encoding: "latin1" });
|
|
var ws = fs.createWriteStream(output, { encoding: "latin1" });
|
|
|
|
var i = 0;
|
|
|
|
async.forEachSeries(sections, function(section, next) {
|
|
ws.write(section.join("\r\n") + (++i < 4 ? "\r\n\r\n" : "\r\n"), next);
|
|
}, function() {
|
|
rs.pipe(tr);
|
|
tr.pipe(ws).on("close", function() {
|
|
});
|
|
});
|
|
});
|
|
}
|