1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- var convert = require('color-convert');
- module.exports = function (cstr) {
- var m, conv, parts, alpha;
- if (m = /^((?:rgb|hs[lv]|cmyk|xyz|lab)a?)\s*\(([^\)]*)\)/.exec(cstr)) {
- var name = m[1];
- var base = name.replace(/a$/, '');
- var size = base === 'cmyk' ? 4 : 3;
- conv = convert[base];
-
- parts = m[2].replace(/^\s+|\s+$/g, '')
- .split(/\s*,\s*/)
- .map(function (x, i) {
- if (/%$/.test(x) && i === size) {
- return parseFloat(x) / 100;
- }
- else if (/%$/.test(x)) {
- return parseFloat(x);
- }
- return parseFloat(x);
- })
- ;
- if (name === base) parts.push(1);
- alpha = parts[size] === undefined ? 1 : parts[size];
- parts = parts.slice(0, size);
-
- conv[base] = function () { return parts };
- }
- else if (/^#[A-Fa-f0-9]+$/.test(cstr)) {
- var base = cstr.replace(/^#/,'');
- var size = base.length;
- conv = convert.rgb;
- parts = base.split(size === 3 ? /(.)/ : /(..)/);
- parts = parts.filter(Boolean)
- .map(function (x) {
- if (size === 3) {
- return parseInt(x + x, 16);
- }
- else {
- return parseInt(x, 16)
- }
- })
- ;
- alpha = 1;
- conv.rgb = function () { return parts };
- if (!parts[0]) parts[0] = 0;
- if (!parts[1]) parts[1] = 0;
- if (!parts[2]) parts[2] = 0;
- }
- else {
- conv = convert.keyword;
- conv.keyword = function () { return cstr };
- parts = cstr;
- alpha = 1;
- }
-
- var res = {
- rgb: undefined,
- hsl: undefined,
- hsv: undefined,
- cmyk: undefined,
- keyword: undefined,
- hex: undefined
- };
- try { res.rgb = conv.rgb(parts) } catch (e) {}
- try { res.hsl = conv.hsl(parts) } catch (e) {}
- try { res.hsv = conv.hsv(parts) } catch (e) {}
- try { res.cmyk = conv.cmyk(parts) } catch (e) {}
- try { res.keyword = conv.keyword(parts) } catch (e) {}
-
- if (res.rgb) res.hex = '#' + res.rgb.map(function (x) {
- var s = x.toString(16);
- if (s.length === 1) return '0' + s;
- return s;
- }).join('');
-
- if (res.rgb) res.rgba = res.rgb.concat(alpha);
- if (res.hsl) res.hsla = res.hsl.concat(alpha);
- if (res.hsv) res.hsva = res.hsv.concat(alpha);
- if (res.cmyk) res.cmyka = res.cmyk.concat(alpha);
-
- return res;
- };
|