| // HSL to RGB converter. Both methods adapted from: |
| // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript |
| |
| function hslToRgb(h, s, l) { |
| var r, g, b; |
| |
| // normalize hue orientation b/w 0 and 360 degrees |
| h = h % 360; |
| if (h < 0) |
| h += 360; |
| h = ~~h / 360; |
| |
| if (s < 0) |
| s = 0; |
| else if (s > 100) |
| s = 100; |
| s = ~~s / 100; |
| |
| if (l < 0) |
| l = 0; |
| else if (l > 100) |
| l = 100; |
| l = ~~l / 100; |
| |
| if (s === 0) { |
| r = g = b = l; // achromatic |
| } else { |
| var q = l < 0.5 ? |
| l * (1 + s) : |
| l + s - l * s; |
| var p = 2 * l - q; |
| r = hueToRgb(p, q, h + 1/3); |
| g = hueToRgb(p, q, h); |
| b = hueToRgb(p, q, h - 1/3); |
| } |
| |
| return [~~(r * 255), ~~(g * 255), ~~(b * 255)]; |
| } |
| |
| function hueToRgb(p, q, t) { |
| if (t < 0) t += 1; |
| if (t > 1) t -= 1; |
| if (t < 1/6) return p + (q - p) * 6 * t; |
| if (t < 1/2) return q; |
| if (t < 2/3) return p + (q - p) * (2/3 - t) * 6; |
| return p; |
| } |
| |
| function shortenHsl(hue, saturation, lightness) { |
| var asRgb = hslToRgb(hue, saturation, lightness); |
| var redAsHex = asRgb[0].toString(16); |
| var greenAsHex = asRgb[1].toString(16); |
| var blueAsHex = asRgb[2].toString(16); |
| |
| return '#' + |
| ((redAsHex.length == 1 ? '0' : '') + redAsHex) + |
| ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) + |
| ((blueAsHex.length == 1 ? '0' : '') + blueAsHex); |
| } |
| |
| module.exports = shortenHsl; |