@@ -11,6 +11,28 @@ function isEqual(left, right) {
11
11
return left . type === right . type && left . value === right . value
12
12
}
13
13
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
+
14
36
function convertMathExpression ( node , precision ) {
15
37
let nodes = convert ( node . left , node . right , precision )
16
38
let left = reduce ( nodes . left , precision )
@@ -54,7 +76,7 @@ function reduceAddSubExpression(node, precision) {
54
76
55
77
// value + value
56
78
// value - value
57
- if ( left . type === right . type && left . type !== 'MathExpression' ) {
79
+ if ( left . type === right . type && isValueType ( left . type ) ) {
58
80
node = Object . assign ( { } , left )
59
81
if ( op === "+" )
60
82
node . value = left . value + right . value
@@ -63,7 +85,11 @@ function reduceAddSubExpression(node, precision) {
63
85
}
64
86
65
87
// 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
+ ) {
67
93
// value + (value + something) => (value + value) + something
68
94
// value + (value - something) => (value + value) - something
69
95
// value - (value + something) => (value - value) + something
@@ -97,7 +123,11 @@ function reduceAddSubExpression(node, precision) {
97
123
}
98
124
99
125
// (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
+ ) {
101
131
// (value + something) + value => (value + value) + something
102
132
// (value - something) + value => (value + value) - something
103
133
// (value + something) - value => (value - value) + something
@@ -158,8 +188,8 @@ function reduceDivisionExpression(node) {
158
188
// (expr) / value
159
189
if ( node . left . type === 'MathExpression' ) {
160
190
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 )
163
193
) {
164
194
node . left . left . value /= node . right . value
165
195
node . left . right . value /= node . right . value
@@ -177,32 +207,32 @@ function reduceMultiplicationExpression(node) {
177
207
// (expr) * value
178
208
if ( node . left . type === 'MathExpression' && node . right . type === 'Value' ) {
179
209
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 )
182
212
) {
183
213
node . left . left . value *= node . right . value
184
214
node . left . right . value *= node . right . value
185
215
return node . left
186
216
}
187
217
}
188
218
// something * value
189
- else if ( node . left . type !== 'MathExpression' && node . right . type === 'Value' ) {
219
+ else if ( isValueType ( node . left . type ) && node . right . type === 'Value' ) {
190
220
node . left . value *= node . right . value
191
221
return node . left
192
222
}
193
223
// value * (expr)
194
224
else if ( node . left . type === 'Value' && node . right . type === 'MathExpression' ) {
195
225
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 )
198
228
) {
199
229
node . right . left . value *= node . left . value
200
230
node . right . right . value *= node . left . value
201
231
return node . right
202
232
}
203
233
}
204
234
// value * something
205
- else if ( node . left . type === 'Value' && node . right . type !== 'MathExpression' ) {
235
+ else if ( node . left . type === 'Value' && isValueType ( node . right . type ) ) {
206
236
node . right . value *= node . left . value
207
237
return node . right
208
238
}
0 commit comments