1- // borrow from https://github.com/princejwesley/is-css-color/blob/master/index.js
2- 'use strict' ;
3-
4- //every string I match against are lowercase
5- const HEX_PATTERN = / ^ # (?: [ a - f 0 - 9 ] { 3 } ) ? (?: [ a - f 0 - 9 ] { 3 } ) $ / ;
6- // css color names + initial + inherit + currentColor + transparent
7- const CSS_COLOR_NAMES = [
8- 'aliceblue' ,
9- 'antiquewhite' ,
10- 'aqua' ,
11- 'aquamarine' ,
12- 'azure' ,
13- 'beige' ,
14- 'bisque' ,
15- 'black' ,
16- 'blanchedalmond' ,
17- 'blue' ,
18- 'blueviolet' ,
19- 'brown' ,
20- 'burlywood' ,
21- 'cadetblue' ,
22- 'chartreuse' ,
23- 'chocolate' ,
24- 'coral' ,
25- 'cornflowerblue' ,
26- 'cornsilk' ,
27- 'crimson' ,
28- 'currentColor' ,
29- 'cyan' ,
30- 'darkblue' ,
31- 'darkcyan' ,
32- 'darkgoldenrod' ,
33- 'darkgray' ,
34- 'darkgreen' ,
35- 'darkgrey' ,
36- 'darkkhaki' ,
37- 'darkmagenta' ,
38- 'darkolivegreen' ,
39- 'darkorange' ,
40- 'darkorchid' ,
41- 'darkred' ,
42- 'darksalmon' ,
43- 'darkseagreen' ,
44- 'darkslateblue' ,
45- 'darkslategray' ,
46- 'darkslategrey' ,
47- 'darkturquoise' ,
48- 'darkviolet' ,
49- 'deeppink' ,
50- 'deepskyblue' ,
51- 'dimgray' ,
52- 'dimgrey' ,
53- 'dodgerblue' ,
54- 'firebrick' ,
55- 'floralwhite' ,
56- 'forestgreen' ,
57- 'fuchsia' ,
58- 'gainsboro' ,
59- 'ghostwhite' ,
60- 'gold' ,
61- 'goldenrod' ,
62- 'gray' ,
63- 'green' ,
64- 'greenyellow' ,
65- 'grey' ,
66- 'honeydew' ,
67- 'hotpink' ,
68- 'indianred' ,
69- 'indigo' ,
70- 'inherit' ,
71- 'initial' ,
72- 'ivory' ,
73- 'khaki' ,
74- 'lavender' ,
75- 'lavenderblush' ,
76- 'lawngreen' ,
77- 'lemonchiffon' ,
78- 'lightblue' ,
79- 'lightcoral' ,
80- 'lightcyan' ,
81- 'lightgoldenrodyellow' ,
82- 'lightgray' ,
83- 'lightgreen' ,
84- 'lightgrey' ,
85- 'lightpink' ,
86- 'lightsalmon' ,
87- 'lightseagreen' ,
88- 'lightskyblue' ,
89- 'lightslategray' ,
90- 'lightslategrey' ,
91- 'lightsteelblue' ,
92- 'lightyellow' ,
93- 'lime' ,
94- 'limegreen' ,
95- 'linen' ,
96- 'magenta' ,
97- 'maroon' ,
98- 'mediumaquamarine' ,
99- 'mediumblue' ,
100- 'mediumorchid' ,
101- 'mediumpurple' ,
102- 'mediumseagreen' ,
103- 'mediumslateblue' ,
104- 'mediumspringgreen' ,
105- 'mediumturquoise' ,
106- 'mediumvioletred' ,
107- 'midnightblue' ,
108- 'mintcream' ,
109- 'mistyrose' ,
110- 'moccasin' ,
111- 'navajowhite' ,
112- 'navy' ,
113- 'oldlace' ,
114- 'olive' ,
115- 'olivedrab' ,
116- 'orange' ,
117- 'orangered' ,
118- 'orchid' ,
119- 'palegoldenrod' ,
120- 'palegreen' ,
121- 'paleturquoise' ,
122- 'palevioletred' ,
123- 'papayawhip' ,
124- 'peachpuff' ,
125- 'peru' ,
126- 'pink' ,
127- 'plum' ,
128- 'powderblue' ,
129- 'purple' ,
130- 'rebeccapurple' ,
131- 'red' ,
132- 'rosybrown' ,
133- 'royalblue' ,
134- 'saddlebrown' ,
135- 'salmon' ,
136- 'sandybrown' ,
137- 'seagreen' ,
138- 'seashell' ,
139- 'sienna' ,
140- 'silver' ,
141- 'skyblue' ,
142- 'slateblue' ,
143- 'slategray' ,
144- 'slategrey' ,
145- 'snow' ,
146- 'springgreen' ,
147- 'steelblue' ,
148- 'tan' ,
149- 'teal' ,
150- 'thistle' ,
151- 'tomato' ,
152- 'transparent' ,
153- 'turquoise' ,
154- 'violet' ,
155- 'wheat' ,
156- 'white' ,
157- 'whitesmoke' ,
158- 'yellow' ,
159- 'yellowgreen' ,
160- ] ;
161-
162- const PREFIX = '^(rgb|hsl)(a?)\\s*\\(' ;
163- const VALUE = '\\s*([-+]?\\d+%?)\\s*' ;
164- const ALPHA = '(?:,\\s*([-+]?(?:(?:\\d+(?:.\\d+)?)|(?:.\\d+))\\s*))?' ;
165- const SUFFIX = '\\)$' ;
166- const RGB_HSL_PATTERN = new RegExp ( PREFIX + VALUE + ',' + VALUE + ',' + VALUE + ALPHA + SUFFIX ) ;
167-
168- const NUM_TYPE = 1 ;
169- const PERCENTAGE_TYPE = 2 ;
170- const ERROR_TYPE = NUM_TYPE & PERCENTAGE_TYPE ;
1+ import * as culori from 'culori' ;
1712
1723const isColor = ( str : string ) => {
173- function getColorType ( token : string ) {
174- return token . indexOf ( '%' ) !== - 1 ? PERCENTAGE_TYPE : NUM_TYPE ;
175- }
176-
177- if ( ! str || typeof str !== 'string' ) {
178- return false ;
179- }
180-
181- const color = str . replace ( / ^ \s + | \s + $ / g, '' ) . toLocaleLowerCase ( ) ;
182-
183- // named colors or hex code
184- if ( ( CSS_COLOR_NAMES . indexOf ( color ) !== - 1 ) || HEX_PATTERN . test ( color ) ) {
185- return true ;
186- }
187-
188- const result = color . match ( RGB_HSL_PATTERN ) ;
189- if ( result ) {
190- const flavor = result [ 1 ] ;
191- const alpha = result [ 2 ] ;
192- const rh = result [ 3 ] ;
193- const gs = result [ 4 ] ;
194- const bl = result [ 5 ] ;
195- const a = result [ 6 ] ;
196-
197- // alpha test
198- if ( ( alpha === 'a' && ! a ) || ( a && alpha === '' ) ) {
199- return false ;
200- }
201-
202- // hsl
203- if ( flavor === 'hsl' ) {
204- if ( getColorType ( rh ) !== NUM_TYPE ) {
205- return false ;
206- }
207- return ( getColorType ( gs ) & getColorType ( bl ) ) === PERCENTAGE_TYPE ;
208- }
209-
210- // rgb
211- return ( getColorType ( rh ) & getColorType ( gs ) & getColorType ( bl ) ) !== ERROR_TYPE ;
212- }
4+ const colorTemp = culori . parse ( str ) ;
2135
214- return false ;
6+ return ! ! colorTemp ;
2157} ;
2168
2179export default isColor ;
0 commit comments