@tbela99/css-parser 1.1.1 → 1.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.
Files changed (101) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +53 -6
  3. package/dist/index-umd-web.js +4195 -3363
  4. package/dist/index.cjs +4199 -3367
  5. package/dist/index.d.ts +42 -31
  6. package/dist/lib/ast/expand.js +81 -65
  7. package/dist/lib/ast/features/calc.js +37 -35
  8. package/dist/lib/ast/features/inlinecssvariables.js +25 -17
  9. package/dist/lib/ast/features/prefix.js +22 -19
  10. package/dist/lib/ast/features/shorthand.js +1 -1
  11. package/dist/lib/ast/features/transform.js +17 -2
  12. package/dist/lib/ast/math/expression.js +184 -159
  13. package/dist/lib/ast/math/math.js +22 -20
  14. package/dist/lib/ast/minify.js +249 -199
  15. package/dist/lib/ast/transform/compute.js +48 -38
  16. package/dist/lib/ast/transform/matrix.js +6 -5
  17. package/dist/lib/ast/transform/minify.js +31 -34
  18. package/dist/lib/ast/transform/utils.js +76 -16
  19. package/dist/lib/ast/types.js +32 -1
  20. package/dist/lib/fs/resolve.js +1 -14
  21. package/dist/lib/parser/declaration/list.js +1 -1
  22. package/dist/lib/parser/declaration/map.js +1 -1
  23. package/dist/lib/parser/declaration/set.js +1 -1
  24. package/dist/lib/parser/parse.js +19 -95
  25. package/dist/lib/parser/tokenize.js +1 -13
  26. package/dist/lib/parser/utils/declaration.js +1 -1
  27. package/dist/lib/parser/utils/type.js +1 -1
  28. package/dist/lib/renderer/render.js +44 -168
  29. package/dist/lib/{renderer → syntax}/color/a98rgb.js +2 -2
  30. package/dist/lib/syntax/color/cmyk.js +104 -0
  31. package/dist/lib/{renderer → syntax}/color/color-mix.js +20 -21
  32. package/dist/lib/syntax/color/color.js +581 -0
  33. package/dist/lib/syntax/color/hex.js +179 -0
  34. package/dist/lib/syntax/color/hsl.js +201 -0
  35. package/dist/lib/syntax/color/hwb.js +185 -0
  36. package/dist/lib/syntax/color/lab.js +262 -0
  37. package/dist/lib/syntax/color/lch.js +194 -0
  38. package/dist/lib/syntax/color/oklab.js +237 -0
  39. package/dist/lib/syntax/color/oklch.js +166 -0
  40. package/dist/lib/{renderer → syntax}/color/p3.js +3 -3
  41. package/dist/lib/{renderer → syntax}/color/rec2020.js +11 -11
  42. package/dist/lib/{renderer → syntax}/color/relativecolor.js +53 -40
  43. package/dist/lib/syntax/color/rgb.js +140 -0
  44. package/dist/lib/{renderer → syntax}/color/srgb.js +58 -46
  45. package/dist/lib/{renderer → syntax}/color/utils/components.js +7 -7
  46. package/dist/lib/{renderer → syntax}/color/utils/constants.js +6 -33
  47. package/dist/lib/syntax/color/utils/distance.js +30 -0
  48. package/dist/lib/{renderer → syntax}/color/xyz.js +27 -14
  49. package/dist/lib/{renderer → syntax}/color/xyzd50.js +8 -8
  50. package/dist/lib/syntax/syntax.js +77 -67
  51. package/dist/lib/syntax/utils.js +70 -0
  52. package/dist/lib/validation/at-rules/container.js +1 -1
  53. package/dist/lib/validation/at-rules/counter-style.js +1 -1
  54. package/dist/lib/validation/at-rules/custom-media.js +1 -1
  55. package/dist/lib/validation/at-rules/document.js +1 -1
  56. package/dist/lib/validation/at-rules/font-feature-values.js +2 -2
  57. package/dist/lib/validation/at-rules/import.js +1 -1
  58. package/dist/lib/validation/at-rules/keyframes.js +14 -13
  59. package/dist/lib/validation/at-rules/layer.js +1 -1
  60. package/dist/lib/validation/at-rules/media.js +1 -1
  61. package/dist/lib/validation/at-rules/namespace.js +1 -1
  62. package/dist/lib/validation/at-rules/page-margin-box.js +1 -1
  63. package/dist/lib/validation/at-rules/page.js +1 -1
  64. package/dist/lib/validation/at-rules/supports.js +1 -1
  65. package/dist/lib/validation/at-rules/when.js +1 -1
  66. package/dist/lib/validation/atrule.js +2 -2
  67. package/dist/lib/validation/config.js +4 -3
  68. package/dist/lib/validation/config.json.js +1 -1
  69. package/dist/lib/validation/parser/parse.js +12 -7
  70. package/dist/lib/validation/selector.js +9 -8
  71. package/dist/lib/validation/syntax.js +170 -120
  72. package/dist/lib/validation/syntaxes/complex-selector-list.js +13 -19
  73. package/dist/lib/validation/syntaxes/complex-selector.js +1 -1
  74. package/dist/lib/validation/syntaxes/compound-selector.js +5 -24
  75. package/dist/lib/validation/syntaxes/family-name.js +36 -39
  76. package/dist/lib/validation/syntaxes/keyframe-selector.js +14 -22
  77. package/dist/lib/validation/syntaxes/layer-name.js +1 -1
  78. package/dist/lib/validation/syntaxes/relative-selector-list.js +27 -25
  79. package/dist/lib/validation/syntaxes/relative-selector.js +1 -1
  80. package/dist/lib/validation/syntaxes/url.js +35 -33
  81. package/dist/lib/validation/utils/list.js +10 -9
  82. package/dist/lib/validation/utils/whitespace.js +1 -1
  83. package/dist/node/index.js +4 -2
  84. package/dist/web/index.js +4 -2
  85. package/package.json +4 -4
  86. package/.editorconfig +0 -484
  87. package/dist/lib/ast/transform/convert.js +0 -33
  88. package/dist/lib/ast/utils/utils.js +0 -104
  89. package/dist/lib/renderer/color/color.js +0 -654
  90. package/dist/lib/renderer/color/hex.js +0 -105
  91. package/dist/lib/renderer/color/hsl.js +0 -125
  92. package/dist/lib/renderer/color/hwb.js +0 -103
  93. package/dist/lib/renderer/color/lab.js +0 -148
  94. package/dist/lib/renderer/color/lch.js +0 -90
  95. package/dist/lib/renderer/color/oklab.js +0 -131
  96. package/dist/lib/renderer/color/oklch.js +0 -75
  97. package/dist/lib/renderer/color/rgb.js +0 -50
  98. package/dist/lib/validation/syntaxes/keyframe-block-list.js +0 -28
  99. package/dist/lib/{renderer → syntax}/color/hsv.js +0 -0
  100. package/dist/lib/{renderer → syntax}/color/prophotorgb.js +1 -1
  101. /package/dist/lib/{renderer → syntax}/color/utils/matrix.js +0 -0
