shields/make.js
2014-01-03 12:29:54 +01:00

75 lines
2.1 KiB
JavaScript

var fs = require('fs');
var path = require('path');
var Promise = require('es6-promise').Promise;
var SVGO = require('svgo');
// Initialize what will be used for automatic text measurement.
var Canvas = require('canvas');
var canvasElement = new Canvas(0, 0); // Width and height are irrelevant.
var canvasContext = canvasElement.getContext('2d');
canvasContext.font = '10px Verdana';
// Template crafting action below.
var dot = require('dot');
var badgeData = require('./badges.json');
var badges = badgeData.badges;
var colorscheme = badgeData.colorschemes;
var template = fs.readFileSync('./template.svg');
var imageTemplate = dot.template(''+template);
// Construct the image sheet.
var imageSheet = 'sheet.html';
var resultSheet = '';
// Where the images will be put.
var targetImgDir = 'img';
function optimize(string, callback) {
var svgo = new SVGO();
svgo.optimize(string, callback);
}
function makeImage(name, data, cb) {
if (data.colorscheme) {
data.colorA = colorscheme[data.colorscheme].colorA;
data.colorB = colorscheme[data.colorscheme].colorB;
}
data.widths = [
(canvasContext.measureText(data.text[0]).width|0) + 10,
(canvasContext.measureText(data.text[1]).width|0) + 10,
];
var result = imageTemplate(data);
// Run the SVG through SVGO.
optimize(result, function(object) {
var result = object.data;
var filename = path.join(targetImgDir, name + '.svg');
// Put this image on the sheet.
resultSheet += '<p><img src="' + filename + '">';
// Write the image individually.
fs.writeFile(filename, result, cb);
});
}
// Return a promise to have all images written out individually.
function buildImages() {
return Promise.all(Object.keys(badges).map(function(name) {
//console.log('badge', name);
return new Promise(function(resolve) {
makeImage(name, badges[name], resolve);
});
}));
}
function main() {
// Write the images individually.
buildImages()
.then(function() {
// Write the sheet.
//console.log('sheet');
fs.writeFileSync(imageSheet, resultSheet);
})
.catch(function(e) { console.error(e.stack); });
}
main();