From f97fbf0dd05327dbc3ce7b8af432c4e1208eda9d Mon Sep 17 00:00:00 2001 From: Max Ogden Date: Sat, 19 Apr 2014 01:11:06 -0700 Subject: [PATCH] add templates support and new flat style option --- badge.js | 32 +++++++++++++------ server.js | 17 ++++++++-- .../default-colorscheme.json | 0 .../default-template.svg | 0 templates/flat-template.svg | 16 ++++++++++ try.html | 16 ++++++++++ 6 files changed, 70 insertions(+), 11 deletions(-) rename colorscheme.json => templates/default-colorscheme.json (100%) rename template.svg => templates/default-template.svg (100%) create mode 100644 templates/flat-template.svg diff --git a/badge.js b/badge.js index 54ba3f0..a03654b 100644 --- a/badge.js +++ b/badge.js @@ -1,6 +1,7 @@ var fs = require('fs'); var path = require('path'); var SVGO = require('svgo'); +var dot = require('dot'); // Initialize what will be used for automatic text measurement. var Canvas = require('canvas'); @@ -14,27 +15,40 @@ try { } catch(e) {} canvasContext.font = '11px Verdana, "DejaVu Sans"'; -// Template crafting action below. -var dot = require('dot'); -var colorscheme = require(path.join(__dirname, 'colorscheme.json')); -var template = fs.readFileSync(path.join(__dirname, 'template.svg')); -var imageTemplate = dot.template(''+template); +function makeTemplate(colorscheme, template) { + // Template crafting action below. + var colorscheme = require(path.join(__dirname, 'templates', (colorscheme || 'default') + '-colorscheme.json')); + var template = fs.readFileSync(path.join(__dirname, 'templates', (template || 'default') + '-template.svg')); + var imageTemplate = dot.template(''+template); + imageTemplate.colorscheme = colorscheme; + return imageTemplate; +} + +var defaultTemplate = makeTemplate(); function optimize(string, callback) { var svgo = new SVGO(); svgo.optimize(string, callback); } -function makeImage(data, cb) { +function makeImage(data, options, cb) { + if (typeof options === 'function') { + cb = options + options = {} + } + var template = defaultTemplate; + if (options.colorscheme || options.template) { + template = makeTemplate(options.colorscheme, options.template); + } if (data.colorscheme) { - data.colorA = colorscheme[data.colorscheme].colorA; - data.colorB = colorscheme[data.colorscheme].colorB; + data.colorA = template.colorscheme[data.colorscheme].colorA; + data.colorB = template.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); + var result = template(data); // Run the SVG through SVGO. optimize(result, function(object) { cb(object.data); }); } diff --git a/server.js b/server.js index 2826bf9..7954aa4 100644 --- a/server.js +++ b/server.js @@ -5,10 +5,13 @@ var camp = require('camp').start({ var https = require('https'); var request = require('request'); var fs = require('fs'); +var url = require('url'); var badge = require('./badge.js'); var svg2img = require('./svg-to-img.js'); var serverStartTime = new Date((new Date()).toGMTString()); +var validTemplates = ['default', 'flat']; + // Analytics var redis; @@ -96,6 +99,16 @@ var cacheFromIndex = Object.create(null); function cache(f) { return function getRequest(data, match, end, ask) { + // parse querystring for specifying template + var reqURL = url.parse(ask.req.url, true); + var badgeOpts = { + template: 'default' + }; + var style = reqURL.query.style || 'default'; + if (style && validTemplates.indexOf(style) > -1) { + badgeOpts.template = style; + }; + // Cache management - no cache, so it won't be cached by GitHub's CDN. ask.res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); incrMonthlyAnalytics(analytics.vendorMonthly); @@ -104,7 +117,7 @@ function cache(f) { // Should we return the data right away? var cached = cacheFromIndex[cacheIndex]; if (cached != null) { - badge(cached.badgeData, makeSend(cached.format, ask.res, end)); + badge(cached.badgeData, badgeOpts, makeSend(cached.format, ask.res, end)); return; } @@ -114,7 +127,7 @@ function cache(f) { var badgeData = getBadgeData('vendor', data); badgeData.text[1] = 'unresponsive'; serverUnresponsive = true; - badge(badgeData, makeSend('svg', ask.res, end)); + badge(badgeData, badgeOpts, makeSend('svg', ask.res, end)); }, 25000); f(data, match, function sendBadge(format, badgeData) { diff --git a/colorscheme.json b/templates/default-colorscheme.json similarity index 100% rename from colorscheme.json rename to templates/default-colorscheme.json diff --git a/template.svg b/templates/default-template.svg similarity index 100% rename from template.svg rename to templates/default-template.svg diff --git a/templates/flat-template.svg b/templates/flat-template.svg new file mode 100644 index 0000000..8a5739e --- /dev/null +++ b/templates/flat-template.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + {{=it.text[0]}} + {{=it.text[1]}} + + diff --git a/try.html b/try.html index f2e60e3..5ed49f5 100644 --- a/try.html +++ b/try.html @@ -190,6 +190,22 @@ I made the GitHub Badge Service. +

Flat Style

+ + + + + + + + + + + + + +
http://img.shields.io/travis/joyent/node.svg?style=flat
http://img.shields.io/travis/joyent/node/v0.6.svg?style=flat
http://img.shields.io/gittip/JSFiddle.svg?style=flat
http://img.shields.io/coveralls/jekyll/jekyll.svg?style=flat
+

Like This?