@@ -1,13 +1,7 @@
1
1
  import { EnumToken } from '../types.js';
2
2
  import { rem, compute } from './math.js';
3
- import { reduceNumber } from '../../renderer/render.js';
4
- import '../../renderer/color/utils/constants.js';
5
- import '../minify.js';
6
- import '../walk.js';
7
- import '../../parser/parse.js';
8
- import '../../parser/tokenize.js';
9
- import '../../parser/utils/config.js';
10
3
  import { mathFuncs } from '../../syntax/syntax.js';
4
+ import { minifyNumber } from '../../syntax/utils.js';
11
5
 
12
6
  /**
13
7
  * evaluate an array of tokens
@@ -38,12 +32,12 @@ function evaluate(tokens) {
38
32
  });
39
33
  return evaluateFunc(tokens[0]);
40
34
  }
41
- try {
42
- nodes = inlineExpression(evaluateExpression(buildExpression(tokens)));
43
- }
44
- catch (e) {
45
- return tokens;
46
- }
35
+ // try {
36
+ nodes = inlineExpression(evaluateExpression(buildExpression(tokens)));
37
+ // } catch (e) {
38
+ //
39
+ // return tokens;
40
+ // }
47
41
  if (nodes.length <= 1) {
48
42
  if (nodes.length == 1) {
49
43
  if (nodes[0].typ == EnumToken.BinaryExpressionTokenType) {
@@ -116,48 +110,59 @@ function doEvaluate(l, r, op) {
116
110
  if (!isScalarToken(l) || !isScalarToken(r) || (l.typ == r.typ && 'unit' in l && 'unit' in r && l.unit != r.unit)) {
117
111
  return defaultReturn;
118
112
  }
119
- if (l.typ == EnumToken.FunctionTokenType) {
120
- const val = evaluateFunc(l);
121
- if (val.length == 1) {
122
- l = val[0];
123
- }
124
- else {
125
- return defaultReturn;
126
- }
127
- }
113
+ // if (l.typ == EnumToken.FunctionTokenType) {
114
+ //
115
+ // const val: Token[] = evaluateFunc(l as FunctionToken);
116
+ //
117
+ // if (val.length == 1) {
118
+ //
119
+ // l = val[0];
120
+ // } else {
121
+ //
122
+ // return defaultReturn;
123
+ // }
124
+ // }
128
125
  if (r.typ == EnumToken.FunctionTokenType) {
129
126
  const val = evaluateFunc(r);
130
127
  if (val.length == 1) {
131
128
  r = val[0];
132
129
  }
133
- else {
134
- return defaultReturn;
135
- }
136
- }
137
- if (l.typ == EnumToken.FunctionTokenType) {
138
- const val = evaluateFunc(l);
139
- if (val.length == 1) {
140
- l = val[0];
141
- }
130
+ // else {
131
+ //
132
+ // return defaultReturn;
133
+ // }
142
134
  }
135
+ // if (l.typ == EnumToken.FunctionTokenType) {
136
+ //
137
+ // const val = evaluateFunc(l as FunctionToken);
138
+ //
139
+ // if (val.length == 1) {
140
+ //
141
+ // l = val[0];
142
+ // }
143
+ // }
143
144
  if ((op == EnumToken.Add || op == EnumToken.Sub)) {
144
145
  // @ts-ignore
145
146
  if (l.typ != r.typ) {
146
147
  return defaultReturn;
147
148
  }
148
149
  }
149
- else if (op == EnumToken.Mul &&
150
- ![EnumToken.NumberTokenType, EnumToken.PercentageTokenType].includes(l.typ) &&
151
- ![EnumToken.NumberTokenType, EnumToken.PercentageTokenType].includes(r.typ)) {
152
- return defaultReturn;
153
- }
150
+ // else if (
151
+ // op == EnumToken.Mul &&
152
+ // ![EnumToken.NumberTokenType, EnumToken.PercentageTokenType].includes(l.typ) &&
153
+ // ![EnumToken.NumberTokenType, EnumToken.PercentageTokenType].includes(r.typ)) {
154
+ //
155
+ // return defaultReturn;
156
+ // }
154
157
  let typ = l.typ == EnumToken.NumberTokenType ? r.typ : (r.typ == EnumToken.NumberTokenType ? l.typ : (l.typ == EnumToken.PercentageTokenType ? r.typ : l.typ));
155
158
  // @ts-ignore
156
- let v1 = getValue(l);
157
- let v2 = getValue(r);
158
- if (v1 == null || v2 == null) {
159
- return defaultReturn;
160
- }
159
+ let v1 = l.val?.typ == EnumToken.FractionTokenType ? l.val : getValue(l);
160
+ // @ts-ignore
161
+ let v2 = r.val?.typ == EnumToken.FractionTokenType ? r.val : getValue(r);
162
+ // if (v1 == null || v2 == null) {
163
+ //
164
+ // return defaultReturn;
165
+ // }
161
166
  if (op == EnumToken.Mul) {
162
167
  if (l.typ != EnumToken.NumberTokenType && r.typ != EnumToken.NumberTokenType) {
163
168
  if (typeof v1 == 'number' && l.typ == EnumToken.PercentageTokenType) {
@@ -181,7 +186,7 @@ function doEvaluate(l, r, op) {
181
186
  const token = {
182
187
  ...(l.typ == EnumToken.NumberTokenType ? r : l),
183
188
  typ,
184
- val: typeof val == 'number' ? reduceNumber(val) : val
189
+ val: typeof val == 'number' ? minifyNumber(val) : val
185
190
  };
186
191
  if (token.typ == EnumToken.IdenTokenType) {
187
192
  // @ts-ignore
@@ -190,22 +195,26 @@ function doEvaluate(l, r, op) {
190
195
  return token;
191
196
  }
192
197
  function getValue(t) {
193
- let v1;
194
- if (t.typ == EnumToken.FunctionTokenType) {
195
- v1 = evaluateFunc(t);
196
- if (v1.length != 1 || v1[0].typ == EnumToken.BinaryExpressionTokenType) {
197
- return null;
198
- }
199
- t = v1[0];
200
- }
198
+ // if (t.typ == EnumToken.FunctionTokenType) {
199
+ //
200
+ // v1 = evaluateFunc(t as FunctionToken);
201
+ //
202
+ // if (v1.length != 1 || v1[0].typ == EnumToken.BinaryExpressionTokenType) {
203
+ //
204
+ // return null;
205
+ // }
206
+ //
207
+ // t = v1[0] as NumberToken | IdentToken;
208
+ // }
201
209
  if (t.typ == EnumToken.IdenTokenType) {
202
210
  // @ts-ignore
203
211
  return Math[t.val.toUpperCase()];
204
212
  }
205
- if (t.val.typ == EnumToken.FractionTokenType) {
206
- // @ts-ignore
207
- return t.val.l.val / t.val.r.val;
208
- }
213
+ // if ((t.val as FractionToken).typ == EnumToken.FractionTokenType) {
214
+ //
215
+ // // @ts-ignore
216
+ // return (t.val as FractionToken).l.val / (t.val as FractionToken).r.val;
217
+ // }
209
218
  // @ts-ignore
210
219
  return t.typ == EnumToken.FractionTokenType ? t.l.val / t.r.val : +t.val;
211
220
  }
@@ -223,9 +232,10 @@ function evaluateFunc(token) {
223
232
  case 'sqrt':
224
233
  case 'exp': {
225
234
  const value = evaluate(values);
226
- if (value.length != 1 || (value[0].typ != EnumToken.NumberTokenType && value[0].typ != EnumToken.FractionTokenType) || (value[0].typ == EnumToken.FractionTokenType && (+value[0].r.val == 0 || !Number.isFinite(+value[0].l.val) || !Number.isFinite(+value[0].r.val)))) {
227
- return value;
228
- }
235
+ // if (value.length != 1 || (value[0].typ != EnumToken.NumberTokenType && value[0].typ != EnumToken.FractionTokenType) || (value[0].typ == EnumToken.FractionTokenType && (+(value[0] as FractionToken).r.val == 0 || !Number.isFinite(+(value[0] as FractionToken).l.val) || !Number.isFinite(+(value[0] as FractionToken).r.val)))) {
236
+ //
237
+ // return value;
238
+ // }
229
239
  // @ts-ignore
230
240
  let val = value[0].typ == EnumToken.NumberTokenType ? +value[0].val : value[0].l.val / value[0].r.val;
231
241
  return [{
@@ -238,19 +248,22 @@ function evaluateFunc(token) {
238
248
  let all = [];
239
249
  let ref = chi[0];
240
250
  let value = 0;
241
- if (![EnumToken.NumberTokenType, EnumToken.PercentageTokenType].includes(ref.typ) && !('unit' in ref)) {
242
- return [token];
243
- }
251
+ // if (![EnumToken.NumberTokenType, EnumToken.PercentageTokenType].includes(ref.typ) && !('unit' in ref)) {
252
+ //
253
+ // return [token];
254
+ // }
244
255
  for (let i = 0; i < chi.length; i++) {
245
256
  // @ts-ignore
246
- if (chi[i].typ != ref.typ || ('unit' in chi[i] && 'unit' in ref && chi[i].unit != ref.unit)) {
247
- return [token];
248
- }
257
+ // if (chi[i].typ != ref.typ || ('unit' in chi[i] && 'unit' in ref && chi[i].unit != ref.unit)) {
258
+ //
259
+ // return [token];
260
+ // }
249
261
  // @ts-ignore
250
262
  const val = getValue(chi[i]);
251
- if (val == null) {
252
- return [token];
253
- }
263
+ // if (val == null) {
264
+ //
265
+ // return [token];
266
+ // }
254
267
  all.push(val);
255
268
  value += val * val;
256
269
  }
@@ -266,35 +279,44 @@ function evaluateFunc(token) {
266
279
  case 'rem':
267
280
  case 'mod': {
268
281
  const chi = values.filter(t => ![EnumToken.WhitespaceTokenType, EnumToken.CommentTokenType].includes(t.typ));
269
- if (chi.length != 3 || chi[1].typ != EnumToken.CommaTokenType) {
270
- return [token];
271
- }
272
- if (token.val == 'pow' && (chi[0].typ != EnumToken.NumberTokenType || chi[2].typ != EnumToken.NumberTokenType)) {
273
- return [token];
274
- }
275
- if (['rem', 'mod'].includes(token.val) &&
276
- (chi[0].typ != chi[2].typ) || ('unit' in chi[0] && 'unit' in chi[2] &&
277
- chi[0].unit != chi[2].unit)) {
278
- return [token];
279
- }
282
+ // if (chi.length != 3 || chi[1].typ != EnumToken.CommaTokenType) {
283
+ //
284
+ // return [token];
285
+ // }
286
+ // if (token.val == 'pow' && (chi[0].typ != EnumToken.NumberTokenType || chi[2].typ != EnumToken.NumberTokenType)) {
287
+ //
288
+ // return [token];
289
+ // }
290
+ // if (['rem', 'mod'].includes(token.val) &&
291
+ // (
292
+ // chi[0].typ != chi[2].typ) || (
293
+ // 'unit' in chi[0] && 'unit' in chi[2] &&
294
+ // chi[0].unit != chi[2].unit
295
+ // )) {
296
+ //
297
+ // return [token];
298
+ // }
280
299
  // https://developer.mozilla.org/en-US/docs/Web/CSS/mod
281
300
  const v1 = evaluate([chi[0]]);
282
301
  const v2 = evaluate([chi[2]]);
283
- const types = [EnumToken.PercentageTokenType, EnumToken.DimensionTokenType, EnumToken.AngleTokenType, EnumToken.NumberTokenType, EnumToken.LengthTokenType, EnumToken.TimeTokenType, EnumToken.FrequencyTokenType, EnumToken.ResolutionTokenType];
284
- if (v1.length != 1 || v2.length != 1 || !types.includes(v1[0].typ) || !types.includes(v2[0].typ) || v1[0].unit != v2[0].unit) {
285
- return [token];
286
- }
302
+ [EnumToken.PercentageTokenType, EnumToken.DimensionTokenType, EnumToken.AngleTokenType, EnumToken.NumberTokenType, EnumToken.LengthTokenType, EnumToken.TimeTokenType, EnumToken.FrequencyTokenType, EnumToken.ResolutionTokenType];
303
+ // if (v1.length != 1 || v2.length != 1 || !types.includes(v1[0].typ) || !types.includes(v2[0].typ) || (v1[0] as DimensionToken).unit != (v2[0] as DimensionToken).unit) {
304
+ //
305
+ // return [token];
306
+ // }
287
307
  // @ts-ignore
288
308
  const val1 = getValue(v1[0]);
289
309
  // @ts-ignore
290
310
  const val2 = getValue(v2[0]);
291
- if (val1 == null || val2 == null || (v1[0].typ != v2[0].typ && val1 != 0 && val2 != 0)) {
292
- return [token];
293
- }
311
+ // if (val1 == null || val2 == null || (v1[0].typ != v2[0].typ && val1 != 0 && val2 != 0)) {
312
+ //
313
+ // return [token];
314
+ // }
294
315
  if (token.val == 'rem') {
295
- if (val2 == 0) {
296
- return [token];
297
- }
316
+ // if (val2 == 0) {
317
+ //
318
+ // return [token];
319
+ // }
298
320
  return [
299
321
  {
300
322
  ...v1[0],
@@ -331,82 +353,84 @@ function evaluateFunc(token) {
331
353
  case 'log':
332
354
  case 'round':
333
355
  case 'min':
334
- case 'max':
335
- {
336
- const strategy = token.val == 'round' && values[0]?.typ == EnumToken.IdenTokenType ? values.shift().val : null;
337
- const valuesMap = new Map;
338
- for (const curr of values) {
339
- if (curr.typ == EnumToken.CommaTokenType || curr.typ == EnumToken.WhitespaceTokenType || curr.typ == EnumToken.CommentTokenType) {
340
- continue;
341
- }
342
- const result = evaluate([curr]);
343
- if (result.length != 1 || result[0].typ == EnumToken.FunctionTokenType) {
344
- return [token];
345
- }
346
- const key = result[0].typ + ('unit' in result[0] ? result[0].unit : '');
347
- if (!valuesMap.has(key)) {
348
- valuesMap.set(key, []);
349
- }
350
- valuesMap.get(key).push(result[0]);
356
+ case 'max': {
357
+ const strategy = token.val == 'round' && values[0]?.typ == EnumToken.IdenTokenType ? values.shift().val : null;
358
+ const valuesMap = new Map;
359
+ for (const curr of values) {
360
+ if (curr.typ == EnumToken.CommaTokenType || curr.typ == EnumToken.WhitespaceTokenType || curr.typ == EnumToken.CommentTokenType) {
361
+ continue;
362
+ }
363
+ const result = evaluate([curr]);
364
+ // if (result.length != 1 || result[0].typ == EnumToken.FunctionTokenType) {
365
+ //
366
+ // return [token];
367
+ // }
368
+ const key = result[0].typ + ('unit' in result[0] ? result[0].unit : '');
369
+ if (!valuesMap.has(key)) {
370
+ valuesMap.set(key, []);
351
371
  }
352
- if (valuesMap.size == 1) {
353
- const values = valuesMap.values().next().value;
354
- if (token.val == 'log') {
355
- if (values[0].typ != EnumToken.NumberTokenType || values.length > 2) {
356
- return [token];
372
+ valuesMap.get(key).push(result[0]);
373
+ }
374
+ if (valuesMap.size == 1) {
375
+ const values = valuesMap.values().next().value;
376
+ if (token.val == 'log') {
377
+ // if (values[0].typ != EnumToken.NumberTokenType || values.length > 2) {
378
+ //
379
+ // return [token];
380
+ // }
381
+ const val1 = getValue(values[0]);
382
+ const val2 = values.length == 2 ? getValue(values[1]) : null;
383
+ // if (values.length == 1) {
384
+ //
385
+ // return [
386
+ // {
387
+ // ...values[0],
388
+ // val: String(Math.log(val1))
389
+ // } as DimensionToken | AngleToken | NumberToken | LengthToken | TimeToken | FrequencyToken | ResolutionToken];
390
+ // }
391
+ return [
392
+ {
393
+ ...values[0],
394
+ val: String(Math.log(val1) / Math.log(val2))
357
395
  }
358
- const val1 = getValue(values[0]);
359
- const val2 = values.length == 2 ? getValue(values[1]) : null;
360
- if (values.length == 1) {
361
- return [
362
- {
363
- ...values[0],
364
- val: String(Math.log(val1))
365
- }
366
- ];
396
+ ];
397
+ }
398
+ if (token.val == 'min' || token.val == 'max') {
399
+ let val = getValue(values[0]);
400
+ let val2 = val;
401
+ let ret = values[0];
402
+ for (const curr of values.slice(1)) {
403
+ val2 = getValue(curr);
404
+ if (val2 < val && token.val == 'min') {
405
+ val = val2;
406
+ ret = curr;
367
407
  }
368
- return [
369
- {
370
- ...values[0],
371
- val: String(Math.log(val1) / Math.log(val2))
372
- }
373
- ];
374
- }
375
- if (token.val == 'min' || token.val == 'max') {
376
- let val = getValue(values[0]);
377
- let val2 = val;
378
- let ret = values[0];
379
- for (const curr of values.slice(1)) {
380
- val2 = getValue(curr);
381
- if (val2 < val && token.val == 'min') {
382
- val = val2;
383
- ret = curr;
384
- }
385
- else if (val2 > val && token.val == 'max') {
386
- val = val2;
387
- ret = curr;
388
- }
408
+ else if (val2 > val && token.val == 'max') {
409
+ val = val2;
410
+ ret = curr;
389
411
  }
390
- return [ret];
391
412
  }
392
- if (token.val == 'round') {
393
- let val = getValue(values[0]);
394
- let val2 = getValue(values[1]);
395
- if (Number.isNaN(val) || Number.isNaN(val2)) {
396
- return [token];
397
- }
398
- if (strategy == null || strategy == 'down') {
399
- val = val - (val % val2);
400
- }
401
- else {
402
- val = strategy == 'to-zero' ? Math.trunc(val / val2) * val2 : (strategy == 'nearest' ? Math.round(val / val2) * val2 : Math.ceil(val / val2) * val2);
403
- }
404
- // @ts-ignore
405
- return [{ ...values[0], val: String(val) }];
413
+ return [ret];
414
+ }
415
+ if (token.val == 'round') {
416
+ let val = getValue(values[0]);
417
+ let val2 = getValue(values[1]);
418
+ // if (Number.isNaN(val) || Number.isNaN(val2)) {
419
+ //
420
+ // return [token];
421
+ // }
422
+ if (strategy == null || strategy == 'down') {
423
+ val = val - (val % val2);
424
+ }
425
+ else {
426
+ val = strategy == 'to-zero' ? Math.trunc(val / val2) * val2 : (strategy == 'nearest' ? Math.round(val / val2) * val2 : Math.ceil(val / val2) * val2);
406
427
  }
428
+ // @ts-ignore
429
+ return [{ ...values[0], val: String(val) }];
407
430
  }
408
431
  }
409
- return [token];
432
+ }
433
+ // return [token];
410
434
  }
411
435
  return [token];
412
436
  }
@@ -416,10 +440,11 @@ function evaluateFunc(token) {
416
440
  */
