-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpvssbom2json.js
More file actions
95 lines (83 loc) · 2.52 KB
/
Copy pathpvssbom2json.js
File metadata and controls
95 lines (83 loc) · 2.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// SG
// pvi2json v1
//
var fs = require('fs');
var x2j = require('xml2js');
var all = {};
function getv(r,n) {
if (r === undefined) return undefined;
var rval = undefined;
// assumes an object/array of properties of the form $ { type, name, value }
r.forEach(function(p) {
if (p.$.name === n) {
rval = (p.$.value != undefined) ? p.$.value : p._;
}
});
return rval;
}
function convert(pvi) {
var figures = pvi['import3di']['figures'];
if (figures === undefined) return false;
if (figures.length > 0) {
for (var sc = 0; sc < figures[0].figure.length; sc++) {
var fig = figures[0].figure[sc];
var figid = fig.name[0];
// finally, is there an itemlist?
var ilist = [];
var slist = "";
var items = fig['itemlist'];
if (items[0].item != undefined) {
for (var ic=0; ic < items[0].item.length; ic++) {
var item = items[0].item[ic];
ilist.push( { itm:item.itmlabel[0], name:item.itmtag[0], qty:item.itmgroup[0].$.qty, refitm:item.itmgroup[0].refitm.map(x => x.$.sbomidpath)});
for(var rc=0;rc<item.itmgroup[0].$.qty;rc++) {
slist = slist + (slist.length>0?",":"") + item.itmgroup[0].refitm[rc].$.sbomidpath;
}
}
}
if (slist.length > 0)
all[figid] = ilist; //slist;
}
}
return true;
}
function processPvi(fi,fn) {
// fi = file in
// var fi= process.argv[2];
var parser = new x2j.Parser();
fs.readFile(fi, function(err, data) {
console.log('read file ok');
parser.parseString(data, function (err, result) {
var ok = convert(result);
if (ok === true && fn!=undefined) fn();
});
});
}
var counter = 1;
function readFile(filename) {
processPvi(filename, function() {
counter = counter - 1;
if (counter === 0) {
var fo = process.argv[3];
if (fo === undefined)
console.log(JSON.stringify(all,null,'\t'));
else
fs.writeFile(fo, JSON.stringify(all,null,'\t'), function(err){
if (err) throw err;
console.log('Done!');
})
}
});
}
function readFiles(dirname, rootfile, onError) {
fs.readdir(dirname, function(err, filenames) {
if (err) {
onError(err);
return;
}
readFile(filenames,rootfile);
});
}
var fi = process.argv[2];
// if the user specifies a specific .pvi file, process that one file
if (fi != undefined) readFile(fi);