Files
MapLibreParticleLab/bin/convert-style.js
2014-01-08 12:10:46 +01:00

141 lines
3.4 KiB
JavaScript
Executable File

#!/usr/bin/env node
var style = require('./style.js');
var Protobuf = require('./protobuf.js');
var fs = require('fs');
var pbf = new Protobuf();
// enum
var bucket_type = {
fill: 1,
line: 2,
point: 3
};
// enum
var cap_type = {
round: 1,
}
// enum
var join_type = {
butt: 1,
bevel: 2
}
function createBucket(bucket, name) {
var pbf = new Protobuf();
pbf.writeTaggedString(1 /* name */, name);
pbf.writeTaggedVarint(2 /* type */, bucket_type[bucket.type]);
pbf.writeTaggedString(3 /* source_name */, bucket.datasource);
pbf.writeTaggedString(4 /* source_layer */, bucket.layer);
if (bucket.field) {
pbf.writeTaggedString(5 /* source_field */, bucket.field);
var values = Array.isArray(bucket.value) ? bucket.value : [bucket.value];
for (var i = 0; i < values.length; i++) {
pbf.writeTaggedString(6 /* source_values */, values[i]);
}
}
if (bucket.cap) {
pbf.writeTaggedVarint(7 /* cap */, cap_type[bucket.cap]);
}
if (bucket.join) {
pbf.writeTaggedVarint(8 /* join */, join_type[bucket.join]);
}
// TODO: font stuff
return pbf;
}
function createStructure(structure) {
var pbf = new Protobuf();
pbf.writeTaggedString(1 /* name */, structure.name);
if (structure.bucket) {
pbf.writeTaggedString(2 /* bucket_name */, structure.bucket);
} else if (structure.layers) {
for (var i = 0; i < structure.layers.length; i++) {
pbf.writeMessage(3 /* child_layers */, createStructure(structure.layers[i]));
}
}
return pbf;
}
function createWidth(width) {
var pbf = new Protobuf();
var values = [];
if (Array.isArray(width)) {
pbf.writeTaggedString(1 /* scaling */, width[0]);
for (var i = 1; i < width.length; i++) {
if (width[0] === 'stops') {
values.push(width[i].z, width[i].val);
} else {
values.push(width[i]);
}
}
} else {
values.push(width);
}
pbf.writePackedFloats(2 /* values */, values);
return pbf;
}
function createLayer(layer, name) {
var pbf = new Protobuf();
pbf.writeTaggedString(1 /* layer_name */, name);
if ('color' in layer) {
var color = layer.color.match(/^#([0-9a-f]{6})$/i);
if (!color) {
console.warn('invalid color');
} else {
pbf.writeTaggedUInt32(2 /* color */, parseInt(color[1] + 'ff', 16));
}
}
if ('antialias' in layer) {
pbf.writeTaggedBoolean(3 /* antialias */, layer.antialias);
}
if ('width' in layer) {
pbf.writeMessage(4 /* width */, createWidth(layer.width));
}
return pbf;
}
function createClass(klass) {
var pbf = new Protobuf();
pbf.writeTaggedString(1 /* name */, klass.name);
for (var name in klass.layers) {
pbf.writeMessage(2 /* layers */, createLayer(klass.layers[name], name));
}
return pbf;
}
for (var name in style.buckets) {
var bucket = style.buckets[name];
pbf.writeMessage(1 /* buckets */, createBucket(bucket, name));
}
for (var i = 0; i < style.structure.length; i++) {
var structure = style.structure[i];
pbf.writeMessage(2 /* structure */, createStructure(structure));
}
for (var i = 0; i < style.classes.length; i++) {
var klass = style.classes[i];
pbf.writeMessage(3 /* classes */, createClass(klass));
}
process.stdout.write(pbf.finish());