92 lines
2.4 KiB
JavaScript
Executable File
92 lines
2.4 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
'use strict';
|
|
|
|
const { PDFKitTextMeasurer } = require('./text-measurer');
|
|
const { makeBadge } = require('./make-badge');
|
|
const svg2img = require('./svg-to-img');
|
|
const colorscheme = require('./colorscheme.json');
|
|
const defaults = require('./defaults');
|
|
|
|
if (process.argv.length < 4) {
|
|
console.log('Usage: badge subject status [:colorscheme] [.output] [@style]');
|
|
console.log('Or: badge subject status right-color [left-color] [.output] [@style]');
|
|
console.log();
|
|
console.log(' colorscheme: one of '
|
|
+ Object.keys(colorscheme).join(', ') + '.');
|
|
console.log(' left-color, right-color:');
|
|
console.log(' #xxx (three hex digits)');
|
|
console.log(' #xxxxxx (six hex digits)');
|
|
console.log(' color (CSS color)');
|
|
console.log(' output:');
|
|
console.log(' svg, png, jpg, or gif');
|
|
console.log();
|
|
console.log('Eg: badge cactus grown :green @flat');
|
|
console.log();
|
|
process.exit();
|
|
}
|
|
|
|
const fontPath = process.env.FONT_PATH || defaults.font.path;
|
|
|
|
// Find a format specifier.
|
|
let format = 'svg';
|
|
let style = '';
|
|
for (let i = 4; i < process.argv.length; i++) {
|
|
if (process.argv[i][0] === '.') {
|
|
format = process.argv[i].slice(1);
|
|
process.argv.splice(i, 1);
|
|
continue;
|
|
}
|
|
if (process.argv[i][0] === '@') {
|
|
style = process.argv[i].slice(1);
|
|
process.argv.splice(i, 1);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
const subject = process.argv[2];
|
|
const status = process.argv[3];
|
|
let color = process.argv[4] || ':green';
|
|
const colorA = process.argv[5];
|
|
|
|
const badgeData = {text: [subject, status], format: format};
|
|
if (style) {
|
|
badgeData.template = style;
|
|
}
|
|
|
|
if (color[0] === ':') {
|
|
color = color.slice(1);
|
|
if (colorscheme[color] == null) {
|
|
// Colorscheme not found.
|
|
console.error('Invalid color scheme.');
|
|
process.exit(1);
|
|
}
|
|
badgeData.colorscheme = color;
|
|
} else {
|
|
badgeData.colorB = color;
|
|
if (colorA) { badgeData.colorA = colorA; }
|
|
}
|
|
|
|
async function main() {
|
|
// The widths are going to be off if Helvetica-Bold is used, though this
|
|
// should print a warning.
|
|
const measurer = new PDFKitTextMeasurer(fontPath, 'Helvetica-Bold');
|
|
const svg = makeBadge(measurer, badgeData);
|
|
|
|
if (/png|jpg|gif/.test(format)) {
|
|
const data = await svg2img(svg, format);
|
|
process.stdout.write(data);
|
|
} else {
|
|
console.log(svg);
|
|
}
|
|
}
|
|
|
|
(async () => {
|
|
try {
|
|
await main()
|
|
} catch (e) {
|
|
console.error(e)
|
|
process.exit(1)
|
|
}
|
|
})()
|