54 lines
1.3 KiB
JavaScript
54 lines
1.3 KiB
JavaScript
|
#!/usr/bin/env node
|
||
|
|
||
|
var json = '';
|
||
|
|
||
|
if (require.main === module) {
|
||
|
process.stdin.setEncoding('utf8');
|
||
|
|
||
|
process.stdin.on('readable', () => {
|
||
|
const chunk = process.stdin.read();
|
||
|
if (chunk !== null) {
|
||
|
json += chunk;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
process.stdin.on('end', () => {
|
||
|
var obj = JSON.parse(json);
|
||
|
var argv = process.argv.slice(2);
|
||
|
extractPaths(obj, argv).forEach(function(line) {
|
||
|
console.log(line);
|
||
|
})
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function extractPaths(obj, paths) {
|
||
|
var lines = [];
|
||
|
paths.forEach(function(exp) {
|
||
|
var objs = obj instanceof Array ? [].concat(obj) : [obj];
|
||
|
exp.split('.').forEach(function(name) {
|
||
|
for(var i = 0; i < objs.length; i++) {
|
||
|
var o = objs[i];
|
||
|
if (o instanceof Array) {
|
||
|
// Expand and do over
|
||
|
objs = objs.slice(0, i).concat(o).concat(objs.slice(i+1, objs.length));
|
||
|
i--;
|
||
|
} else {
|
||
|
name.split("=").forEach(function(name, index) {
|
||
|
if (index == 0) {
|
||
|
objs[i] = o = o[name];
|
||
|
} else if (name.charAt(0) == '^') {
|
||
|
if (o.indexOf(name.substr(1)) !== 0) {
|
||
|
objs.splice(i, 1);
|
||
|
i--;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
lines.push(objs.join("|"));
|
||
|
});
|
||
|
return lines;
|
||
|
}
|
||
|
|
||
|
exports.extractPaths = extractPaths;
|