Files
shields/lib/badge-data.js
T
DanialandGitHub d8cf836264 Add support for rgb, rgba, hsl, hsla, css named colors (#1635)
* add support for rgb, rgb, css named colors

* add support for hsl, hsla & add color-validate

* update makeBadge test, better coverage

* re-add comment

* add comment for supported colors

* dynamic badge gen, remove 'hex'

* add support for 1.0 opacity & fix 101-109

* fix colorscheme tests

* remove extra tests

* add test for negative values

* add test for uppercase & mixed case colors

* fix mixed case/uppercase test

* allow whitespace around color

* update test error messages

* add comments

* add more uppercase test

* update error message

* default to grey/red if invalid color chosen

default colorscheme:
colorA: grey
colorB: red

* Revert "default to grey/red if invalid color chosen"

This reverts commit 10db0c6d74.
Reverted as this affects the CLI version/when no color specified.

* validColor -> isCSSColor

* assignColor function

* update tests to use sazerac
2018-07-12 10:26:17 +12:00

127 lines
2.7 KiB
JavaScript

'use strict';
const isCSSColor = require('is-css-color');
const logos = require('./load-logos')();
const colorschemes = require('./colorscheme.json');
function toArray(val) {
if (val === undefined) {
return [];
} else if (Object(val) instanceof Array) {
return val;
} else {
return [val];
}
}
function isDataUri(s) {
return s !== undefined && /^(data:)([^;]+);([^,]+),(.+)$/.test(s);
}
function prependPrefix(s, prefix) {
if (s === undefined) {
return undefined;
}
s = '' + s;
if (s.startsWith(prefix)) {
return s;
} else {
return prefix + s;
}
}
function isHexColor (s = ''){
return /^([\da-f]{3}){1,2}$/i.test(s);
}
function makeColor(color) {
if (isHexColor(color)) {
return '#' + color;
} else {
return color;
}
}
function makeColorB(defaultColor, overrides) {
return makeColor(overrides.colorB || defaultColor);
}
function setBadgeColor(badgeData, color) {
if (isHexColor(color)) {
badgeData.colorB = '#' + color;
delete badgeData.colorscheme;
} else if (colorschemes[color] !== undefined){
badgeData.colorscheme = color;
delete badgeData.colorB;
} else if (isCSSColor(color)){
badgeData.colorB = color;
delete badgeData.colorscheme;
} else {
badgeData.colorscheme = 'red';
delete badgeData.colorB;
}
return badgeData;
}
function makeLabel(defaultLabel, overrides) {
return overrides.label || defaultLabel;
}
function makeLogo(defaultNamedLogo, overrides) {
if (overrides.logo === undefined){
return logos[defaultNamedLogo];
}
// +'s are replaced with spaces when used in query params, this returns them to +'s, then removes remaining whitespace - #1546
const maybeDataUri = prependPrefix(overrides.logo, 'data:').replace(/ /g, '+').replace(/\s/g, '');
if (isDataUri(maybeDataUri)) {
return maybeDataUri;
} else {
return logos[overrides.logo];
}
}
// Generate the initial badge data. Pass the URL query parameters, which
// override the default label.
//
// The following parameters are supported:
//
// - label
// - style
// - logo
// - logoWidth
// - link
// - colorA
// - colorB
// - maxAge
//
// Note: maxAge is handled by cache(), not this function.
function makeBadgeData(defaultLabel, overrides) {
return {
text: [makeLabel(defaultLabel, overrides), 'n/a'],
colorscheme: 'lightgrey',
template: overrides.style,
logo: makeLogo(undefined, overrides),
logoWidth: +overrides.logoWidth,
links: toArray(overrides.link),
colorA: makeColor(overrides.colorA),
colorB: makeColor(overrides.colorB),
};
}
module.exports = {
toArray,
prependPrefix,
isDataUri,
isHexColor,
makeLabel,
makeLogo,
makeBadgeData,
makeColor,
makeColorB,
setBadgeColor
};