cssstyle 4.1.0 → 4.2.1
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/lib/CSSStyleDeclaration.js +3 -1
- package/lib/implementedProperties.js +1 -1
- package/lib/parsers.js +32 -170
- package/lib/properties.js +1 -1
- package/package.json +11 -10
- package/lib/utils/colorSpace.js +0 -19
|
@@ -53,7 +53,9 @@ CSSStyleDeclaration.prototype = {
|
|
|
53
53
|
this.removeProperty(name);
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
|
-
var isCustomProperty =
|
|
56
|
+
var isCustomProperty =
|
|
57
|
+
name.indexOf('--') === 0 ||
|
|
58
|
+
(typeof value === 'string' && /^var\(--[-\w]+,?.*\)$/.test(value));
|
|
57
59
|
if (isCustomProperty) {
|
|
58
60
|
this._setProperty(name, value, priority);
|
|
59
61
|
return;
|
package/lib/parsers.js
CHANGED
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
********************************************************************/
|
|
5
5
|
'use strict';
|
|
6
6
|
|
|
7
|
-
const
|
|
8
|
-
const { hslToRgb } = require('./utils/colorSpace');
|
|
7
|
+
const { cssCalc, isColor, resolve } = require('@asamuzakjp/css-color');
|
|
9
8
|
|
|
10
9
|
exports.TYPES = {
|
|
11
10
|
INTEGER: 1,
|
|
@@ -19,22 +18,24 @@ exports.TYPES = {
|
|
|
19
18
|
KEYWORD: 9,
|
|
20
19
|
NULL_OR_EMPTY_STR: 10,
|
|
21
20
|
CALC: 11,
|
|
21
|
+
VAR: 12,
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
//
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
var
|
|
28
|
-
var
|
|
24
|
+
// regular expressions
|
|
25
|
+
var DIGIT = '(?:0|[1-9]\\d*)';
|
|
26
|
+
var NUMBER = `[+-]?(?:${DIGIT}(?:\\.\\d*)?|\\.\\d+)(?:e-?${DIGIT})?`;
|
|
27
|
+
var integerRegEx = new RegExp(`^[+-]?${DIGIT}$`);
|
|
28
|
+
var numberRegEx = new RegExp(`^${NUMBER}$`);
|
|
29
|
+
var lengthRegEx = new RegExp(
|
|
30
|
+
`^${NUMBER}(?:[cm]m|[dls]?v(?:[bhiw]|max|min)|in|p[ctx]|q|r?(?:[cl]h|cap|e[mx]|ic))$`
|
|
31
|
+
);
|
|
32
|
+
var percentRegEx = new RegExp(`^${NUMBER}%$`);
|
|
33
|
+
var angleRegEx = new RegExp(`^${NUMBER}(?:deg|g?rad|turn)$`);
|
|
29
34
|
var urlRegEx = /^url\(\s*([^)]*)\s*\)$/;
|
|
30
35
|
var stringRegEx = /^("[^"]*"|'[^']*')$/;
|
|
31
|
-
var
|
|
32
|
-
var
|
|
33
|
-
|
|
34
|
-
var calcRegEx = /^calc\(([^)]*)\)$/;
|
|
35
|
-
var colorRegEx4 =
|
|
36
|
-
/^hsla?\(\s*(-?\d+|-?\d*.\d+)\s*,\s*(-?\d+|-?\d*.\d+)%\s*,\s*(-?\d+|-?\d*.\d+)%\s*(,\s*(-?\d+|-?\d*.\d+)\s*)?\)/;
|
|
37
|
-
var angleRegEx = /^([-+]?[0-9]*\.?[0-9]+)(deg|grad|rad)$/;
|
|
36
|
+
var varRegEx = /^var\(|(?<=[*/\s(])var\(/;
|
|
37
|
+
var calcRegEx =
|
|
38
|
+
/^(?:a?(?:cos|sin|tan)|abs|atan2|calc|clamp|exp|hypot|log|max|min|mod|pow|rem|round|sign|sqrt)\(/;
|
|
38
39
|
|
|
39
40
|
// This will return one of the above types based on the passed in string
|
|
40
41
|
exports.valueType = function valueType(val) {
|
|
@@ -44,11 +45,9 @@ exports.valueType = function valueType(val) {
|
|
|
44
45
|
if (typeof val === 'number') {
|
|
45
46
|
val = val.toString();
|
|
46
47
|
}
|
|
47
|
-
|
|
48
48
|
if (typeof val !== 'string') {
|
|
49
49
|
return undefined;
|
|
50
50
|
}
|
|
51
|
-
|
|
52
51
|
if (integerRegEx.test(val)) {
|
|
53
52
|
return exports.TYPES.INTEGER;
|
|
54
53
|
}
|
|
@@ -64,6 +63,9 @@ exports.valueType = function valueType(val) {
|
|
|
64
63
|
if (urlRegEx.test(val)) {
|
|
65
64
|
return exports.TYPES.URL;
|
|
66
65
|
}
|
|
66
|
+
if (varRegEx.test(val)) {
|
|
67
|
+
return exports.TYPES.VAR;
|
|
68
|
+
}
|
|
67
69
|
if (calcRegEx.test(val)) {
|
|
68
70
|
return exports.TYPES.CALC;
|
|
69
71
|
}
|
|
@@ -73,54 +75,11 @@ exports.valueType = function valueType(val) {
|
|
|
73
75
|
if (angleRegEx.test(val)) {
|
|
74
76
|
return exports.TYPES.ANGLE;
|
|
75
77
|
}
|
|
76
|
-
if (
|
|
78
|
+
if (isColor(val)) {
|
|
77
79
|
return exports.TYPES.COLOR;
|
|
78
80
|
}
|
|
79
81
|
|
|
80
|
-
|
|
81
|
-
var parts;
|
|
82
|
-
if (res !== null) {
|
|
83
|
-
parts = res[1].split(/\s*,\s*/);
|
|
84
|
-
if (parts.length !== 3) {
|
|
85
|
-
return undefined;
|
|
86
|
-
}
|
|
87
|
-
if (
|
|
88
|
-
parts.every(percentRegEx.test.bind(percentRegEx)) ||
|
|
89
|
-
parts.every(integerRegEx.test.bind(integerRegEx))
|
|
90
|
-
) {
|
|
91
|
-
return exports.TYPES.COLOR;
|
|
92
|
-
}
|
|
93
|
-
return undefined;
|
|
94
|
-
}
|
|
95
|
-
res = colorRegEx3.exec(val);
|
|
96
|
-
if (res !== null) {
|
|
97
|
-
parts = res[1].split(/\s*,\s*/);
|
|
98
|
-
if (parts.length !== 4) {
|
|
99
|
-
return undefined;
|
|
100
|
-
}
|
|
101
|
-
if (
|
|
102
|
-
parts.slice(0, 3).every(percentRegEx.test.bind(percentRegEx)) ||
|
|
103
|
-
parts.slice(0, 3).every(integerRegEx.test.bind(integerRegEx))
|
|
104
|
-
) {
|
|
105
|
-
if (numberRegEx.test(parts[3])) {
|
|
106
|
-
return exports.TYPES.COLOR;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return undefined;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (colorRegEx4.test(val)) {
|
|
113
|
-
return exports.TYPES.COLOR;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// could still be a color, one of the standard keyword colors
|
|
117
|
-
val = val.toLowerCase();
|
|
118
|
-
|
|
119
|
-
if (namedColors.includes(val)) {
|
|
120
|
-
return exports.TYPES.COLOR;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
switch (val) {
|
|
82
|
+
switch (val.toLowerCase()) {
|
|
124
83
|
// the following are deprecated in CSS3
|
|
125
84
|
case 'activeborder':
|
|
126
85
|
case 'activecaption':
|
|
@@ -209,9 +168,14 @@ exports.parsePercent = function parsePercent(val) {
|
|
|
209
168
|
// either a length or a percent
|
|
210
169
|
exports.parseMeasurement = function parseMeasurement(val) {
|
|
211
170
|
var type = exports.valueType(val);
|
|
212
|
-
if (type === exports.TYPES.
|
|
171
|
+
if (type === exports.TYPES.VAR) {
|
|
213
172
|
return val;
|
|
214
173
|
}
|
|
174
|
+
if (type === exports.TYPES.CALC) {
|
|
175
|
+
return cssCalc(val, {
|
|
176
|
+
format: 'specifiedValue',
|
|
177
|
+
});
|
|
178
|
+
}
|
|
215
179
|
|
|
216
180
|
var length = exports.parseLength(val);
|
|
217
181
|
if (length !== undefined) {
|
|
@@ -291,116 +255,14 @@ exports.parseColor = function parseColor(val) {
|
|
|
291
255
|
if (type === exports.TYPES.NULL_OR_EMPTY_STR) {
|
|
292
256
|
return val;
|
|
293
257
|
}
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
blue,
|
|
297
|
-
hue,
|
|
298
|
-
saturation,
|
|
299
|
-
lightness,
|
|
300
|
-
alpha = 1;
|
|
301
|
-
var parts;
|
|
302
|
-
var res = colorRegEx1.exec(val);
|
|
303
|
-
// is it #aaa, #ababab, #aaaa, #abababaa
|
|
304
|
-
if (res) {
|
|
305
|
-
var defaultHex = val.substr(1);
|
|
306
|
-
var hex = val.substr(1);
|
|
307
|
-
if (hex.length === 3 || hex.length === 4) {
|
|
308
|
-
hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
|
|
309
|
-
|
|
310
|
-
if (defaultHex.length === 4) {
|
|
311
|
-
hex = hex + defaultHex[3] + defaultHex[3];
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
red = parseInt(hex.substr(0, 2), 16);
|
|
315
|
-
green = parseInt(hex.substr(2, 2), 16);
|
|
316
|
-
blue = parseInt(hex.substr(4, 2), 16);
|
|
317
|
-
if (hex.length === 8) {
|
|
318
|
-
var hexAlpha = hex.substr(6, 2);
|
|
319
|
-
var hexAlphaToRgbaAlpha = Number((parseInt(hexAlpha, 16) / 255).toFixed(3));
|
|
320
|
-
|
|
321
|
-
return 'rgba(' + red + ', ' + green + ', ' + blue + ', ' + hexAlphaToRgbaAlpha + ')';
|
|
322
|
-
}
|
|
323
|
-
return 'rgb(' + red + ', ' + green + ', ' + blue + ')';
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
res = colorRegEx2.exec(val);
|
|
327
|
-
if (res) {
|
|
328
|
-
parts = res[1].split(/\s*,\s*/);
|
|
329
|
-
if (parts.length !== 3) {
|
|
330
|
-
return undefined;
|
|
331
|
-
}
|
|
332
|
-
if (parts.every(percentRegEx.test.bind(percentRegEx))) {
|
|
333
|
-
red = Math.floor((parseFloat(parts[0].slice(0, -1)) * 255) / 100);
|
|
334
|
-
green = Math.floor((parseFloat(parts[1].slice(0, -1)) * 255) / 100);
|
|
335
|
-
blue = Math.floor((parseFloat(parts[2].slice(0, -1)) * 255) / 100);
|
|
336
|
-
} else if (parts.every(integerRegEx.test.bind(integerRegEx))) {
|
|
337
|
-
red = parseInt(parts[0], 10);
|
|
338
|
-
green = parseInt(parts[1], 10);
|
|
339
|
-
blue = parseInt(parts[2], 10);
|
|
340
|
-
} else {
|
|
341
|
-
return undefined;
|
|
342
|
-
}
|
|
343
|
-
red = Math.min(255, Math.max(0, red));
|
|
344
|
-
green = Math.min(255, Math.max(0, green));
|
|
345
|
-
blue = Math.min(255, Math.max(0, blue));
|
|
346
|
-
return 'rgb(' + red + ', ' + green + ', ' + blue + ')';
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
res = colorRegEx3.exec(val);
|
|
350
|
-
if (res) {
|
|
351
|
-
parts = res[1].split(/\s*,\s*/);
|
|
352
|
-
if (parts.length !== 4) {
|
|
353
|
-
return undefined;
|
|
354
|
-
}
|
|
355
|
-
if (parts.slice(0, 3).every(percentRegEx.test.bind(percentRegEx))) {
|
|
356
|
-
red = Math.floor((parseFloat(parts[0].slice(0, -1)) * 255) / 100);
|
|
357
|
-
green = Math.floor((parseFloat(parts[1].slice(0, -1)) * 255) / 100);
|
|
358
|
-
blue = Math.floor((parseFloat(parts[2].slice(0, -1)) * 255) / 100);
|
|
359
|
-
alpha = parseFloat(parts[3]);
|
|
360
|
-
} else if (parts.slice(0, 3).every(integerRegEx.test.bind(integerRegEx))) {
|
|
361
|
-
red = parseInt(parts[0], 10);
|
|
362
|
-
green = parseInt(parts[1], 10);
|
|
363
|
-
blue = parseInt(parts[2], 10);
|
|
364
|
-
alpha = parseFloat(parts[3]);
|
|
365
|
-
} else {
|
|
366
|
-
return undefined;
|
|
367
|
-
}
|
|
368
|
-
if (isNaN(alpha)) {
|
|
369
|
-
alpha = 1;
|
|
370
|
-
}
|
|
371
|
-
red = Math.min(255, Math.max(0, red));
|
|
372
|
-
green = Math.min(255, Math.max(0, green));
|
|
373
|
-
blue = Math.min(255, Math.max(0, blue));
|
|
374
|
-
alpha = Math.min(1, Math.max(0, alpha));
|
|
375
|
-
if (alpha === 1) {
|
|
376
|
-
return 'rgb(' + red + ', ' + green + ', ' + blue + ')';
|
|
377
|
-
}
|
|
378
|
-
return 'rgba(' + red + ', ' + green + ', ' + blue + ', ' + alpha + ')';
|
|
258
|
+
if (/^[a-z]+$/i.test(val) && type === exports.TYPES.COLOR) {
|
|
259
|
+
return val;
|
|
379
260
|
}
|
|
380
|
-
|
|
381
|
-
|
|
261
|
+
var res = resolve(val, {
|
|
262
|
+
format: 'specifiedValue',
|
|
263
|
+
});
|
|
382
264
|
if (res) {
|
|
383
|
-
|
|
384
|
-
const _alpha = parseFloat(_alphaString.replace(',', '').trim());
|
|
385
|
-
if (!_hue || !_saturation || !_lightness) {
|
|
386
|
-
return undefined;
|
|
387
|
-
}
|
|
388
|
-
hue = parseFloat(_hue);
|
|
389
|
-
saturation = parseInt(_saturation, 10);
|
|
390
|
-
lightness = parseInt(_lightness, 10);
|
|
391
|
-
if (_alpha && numberRegEx.test(_alpha)) {
|
|
392
|
-
alpha = parseFloat(_alpha);
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
const [r, g, b] = hslToRgb(hue, saturation / 100, lightness / 100);
|
|
396
|
-
if (!_alphaString || alpha === 1) {
|
|
397
|
-
return 'rgb(' + r + ', ' + g + ', ' + b + ')';
|
|
398
|
-
}
|
|
399
|
-
return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + alpha + ')';
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
if (type === exports.TYPES.COLOR) {
|
|
403
|
-
return val;
|
|
265
|
+
return res;
|
|
404
266
|
}
|
|
405
267
|
return undefined;
|
|
406
268
|
};
|
package/lib/properties.js
CHANGED
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"CSSStyleDeclaration",
|
|
7
7
|
"StyleSheet"
|
|
8
8
|
],
|
|
9
|
-
"version": "4.1
|
|
9
|
+
"version": "4.2.1",
|
|
10
10
|
"homepage": "https://github.com/jsdom/cssstyle",
|
|
11
11
|
"maintainers": [
|
|
12
12
|
{
|
|
@@ -37,20 +37,21 @@
|
|
|
37
37
|
],
|
|
38
38
|
"main": "./lib/CSSStyleDeclaration.js",
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"
|
|
40
|
+
"@asamuzakjp/css-color": "^2.8.2",
|
|
41
|
+
"rrweb-cssom": "^0.8.0"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
|
-
"@babel/generator": "^7.
|
|
44
|
-
"@babel/parser": "^7.
|
|
45
|
-
"@babel/traverse": "^7.
|
|
46
|
-
"@babel/types": "^7.
|
|
47
|
-
"eslint": "^9.
|
|
44
|
+
"@babel/generator": "^7.26.3",
|
|
45
|
+
"@babel/parser": "^7.26.3",
|
|
46
|
+
"@babel/traverse": "^7.26.3",
|
|
47
|
+
"@babel/types": "^7.26.3",
|
|
48
|
+
"eslint": "^9.17.0",
|
|
48
49
|
"eslint-config-prettier": "^9.1.0",
|
|
49
50
|
"eslint-plugin-prettier": "^5.2.1",
|
|
50
|
-
"globals": "^15.
|
|
51
|
+
"globals": "^15.14.0",
|
|
51
52
|
"npm-run-all": "^4.1.5",
|
|
52
|
-
"prettier": "^3.
|
|
53
|
-
"resolve": "^1.22.
|
|
53
|
+
"prettier": "^3.4.2",
|
|
54
|
+
"resolve": "^1.22.10"
|
|
54
55
|
},
|
|
55
56
|
"scripts": {
|
|
56
57
|
"download": "node ./scripts/downloadLatestProperties.mjs && eslint lib/allProperties.js --fix",
|
package/lib/utils/colorSpace.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const MAX_HUE = 360;
|
|
4
|
-
const COLOR_NB = 12;
|
|
5
|
-
const MAX_RGB_VALUE = 255;
|
|
6
|
-
|
|
7
|
-
// https://www.w3.org/TR/css-color-4/#hsl-to-rgb
|
|
8
|
-
exports.hslToRgb = (hue, sat, light) => {
|
|
9
|
-
hue = hue % MAX_HUE;
|
|
10
|
-
if (hue < 0) {
|
|
11
|
-
hue += MAX_HUE;
|
|
12
|
-
}
|
|
13
|
-
function f(n) {
|
|
14
|
-
const k = (n + hue / (MAX_HUE / COLOR_NB)) % COLOR_NB;
|
|
15
|
-
const a = sat * Math.min(light, 1 - light);
|
|
16
|
-
return light - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));
|
|
17
|
-
}
|
|
18
|
-
return [f(0), f(8), f(4)].map((value) => Math.round(value * MAX_RGB_VALUE));
|
|
19
|
-
};
|