Skip to content

Commit 9807c5e

Browse files
authored
Correctly handle summands that cancel out and pull out common factors
1 parent 7a3bc58 commit 9807c5e

File tree

2 files changed

+51
-11
lines changed

2 files changed

+51
-11
lines changed

src/__tests__/index.js

+7
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,13 @@ test(
239239
'calc(var(--popupHeight)/2)',
240240
);
241241

242+
test(
243+
'should ignore calc with css variables (7)',
244+
testValue,
245+
'calc(var(--popupHeight) / 2 + var(--popupWidth) / 2)',
246+
'calc((var(--popupHeight) + var(--popupWidth))/2)',
247+
);
248+
242249

243250
test(
244251
'should reduce calc with newline characters',

src/lib/reducer.js

+44-11
Original file line numberDiff line numberDiff line change
@@ -197,22 +197,55 @@ function reduceAddSubExpression(node, precision) {
197197
// (expr) + (expr) => number
198198
// (expr) - (expr) => number
199199
if (node.right.type === 'MathExpression' && node.left.type === 'MathExpression') {
200-
if (isEqual(node.left.right, node.right.right)) {
201-
const newNodes = covertNodesUnits(node.left.left, node.right.left, precision);
200+
if (
201+
(node.left.operator === "-" && node.right.operator === "+") ||
202+
(node.right.operator === "-" && node.left.operator === "+")
203+
) {
204+
// (expr1 - something) + (expr2 + something) => expr1 + expr2
205+
// (expr1 + something) + (expr2 - something) => expr1 + expr2
206+
// (expr1 - something) - (expr2 + something) => expr1 + expr2
207+
// (expr1 + something) - (expr2 - something) => expr1 + expr2
208+
if (isEqual(node.left.right, node.right.right)) {
209+
const newNodes = covertNodesUnits(node.left.left, node.right.left, precision);
202210

203-
node.left = newNodes.left;
204-
node.right = newNodes.right;
211+
node.left = newNodes.left;
212+
node.right = newNodes.right;
205213

206-
return reduce(node);
207-
}
214+
return reduce(node, precision);
215+
}
208216

209-
if (isEqual(node.left.right, node.right.left)) {
210-
const newNodes = covertNodesUnits(node.left.left, node.right.right, precision);
217+
// (expr1 - something) + (something + expr2) => expr1 + expr2
218+
// (expr1 + something) + (something - expr2) => expr1 + expr2
219+
// (expr1 - something) - (something + expr2) => expr1 + expr2
220+
// (expr1 + something) - (something - expr2) => expr1 + expr2
221+
if (isEqual(node.left.right, node.right.left)) {
222+
const newNodes = covertNodesUnits(node.left.left, node.right.right, precision);
211223

212-
node.left = newNodes.left;
213-
node.right = newNodes.right;
224+
node.left = newNodes.left;
225+
node.right = newNodes.right;
214226

215-
return reduce(node);
227+
return reduce(node, precision);
228+
}
229+
// (expr1 / something) + (expr2 / something) => (expr1 + expr2) / something
230+
// (expr1 * something) + (expr2 * something) => (expr1 + expr2) * something
231+
// (expr1 / something) - (expr2 / something) => (expr1 - expr2) / something
232+
// (expr1 * something) - (expr2 * something) => (expr1 - expr2) * something
233+
} else if (
234+
(node.left.operator === "/" || node.left.operator === "*") &&
235+
(node.left.operator === node.right.operator) &&
236+
isEqual(node.left.right, node.right.right)
237+
) {
238+
return reduce({
239+
type: "MathExpression",
240+
operator: node.left.operator,
241+
left: {
242+
type: "MathExpression",
243+
operator: node.operator,
244+
left: node.left.left,
245+
right: node.right.left
246+
},
247+
right: node.left.right
248+
}, precision)
216249
}
217250
}
218251

0 commit comments

Comments
 (0)