Skip to content

Commit 4595244

Browse files
andyjanssonben-eb
authored andcommitted
Fix css variable handling
1 parent bdf838f commit 4595244

File tree

3 files changed

+50
-13
lines changed

3 files changed

+50
-13
lines changed

parser.jison

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
([0-9]+("."[0-9]*)?|"."[0-9]+)\b return 'NUMBER';
3939

4040
(calc) return 'NESTED_CALC';
41-
(var\(.*\)) return 'CSS_VAR';
41+
(var\([^\)]*\)) return 'CSS_VAR';
4242
([a-z]+) return 'PREFIX';
4343

4444
"(" return 'LPAREN';

src/__tests__/index.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,18 @@ test(
114114
)
115115

116116
test(
117-
'should ignore calc with css variables',
117+
'should ignore calc with css variables (1)',
118118
testFixture,
119119
'calc(var(--mouseX) * 1px)'
120120
)
121121

122+
test(
123+
'should ignore calc with css variables (2)',
124+
testFixture,
125+
'calc(10px - (100px * var(--mouseX)))',
126+
'calc(10px - 100px * var(--mouseX))'
127+
)
128+
122129
test(
123130
'should reduce calc with newline characters',
124131
testFixture,

src/lib/reducer.js

+41-11
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,28 @@ function isEqual(left, right) {
1111
return left.type === right.type && left.value === right.value
1212
}
1313

14+
function isValueType(type) {
15+
switch (type) {
16+
case 'LengthValue':
17+
case 'AngleValue':
18+
case 'TimeValue':
19+
case 'FrequencyValue':
20+
case 'ResolutionValue':
21+
case 'EmValue':
22+
case 'ExValue':
23+
case 'ChValue':
24+
case 'RemValue':
25+
case 'VhValue':
26+
case 'VwValue':
27+
case 'VminValue':
28+
case 'VmaxValue':
29+
case 'PercentageValue':
30+
case 'Value':
31+
return true;
32+
}
33+
return false;
34+
}
35+
1436
function convertMathExpression(node, precision) {
1537
let nodes = convert(node.left, node.right, precision)
1638
let left = reduce(nodes.left, precision)
@@ -54,7 +76,7 @@ function reduceAddSubExpression(node, precision) {
5476

5577
// value + value
5678
// value - value
57-
if (left.type === right.type && left.type !== 'MathExpression') {
79+
if (left.type === right.type && isValueType(left.type)) {
5880
node = Object.assign({ }, left)
5981
if (op === "+")
6082
node.value = left.value + right.value
@@ -63,7 +85,11 @@ function reduceAddSubExpression(node, precision) {
6385
}
6486

6587
// value <op> (expr)
66-
if (left.type !== 'MathExpression' && right.type === 'MathExpression') {
88+
if (
89+
isValueType(left.type) &&
90+
(right.operator === '+' || right.operator === '-') &&
91+
right.type === 'MathExpression'
92+
) {
6793
// value + (value + something) => (value + value) + something
6894
// value + (value - something) => (value + value) - something
6995
// value - (value + something) => (value - value) + something
@@ -97,7 +123,11 @@ function reduceAddSubExpression(node, precision) {
97123
}
98124

99125
// (expr) <op> value
100-
if (left.type === 'MathExpression' && right.type !== 'MathExpression') {
126+
if (
127+
left.type === 'MathExpression' &&
128+
(left.operator === '+' || left.operator === '-') &&
129+
isValueType(right.type)
130+
) {
101131
// (value + something) + value => (value + value) + something
102132
// (value - something) + value => (value + value) - something
103133
// (value + something) - value => (value - value) + something
@@ -158,8 +188,8 @@ function reduceDivisionExpression(node) {
158188
// (expr) / value
159189
if (node.left.type === 'MathExpression') {
160190
if (
161-
node.left.left.type !== 'MathExpression' &&
162-
node.left.right.type !== 'MathExpression'
191+
isValueType(node.left.left.type) &&
192+
isValueType(node.left.right.type)
163193
) {
164194
node.left.left.value /= node.right.value
165195
node.left.right.value /= node.right.value
@@ -177,32 +207,32 @@ function reduceMultiplicationExpression(node) {
177207
// (expr) * value
178208
if (node.left.type === 'MathExpression' && node.right.type === 'Value') {
179209
if (
180-
node.left.left.type !== 'MathExpression' &&
181-
node.left.right.type !== 'MathExpression'
210+
isValueType(node.left.left.type) &&
211+
isValueType(node.left.right.type)
182212
) {
183213
node.left.left.value *= node.right.value
184214
node.left.right.value *= node.right.value
185215
return node.left
186216
}
187217
}
188218
// something * value
189-
else if (node.left.type !== 'MathExpression' &&node.right.type === 'Value') {
219+
else if (isValueType(node.left.type) && node.right.type === 'Value') {
190220
node.left.value *= node.right.value
191221
return node.left
192222
}
193223
// value * (expr)
194224
else if (node.left.type === 'Value' && node.right.type === 'MathExpression') {
195225
if (
196-
node.right.left.type !== 'MathExpression' &&
197-
node.right.right.type !== 'MathExpression'
226+
isValueType(node.right.left.type) &&
227+
isValueType(node.right.right.type)
198228
) {
199229
node.right.left.value *= node.left.value
200230
node.right.right.value *= node.left.value
201231
return node.right
202232
}
203233
}
204234
// value * something
205-
else if (node.left.type === 'Value' && node.right.type !== 'MathExpression') {
235+
else if (node.left.type === 'Value' && isValueType(node.right.type)) {
206236
node.right.value *= node.left.value
207237
return node.right
208238
}

0 commit comments

Comments
 (0)