@@ -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+
1436function 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