417
441
  function inlineExpression(token) {
418
442
  const result = [];
419
- if (token.typ == EnumToken.ParensTokenType && token.chi.length == 1) {
420
- result.push(token.chi[0]);
421
- }
422
- else if (token.typ == EnumToken.BinaryExpressionTokenType) {
443
+ // if (token.typ == EnumToken.ParensTokenType && (token as ParensToken).chi.length == 1) {
444
+ //
445
+ // result.push((token as ParensToken).chi[0]);
446
+ // } else
447
+ if (token.typ == EnumToken.BinaryExpressionTokenType) {
423
448
  if ([EnumToken.Mul, EnumToken.Div].includes(token.op)) {
424
449
  result.push(token);
425
450
  }
@@ -1,11 +1,12 @@
1
1
  import { EnumToken } from '../types.js';
2
- import { reduceNumber } from '../../renderer/render.js';
3
- import '../../renderer/color/utils/constants.js';
4
2
  import '../minify.js';
5
3
  import '../walk.js';
6
4
  import '../../parser/parse.js';
7
5
  import '../../parser/tokenize.js';
8
6
  import '../../parser/utils/config.js';
7
+ import '../../syntax/color/utils/constants.js';
8
+ import '../../renderer/sourcemap/lib/encode.js';
9
+ import { minifyNumber } from '../../syntax/utils.js';
9
10
 
10
11
  function gcd(x, y) {
11
12
  x = Math.abs(x);
@@ -14,16 +15,17 @@ function gcd(x, y) {
14
15
  return x;
15
16
  }
16
17
  let t;
17
- if (x == 0) {
18
- return y;
19
- }
20
- if (y == 0) {
21
- return x;
22
- }
18
+ // if (x == 0) {
19
+ //
20
+ // return y;
21
+ // }
22
+ //
23
+ // if (y == 0) {
24
+ //
25
+ // return x;
26
+ // }
23
27
  if (y > x) {
24
- t = x;
25
- x = y;
26
- y = t;
28
+ [x, y] = [y, x];
27
29
  }
28
30
  while (y) {
29
31
  t = y;
@@ -47,22 +49,22 @@ function compute(a, b, op) {
47
49
  return r[0];
48
50
  }
49
51
  const result = a / b;
50
- const r2 = reduceNumber(r[0]) + '/' + reduceNumber(r[1]);
51
- return reduceNumber(result).length <= r2.length ? result : {
52
+ const r2 = minifyNumber(r[0]) + '/' + minifyNumber(r[1]);
53
+ return minifyNumber(result).length < r2.length ? result : {
52
54
  typ: EnumToken.FractionTokenType,
53
- l: { typ: EnumToken.NumberTokenType, val: reduceNumber(r[0]) },
54
- r: { typ: EnumToken.NumberTokenType, val: reduceNumber(r[1]) }
55
+ l: { typ: EnumToken.NumberTokenType, val: minifyNumber(r[0]) },
56
+ r: { typ: EnumToken.NumberTokenType, val: minifyNumber(r[1]) }
55
57
  };
56
58
  }
57
59
  }
58
60
  let l1 = typeof a == 'number' ? {
59
61
  typ: EnumToken.FractionTokenType,
60
- l: { typ: EnumToken.NumberTokenType, val: reduceNumber(a) },
62
+ l: { typ: EnumToken.NumberTokenType, val: minifyNumber(a) },
61
63
  r: { typ: EnumToken.NumberTokenType, val: '1' }
62
64
  } : a;
63
65
  let r1 = typeof b == 'number' ? {
64
66
  typ: EnumToken.FractionTokenType,
65
- l: { typ: EnumToken.NumberTokenType, val: reduceNumber(b) },
67
+ l: { typ: EnumToken.NumberTokenType, val: minifyNumber(b) },
66
68
  r: { typ: EnumToken.NumberTokenType, val: '1' }
67
69
  } : b;
68
70
  let l2;
@@ -99,10 +101,10 @@ function compute(a, b, op) {
99
101
  return a2[0];
100
102
  }
101
103
  const result = a2[0] / a2[1];
102
- return reduceNumber(result).length <= reduceNumber(a2[0]).length + 1 + reduceNumber(a2[1]).length ? result : {
104
+ return minifyNumber(result).length <= minifyNumber(a2[0]).length + 1 + minifyNumber(a2[1]).length ? result : {
103
105
  typ: EnumToken.FractionTokenType,
104
- l: { typ: EnumToken.NumberTokenType, val: reduceNumber(a2[0]) },
105
- r: { typ: EnumToken.NumberTokenType, val: reduceNumber(a2[1]) }
106
+ l: { typ: EnumToken.NumberTokenType, val: minifyNumber(a2[0]) },
107
+ r: { typ: EnumToken.NumberTokenType, val: minifyNumber(a2[1]) }
106
108
  };
107
109
  }
108
110
  function rem(...a) {