From 42fdb99c1fb6ec0af42167a2b3709a1fa14aa85a Mon Sep 17 00:00:00 2001 From: Andy Jansson Date: Mon, 8 May 2017 19:38:15 +0200 Subject: [PATCH 1/4] Fix consecutive substractions --- src/__tests__/index.js | 13 +++++++++++++ src/lib/reducer.js | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/__tests__/index.js b/src/__tests__/index.js index a00f8df..c81ff8d 100644 --- a/src/__tests__/index.js +++ b/src/__tests__/index.js @@ -168,6 +168,19 @@ test( 'calc(1px + 1)' ) +test( + 'should reduce consecutive substractions (#24) (1)', + testFixture, + 'calc(100% - 120px - 60px)', + 'calc(100% - 180px)' +) + +test( + 'should reduce consecutive substractions (#24) (2)', + testFixture, + 'calc(100% - 10px - 20px)', + 'calc(100% - 30px)' +) test( 'should produce simpler result (postcss-calc#25) (1)', diff --git a/src/lib/reducer.js b/src/lib/reducer.js index 6f1d19f..1822e7d 100644 --- a/src/lib/reducer.js +++ b/src/lib/reducer.js @@ -115,12 +115,12 @@ function reduceAddSubExpression(node, precision) { // (something + value) + value => something + (value + value) // (something - value) + value => something - (value + value) // (something + value) - value => something + (value - value) - // (something - value) - value => something - (value - value) + // (something - value) - value => something - (value + value) else if (right.type === left.right.type) { node = Object.assign({ }, left) node.right = reduce({ type: 'MathExpression', - operator: op, + operator: op === left.operator && op === '-' ? '+' : op, left: left.right, right: right }, precision) From 76e6ea932644221788406e1343099959a98cb635 Mon Sep 17 00:00:00 2001 From: Andy Jansson Date: Mon, 8 May 2017 20:53:16 +0200 Subject: [PATCH 2/4] Fix consecutive additions and substractions --- src/__tests__/index.js | 14 ++++++++++++++ src/lib/reducer.js | 29 ++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/__tests__/index.js b/src/__tests__/index.js index c81ff8d..169a054 100644 --- a/src/__tests__/index.js +++ b/src/__tests__/index.js @@ -42,6 +42,20 @@ test( '1ex' ) +test( + 'should reduce additions and subtractions (1)', + testFixture, + 'calc(100% - 10px + 20px)', + 'calc(100% + 10px)' +) + +test( + 'should reduce additions and subtractions (2)', + testFixture, + 'calc(100% + 10px - 20px)', + 'calc(100% - 10px)' +) + test( 'should ignore value surrounding calc function (1)', testFixture, diff --git a/src/lib/reducer.js b/src/lib/reducer.js index 1822e7d..879edc6 100644 --- a/src/lib/reducer.js +++ b/src/lib/reducer.js @@ -113,17 +113,32 @@ function reduceAddSubExpression(node, precision) { return reduce(node, precision) } // (something + value) + value => something + (value + value) - // (something - value) + value => something - (value + value) + // (something - value1) + value2 => something - (value2 - value1) // (something + value) - value => something + (value - value) // (something - value) - value => something - (value + value) else if (right.type === left.right.type) { node = Object.assign({ }, left) - node.right = reduce({ - type: 'MathExpression', - operator: op === left.operator && op === '-' ? '+' : op, - left: left.right, - right: right - }, precision) + if (left.operator === '-') { + node.right = reduce({ + type: 'MathExpression', + operator: op === left.operator ? '+' : '-', + left: right, + right: left.right + }, precision) + node.operator = op === left.operator ? '-' : '+'; + } + else { + node.right = reduce({ + type: 'MathExpression', + operator: op, + left: left.right, + right: right + }, precision) + } + if (node.right.value < 0) { + node.right.value *= -1; + node.operator = '-'; + } return reduce(node, precision) } } From c975de837075cc0c18df7044895534a44a3bf8c1 Mon Sep 17 00:00:00 2001 From: Andy Jansson Date: Mon, 8 May 2017 21:14:28 +0200 Subject: [PATCH 3/4] fix for inverting operator on negative numbers --- src/lib/reducer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/reducer.js b/src/lib/reducer.js index 879edc6..4d9b3d3 100644 --- a/src/lib/reducer.js +++ b/src/lib/reducer.js @@ -121,11 +121,11 @@ function reduceAddSubExpression(node, precision) { if (left.operator === '-') { node.right = reduce({ type: 'MathExpression', - operator: op === left.operator ? '+' : '-', + operator: op === '-' ? '+' : '-', left: right, right: left.right }, precision) - node.operator = op === left.operator ? '-' : '+'; + node.operator = op === '-' ? '-' : '+'; } else { node.right = reduce({ @@ -137,7 +137,7 @@ function reduceAddSubExpression(node, precision) { } if (node.right.value < 0) { node.right.value *= -1; - node.operator = '-'; + node.operator = node.operator === '-' ? '+' : '-'; } return reduce(node, precision) } From 4718d9b1262fb82c37a251396e4f341741e15a44 Mon Sep 17 00:00:00 2001 From: Andy Jansson Date: Mon, 8 May 2017 21:19:07 +0200 Subject: [PATCH 4/4] Add additional test --- src/__tests__/index.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/__tests__/index.js b/src/__tests__/index.js index 169a054..11fc629 100644 --- a/src/__tests__/index.js +++ b/src/__tests__/index.js @@ -42,6 +42,13 @@ test( '1ex' ) +test( + 'should reduce simple calc (5)', + testFixture, + 'calc(50px - (20px - 30px))', + '60px' +) + test( 'should reduce additions and subtractions (1)', testFixture,