Skip to content

Commit eda4c70

Browse files
authored
Merge pull request #67 from vunguyentuan/52-support-for-color-functional-notation
52 support for color functional notation
2 parents daaa9f9 + 3c3030f commit eda4c70

File tree

3 files changed

+13
-217
lines changed

3 files changed

+13
-217
lines changed

packages/css-variables-language-server/src/CSSVariableManager.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,10 @@ export default class CSSVariableManager {
137137
},
138138
};
139139

140-
if (isColor(decl.value)) {
141-
const culoriColor = culori.parse(decl.value);
142-
if (culoriColor) {
143-
variable.color = culoriColorToVscodeColor(culoriColor);
144-
}
140+
const culoriColor = culori.parse(decl.value);
141+
142+
if (culoriColor) {
143+
variable.color = culoriColorToVscodeColor(culoriColor);
145144
}
146145

147146
// add to cache

packages/css-variables-language-server/src/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { indexToPosition } from './utils/indexToPosition';
2222
import { getCurrentWord } from './utils/getCurrentWord';
2323
import { isInFunctionExpression } from './utils/isInFunctionExpression';
2424
import CSSVariableManager, { CSSVariablesSettings, defaultSettings } from './CSSVariableManager';
25+
import { formatHex } from 'culori';
2526

2627
// Create a connection for the server, using Node's IPC as a transport.
2728
// Also include all preview / proposed LSP features.
@@ -199,6 +200,11 @@ connection.onCompletion(
199200
sortText: 'z',
200201
};
201202

203+
if (isColor(varSymbol.value)) {
204+
// convert to hex code
205+
completion.documentation = formatHex(varSymbol.value);
206+
}
207+
202208
if (isFunctionCall) {
203209
completion.detail = varSymbol.value;
204210
}
@@ -278,7 +284,6 @@ connection.onHover((params) => {
278284
if (cssVariable) {
279285
return {
280286
contents: cssVariable.symbol.value,
281-
range: cssVariable.definition.range,
282287
} as Hover;
283288
}
284289

Lines changed: 3 additions & 211 deletions
Original file line numberDiff line numberDiff line change
@@ -1,217 +1,9 @@
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-f0-9]{3})?(?:[a-f0-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

1723
const 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

2179
export default isColor;

0 commit comments

Comments
 (0)