cssstyle 4.1.0 → 4.2.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.
@@ -53,7 +53,9 @@ CSSStyleDeclaration.prototype = {
53
53
  this.removeProperty(name);
54
54
  return;
55
55
  }
56
- var isCustomProperty = name.indexOf('--') === 0;
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;
@@ -1,6 +1,6 @@
1
1
 
2
2
  'use strict';
3
- // autogenerated - 2024-09-07
3
+ // autogenerated - 2025-01-09
4
4
  // https://www.w3.org/Style/CSS/all-properties.en.html
5
5
 
6
6
  module.exports = new Set([
package/lib/parsers.js CHANGED
@@ -4,8 +4,7 @@
4
4
  ********************************************************************/
5
5
  'use strict';
6
6
 
7
- const namedColors = require('./named_colors.json');
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
- // rough regular expressions
25
- var integerRegEx = /^[-+]?[0-9]+$/;
26
- var numberRegEx = /^[-+]?[0-9]*\.?[0-9]+$/;
27
- var lengthRegEx = /^(0|[-+]?[0-9]*\.?[0-9]+(in|cm|em|mm|pt|pc|px|ex|rem|vh|vw|ch))$/;
28
- var percentRegEx = /^[-+]?[0-9]*\.?[0-9]+%$/;
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 colorRegEx1 = /^#([0-9a-fA-F]{3,4}){1,2}$/;
32
- var colorRegEx2 = /^rgb\(([^)]*)\)$/;
33
- var colorRegEx3 = /^rgba\(([^)]*)\)$/;
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 (colorRegEx1.test(val)) {
78
+ if (isColor(val)) {
77
79
  return exports.TYPES.COLOR;
78
80
  }
79
81
 
80
- var res = colorRegEx2.exec(val);
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.CALC) {
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
- var red,
295
- green,
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
- res = colorRegEx4.exec(val);
261
+ var res = resolve(val, {
262
+ format: 'specifiedValue',
263
+ });
382
264
  if (res) {
383
- const [, _hue, _saturation, _lightness, _alphaString = ''] = res;
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
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- // autogenerated - 9/7/2024
3
+ // autogenerated - 1/9/2025
4
4
 
5
5
  /*
6
6
  *
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "CSSStyleDeclaration",
7
7
  "StyleSheet"
8
8
  ],
9
- "version": "4.1.0",
9
+ "version": "4.2.0",
10
10
  "homepage": "https://github.com/jsdom/cssstyle",
11
11
  "maintainers": [
12
12
  {
@@ -37,6 +37,7 @@
37
37
  ],
38
38
  "main": "./lib/CSSStyleDeclaration.js",
39
39
  "dependencies": {
40
+ "@asamuzakjp/css-color": "^2.8.2",
40
41
  "rrweb-cssom": "^0.7.1"
41
42
  },
42
43
  "devDependencies": {
@@ -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
- };