Color.js 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. var Class = require('./Class');
  2. var isStr = require('./isStr');
  3. var clamp = require('./clamp');
  4. var rgbToHsl = require('./rgbToHsl');
  5. var hslToRgb = require('./hslToRgb');
  6. var hex = require('./hex');
  7. exports = Class(
  8. {
  9. initialize: function Color(color) {
  10. if (isStr(color)) color = exports.parse(color);
  11. this.model = color.model;
  12. this.val = color.val;
  13. },
  14. toRgb: function() {
  15. var val = this.val;
  16. if (this.model === 'hsl') val = hslToRgb(val);
  17. var prefix = 'rgba';
  18. if (val[3] === 1) {
  19. prefix = 'rgb';
  20. val = val.slice(0, 3);
  21. }
  22. return prefix + '(' + val.join(', ') + ')';
  23. },
  24. toHex: function() {
  25. var val = this.val;
  26. if (this.model === 'hsl') val = hslToRgb(val);
  27. var ret = hex.encode(val.slice(0, 3));
  28. if (ret[0] === ret[1] && ret[2] === ret[3] && ret[4] === ret[5]) {
  29. ret = ret[0] + ret[2] + ret[5];
  30. }
  31. return '#' + ret;
  32. },
  33. toHsl: function() {
  34. var val = this.val;
  35. if (this.model === 'rgb') val = rgbToHsl(val);
  36. var prefix = 'hsla';
  37. if (val[3] === 1) {
  38. prefix = 'hsl';
  39. val = val.slice(0, 3);
  40. }
  41. val[1] = val[1] + '%';
  42. val[2] = val[2] + '%';
  43. return prefix + '(' + val.join(', ') + ')';
  44. }
  45. },
  46. {
  47. parse: function(colorStr) {
  48. var i, match;
  49. var val = [0, 0, 0, 1],
  50. model = 'rgb';
  51. if ((match = colorStr.match(regHexAbbr))) {
  52. match = match[1];
  53. for (i = 0; i < 3; i++) {
  54. val[i] = parseInt(match[i] + match[i], 16);
  55. }
  56. } else if ((match = colorStr.match(regHex))) {
  57. match = match[1];
  58. for (i = 0; i < 3; i++) {
  59. var i2 = i * 2;
  60. val[i] = parseInt(match.slice(i2, i2 + 2), 16);
  61. }
  62. } else if ((match = colorStr.match(regRgba))) {
  63. for (i = 0; i < 3; i++) {
  64. val[i] = parseInt(match[i + 1], 0);
  65. }
  66. if (match[4]) val[3] = parseFloat(match[4]);
  67. } else if ((match = colorStr.match(regRgbaPer))) {
  68. for (i = 0; i < 3; i++) {
  69. val[i] = Math.round(parseFloat(match[i + 1]) * 2.55);
  70. }
  71. if (match[4]) val[3] = parseFloat(match[4]);
  72. } else if ((match = colorStr.match(regHsla))) {
  73. model = 'hsl';
  74. val = [
  75. ((parseFloat(match[1]) % 360) + 360) % 360,
  76. clamp(parseFloat(match[2]), 0, 100),
  77. clamp(parseFloat(match[3]), 0, 100),
  78. clamp(parseFloat(match[4]), 0, 1)
  79. ];
  80. }
  81. return {
  82. val: val,
  83. model: model
  84. };
  85. }
  86. }
  87. );
  88. var regHexAbbr = /^#([a-fA-F0-9]{3})$/;
  89. var regHex = /^#([a-fA-F0-9]{6})$/;
  90. var regRgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d.]+)\s*)?\)$/;
  91. var regRgbaPer = /^rgba?\(\s*([+-]?[\d.]+)%\s*,\s*([+-]?[\d.]+)%\s*,\s*([+-]?[\d.]+)%\s*(?:,\s*([+-]?[\d.]+)\s*)?\)$/;
  92. var regHsla = /^hsla?\(\s*([+-]?\d*[.]?\d+)(?:deg)?\s*,\s*([+-]?[\d.]+)%\s*,\s*([+-]?[\d.]+)%\s*(?:,\s*([+-]?[\d.]+)\s*)?\)$/;
  93. module.exports = exports;