ldraw
Version:
A Library for parsing an LDraw file
100 lines (84 loc) • 2.43 kB
JavaScript
var parseLine = require('./parse-line');
/*
Parses the LDConfig.ldr file for the colors:
Returns an array indexed by the color code.
var colors = parseColors(LDConfig);
var color = colors[114] = {
NAME: 'Glitter_Trans_Dark_Pink',
CODE: 114,
VALUE: '#DF6695',
EDGE: '#9A2A66',
ALPHA: 128,
MATERIAL: 'GLITTER',
GLITTER_VALUE: '#923978',
FRACTION: '0.17',
VFRACTION: '0.2',
SIZE: 1,
LEGOID: '114 - Tr. Medium Reddish-Violet w. Glitter 2%'
}
*/
var state = null;
function parseColors(LDConfig) {
var colors = {};
var lines = LDConfig.split('\n');
function getColor(params) {
var color = {};
color.NAME = params[2];
for (var i = 3; i < params.length; i = i + 2) {
//console.log(i + ': ' + params[i] + '=' + params[i+1]);
if (params[i] && params[i+1]) {
if (params[i - 2] === 'MATERIAL' && params[i] === 'VALUE') {
color[params[i - 1] + '_VALUE'] = params[i+1];
} else {
color[params[i]] = params[i + 1];
if (params[i + 1] == parseInt(params[i+1], 10)) {
color[params[i]] = parseInt(params[i+1], 10);
}
}
} else {
// Material must be the last parameter on a line according to spec
color.MATERIAL = params[i];
}
}
return color;
}
for (var i = 0; i < lines.length; i++) {
var line = lines[i].trim();
// Skip blank lines
if (line === '') {
state = null;
continue;
}
// Does it have a LEGOID? If so, parse it and add it to color object
// 0 // LEGOID 26 - Black
legoIdIdx = line.indexOf('LEGOID');
if (legoIdIdx > 0) {
// 0 // LEGOID 26 - Black
legoId = line.substr(legoIdIdx + 6).trim();
i = i + 1;
line = lines[i].trim();
} else {
legoId = null;
}
// Parse the color line
// 0 !COLOUR Black CODE 0 VALUE #05131D EDGE #595959
var params = parseLine(line);
if (params && params[0] == 0 && params[1] == '!COLOUR') {
var color = getColor(params);
if (!color.MATERIAL) {
if (color.ALPHA) {
color.MATERIAL ='TRANSPARENT';
} else {
color.MATERIAL = 'SOLID';
}
}
if (legoId) {
color.LEGOID = legoId;
}
legoIdIdx = null;
colors[color.CODE] = color;
}
}
return colors;
}
module.exports = parseColors;