@tbela99/css-parser 0.9.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +265 -0
- package/LICENSE.md +1 -1
- package/README.md +29 -17
- package/dist/index-umd-web.js +7461 -4360
- package/dist/index.cjs +8608 -5507
- package/dist/index.d.ts +203 -61
- package/dist/lib/ast/expand.js +2 -1
- package/dist/lib/ast/features/calc.js +19 -11
- package/dist/lib/ast/features/index.js +1 -0
- package/dist/lib/ast/features/inlinecssvariables.js +47 -29
- package/dist/lib/ast/features/prefix.js +117 -91
- package/dist/lib/ast/features/shorthand.js +34 -14
- package/dist/lib/ast/features/transform.js +67 -0
- package/dist/lib/ast/features/type.js +7 -0
- package/dist/lib/ast/math/expression.js +20 -10
- package/dist/lib/ast/math/math.js +20 -2
- package/dist/lib/ast/minify.js +209 -80
- package/dist/lib/ast/transform/compute.js +337 -0
- package/dist/lib/ast/transform/convert.js +33 -0
- package/dist/lib/ast/transform/matrix.js +112 -0
- package/dist/lib/ast/transform/minify.js +296 -0
- package/dist/lib/ast/transform/perspective.js +10 -0
- package/dist/lib/ast/transform/rotate.js +40 -0
- package/dist/lib/ast/transform/scale.js +32 -0
- package/dist/lib/ast/transform/skew.js +23 -0
- package/dist/lib/ast/transform/translate.js +32 -0
- package/dist/lib/ast/transform/utils.js +198 -0
- package/dist/lib/ast/types.js +18 -15
- package/dist/lib/ast/walk.js +54 -22
- package/dist/lib/fs/resolve.js +10 -0
- package/dist/lib/parser/declaration/list.js +48 -45
- package/dist/lib/parser/declaration/map.js +1 -0
- package/dist/lib/parser/declaration/set.js +2 -1
- package/dist/lib/parser/parse.js +449 -340
- package/dist/lib/parser/tokenize.js +147 -72
- package/dist/lib/parser/utils/declaration.js +5 -4
- package/dist/lib/parser/utils/type.js +2 -1
- package/dist/lib/renderer/color/a98rgb.js +2 -1
- package/dist/lib/renderer/color/{colormix.js → color-mix.js} +16 -7
- package/dist/lib/renderer/color/color.js +264 -170
- package/dist/lib/renderer/color/hex.js +19 -8
- package/dist/lib/renderer/color/hsl.js +9 -3
- package/dist/lib/renderer/color/hwb.js +2 -1
- package/dist/lib/renderer/color/lab.js +10 -1
- package/dist/lib/renderer/color/lch.js +10 -1
- package/dist/lib/renderer/color/oklab.js +10 -1
- package/dist/lib/renderer/color/oklch.js +10 -1
- package/dist/lib/renderer/color/p3.js +2 -1
- package/dist/lib/renderer/color/rec2020.js +2 -1
- package/dist/lib/renderer/color/relativecolor.js +27 -32
- package/dist/lib/renderer/color/rgb.js +14 -10
- package/dist/lib/renderer/color/srgb.js +48 -23
- package/dist/lib/renderer/color/utils/components.js +18 -6
- package/dist/lib/renderer/color/utils/constants.js +47 -3
- package/dist/lib/renderer/color/xyz.js +2 -1
- package/dist/lib/renderer/color/xyzd50.js +2 -1
- package/dist/lib/renderer/render.js +108 -43
- package/dist/lib/syntax/syntax.js +267 -136
- package/dist/lib/validation/at-rules/container.js +81 -103
- package/dist/lib/validation/at-rules/counter-style.js +9 -8
- package/dist/lib/validation/at-rules/custom-media.js +13 -15
- package/dist/lib/validation/at-rules/document.js +22 -27
- package/dist/lib/validation/at-rules/font-feature-values.js +8 -8
- package/dist/lib/validation/at-rules/import.js +30 -81
- package/dist/lib/validation/at-rules/keyframes.js +19 -23
- package/dist/lib/validation/at-rules/layer.js +5 -5
- package/dist/lib/validation/at-rules/media.js +42 -53
- package/dist/lib/validation/at-rules/namespace.js +19 -23
- package/dist/lib/validation/at-rules/page-margin-box.js +15 -18
- package/dist/lib/validation/at-rules/page.js +8 -7
- package/dist/lib/validation/at-rules/supports.js +73 -82
- package/dist/lib/validation/at-rules/when.js +32 -36
- package/dist/lib/validation/atrule.js +15 -18
- package/dist/lib/validation/config.js +24 -1
- package/dist/lib/validation/config.json.js +563 -63
- package/dist/lib/validation/parser/parse.js +196 -185
- package/dist/lib/validation/parser/types.js +1 -1
- package/dist/lib/validation/selector.js +8 -5
- package/dist/lib/validation/syntax.js +724 -1405
- package/dist/lib/validation/syntaxes/complex-selector-list.js +10 -11
- package/dist/lib/validation/syntaxes/complex-selector.js +10 -11
- package/dist/lib/validation/syntaxes/compound-selector.js +40 -50
- package/dist/lib/validation/syntaxes/family-name.js +9 -8
- package/dist/lib/validation/syntaxes/keyframe-block-list.js +6 -5
- package/dist/lib/validation/syntaxes/keyframe-selector.js +23 -105
- package/dist/lib/validation/syntaxes/layer-name.js +6 -5
- package/dist/lib/validation/syntaxes/relative-selector-list.js +7 -6
- package/dist/lib/validation/syntaxes/relative-selector.js +17 -15
- package/dist/lib/validation/syntaxes/url.js +18 -22
- package/dist/lib/validation/utils/list.js +20 -2
- package/dist/lib/validation/utils/whitespace.js +2 -1
- package/dist/node/index.js +4 -2
- package/dist/node/load.js +6 -1
- package/dist/web/index.js +4 -2
- package/dist/web/load.js +5 -0
- package/package.json +16 -15
- package/dist/lib/renderer/color/prophotoRgb.js +0 -56
- package/dist/lib/validation/declaration.js +0 -94
- package/dist/lib/validation/syntaxes/image.js +0 -29
|
@@ -2,11 +2,42 @@ import { EnumToken } from '../ast/types.js';
|
|
|
2
2
|
import '../ast/minify.js';
|
|
3
3
|
import '../ast/walk.js';
|
|
4
4
|
import './parse.js';
|
|
5
|
-
import { isWhiteSpace, isNewLine, isDigit, isNonPrintable } from '../syntax/syntax.js';
|
|
6
5
|
import './utils/config.js';
|
|
6
|
+
import { isWhiteSpace, isIdentStart, isIdent, isNewLine, isDigit, isNonPrintable } from '../syntax/syntax.js';
|
|
7
7
|
import '../renderer/color/utils/constants.js';
|
|
8
8
|
import '../renderer/sourcemap/lib/encode.js';
|
|
9
9
|
|
|
10
|
+
var TokenMap;
|
|
11
|
+
(function (TokenMap) {
|
|
12
|
+
TokenMap[TokenMap["SLASH"] = 47] = "SLASH";
|
|
13
|
+
TokenMap[TokenMap["AMPERSAND"] = 38] = "AMPERSAND";
|
|
14
|
+
TokenMap[TokenMap["LOWERTHAN"] = 60] = "LOWERTHAN";
|
|
15
|
+
TokenMap[TokenMap["HASH"] = 35] = "HASH";
|
|
16
|
+
TokenMap[TokenMap["REVERSE_SOLIDUS"] = 92] = "REVERSE_SOLIDUS";
|
|
17
|
+
TokenMap[TokenMap["DOUBLE_QUOTE"] = 34] = "DOUBLE_QUOTE";
|
|
18
|
+
TokenMap[TokenMap["SINGLE_QUOTE"] = 39] = "SINGLE_QUOTE";
|
|
19
|
+
// ^
|
|
20
|
+
TokenMap[TokenMap["CIRCUMFLEX"] = 94] = "CIRCUMFLEX";
|
|
21
|
+
TokenMap[TokenMap["TILDA"] = 126] = "TILDA";
|
|
22
|
+
TokenMap[TokenMap["PIPE"] = 124] = "PIPE";
|
|
23
|
+
TokenMap[TokenMap["DOLLAR"] = 36] = "DOLLAR";
|
|
24
|
+
TokenMap[TokenMap["GREATER_THAN"] = 62] = "GREATER_THAN";
|
|
25
|
+
TokenMap[TokenMap["DOT"] = 46] = "DOT";
|
|
26
|
+
TokenMap[TokenMap["PLUS"] = 43] = "PLUS";
|
|
27
|
+
TokenMap[TokenMap["STAR"] = 42] = "STAR";
|
|
28
|
+
TokenMap[TokenMap["COLON"] = 58] = "COLON";
|
|
29
|
+
TokenMap[TokenMap["COMMA"] = 44] = "COMMA";
|
|
30
|
+
TokenMap[TokenMap["EQUAL"] = 61] = "EQUAL";
|
|
31
|
+
TokenMap[TokenMap["CLOSE_PAREN"] = 41] = "CLOSE_PAREN";
|
|
32
|
+
TokenMap[TokenMap["OPEN_PAREN"] = 40] = "OPEN_PAREN";
|
|
33
|
+
TokenMap[TokenMap["OPEN_BRACKET"] = 91] = "OPEN_BRACKET";
|
|
34
|
+
TokenMap[TokenMap["CLOSE_BRACKET"] = 93] = "CLOSE_BRACKET";
|
|
35
|
+
TokenMap[TokenMap["OPEN_CURLY_BRACE"] = 123] = "OPEN_CURLY_BRACE";
|
|
36
|
+
TokenMap[TokenMap["CLOSE_CURLY_BRACE"] = 125] = "CLOSE_CURLY_BRACE";
|
|
37
|
+
TokenMap[TokenMap["SEMICOLON"] = 59] = "SEMICOLON";
|
|
38
|
+
TokenMap[TokenMap["EXCLAMATION"] = 33] = "EXCLAMATION";
|
|
39
|
+
TokenMap[TokenMap["AT"] = 64] = "AT";
|
|
40
|
+
})(TokenMap || (TokenMap = {}));
|
|
10
41
|
function consumeWhiteSpace(parseInfo) {
|
|
11
42
|
let count = 0;
|
|
12
43
|
while (isWhiteSpace(parseInfo.stream.charAt(count + parseInfo.currentPosition.ind + 1).charCodeAt(0))) {
|
|
@@ -18,14 +49,18 @@ function consumeWhiteSpace(parseInfo) {
|
|
|
18
49
|
function pushToken(token, parseInfo, hint) {
|
|
19
50
|
const result = {
|
|
20
51
|
token,
|
|
21
|
-
len: parseInfo.currentPosition.ind - parseInfo.position.ind,
|
|
52
|
+
len: parseInfo.currentPosition.ind - parseInfo.position.ind - 1,
|
|
22
53
|
hint,
|
|
23
|
-
|
|
54
|
+
sta: { ...parseInfo.position },
|
|
55
|
+
end: { ...parseInfo.currentPosition },
|
|
24
56
|
bytesIn: parseInfo.currentPosition.ind + 1
|
|
25
57
|
};
|
|
26
58
|
parseInfo.position.ind = parseInfo.currentPosition.ind;
|
|
27
59
|
parseInfo.position.lin = parseInfo.currentPosition.lin;
|
|
28
60
|
parseInfo.position.col = Math.max(parseInfo.currentPosition.col, 1);
|
|
61
|
+
if (result.end.col == 0) {
|
|
62
|
+
result.end.col = 1;
|
|
63
|
+
}
|
|
29
64
|
return result;
|
|
30
65
|
}
|
|
31
66
|
function* consumeString(quoteStr, buffer, parseInfo) {
|
|
@@ -108,6 +143,9 @@ function* consumeString(quoteStr, buffer, parseInfo) {
|
|
|
108
143
|
yield pushToken(buffer + quote, parseInfo, EnumToken.StringTokenType);
|
|
109
144
|
}
|
|
110
145
|
}
|
|
146
|
+
function match(parseInfo, input) {
|
|
147
|
+
return parseInfo.stream.slice(parseInfo.currentPosition.ind + 1, parseInfo.currentPosition.ind + input.length + 1) == input;
|
|
148
|
+
}
|
|
111
149
|
function peek(parseInfo, count = 1) {
|
|
112
150
|
if (count == 1) {
|
|
113
151
|
return parseInfo.stream.charAt(parseInfo.currentPosition.ind + 1);
|
|
@@ -154,37 +192,40 @@ function* tokenize(stream) {
|
|
|
154
192
|
};
|
|
155
193
|
let value;
|
|
156
194
|
let buffer = '';
|
|
195
|
+
let charCode;
|
|
157
196
|
while (value = next(parseInfo)) {
|
|
158
|
-
|
|
197
|
+
charCode = value.charCodeAt(0);
|
|
198
|
+
if (isWhiteSpace(charCode)) {
|
|
159
199
|
if (buffer.length > 0) {
|
|
160
200
|
yield pushToken(buffer, parseInfo);
|
|
161
201
|
buffer = '';
|
|
162
202
|
}
|
|
163
203
|
while (value = next(parseInfo)) {
|
|
164
|
-
|
|
204
|
+
charCode = value.charCodeAt(0);
|
|
205
|
+
if (!isWhiteSpace(charCode)) {
|
|
165
206
|
break;
|
|
166
207
|
}
|
|
167
208
|
}
|
|
168
209
|
yield pushToken('', parseInfo, EnumToken.WhitespaceTokenType);
|
|
169
210
|
buffer = '';
|
|
170
211
|
}
|
|
171
|
-
switch (
|
|
172
|
-
case
|
|
212
|
+
switch (charCode) {
|
|
213
|
+
case 47 /* TokenMap.SLASH */:
|
|
173
214
|
if (buffer.length > 0) {
|
|
174
215
|
yield pushToken(buffer, parseInfo);
|
|
175
216
|
buffer = '';
|
|
176
|
-
if (
|
|
217
|
+
if (!match(parseInfo, '*')) {
|
|
177
218
|
yield pushToken(value, parseInfo);
|
|
178
219
|
break;
|
|
179
220
|
}
|
|
180
221
|
}
|
|
181
222
|
buffer += value;
|
|
182
|
-
if (
|
|
223
|
+
if (match(parseInfo, '*')) {
|
|
183
224
|
buffer += next(parseInfo);
|
|
184
225
|
while (value = next(parseInfo)) {
|
|
185
226
|
if (value == '*') {
|
|
186
227
|
buffer += value;
|
|
187
|
-
if (
|
|
228
|
+
if (match(parseInfo, '/')) {
|
|
188
229
|
yield pushToken(buffer + next(parseInfo), parseInfo, EnumToken.CommentTokenType);
|
|
189
230
|
buffer = '';
|
|
190
231
|
break;
|
|
@@ -200,29 +241,29 @@ function* tokenize(stream) {
|
|
|
200
241
|
}
|
|
201
242
|
}
|
|
202
243
|
break;
|
|
203
|
-
case
|
|
244
|
+
case 38 /* TokenMap.AMPERSAND */:
|
|
204
245
|
if (buffer.length > 0) {
|
|
205
246
|
yield pushToken(buffer, parseInfo);
|
|
206
247
|
buffer = '';
|
|
207
248
|
}
|
|
208
249
|
yield pushToken(value, parseInfo);
|
|
209
250
|
break;
|
|
210
|
-
case
|
|
251
|
+
case 60 /* TokenMap.LOWERTHAN */:
|
|
211
252
|
if (buffer.length > 0) {
|
|
212
253
|
yield pushToken(buffer, parseInfo);
|
|
213
254
|
buffer = '';
|
|
214
255
|
}
|
|
215
|
-
if (
|
|
256
|
+
if (match(parseInfo, '=')) {
|
|
216
257
|
yield pushToken('', parseInfo, EnumToken.LteTokenType);
|
|
217
258
|
next(parseInfo);
|
|
218
259
|
break;
|
|
219
260
|
}
|
|
220
261
|
buffer += value;
|
|
221
|
-
if (
|
|
262
|
+
if (match(parseInfo, '!--')) {
|
|
222
263
|
buffer += next(parseInfo, 3);
|
|
223
264
|
while (value = next(parseInfo)) {
|
|
224
265
|
buffer += value;
|
|
225
|
-
if (value == '-' &&
|
|
266
|
+
if (value == '-' && match(parseInfo, '->')) {
|
|
226
267
|
break;
|
|
227
268
|
}
|
|
228
269
|
}
|
|
@@ -235,14 +276,14 @@ function* tokenize(stream) {
|
|
|
235
276
|
buffer = '';
|
|
236
277
|
}
|
|
237
278
|
break;
|
|
238
|
-
case
|
|
279
|
+
case 35 /* TokenMap.HASH */:
|
|
239
280
|
if (buffer.length > 0) {
|
|
240
281
|
yield pushToken(buffer, parseInfo);
|
|
241
282
|
buffer = '';
|
|
242
283
|
}
|
|
243
284
|
buffer += value;
|
|
244
285
|
break;
|
|
245
|
-
case
|
|
286
|
+
case 92 /* TokenMap.REVERSE_SOLIDUS */:
|
|
246
287
|
// EOF
|
|
247
288
|
if (!(value = next(parseInfo))) {
|
|
248
289
|
// end of stream ignore \\
|
|
@@ -254,25 +295,25 @@ function* tokenize(stream) {
|
|
|
254
295
|
}
|
|
255
296
|
buffer += prev(parseInfo) + value;
|
|
256
297
|
break;
|
|
257
|
-
case
|
|
258
|
-
case
|
|
298
|
+
case 39 /* TokenMap.SINGLE_QUOTE */:
|
|
299
|
+
case 34 /* TokenMap.DOUBLE_QUOTE */:
|
|
259
300
|
yield* consumeString(value, buffer, parseInfo);
|
|
260
301
|
buffer = '';
|
|
261
302
|
break;
|
|
262
|
-
case
|
|
263
|
-
case
|
|
264
|
-
case
|
|
265
|
-
case
|
|
303
|
+
case 94 /* TokenMap.CIRCUMFLEX */:
|
|
304
|
+
case 126 /* TokenMap.TILDA */:
|
|
305
|
+
case 124 /* TokenMap.PIPE */:
|
|
306
|
+
case 36 /* TokenMap.DOLLAR */:
|
|
266
307
|
if (buffer.length > 0) {
|
|
267
308
|
yield pushToken(buffer, parseInfo);
|
|
268
309
|
buffer = '';
|
|
269
310
|
}
|
|
270
|
-
if (
|
|
271
|
-
if (
|
|
311
|
+
if (charCode == 124 /* TokenMap.PIPE */) {
|
|
312
|
+
if (match(parseInfo, '|')) {
|
|
272
313
|
next(parseInfo);
|
|
273
314
|
yield pushToken('', parseInfo, EnumToken.ColumnCombinatorTokenType);
|
|
274
315
|
}
|
|
275
|
-
else if (
|
|
316
|
+
else if (match(parseInfo, '=')) {
|
|
276
317
|
buffer += next(parseInfo);
|
|
277
318
|
yield pushToken(buffer, parseInfo);
|
|
278
319
|
}
|
|
@@ -280,7 +321,7 @@ function* tokenize(stream) {
|
|
|
280
321
|
yield pushToken('|', parseInfo);
|
|
281
322
|
}
|
|
282
323
|
buffer = '';
|
|
283
|
-
|
|
324
|
+
continue;
|
|
284
325
|
}
|
|
285
326
|
if (buffer.length > 0) {
|
|
286
327
|
yield pushToken(buffer, parseInfo);
|
|
@@ -296,19 +337,19 @@ function* tokenize(stream) {
|
|
|
296
337
|
// ^=
|
|
297
338
|
// $=
|
|
298
339
|
// |=
|
|
299
|
-
if (
|
|
340
|
+
if (match(parseInfo, '=')) {
|
|
300
341
|
next(parseInfo);
|
|
301
|
-
switch (buffer.
|
|
302
|
-
case
|
|
342
|
+
switch (buffer.charCodeAt(0)) {
|
|
343
|
+
case 126 /* TokenMap.TILDA */:
|
|
303
344
|
yield pushToken(buffer, parseInfo, EnumToken.IncludeMatchTokenType);
|
|
304
345
|
break;
|
|
305
|
-
case
|
|
346
|
+
case 94 /* TokenMap.CIRCUMFLEX */:
|
|
306
347
|
yield pushToken(buffer, parseInfo, EnumToken.StartMatchTokenType);
|
|
307
348
|
break;
|
|
308
|
-
case
|
|
349
|
+
case 36 /* TokenMap.DOLLAR */:
|
|
309
350
|
yield pushToken(buffer, parseInfo, EnumToken.EndMatchTokenType);
|
|
310
351
|
break;
|
|
311
|
-
case
|
|
352
|
+
case 124 /* TokenMap.PIPE */:
|
|
312
353
|
yield pushToken(buffer, parseInfo, EnumToken.DashMatchTokenType);
|
|
313
354
|
break;
|
|
314
355
|
}
|
|
@@ -318,12 +359,12 @@ function* tokenize(stream) {
|
|
|
318
359
|
yield pushToken(buffer, parseInfo);
|
|
319
360
|
buffer = '';
|
|
320
361
|
break;
|
|
321
|
-
case
|
|
362
|
+
case 62 /* TokenMap.GREATER_THAN */:
|
|
322
363
|
if (buffer !== '') {
|
|
323
364
|
yield pushToken(buffer, parseInfo);
|
|
324
365
|
buffer = '';
|
|
325
366
|
}
|
|
326
|
-
if (
|
|
367
|
+
if (match(parseInfo, '=')) {
|
|
327
368
|
yield pushToken('', parseInfo, EnumToken.GteTokenType);
|
|
328
369
|
next(parseInfo);
|
|
329
370
|
}
|
|
@@ -332,7 +373,7 @@ function* tokenize(stream) {
|
|
|
332
373
|
}
|
|
333
374
|
consumeWhiteSpace(parseInfo);
|
|
334
375
|
break;
|
|
335
|
-
case
|
|
376
|
+
case 46 /* TokenMap.DOT */:
|
|
336
377
|
const codepoint = peek(parseInfo).charCodeAt(0);
|
|
337
378
|
if (!isDigit(codepoint) && buffer !== '') {
|
|
338
379
|
yield pushToken(buffer, parseInfo);
|
|
@@ -341,11 +382,11 @@ function* tokenize(stream) {
|
|
|
341
382
|
}
|
|
342
383
|
buffer += value;
|
|
343
384
|
break;
|
|
344
|
-
case
|
|
345
|
-
case
|
|
346
|
-
case
|
|
347
|
-
case
|
|
348
|
-
case
|
|
385
|
+
case 58 /* TokenMap.COLON */:
|
|
386
|
+
case 43 /* TokenMap.PLUS */:
|
|
387
|
+
case 42 /* TokenMap.STAR */:
|
|
388
|
+
case 44 /* TokenMap.COMMA */:
|
|
389
|
+
case 61 /* TokenMap.EQUAL */:
|
|
349
390
|
if (buffer.length > 0 && buffer != ':') {
|
|
350
391
|
yield pushToken(buffer, parseInfo);
|
|
351
392
|
buffer = '';
|
|
@@ -374,14 +415,14 @@ function* tokenize(stream) {
|
|
|
374
415
|
next(parseInfo);
|
|
375
416
|
}
|
|
376
417
|
break;
|
|
377
|
-
case
|
|
418
|
+
case 41 /* TokenMap.CLOSE_PAREN */:
|
|
378
419
|
if (buffer.length > 0) {
|
|
379
420
|
yield pushToken(buffer, parseInfo);
|
|
380
421
|
buffer = '';
|
|
381
422
|
}
|
|
382
423
|
yield pushToken('', parseInfo, EnumToken.EndParensTokenType);
|
|
383
424
|
break;
|
|
384
|
-
case
|
|
425
|
+
case 40 /* TokenMap.OPEN_PAREN */:
|
|
385
426
|
if (buffer.length == 0) {
|
|
386
427
|
yield pushToken(value, parseInfo);
|
|
387
428
|
break;
|
|
@@ -393,7 +434,7 @@ function* tokenize(stream) {
|
|
|
393
434
|
buffer = '';
|
|
394
435
|
consumeWhiteSpace(parseInfo);
|
|
395
436
|
value = peek(parseInfo);
|
|
396
|
-
let cp;
|
|
437
|
+
// let cp: number;
|
|
397
438
|
let whitespace = '';
|
|
398
439
|
let hasWhiteSpace = false;
|
|
399
440
|
let errorState = false;
|
|
@@ -403,11 +444,11 @@ function* tokenize(stream) {
|
|
|
403
444
|
let hasNewLine = false;
|
|
404
445
|
buffer = next(parseInfo);
|
|
405
446
|
while (value = next(parseInfo)) {
|
|
406
|
-
|
|
447
|
+
charCode = value.charCodeAt(0);
|
|
407
448
|
// consume an invalid string
|
|
408
449
|
if (inquote) {
|
|
409
450
|
buffer += value;
|
|
410
|
-
if (isNewLine(
|
|
451
|
+
if (isNewLine(charCode)) {
|
|
411
452
|
hasNewLine = true;
|
|
412
453
|
while (value = next(parseInfo)) {
|
|
413
454
|
buffer += value;
|
|
@@ -421,10 +462,10 @@ function* tokenize(stream) {
|
|
|
421
462
|
buffer = '';
|
|
422
463
|
break;
|
|
423
464
|
}
|
|
424
|
-
|
|
465
|
+
charCode = value.charCodeAt(0);
|
|
425
466
|
}
|
|
426
467
|
// '\\'
|
|
427
|
-
if (
|
|
468
|
+
if (charCode == 0x5c) {
|
|
428
469
|
buffer += next(parseInfo);
|
|
429
470
|
}
|
|
430
471
|
else if (value == quote) {
|
|
@@ -433,7 +474,7 @@ function* tokenize(stream) {
|
|
|
433
474
|
continue;
|
|
434
475
|
}
|
|
435
476
|
if (!inquote) {
|
|
436
|
-
if (isWhiteSpace(
|
|
477
|
+
if (isWhiteSpace(charCode)) {
|
|
437
478
|
whitespace += value;
|
|
438
479
|
while (value = peek(parseInfo)) {
|
|
439
480
|
hasWhiteSpace = true;
|
|
@@ -449,21 +490,21 @@ function* tokenize(stream) {
|
|
|
449
490
|
break;
|
|
450
491
|
}
|
|
451
492
|
}
|
|
452
|
-
|
|
493
|
+
charCode = value.charCodeAt(0);
|
|
453
494
|
// ')'
|
|
454
|
-
if (
|
|
495
|
+
if (charCode == 0x29) {
|
|
455
496
|
yield pushToken(buffer, parseInfo, hasNewLine ? EnumToken.BadStringTokenType : EnumToken.StringTokenType);
|
|
456
497
|
yield pushToken('', parseInfo, EnumToken.EndParensTokenType);
|
|
457
498
|
buffer = '';
|
|
458
499
|
break;
|
|
459
500
|
}
|
|
460
501
|
while (value = next(parseInfo)) {
|
|
461
|
-
|
|
462
|
-
if (
|
|
502
|
+
charCode = value.charCodeAt(0);
|
|
503
|
+
if (charCode == 0x5c) {
|
|
463
504
|
buffer += value + next(parseInfo);
|
|
464
505
|
continue;
|
|
465
506
|
}
|
|
466
|
-
if (
|
|
507
|
+
if (charCode == 0x29) {
|
|
467
508
|
yield pushToken(buffer, parseInfo, EnumToken.BadStringTokenType);
|
|
468
509
|
yield pushToken('', parseInfo, EnumToken.EndParensTokenType);
|
|
469
510
|
buffer = '';
|
|
@@ -484,15 +525,15 @@ function* tokenize(stream) {
|
|
|
484
525
|
else {
|
|
485
526
|
buffer = '';
|
|
486
527
|
while (value = next(parseInfo)) {
|
|
487
|
-
|
|
528
|
+
charCode = value.charCodeAt(0);
|
|
488
529
|
// ')'
|
|
489
|
-
if (
|
|
530
|
+
if (charCode == 0x29) {
|
|
490
531
|
yield pushToken(buffer, parseInfo, EnumToken.UrlTokenTokenType);
|
|
491
532
|
yield pushToken('', parseInfo, EnumToken.EndParensTokenType);
|
|
492
533
|
buffer = '';
|
|
493
534
|
break;
|
|
494
535
|
}
|
|
495
|
-
if (isWhiteSpace(
|
|
536
|
+
if (isWhiteSpace(charCode)) {
|
|
496
537
|
hasWhiteSpace = true;
|
|
497
538
|
whitespace = value;
|
|
498
539
|
while (isWhiteSpace(peek(parseInfo)?.charCodeAt(0))) {
|
|
@@ -500,26 +541,26 @@ function* tokenize(stream) {
|
|
|
500
541
|
}
|
|
501
542
|
continue;
|
|
502
543
|
}
|
|
503
|
-
if (isNonPrintable(
|
|
544
|
+
if (isNonPrintable(charCode) ||
|
|
504
545
|
// '"'
|
|
505
|
-
|
|
546
|
+
charCode == 0x22 ||
|
|
506
547
|
// "'"
|
|
507
|
-
|
|
548
|
+
charCode == 0x27 ||
|
|
508
549
|
// \('
|
|
509
|
-
|
|
550
|
+
charCode == 0x28 ||
|
|
510
551
|
hasWhiteSpace) {
|
|
511
552
|
errorState = true;
|
|
512
553
|
}
|
|
513
554
|
if (errorState) {
|
|
514
555
|
buffer += whitespace + value;
|
|
515
556
|
while (value = peek(parseInfo)) {
|
|
516
|
-
|
|
517
|
-
if (
|
|
557
|
+
charCode = value.charCodeAt(0);
|
|
558
|
+
if (charCode == 0x5c) {
|
|
518
559
|
buffer += next(parseInfo, 2);
|
|
519
560
|
continue;
|
|
520
561
|
}
|
|
521
562
|
// ')'
|
|
522
|
-
if (
|
|
563
|
+
if (charCode == 0x29) {
|
|
523
564
|
break;
|
|
524
565
|
}
|
|
525
566
|
buffer += next(parseInfo);
|
|
@@ -541,23 +582,23 @@ function* tokenize(stream) {
|
|
|
541
582
|
yield pushToken(buffer, parseInfo);
|
|
542
583
|
buffer = '';
|
|
543
584
|
break;
|
|
544
|
-
case
|
|
545
|
-
case
|
|
546
|
-
case
|
|
547
|
-
case
|
|
548
|
-
case
|
|
585
|
+
case 91 /* TokenMap.OPEN_BRACKET */:
|
|
586
|
+
case 93 /* TokenMap.CLOSE_BRACKET */:
|
|
587
|
+
case 123 /* TokenMap.OPEN_CURLY_BRACE */:
|
|
588
|
+
case 125 /* TokenMap.CLOSE_CURLY_BRACE */:
|
|
589
|
+
case 59 /* TokenMap.SEMICOLON */:
|
|
549
590
|
if (buffer.length > 0) {
|
|
550
591
|
yield pushToken(buffer, parseInfo);
|
|
551
592
|
buffer = '';
|
|
552
593
|
}
|
|
553
594
|
yield pushToken(value, parseInfo);
|
|
554
595
|
break;
|
|
555
|
-
case
|
|
596
|
+
case 33 /* TokenMap.EXCLAMATION */:
|
|
556
597
|
if (buffer.length > 0) {
|
|
557
598
|
yield pushToken(buffer, parseInfo);
|
|
558
599
|
buffer = '';
|
|
559
600
|
}
|
|
560
|
-
if (
|
|
601
|
+
if (match(parseInfo, 'important')) {
|
|
561
602
|
yield pushToken('', parseInfo, EnumToken.ImportantTokenType);
|
|
562
603
|
next(parseInfo, 9);
|
|
563
604
|
buffer = '';
|
|
@@ -565,15 +606,49 @@ function* tokenize(stream) {
|
|
|
565
606
|
}
|
|
566
607
|
buffer = '!';
|
|
567
608
|
break;
|
|
609
|
+
case 64 /* TokenMap.AT */:
|
|
610
|
+
if (buffer.length > 0) {
|
|
611
|
+
yield pushToken(buffer, parseInfo);
|
|
612
|
+
buffer = '';
|
|
613
|
+
}
|
|
614
|
+
buffer = value;
|
|
615
|
+
{
|
|
616
|
+
let val = peek(parseInfo);
|
|
617
|
+
if (val == '-' || isIdentStart(val.charCodeAt(0))) {
|
|
618
|
+
buffer = next(parseInfo);
|
|
619
|
+
val = peek(parseInfo);
|
|
620
|
+
while (isIdent(val) || val == '-') {
|
|
621
|
+
buffer += next(parseInfo);
|
|
622
|
+
val = peek(parseInfo);
|
|
623
|
+
}
|
|
624
|
+
yield pushToken(buffer, parseInfo, EnumToken.AtRuleTokenType);
|
|
625
|
+
buffer = '';
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
break;
|
|
568
629
|
default:
|
|
569
630
|
buffer += value;
|
|
631
|
+
if (buffer.length == 1) {
|
|
632
|
+
if (buffer == 'h') {
|
|
633
|
+
if (match(parseInfo, 'ttp://') || match(parseInfo, 'ttps://')) {
|
|
634
|
+
let val = peek(parseInfo);
|
|
635
|
+
while (val != ')' && val != ';' && !isWhiteSpace(val.charCodeAt(0))) {
|
|
636
|
+
buffer += next(parseInfo);
|
|
637
|
+
val = peek(parseInfo);
|
|
638
|
+
}
|
|
639
|
+
yield pushToken(buffer, parseInfo);
|
|
640
|
+
buffer = '';
|
|
641
|
+
break;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
570
645
|
break;
|
|
571
646
|
}
|
|
572
647
|
}
|
|
573
648
|
if (buffer.length > 0) {
|
|
574
649
|
yield pushToken(buffer, parseInfo);
|
|
575
650
|
}
|
|
576
|
-
|
|
651
|
+
yield pushToken('', parseInfo, EnumToken.EOFTokenType);
|
|
577
652
|
}
|
|
578
653
|
|
|
579
654
|
export { tokenize };
|
|
@@ -2,20 +2,21 @@ import { EnumToken } from '../../ast/types.js';
|
|
|
2
2
|
import '../../ast/minify.js';
|
|
3
3
|
import { walkValues } from '../../ast/walk.js';
|
|
4
4
|
import '../parse.js';
|
|
5
|
-
import
|
|
5
|
+
import '../tokenize.js';
|
|
6
6
|
import './config.js';
|
|
7
|
+
import { isWhiteSpace } from '../../syntax/syntax.js';
|
|
7
8
|
import '../../renderer/color/utils/constants.js';
|
|
8
9
|
import '../../renderer/sourcemap/lib/encode.js';
|
|
9
10
|
|
|
10
|
-
function parseDeclarationNode(node, errors,
|
|
11
|
+
function parseDeclarationNode(node, errors, location) {
|
|
11
12
|
while (node.val[0]?.typ == EnumToken.WhitespaceTokenType) {
|
|
12
13
|
node.val.shift();
|
|
13
14
|
}
|
|
14
|
-
if (node.val.filter((t) => ![EnumToken.WhitespaceTokenType, EnumToken.CommentTokenType].includes(t.typ)).length == 0) {
|
|
15
|
+
if (!node.nam.startsWith('--') && node.val.filter((t) => ![EnumToken.WhitespaceTokenType, EnumToken.CommentTokenType].includes(t.typ)).length == 0) {
|
|
15
16
|
errors.push({
|
|
16
17
|
action: 'drop',
|
|
17
18
|
message: 'doParse: invalid declaration',
|
|
18
|
-
location
|
|
19
|
+
location
|
|
19
20
|
});
|
|
20
21
|
return null;
|
|
21
22
|
}
|
|
@@ -2,8 +2,9 @@ import { EnumToken } from '../../ast/types.js';
|
|
|
2
2
|
import '../../ast/minify.js';
|
|
3
3
|
import '../../ast/walk.js';
|
|
4
4
|
import '../parse.js';
|
|
5
|
-
import
|
|
5
|
+
import '../tokenize.js';
|
|
6
6
|
import './config.js';
|
|
7
|
+
import { mathFuncs } from '../../syntax/syntax.js';
|
|
7
8
|
import '../../renderer/color/utils/constants.js';
|
|
8
9
|
import '../../renderer/sourcemap/lib/encode.js';
|
|
9
10
|
|
|
@@ -5,9 +5,10 @@ import '../../ast/types.js';
|
|
|
5
5
|
import '../../ast/minify.js';
|
|
6
6
|
import '../../ast/walk.js';
|
|
7
7
|
import '../../parser/parse.js';
|
|
8
|
+
import '../../parser/tokenize.js';
|
|
9
|
+
import '../../parser/utils/config.js';
|
|
8
10
|
import { srgb2xyz } from './xyz.js';
|
|
9
11
|
import '../sourcemap/lib/encode.js';
|
|
10
|
-
import '../../parser/utils/config.js';
|
|
11
12
|
|
|
12
13
|
function a98rgb2srgbvalues(r, g, b, a = null) {
|
|
13
14
|
// @ts-ignore
|
|
@@ -2,11 +2,12 @@ import { EnumToken } from '../../ast/types.js';
|
|
|
2
2
|
import '../../ast/minify.js';
|
|
3
3
|
import '../../ast/walk.js';
|
|
4
4
|
import '../../parser/parse.js';
|
|
5
|
-
import
|
|
5
|
+
import '../../parser/tokenize.js';
|
|
6
6
|
import '../../parser/utils/config.js';
|
|
7
|
+
import { isRectangularOrthogonalColorspace, isPolarColorspace } from '../../syntax/syntax.js';
|
|
7
8
|
import { getNumber } from './color.js';
|
|
8
9
|
import { srgb2rgb } from './rgb.js';
|
|
9
|
-
import './utils/constants.js';
|
|
10
|
+
import { ColorKind } from './utils/constants.js';
|
|
10
11
|
import { getComponents } from './utils/components.js';
|
|
11
12
|
import { srgb2hwb } from './hwb.js';
|
|
12
13
|
import { srgb2hsl } from './hsl.js';
|
|
@@ -57,6 +58,9 @@ function interpolateHue(interpolationMethod, h1, h2) {
|
|
|
57
58
|
return [h1, h2];
|
|
58
59
|
}
|
|
59
60
|
function colorMix(colorSpace, hueInterpolationMethod, color1, percentage1, color2, percentage2) {
|
|
61
|
+
if (color1.val == 'currentcolor' || color2.val == 'currentcolor') {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
60
64
|
if (hueInterpolationMethod != null && isRectangularOrthogonalColorspace(colorSpace)) {
|
|
61
65
|
return null;
|
|
62
66
|
}
|
|
@@ -110,6 +114,9 @@ function colorMix(colorSpace, hueInterpolationMethod, color1, percentage1, color
|
|
|
110
114
|
}
|
|
111
115
|
const components1 = getComponents(color1);
|
|
112
116
|
const components2 = getComponents(color2);
|
|
117
|
+
if (components1 == null || components2 == null) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
113
120
|
if ((components1[3] != null && components1[3].typ == EnumToken.IdenTokenType && components1[3].val == 'none') && values2.length == 4) {
|
|
114
121
|
values1[3] = values2[3];
|
|
115
122
|
}
|
|
@@ -223,14 +230,16 @@ function colorMix(colorSpace, hueInterpolationMethod, color1, percentage1, color
|
|
|
223
230
|
return null;
|
|
224
231
|
}
|
|
225
232
|
const lchSpaces = ['lch', 'oklch'];
|
|
233
|
+
const colorSpace1 = ColorKind[color1.kin].toLowerCase().replaceAll('_', '-');
|
|
234
|
+
const colorSpace2 = ColorKind[color2.kin].toLowerCase().replaceAll('_', '-');
|
|
226
235
|
// powerless
|
|
227
|
-
if (lchSpaces.includes(
|
|
236
|
+
if (lchSpaces.includes(colorSpace1) || lchSpaces.includes(colorSpace.val)) {
|
|
228
237
|
if ((components1[2].typ == EnumToken.IdenTokenType && components1[2].val == 'none') || values1[2] == 0) {
|
|
229
238
|
values1[2] = values2[2];
|
|
230
239
|
}
|
|
231
240
|
}
|
|
232
241
|
// powerless
|
|
233
|
-
if (lchSpaces.includes(
|
|
242
|
+
if (lchSpaces.includes(colorSpace2) || lchSpaces.includes(colorSpace.val)) {
|
|
234
243
|
if ((components2[2].typ == EnumToken.IdenTokenType && components2[2].val == 'none') || values2[2] == 0) {
|
|
235
244
|
values2[2] = values1[2];
|
|
236
245
|
}
|
|
@@ -270,7 +279,7 @@ function colorMix(colorSpace, hueInterpolationMethod, color1, percentage1, color
|
|
|
270
279
|
val: String(v)
|
|
271
280
|
};
|
|
272
281
|
}),
|
|
273
|
-
kin:
|
|
282
|
+
kin: ColorKind.LCH
|
|
274
283
|
};
|
|
275
284
|
case 'srgb':
|
|
276
285
|
case 'srgb-linear':
|
|
@@ -281,7 +290,7 @@ function colorMix(colorSpace, hueInterpolationMethod, color1, percentage1, color
|
|
|
281
290
|
typ: EnumToken.ColorTokenType,
|
|
282
291
|
val: 'color',
|
|
283
292
|
chi: calculate(),
|
|
284
|
-
kin:
|
|
293
|
+
kin: ColorKind.COLOR,
|
|
285
294
|
cal: 'col'
|
|
286
295
|
};
|
|
287
296
|
case 'rgb':
|
|
@@ -320,7 +329,7 @@ function colorMix(colorSpace, hueInterpolationMethod, color1, percentage1, color
|
|
|
320
329
|
typ: EnumToken.ColorTokenType,
|
|
321
330
|
val: colorSpace.val,
|
|
322
331
|
chi: calculate().slice(1),
|
|
323
|
-
kin: colorSpace.val
|
|
332
|
+
kin: ColorKind[colorSpace.val.toLowerCase().replaceAll('-', '_')]
|
|
324
333
|
};
|
|
325
334
|
if (colorSpace.val == 'hsl' || colorSpace.val == 'hwb') {
|
|
326
335
|
// @ts-ignore
|