@tbela99/css-parser 0.9.0 → 1.0.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/LICENSE.md +1 -1
- package/README.md +22 -12
- package/dist/index-umd-web.js +2678 -2838
- package/dist/index.cjs +2468 -2628
- package/dist/index.d.ts +71 -26
- package/dist/lib/ast/expand.js +15 -2
- package/dist/lib/ast/features/calc.js +7 -10
- package/dist/lib/ast/features/index.js +1 -0
- package/dist/lib/ast/features/inlinecssvariables.js +0 -5
- package/dist/lib/ast/features/prefix.js +2 -7
- package/dist/lib/ast/features/shorthand.js +6 -9
- package/dist/lib/ast/features/transform.js +60 -0
- package/dist/lib/ast/math/expression.js +14 -10
- package/dist/lib/ast/math/math.js +14 -2
- package/dist/lib/ast/minify.js +47 -6
- package/dist/lib/ast/transform/compute.js +336 -0
- package/dist/lib/ast/transform/convert.js +33 -0
- package/dist/lib/ast/transform/matrix.js +111 -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 +2 -0
- package/dist/lib/ast/walk.js +23 -17
- package/dist/lib/parser/parse.js +174 -127
- package/dist/lib/parser/utils/declaration.js +1 -1
- package/dist/lib/renderer/color/{colormix.js → color-mix.js} +6 -0
- package/dist/lib/renderer/color/color.js +96 -20
- package/dist/lib/renderer/color/hex.js +17 -7
- package/dist/lib/renderer/color/hsl.js +7 -2
- package/dist/lib/renderer/color/lab.js +10 -1
- package/dist/lib/renderer/color/lch.js +8 -0
- package/dist/lib/renderer/color/oklab.js +8 -0
- package/dist/lib/renderer/color/oklch.js +8 -0
- package/dist/lib/renderer/color/prophotorgb.js +2 -2
- package/dist/lib/renderer/color/relativecolor.js +10 -21
- package/dist/lib/renderer/color/rgb.js +10 -7
- package/dist/lib/renderer/color/srgb.js +30 -6
- package/dist/lib/renderer/color/utils/components.js +13 -2
- package/dist/lib/renderer/color/xyz.js +2 -18
- package/dist/lib/renderer/color/xyzd50.js +20 -2
- package/dist/lib/renderer/render.js +70 -32
- package/dist/lib/renderer/sourcemap/sourcemap.js +1 -1
- package/dist/lib/syntax/syntax.js +75 -56
- package/dist/lib/validation/at-rules/container.js +6 -6
- package/dist/lib/validation/at-rules/document.js +40 -60
- package/dist/lib/validation/at-rules/import.js +61 -59
- package/dist/lib/validation/at-rules/keyframes.js +1 -1
- package/dist/lib/validation/at-rules/media.js +1 -1
- package/dist/lib/validation/at-rules/supports.js +40 -9
- package/dist/lib/validation/atrule.js +0 -4
- package/dist/lib/validation/config.json.js +83 -35
- package/dist/lib/validation/parser/parse.js +1 -95
- package/dist/lib/validation/parser/types.js +1 -2
- package/dist/lib/validation/selector.js +5 -2
- package/dist/lib/validation/syntaxes/compound-selector.js +2 -2
- package/dist/lib/validation/syntaxes/keyframe-block-list.js +2 -2
- package/dist/lib/validation/syntaxes/keyframe-selector.js +11 -90
- package/dist/lib/validation/syntaxes/layer-name.js +5 -16
- package/dist/lib/validation/syntaxes/relative-selector.js +15 -14
- package/dist/lib/validation/utils/list.js +18 -1
- package/dist/node/load.js +1 -1
- package/package.json +13 -12
- package/dist/lib/renderer/color/prophotoRgb.js +0 -56
- package/dist/lib/validation/declaration.js +0 -102
- package/dist/lib/validation/syntax.js +0 -1475
- package/dist/lib/validation/syntaxes/image.js +0 -29
|
@@ -57,6 +57,9 @@ function interpolateHue(interpolationMethod, h1, h2) {
|
|
|
57
57
|
return [h1, h2];
|
|
58
58
|
}
|
|
59
59
|
function colorMix(colorSpace, hueInterpolationMethod, color1, percentage1, color2, percentage2) {
|
|
60
|
+
if (color1.val == 'currentcolor' || color2.val == 'currentcolor') {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
60
63
|
if (hueInterpolationMethod != null && isRectangularOrthogonalColorspace(colorSpace)) {
|
|
61
64
|
return null;
|
|
62
65
|
}
|
|
@@ -110,6 +113,9 @@ function colorMix(colorSpace, hueInterpolationMethod, color1, percentage1, color
|
|
|
110
113
|
}
|
|
111
114
|
const components1 = getComponents(color1);
|
|
112
115
|
const components2 = getComponents(color2);
|
|
116
|
+
if (components1 == null || components2 == null) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
113
119
|
if ((components1[3] != null && components1[3].typ == EnumToken.IdenTokenType && components1[3].val == 'none') && values2.length == 4) {
|
|
114
120
|
values1[3] = values2[3];
|
|
115
121
|
}
|
|
@@ -8,16 +8,16 @@ import { lch2hwb, lab2hwb, oklch2hwb, oklab2hwb, hsl2hwb, rgb2hwb } from './hwb.
|
|
|
8
8
|
import { srgb2lab, oklch2lab, oklab2lab, lch2lab, hwb2lab, hsl2lab, rgb2lab, hex2lab } from './lab.js';
|
|
9
9
|
import { srgb2lch, oklch2lch, oklab2lch, lab2lch, hwb2lch, hsl2lch, rgb2lch, hex2lch } from './lch.js';
|
|
10
10
|
import { srgb2oklab, oklch2oklab, lch2oklab, lab2oklab, hwb2oklab, hsl2oklab, rgb2oklab, hex2oklab } from './oklab.js';
|
|
11
|
-
import { lch2oklch, oklab2oklch, lab2oklch, hwb2oklch, hsl2oklch, rgb2oklch, hex2oklch
|
|
11
|
+
import { lch2oklch, oklab2oklch, lab2oklch, hwb2oklch, hsl2oklch, rgb2oklch, hex2oklch } from './oklch.js';
|
|
12
12
|
import { colorFuncColorSpace } from './utils/constants.js';
|
|
13
13
|
import { getComponents } from './utils/components.js';
|
|
14
14
|
import { xyz2srgb, lsrgb2srgbvalues, srgb2lsrgbvalues, lch2srgb, oklab2srgb, lab2srgb, hwb2srgb, hsl2srgb, rgb2srgb, hex2srgb } from './srgb.js';
|
|
15
15
|
import { prophotorgb2srgbvalues, srgb2prophotorgbvalues } from './prophotorgb.js';
|
|
16
16
|
import { a98rgb2srgbvalues, srgb2a98values } from './a98rgb.js';
|
|
17
17
|
import { rec20202srgb, srgb2rec2020values } from './rec2020.js';
|
|
18
|
-
import {
|
|
18
|
+
import { srgb2xyz } from './xyz.js';
|
|
19
19
|
import { p32srgbvalues, srgb2p3values } from './p3.js';
|
|
20
|
-
import { XYZ_D65_to_D50 } from './xyzd50.js';
|
|
20
|
+
import { xyzd502srgb, XYZ_D65_to_D50 } from './xyzd50.js';
|
|
21
21
|
import '../sourcemap/lib/encode.js';
|
|
22
22
|
import '../../parser/utils/config.js';
|
|
23
23
|
|
|
@@ -33,10 +33,15 @@ function convert(token, to) {
|
|
|
33
33
|
}
|
|
34
34
|
let values = [];
|
|
35
35
|
if (to == 'hsl') {
|
|
36
|
+
let t;
|
|
36
37
|
switch (token.kin) {
|
|
37
38
|
case 'rgb':
|
|
38
39
|
case 'rgba':
|
|
39
|
-
|
|
40
|
+
t = rgb2hsl(token);
|
|
41
|
+
if (t == null) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
values.push(...t);
|
|
40
45
|
break;
|
|
41
46
|
case 'hex':
|
|
42
47
|
case 'lit':
|
|
@@ -46,10 +51,18 @@ function convert(token, to) {
|
|
|
46
51
|
values.push(...hwb2hsl(token));
|
|
47
52
|
break;
|
|
48
53
|
case 'oklab':
|
|
49
|
-
|
|
54
|
+
t = oklab2hsl(token);
|
|
55
|
+
if (t == null) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
values.push(...t);
|
|
50
59
|
break;
|
|
51
60
|
case 'oklch':
|
|
52
|
-
|
|
61
|
+
t = oklch2hsl(token);
|
|
62
|
+
if (t == null) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
values.push(...t);
|
|
53
66
|
break;
|
|
54
67
|
case 'lab':
|
|
55
68
|
values.push(...lab2hsl(token));
|
|
@@ -98,28 +111,53 @@ function convert(token, to) {
|
|
|
98
111
|
}
|
|
99
112
|
}
|
|
100
113
|
else if (to == 'rgb') {
|
|
114
|
+
let t;
|
|
101
115
|
switch (token.kin) {
|
|
102
116
|
case 'hex':
|
|
103
117
|
case 'lit':
|
|
104
118
|
values.push(...hex2rgb(token));
|
|
105
119
|
break;
|
|
106
120
|
case 'hsl':
|
|
107
|
-
|
|
121
|
+
t = hsl2rgb(token);
|
|
122
|
+
if (t == null) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
values.push(...t);
|
|
108
126
|
break;
|
|
109
127
|
case 'hwb':
|
|
110
|
-
|
|
128
|
+
t = hwb2rgb(token);
|
|
129
|
+
if (t == null) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
values.push(...t);
|
|
111
133
|
break;
|
|
112
134
|
case 'oklab':
|
|
113
|
-
|
|
135
|
+
t = oklab2rgb(token);
|
|
136
|
+
if (t == null) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
values.push(...t);
|
|
114
140
|
break;
|
|
115
141
|
case 'oklch':
|
|
116
|
-
|
|
142
|
+
t = oklch2rgb(token);
|
|
143
|
+
if (t == null) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
values.push(...t);
|
|
117
147
|
break;
|
|
118
148
|
case 'lab':
|
|
119
|
-
|
|
149
|
+
t = lab2rgb(token);
|
|
150
|
+
if (t == null) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
values.push(...t);
|
|
120
154
|
break;
|
|
121
155
|
case 'lch':
|
|
122
|
-
|
|
156
|
+
t = lch2rgb(token);
|
|
157
|
+
if (t == null) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
values.push(...t);
|
|
123
161
|
break;
|
|
124
162
|
case 'color':
|
|
125
163
|
// @ts-ignore
|
|
@@ -305,6 +343,7 @@ function convert(token, to) {
|
|
|
305
343
|
}
|
|
306
344
|
}
|
|
307
345
|
else if (colorFuncColorSpace.includes(to)) {
|
|
346
|
+
let t;
|
|
308
347
|
switch (token.kin) {
|
|
309
348
|
case 'hex':
|
|
310
349
|
case 'lit':
|
|
@@ -312,30 +351,60 @@ function convert(token, to) {
|
|
|
312
351
|
break;
|
|
313
352
|
case 'rgb':
|
|
314
353
|
case 'rgba':
|
|
315
|
-
|
|
354
|
+
t = rgb2srgb(token);
|
|
355
|
+
if (t == null) {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
values.push(...t);
|
|
316
359
|
break;
|
|
317
360
|
case 'hsl':
|
|
318
361
|
case 'hsla':
|
|
319
|
-
|
|
362
|
+
t = hsl2srgb(token);
|
|
363
|
+
if (t == null) {
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
values.push(...t);
|
|
320
367
|
break;
|
|
321
368
|
case 'hwb':
|
|
322
|
-
|
|
369
|
+
t = hwb2srgb(token);
|
|
370
|
+
if (t == null) {
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
values.push(...t);
|
|
323
374
|
break;
|
|
324
375
|
case 'lab':
|
|
325
|
-
|
|
376
|
+
t = lab2srgb(token);
|
|
377
|
+
if (t == null) {
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
values.push(...t);
|
|
326
381
|
break;
|
|
327
382
|
case 'oklab':
|
|
328
|
-
|
|
383
|
+
t = oklab2srgb(token);
|
|
384
|
+
if (t == null) {
|
|
385
|
+
return null;
|
|
386
|
+
}
|
|
387
|
+
values.push(...t);
|
|
329
388
|
break;
|
|
330
389
|
case 'lch':
|
|
331
|
-
|
|
390
|
+
t = lch2srgb(token);
|
|
391
|
+
if (t == null) {
|
|
392
|
+
return null;
|
|
393
|
+
}
|
|
394
|
+
values.push(...t);
|
|
332
395
|
break;
|
|
333
396
|
case 'oklch':
|
|
334
|
-
|
|
335
|
-
|
|
397
|
+
t = color2srgbvalues(token);
|
|
398
|
+
if (t == null) {
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
values.push(...t);
|
|
336
402
|
break;
|
|
337
403
|
case 'color':
|
|
338
404
|
const val = color2srgbvalues(token);
|
|
405
|
+
if (val == null) {
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
339
408
|
switch (to) {
|
|
340
409
|
case 'srgb':
|
|
341
410
|
values.push(...val);
|
|
@@ -389,6 +458,9 @@ function minmax(value, min, max) {
|
|
|
389
458
|
}
|
|
390
459
|
function color2srgbvalues(token) {
|
|
391
460
|
const components = getComponents(token);
|
|
461
|
+
if (components == null) {
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
392
464
|
const colorSpace = components.shift();
|
|
393
465
|
let values = components.map((val) => getNumber(val));
|
|
394
466
|
switch (colorSpace.val) {
|
|
@@ -531,6 +603,10 @@ function getNumber(token) {
|
|
|
531
603
|
// @ts-ignore
|
|
532
604
|
return token.typ == EnumToken.PercentageTokenType ? token.val / 100 : +token.val;
|
|
533
605
|
}
|
|
606
|
+
/**
|
|
607
|
+
* convert angle to turn
|
|
608
|
+
* @param token
|
|
609
|
+
*/
|
|
534
610
|
function getAngle(token) {
|
|
535
611
|
if (token.typ == EnumToken.IdenTokenType) {
|
|
536
612
|
if (token.val == 'none') {
|
|
@@ -67,25 +67,35 @@ function rgb2hex(token) {
|
|
|
67
67
|
return value;
|
|
68
68
|
}
|
|
69
69
|
function hsl2hex(token) {
|
|
70
|
-
|
|
70
|
+
const t = hsl2rgb(token);
|
|
71
|
+
return t == null ? null : `${t.reduce(toHexString, '#')}`;
|
|
71
72
|
}
|
|
72
73
|
function hwb2hex(token) {
|
|
73
|
-
|
|
74
|
+
const t = hwb2rgb(token);
|
|
75
|
+
return t == null ? null : `${t.reduce(toHexString, '#')}`;
|
|
74
76
|
}
|
|
75
77
|
function cmyk2hex(token) {
|
|
76
|
-
|
|
78
|
+
const t = cmyk2rgb(token);
|
|
79
|
+
return t == null ? null : `#${t.reduce(toHexString, '')}`;
|
|
77
80
|
}
|
|
78
81
|
function oklab2hex(token) {
|
|
79
|
-
|
|
82
|
+
const t = oklab2rgb(token);
|
|
83
|
+
return t == null ? null : `${t.reduce(toHexString, '#')}`;
|
|
80
84
|
}
|
|
81
85
|
function oklch2hex(token) {
|
|
82
|
-
|
|
86
|
+
const value = oklch2rgb(token);
|
|
87
|
+
if (value == null) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
return `${value.reduce(toHexString, '#')}`;
|
|
83
91
|
}
|
|
84
92
|
function lab2hex(token) {
|
|
85
|
-
|
|
93
|
+
const t = lab2rgb(token);
|
|
94
|
+
return t == null ? null : `${t.reduce(toHexString, '#')}`;
|
|
86
95
|
}
|
|
87
96
|
function lch2hex(token) {
|
|
88
|
-
|
|
97
|
+
const t = lch2rgb(token);
|
|
98
|
+
return t == null ? null : `${t.reduce(toHexString, '#')}`;
|
|
89
99
|
}
|
|
90
100
|
function srgb2hexvalues(r, g, b, alpha) {
|
|
91
101
|
return [r, g, b].concat(alpha == null || alpha == 1 ? [] : [alpha]).reduce((acc, value) => acc + minmax(Math.round(255 * value), 0, 255).toString(16).padStart(2, '0'), '#');
|
|
@@ -17,6 +17,9 @@ function hex2hsl(token) {
|
|
|
17
17
|
}
|
|
18
18
|
function rgb2hsl(token) {
|
|
19
19
|
const chi = getComponents(token);
|
|
20
|
+
if (chi == null) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
20
23
|
// @ts-ignore
|
|
21
24
|
let t = chi[0];
|
|
22
25
|
// @ts-ignore
|
|
@@ -75,12 +78,14 @@ function lch2hsl(token) {
|
|
|
75
78
|
return rgb2hslvalues(...lch2rgb(token));
|
|
76
79
|
}
|
|
77
80
|
function oklab2hsl(token) {
|
|
81
|
+
const t = oklab2rgb(token);
|
|
78
82
|
// @ts-ignore
|
|
79
|
-
return rgb2hslvalues(...
|
|
83
|
+
return t == null ? null : rgb2hslvalues(...t);
|
|
80
84
|
}
|
|
81
85
|
function oklch2hsl(token) {
|
|
86
|
+
const t = oklch2rgb(token);
|
|
82
87
|
// @ts-ignore
|
|
83
|
-
return rgb2hslvalues(...
|
|
88
|
+
return t == null ? null : rgb2hslvalues(...t);
|
|
84
89
|
}
|
|
85
90
|
function rgb2hslvalues(r, g, b, a = null) {
|
|
86
91
|
return srgb2hsl(r / 255, g / 255, b / 255, a);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { e, k, D50 } from './utils/constants.js';
|
|
2
2
|
import { getComponents } from './utils/components.js';
|
|
3
|
-
import { srgb2xyz
|
|
3
|
+
import { srgb2xyz } from './xyz.js';
|
|
4
4
|
import { oklch2srgb, hwb2srgb, hsl2srgb, rgb2srgb, hex2srgb } from './srgb.js';
|
|
5
5
|
import { getLCHComponents } from './lch.js';
|
|
6
6
|
import { OKLab_to_XYZ, getOKLABComponents } from './oklab.js';
|
|
@@ -9,6 +9,7 @@ import { EnumToken } from '../../ast/types.js';
|
|
|
9
9
|
import '../../ast/minify.js';
|
|
10
10
|
import '../../ast/walk.js';
|
|
11
11
|
import '../../parser/parse.js';
|
|
12
|
+
import { xyzd502srgb } from './xyzd50.js';
|
|
12
13
|
import '../sourcemap/lib/encode.js';
|
|
13
14
|
import '../../parser/utils/config.js';
|
|
14
15
|
|
|
@@ -86,6 +87,14 @@ function lch2labvalues(l, c, h, a = null) {
|
|
|
86
87
|
}
|
|
87
88
|
function getLABComponents(token) {
|
|
88
89
|
const components = getComponents(token);
|
|
90
|
+
if (components == null) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
for (let i = 0; i < components.length; i++) {
|
|
94
|
+
if (![EnumToken.NumberTokenType, EnumToken.PercentageTokenType, EnumToken.AngleTokenType, EnumToken.IdenTokenType].includes(components[i].typ)) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
89
98
|
// @ts-ignore
|
|
90
99
|
let t = components[0];
|
|
91
100
|
// @ts-ignore
|
|
@@ -59,6 +59,14 @@ function xyz2lchvalues(x, y, z, alpha) {
|
|
|
59
59
|
}
|
|
60
60
|
function getLCHComponents(token) {
|
|
61
61
|
const components = getComponents(token);
|
|
62
|
+
if (components == null) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
for (let i = 0; i < components.length; i++) {
|
|
66
|
+
if (![EnumToken.NumberTokenType, EnumToken.PercentageTokenType, EnumToken.AngleTokenType, EnumToken.IdenTokenType].includes(components[i].typ)) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
62
70
|
// @ts-ignore
|
|
63
71
|
let t = components[0];
|
|
64
72
|
// @ts-ignore
|
|
@@ -52,6 +52,14 @@ function srgb2oklab(r, g, blue, alpha) {
|
|
|
52
52
|
}
|
|
53
53
|
function getOKLABComponents(token) {
|
|
54
54
|
const components = getComponents(token);
|
|
55
|
+
if (components == null) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
for (let i = 0; i < components.length; i++) {
|
|
59
|
+
if (![EnumToken.NumberTokenType, EnumToken.PercentageTokenType, EnumToken.AngleTokenType, EnumToken.IdenTokenType].includes(components[i].typ)) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
55
63
|
// @ts-ignore
|
|
56
64
|
let t = components[0];
|
|
57
65
|
// @ts-ignore
|
|
@@ -44,6 +44,14 @@ function srgb2oklch(r, g, blue, alpha) {
|
|
|
44
44
|
}
|
|
45
45
|
function getOKLCHComponents(token) {
|
|
46
46
|
const components = getComponents(token);
|
|
47
|
+
if (components == null) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
for (let i = 0; i < components.length; i++) {
|
|
51
|
+
if (![EnumToken.NumberTokenType, EnumToken.PercentageTokenType, EnumToken.AngleTokenType, EnumToken.IdenTokenType].includes(components[i].typ)) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
47
55
|
// @ts-ignore
|
|
48
56
|
let t = components[0];
|
|
49
57
|
// @ts-ignore
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { srgb2xyz
|
|
2
|
-
import { XYZ_D65_to_D50 } from './xyzd50.js';
|
|
1
|
+
import { srgb2xyz } from './xyz.js';
|
|
2
|
+
import { XYZ_D65_to_D50, xyzd502srgb } from './xyzd50.js';
|
|
3
3
|
|
|
4
4
|
function prophotorgb2srgbvalues(r, g, b, a = null) {
|
|
5
5
|
// @ts-ignore
|
|
@@ -142,30 +142,19 @@ function computeComponentValue(expr, converted, values) {
|
|
|
142
142
|
return expr;
|
|
143
143
|
}
|
|
144
144
|
function replaceValue(parent, value, newValue) {
|
|
145
|
-
|
|
146
|
-
if (
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
parent.r = newValue;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
for (let i = 0; i < parent.chi.length; i++) {
|
|
155
|
-
if (parent.chi[i] == value) {
|
|
156
|
-
parent.chi.splice(i, 1, newValue);
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
if (parent.chi[i].typ == EnumToken.BinaryExpressionTokenType) {
|
|
160
|
-
if (parent.chi[i].l == value) {
|
|
161
|
-
parent.chi[i].l = newValue;
|
|
162
|
-
break;
|
|
145
|
+
for (const { value: val, parent: pr } of walkValues([parent])) {
|
|
146
|
+
if (val.typ == value.typ && val.val == value.val) {
|
|
147
|
+
if (pr.typ == EnumToken.BinaryExpressionTokenType) {
|
|
148
|
+
if (pr.l == val) {
|
|
149
|
+
pr.l = newValue;
|
|
163
150
|
}
|
|
164
|
-
else
|
|
165
|
-
|
|
166
|
-
break;
|
|
151
|
+
else {
|
|
152
|
+
pr.r = newValue;
|
|
167
153
|
}
|
|
168
154
|
}
|
|
155
|
+
else {
|
|
156
|
+
pr.chi.splice(pr.chi.indexOf(val), 1, newValue);
|
|
157
|
+
}
|
|
169
158
|
}
|
|
170
159
|
}
|
|
171
160
|
}
|
|
@@ -21,26 +21,29 @@ function hex2rgb(token) {
|
|
|
21
21
|
return rgb;
|
|
22
22
|
}
|
|
23
23
|
function hwb2rgb(token) {
|
|
24
|
-
return hwb2srgb(token)
|
|
24
|
+
return hwb2srgb(token)?.map?.(srgb2rgb) ?? null;
|
|
25
25
|
}
|
|
26
26
|
function hsl2rgb(token) {
|
|
27
|
-
let { h, s, l, a } = hslvalues(token);
|
|
27
|
+
let { h, s, l, a } = hslvalues(token) ?? {};
|
|
28
|
+
if (h == null || s == null || l == null) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
28
31
|
return hsl2srgbvalues(h, s, l, a).map((t) => minmax(Math.round(t * 255), 0, 255));
|
|
29
32
|
}
|
|
30
33
|
function cmyk2rgb(token) {
|
|
31
|
-
return cmyk2srgb(token)
|
|
34
|
+
return cmyk2srgb(token)?.map?.(srgb2rgb) ?? null;
|
|
32
35
|
}
|
|
33
36
|
function oklab2rgb(token) {
|
|
34
|
-
return oklab2srgb(token)
|
|
37
|
+
return oklab2srgb(token)?.map?.(srgb2rgb) ?? null;
|
|
35
38
|
}
|
|
36
39
|
function oklch2rgb(token) {
|
|
37
|
-
return oklch2srgb(token)
|
|
40
|
+
return oklch2srgb(token)?.map?.(srgb2rgb) ?? null;
|
|
38
41
|
}
|
|
39
42
|
function lab2rgb(token) {
|
|
40
|
-
return lab2srgb(token)
|
|
43
|
+
return lab2srgb(token)?.map?.(srgb2rgb) ?? null;
|
|
41
44
|
}
|
|
42
45
|
function lch2rgb(token) {
|
|
43
|
-
return lch2srgb(token)
|
|
46
|
+
return lch2srgb(token)?.map?.(srgb2rgb) ?? null;
|
|
44
47
|
}
|
|
45
48
|
|
|
46
49
|
export { cmyk2rgb, hex2rgb, hsl2rgb, hwb2rgb, lab2rgb, lch2rgb, oklab2rgb, oklch2rgb, srgb2rgb };
|
|
@@ -44,7 +44,7 @@ function srgbvalues(token) {
|
|
|
44
44
|
return null;
|
|
45
45
|
}
|
|
46
46
|
function rgb2srgb(token) {
|
|
47
|
-
return getComponents(token)
|
|
47
|
+
return getComponents(token)?.map?.((t, index) => index == 3 ? ((t.typ == EnumToken.IdenTokenType && t.val == 'none') ? 1 : getNumber(t)) : (t.typ == EnumToken.PercentageTokenType ? 255 : 1) * getNumber(t) / 255) ?? null;
|
|
48
48
|
}
|
|
49
49
|
function hex2srgb(token) {
|
|
50
50
|
const value = expandHexValue(token.kin == 'lit' ? COLORS_NAMES[token.val.toLowerCase()] : token.val);
|
|
@@ -59,7 +59,10 @@ function xyz2srgb(x, y, z) {
|
|
|
59
59
|
return lsrgb2srgbvalues(...XYZ_to_lin_sRGB(x, y, z));
|
|
60
60
|
}
|
|
61
61
|
function hwb2srgb(token) {
|
|
62
|
-
const { h: hue, s: white, l: black, a: alpha } = hslvalues(token);
|
|
62
|
+
const { h: hue, s: white, l: black, a: alpha } = hslvalues(token) ?? {};
|
|
63
|
+
if (hue == null || white == null || black == null) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
63
66
|
const rgb = hsl2srgbvalues(hue, 1, .5);
|
|
64
67
|
for (let i = 0; i < 3; i++) {
|
|
65
68
|
rgb[i] *= (1 - white - black);
|
|
@@ -71,11 +74,17 @@ function hwb2srgb(token) {
|
|
|
71
74
|
return rgb;
|
|
72
75
|
}
|
|
73
76
|
function hsl2srgb(token) {
|
|
74
|
-
let { h, s, l, a } = hslvalues(token);
|
|
77
|
+
let { h, s, l, a } = hslvalues(token) ?? {};
|
|
78
|
+
if (h == null || s == null || l == null) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
75
81
|
return hsl2srgbvalues(h, s, l, a);
|
|
76
82
|
}
|
|
77
83
|
function cmyk2srgb(token) {
|
|
78
84
|
const components = getComponents(token);
|
|
85
|
+
if (components == null) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
79
88
|
// @ts-ignore
|
|
80
89
|
let t = components[0];
|
|
81
90
|
// @ts-ignore
|
|
@@ -107,7 +116,10 @@ function cmyk2srgb(token) {
|
|
|
107
116
|
return rgb;
|
|
108
117
|
}
|
|
109
118
|
function oklab2srgb(token) {
|
|
110
|
-
const [l, a, b, alpha] = getOKLABComponents(token);
|
|
119
|
+
const [l, a, b, alpha] = getOKLABComponents(token) ?? [];
|
|
120
|
+
if (l == null || a == null || b == null) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
111
123
|
const rgb = OKLab_to_sRGB(l, a, b);
|
|
112
124
|
if (alpha != null && alpha != 1) {
|
|
113
125
|
rgb.push(alpha);
|
|
@@ -115,7 +127,10 @@ function oklab2srgb(token) {
|
|
|
115
127
|
return rgb;
|
|
116
128
|
}
|
|
117
129
|
function oklch2srgb(token) {
|
|
118
|
-
const [l, c, h, alpha] = getOKLCHComponents(token);
|
|
130
|
+
const [l, c, h, alpha] = getOKLCHComponents(token) ?? [];
|
|
131
|
+
if (l == null || c == null || h == null) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
119
134
|
// @ts-ignore
|
|
120
135
|
const rgb = OKLab_to_sRGB(...lch2labvalues(l, c, h));
|
|
121
136
|
if (alpha != 1) {
|
|
@@ -125,6 +140,9 @@ function oklch2srgb(token) {
|
|
|
125
140
|
}
|
|
126
141
|
function hslvalues(token) {
|
|
127
142
|
const components = getComponents(token);
|
|
143
|
+
if (components == null) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
128
146
|
let t;
|
|
129
147
|
// @ts-ignore
|
|
130
148
|
let h = getAngle(components[0]);
|
|
@@ -199,7 +217,10 @@ function hsl2srgbvalues(h, s, l, a = null) {
|
|
|
199
217
|
return values;
|
|
200
218
|
}
|
|
201
219
|
function lab2srgb(token) {
|
|
202
|
-
const [l, a, b, alpha] = getLABComponents(token);
|
|
220
|
+
const [l, a, b, alpha] = getLABComponents(token) ?? [];
|
|
221
|
+
if (l == null || a == null || b == null) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
203
224
|
const rgb = Lab_to_sRGB(l, a, b);
|
|
204
225
|
if (alpha != null && alpha != 1) {
|
|
205
226
|
rgb.push(alpha);
|
|
@@ -209,6 +230,9 @@ function lab2srgb(token) {
|
|
|
209
230
|
function lch2srgb(token) {
|
|
210
231
|
// @ts-ignore
|
|
211
232
|
const [l, a, b, alpha] = lch2labvalues(...getLCHComponents(token));
|
|
233
|
+
if (l == null || a == null || b == null) {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
212
236
|
// https://www.w3.org/TR/css-color-4/#lab-to-lch
|
|
213
237
|
const rgb = Lab_to_sRGB(l, a, b);
|
|
214
238
|
if (alpha != 1) {
|
|
@@ -15,8 +15,19 @@ function getComponents(token) {
|
|
|
15
15
|
return { typ: EnumToken.Number, val: parseInt(t, 16).toString() };
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
const result = [];
|
|
19
|
+
for (const child of (token.chi)) {
|
|
20
|
+
if ([
|
|
21
|
+
EnumToken.LiteralTokenType, EnumToken.CommentTokenType, EnumToken.CommaTokenType, EnumToken.WhitespaceTokenType
|
|
22
|
+
].includes(child.typ)) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (child.typ == EnumToken.ColorTokenType && child.val == 'currentcolor') {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
result.push(child);
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
20
31
|
}
|
|
21
32
|
|
|
22
33
|
export { getComponents };
|
|
@@ -4,26 +4,10 @@ import '../../ast/types.js';
|
|
|
4
4
|
import '../../ast/minify.js';
|
|
5
5
|
import '../../ast/walk.js';
|
|
6
6
|
import '../../parser/parse.js';
|
|
7
|
-
import { srgb2lsrgbvalues
|
|
7
|
+
import { srgb2lsrgbvalues } from './srgb.js';
|
|
8
8
|
import '../sourcemap/lib/encode.js';
|
|
9
9
|
import '../../parser/utils/config.js';
|
|
10
10
|
|
|
11
|
-
function xyzd502srgb(x, y, z) {
|
|
12
|
-
// @ts-ignore
|
|
13
|
-
return lsrgb2srgbvalues(
|
|
14
|
-
/* r: */
|
|
15
|
-
x * 3.1341359569958707 -
|
|
16
|
-
y * 1.6173863321612538 -
|
|
17
|
-
0.4906619460083532 * z,
|
|
18
|
-
/* g: */
|
|
19
|
-
x * -0.978795502912089 +
|
|
20
|
-
y * 1.916254567259524 +
|
|
21
|
-
0.03344273116131949 * z,
|
|
22
|
-
/* b: */
|
|
23
|
-
x * 0.07195537988411677 -
|
|
24
|
-
y * 0.2289768264158322 +
|
|
25
|
-
1.405386058324125 * z);
|
|
26
|
-
}
|
|
27
11
|
function XYZ_to_lin_sRGB(x, y, z) {
|
|
28
12
|
// convert XYZ to linear-light sRGB
|
|
29
13
|
const M = [
|
|
@@ -63,4 +47,4 @@ function srgb2xyz(r, g, b, alpha) {
|
|
|
63
47
|
return rgb;
|
|
64
48
|
}
|
|
65
49
|
|
|
66
|
-
export { XYZ_D50_to_D65, XYZ_to_lin_sRGB, srgb2xyz
|
|
50
|
+
export { XYZ_D50_to_D65, XYZ_to_lin_sRGB, srgb2xyz };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { lsrgb2srgbvalues } from './srgb.js';
|
|
1
2
|
import { multiplyMatrices } from './utils/matrix.js';
|
|
2
3
|
import './utils/constants.js';
|
|
3
4
|
import '../../ast/types.js';
|
|
@@ -10,11 +11,12 @@ import { XYZ_D50_to_D65 } from './xyz.js';
|
|
|
10
11
|
import '../sourcemap/lib/encode.js';
|
|
11
12
|
import '../../parser/utils/config.js';
|
|
12
13
|
|
|
14
|
+
/*
|
|
15
|
+
*/
|
|
13
16
|
function xyzd502lch(x, y, z, alpha) {
|
|
14
17
|
// @ts-ignore
|
|
15
18
|
const [l, a, b] = xyz2lab(...XYZ_D50_to_D65(x, y, z));
|
|
16
19
|
// L in range [0,100]. For use in CSS, add a percent
|
|
17
|
-
// @ts-ignore
|
|
18
20
|
return lab2lchvalues(l, a, b, alpha);
|
|
19
21
|
}
|
|
20
22
|
function XYZ_D65_to_D50(x, y, z) {
|
|
@@ -31,5 +33,21 @@ function XYZ_D65_to_D50(x, y, z) {
|
|
|
31
33
|
];
|
|
32
34
|
return multiplyMatrices(M, [x, y, z]);
|
|
33
35
|
}
|
|
36
|
+
function xyzd502srgb(x, y, z) {
|
|
37
|
+
// @ts-ignore
|
|
38
|
+
return lsrgb2srgbvalues(
|
|
39
|
+
/* r: */
|
|
40
|
+
x * 3.1341359569958707 -
|
|
41
|
+
y * 1.6173863321612538 -
|
|
42
|
+
0.4906619460083532 * z,
|
|
43
|
+
/* g: */
|
|
44
|
+
x * -0.978795502912089 +
|
|
45
|
+
y * 1.916254567259524 +
|
|
46
|
+
0.03344273116131949 * z,
|
|
47
|
+
/* b: */
|
|
48
|
+
x * 0.07195537988411677 -
|
|
49
|
+
y * 0.2289768264158322 +
|
|
50
|
+
1.405386058324125 * z);
|
|
51
|
+
}
|
|
34
52
|
|
|
35
|
-
export { XYZ_D65_to_D50, xyzd502lch };
|
|
53
|
+
export { XYZ_D65_to_D50, xyzd502lch, xyzd502srgb };
|