index.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. var convert = require('color-convert');
  2. module.exports = function (cstr) {
  3. var m, conv, parts, alpha;
  4. if (m = /^((?:rgb|hs[lv]|cmyk|xyz|lab)a?)\s*\(([^\)]*)\)/.exec(cstr)) {
  5. var name = m[1];
  6. var base = name.replace(/a$/, '');
  7. var size = base === 'cmyk' ? 4 : 3;
  8. conv = convert[base];
  9. parts = m[2].replace(/^\s+|\s+$/g, '')
  10. .split(/\s*,\s*/)
  11. .map(function (x, i) {
  12. if (/%$/.test(x) && i === size) {
  13. return parseFloat(x) / 100;
  14. }
  15. else if (/%$/.test(x)) {
  16. return parseFloat(x);
  17. }
  18. return parseFloat(x);
  19. })
  20. ;
  21. if (name === base) parts.push(1);
  22. alpha = parts[size] === undefined ? 1 : parts[size];
  23. parts = parts.slice(0, size);
  24. conv[base] = function () { return parts };
  25. }
  26. else if (/^#[A-Fa-f0-9]+$/.test(cstr)) {
  27. var base = cstr.replace(/^#/,'');
  28. var size = base.length;
  29. conv = convert.rgb;
  30. parts = base.split(size === 3 ? /(.)/ : /(..)/);
  31. parts = parts.filter(Boolean)
  32. .map(function (x) {
  33. if (size === 3) {
  34. return parseInt(x + x, 16);
  35. }
  36. else {
  37. return parseInt(x, 16)
  38. }
  39. })
  40. ;
  41. alpha = 1;
  42. conv.rgb = function () { return parts };
  43. if (!parts[0]) parts[0] = 0;
  44. if (!parts[1]) parts[1] = 0;
  45. if (!parts[2]) parts[2] = 0;
  46. }
  47. else {
  48. conv = convert.keyword;
  49. conv.keyword = function () { return cstr };
  50. parts = cstr;
  51. alpha = 1;
  52. }
  53. var res = {
  54. rgb: undefined,
  55. hsl: undefined,
  56. hsv: undefined,
  57. cmyk: undefined,
  58. keyword: undefined,
  59. hex: undefined
  60. };
  61. try { res.rgb = conv.rgb(parts) } catch (e) {}
  62. try { res.hsl = conv.hsl(parts) } catch (e) {}
  63. try { res.hsv = conv.hsv(parts) } catch (e) {}
  64. try { res.cmyk = conv.cmyk(parts) } catch (e) {}
  65. try { res.keyword = conv.keyword(parts) } catch (e) {}
  66. if (res.rgb) res.hex = '#' + res.rgb.map(function (x) {
  67. var s = x.toString(16);
  68. if (s.length === 1) return '0' + s;
  69. return s;
  70. }).join('');
  71. if (res.rgb) res.rgba = res.rgb.concat(alpha);
  72. if (res.hsl) res.hsla = res.hsl.concat(alpha);
  73. if (res.hsv) res.hsva = res.hsv.concat(alpha);
  74. if (res.cmyk) res.cmyka = res.cmyk.concat(alpha);
  75. return res;
  76. };