UNPKG

5.82 kBJavaScriptView Raw
1/* MIT license */
2var colorNames = require('color-name');
3
4module.exports = {
5 getRgba: getRgba,
6 getHsla: getHsla,
7 getRgb: getRgb,
8 getHsl: getHsl,
9 getHwb: getHwb,
10 getAlpha: getAlpha,
11
12 hexString: hexString,
13 rgbString: rgbString,
14 rgbaString: rgbaString,
15 percentString: percentString,
16 percentaString: percentaString,
17 hslString: hslString,
18 hslaString: hslaString,
19 hwbString: hwbString,
20 keyword: keyword
21}
22
23function getRgba(string) {
24 if (!string) {
25 return;
26 }
27 var abbr = /^#([a-fA-F0-9]{3})$/,
28 hex = /^#([a-fA-F0-9]{6})$/,
29 rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,
30 per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,
31 keyword = /(\D+)/;
32
33 var rgb = [0, 0, 0],
34 a = 1,
35 match = string.match(abbr);
36 if (match) {
37 match = match[1];
38 for (var i = 0; i < rgb.length; i++) {
39 rgb[i] = parseInt(match[i] + match[i], 16);
40 }
41 }
42 else if (match = string.match(hex)) {
43 match = match[1];
44 for (var i = 0; i < rgb.length; i++) {
45 rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);
46 }
47 }
48 else if (match = string.match(rgba)) {
49 for (var i = 0; i < rgb.length; i++) {
50 rgb[i] = parseInt(match[i + 1]);
51 }
52 a = parseFloat(match[4]);
53 }
54 else if (match = string.match(per)) {
55 for (var i = 0; i < rgb.length; i++) {
56 rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);
57 }
58 a = parseFloat(match[4]);
59 }
60 else if (match = string.match(keyword)) {
61 if (match[1] == "transparent") {
62 return [0, 0, 0, 0];
63 }
64 rgb = colorNames[match[1]];
65 if (!rgb) {
66 return;
67 }
68 }
69
70 for (var i = 0; i < rgb.length; i++) {
71 rgb[i] = scale(rgb[i], 0, 255);
72 }
73 if (!a && a != 0) {
74 a = 1;
75 }
76 else {
77 a = scale(a, 0, 1);
78 }
79 rgb[3] = a;
80 return rgb;
81}
82
83function getHsla(string) {
84 if (!string) {
85 return;
86 }
87 var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
88 var match = string.match(hsl);
89 if (match) {
90 var alpha = parseFloat(match[4]);
91 var h = scale(parseInt(match[1]), 0, 360),
92 s = scale(parseFloat(match[2]), 0, 100),
93 l = scale(parseFloat(match[3]), 0, 100),
94 a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
95 return [h, s, l, a];
96 }
97}
98
99function getHwb(string) {
100 if (!string) {
101 return;
102 }
103 var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
104 var match = string.match(hwb);
105 if (match) {
106 var alpha = parseFloat(match[4]);
107 var h = scale(parseInt(match[1]), 0, 360),
108 w = scale(parseFloat(match[2]), 0, 100),
109 b = scale(parseFloat(match[3]), 0, 100),
110 a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
111 return [h, w, b, a];
112 }
113}
114
115function getRgb(string) {
116 var rgba = getRgba(string);
117 return rgba && rgba.slice(0, 3);
118}
119
120function getHsl(string) {
121 var hsla = getHsla(string);
122 return hsla && hsla.slice(0, 3);
123}
124
125function getAlpha(string) {
126 var vals = getRgba(string);
127 if (vals) {
128 return vals[3];
129 }
130 else if (vals = getHsla(string)) {
131 return vals[3];
132 }
133 else if (vals = getHwb(string)) {
134 return vals[3];
135 }
136}
137
138// generators
139function hexString(rgb) {
140 return "#" + hexDouble(rgb[0]) + hexDouble(rgb[1])
141 + hexDouble(rgb[2]);
142}
143
144function rgbString(rgba, alpha) {
145 if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
146 return rgbaString(rgba, alpha);
147 }
148 return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")";
149}
150
151function rgbaString(rgba, alpha) {
152 if (alpha === undefined) {
153 alpha = (rgba[3] !== undefined ? rgba[3] : 1);
154 }
155 return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2]
156 + ", " + alpha + ")";
157}
158
159function percentString(rgba, alpha) {
160 if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
161 return percentaString(rgba, alpha);
162 }
163 var r = Math.round(rgba[0]/255 * 100),
164 g = Math.round(rgba[1]/255 * 100),
165 b = Math.round(rgba[2]/255 * 100);
166
167 return "rgb(" + r + "%, " + g + "%, " + b + "%)";
168}
169
170function percentaString(rgba, alpha) {
171 var r = Math.round(rgba[0]/255 * 100),
172 g = Math.round(rgba[1]/255 * 100),
173 b = Math.round(rgba[2]/255 * 100);
174 return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")";
175}
176
177function hslString(hsla, alpha) {
178 if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {
179 return hslaString(hsla, alpha);
180 }
181 return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)";
182}
183
184function hslaString(hsla, alpha) {
185 if (alpha === undefined) {
186 alpha = (hsla[3] !== undefined ? hsla[3] : 1);
187 }
188 return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, "
189 + alpha + ")";
190}
191
192// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax
193// (hwb have alpha optional & 1 is default value)
194function hwbString(hwb, alpha) {
195 if (alpha === undefined) {
196 alpha = (hwb[3] !== undefined ? hwb[3] : 1);
197 }
198 return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%"
199 + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")";
200}
201
202function keyword(rgb) {
203 return reverseNames[rgb.slice(0, 3)];
204}
205
206// helpers
207function scale(num, min, max) {
208 return Math.min(Math.max(min, num), max);
209}
210
211function hexDouble(num) {
212 var str = num.toString(16).toUpperCase();
213 return (str.length < 2) ? "0" + str : str;
214}
215
216
217//create a list of reverse color names
218var reverseNames = {};
219for (var name in colorNames) {
220 reverseNames[colorNames[name]] = name;
221}