1 |
|
2 | var colorNames = require('color-name');
|
3 |
|
4 | module.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 |
|
23 | function 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 |
|
83 | function 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 |
|
99 | function 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 |
|
115 | function getRgb(string) {
|
116 | var rgba = getRgba(string);
|
117 | return rgba && rgba.slice(0, 3);
|
118 | }
|
119 |
|
120 | function getHsl(string) {
|
121 | var hsla = getHsla(string);
|
122 | return hsla && hsla.slice(0, 3);
|
123 | }
|
124 |
|
125 | function 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 |
|
139 | function hexString(rgb) {
|
140 | return "#" + hexDouble(rgb[0]) + hexDouble(rgb[1])
|
141 | + hexDouble(rgb[2]);
|
142 | }
|
143 |
|
144 | function 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 |
|
151 | function 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 |
|
159 | function 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 |
|
170 | function 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 |
|
177 | function 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 |
|
184 | function 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 |
|
193 |
|
194 | function 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 |
|
202 | function keyword(rgb) {
|
203 | return reverseNames[rgb.slice(0, 3)];
|
204 | }
|
205 |
|
206 |
|
207 | function scale(num, min, max) {
|
208 | return Math.min(Math.max(min, num), max);
|
209 | }
|
210 |
|
211 | function hexDouble(num) {
|
212 | var str = num.toString(16).toUpperCase();
|
213 | return (str.length < 2) ? "0" + str : str;
|
214 | }
|
215 |
|
216 |
|
217 |
|
218 | var reverseNames = {};
|
219 | for (var name in colorNames) {
|
220 | reverseNames[colorNames[name]] = name;
|
221 | }
|