chroma-js
Version:
JavaScript library for color conversions
95 lines (82 loc) • 2.56 kB
JavaScript
const hsl2rgb = require('../hsl/hsl2rgb');
const input = require('../input');
const RE_RGB = /^rgb\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*\)$/;
const RE_RGBA = /^rgba\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*,\s*([01]|[01]?\.\d+)\)$/;
const RE_RGB_PCT = /^rgb\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/;
const RE_RGBA_PCT = /^rgba\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/;
const RE_HSL = /^hsl\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/;
const RE_HSLA = /^hsla\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/;
const {round} = Math;
const css2rgb = (css) => {
css = css.toLowerCase().trim();
let m;
if (input.format.named) {
try {
return input.format.named(css);
} catch (e) {
// eslint-disable-next-line
}
}
// rgb(250,20,0)
if ((m = css.match(RE_RGB))) {
const rgb = m.slice(1,4);
for (let i=0; i<3; i++) {
rgb[i] = +rgb[i];
}
rgb[3] = 1; // default alpha
return rgb;
}
// rgba(250,20,0,0.4)
if ((m = css.match(RE_RGBA))) {
const rgb = m.slice(1,5);
for (let i=0; i<4; i++) {
rgb[i] = +rgb[i]
}
return rgb;
}
// rgb(100%,0%,0%)
if ((m = css.match(RE_RGB_PCT))) {
const rgb = m.slice(1,4);
for (let i=0; i<3; i++) {
rgb[i] = round(rgb[i] * 2.55);
}
rgb[3] = 1; // default alpha
return rgb;
}
// rgba(100%,0%,0%,0.4)
if ((m = css.match(RE_RGBA_PCT))) {
const rgb = m.slice(1,5);
for (let i=0; i<3; i++) {
rgb[i] = round(rgb[i] * 2.55);
}
rgb[3] = +rgb[3];
return rgb;
}
// hsl(0,100%,50%)
if ((m = css.match(RE_HSL))) {
const hsl = m.slice(1,4);
hsl[1] *= 0.01;
hsl[2] *= 0.01;
const rgb = hsl2rgb(hsl);
rgb[3] = 1;
return rgb;
}
// hsla(0,100%,50%,0.5)
if ((m = css.match(RE_HSLA))) {
const hsl = m.slice(1,4);
hsl[1] *= 0.01;
hsl[2] *= 0.01;
const rgb = hsl2rgb(hsl);
rgb[3] = +m[4] // default alpha = 1
return rgb;
}
}
css2rgb.test = (s) => {
return RE_RGB.test(s) ||
RE_RGBA.test(s) ||
RE_RGB_PCT.test(s) ||
RE_RGBA_PCT.test(s) ||
RE_HSL.test(s) ||
RE_HSLA.test(s);
}
module.exports = css2rgb;