From 1018f6a332abc5da77adb0799bf22206698a2aa8 Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Mon, 17 Nov 2014 19:58:06 +0000 Subject: [PATCH] Fixes #383 - decimal places and rounding. * Introduced by #380. Should fix it for good. --- History.md | 5 +++++ lib/selectors/optimizers/simple.js | 15 ++++----------- test/binary-test.js | 2 +- test/integration-test.js | 4 ++++ 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/History.md b/History.md index ae880d0f..0f58f012 100644 --- a/History.md +++ b/History.md @@ -16,6 +16,11 @@ * Fixed issue [#360](https://github.com/GoalSmashers/clean-css/issues/360) - adds 7 extra CSS colors. * Fixed issue [#363](https://github.com/GoalSmashers/clean-css/issues/363) - `rem` units overriding `px`. +[2.2.18 / 2014-11-17](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.17...v2.2.18) +================== + +* Fixed issue [#383](https://github.com/GoalSmashers/clean-css/issues/383) - rounding fractions once again. + [2.2.17 / 2014-11-09](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.16...v2.2.17) ================== diff --git a/lib/selectors/optimizers/simple.js b/lib/selectors/optimizers/simple.js index 5d1a9888..8fd988ea 100644 --- a/lib/selectors/optimizers/simple.js +++ b/lib/selectors/optimizers/simple.js @@ -22,7 +22,7 @@ function SimpleOptimizer(options) { DEFAULT_ROUNDING_PRECISION : options.roundingPrecision; options.precision.multiplier = Math.pow(10, options.precision.value); - options.precision.regexp = new RegExp('\\.(\\d{' + (options.precision.value + 1) + ',})px', 'g'); + options.precision.regexp = new RegExp('(\\d*\\.\\d{' + (options.precision.value + 1) + ',})px', 'g'); } function removeUnsupported(token, compatibility) { @@ -107,15 +107,8 @@ function precisionMinifier(_, value, precisionOptions) { return value; return value - .replace(precisionOptions.regexp, function(match, decimalPlaces) { - var newFraction = Math.round(parseFloat('.' + decimalPlaces) * precisionOptions.multiplier) / precisionOptions.multiplier; - if (precisionOptions.value === 0 || newFraction === 0) { - return 'px'; - } else { - return newFraction < 1 ? - '.' + ('' + newFraction).substring('0.'.length) + 'px' : - newFraction + 'px'; - } + .replace(precisionOptions.regexp, function(match, number) { + return Math.round(parseFloat(number) * precisionOptions.multiplier) / precisionOptions.multiplier + 'px'; }) .replace(/(\d)\.($|\D)/g, '$1$2'); } @@ -200,8 +193,8 @@ function reduce(body, options) { if (valueMinifiers[property]) value = valueMinifiers[property](value); - value = zeroMinifier(property, value); value = precisionMinifier(property, value, options.precision); + value = zeroMinifier(property, value); value = unitMinifier(property, value, options.unitsRegexp); value = multipleZerosMinifier(property, value); value = colorMininifier(property, value, options.compatibility); diff --git a/test/binary-test.js b/test/binary-test.js index 7e572e84..7a5047a4 100644 --- a/test/binary-test.js +++ b/test/binary-test.js @@ -309,7 +309,7 @@ exports.commandsSuite = vows.describe('binary commands').addBatch({ }), zero: pipedContext('div{width:1.5051px}', '--rounding-precision 0', { 'should keep 0 decimal places': function(error, stdout) { - assert.equal(stdout, 'div{width:1px}'); + assert.equal(stdout, 'div{width:2px}'); } }), disabled: pipedContext('div{width:0.12345px}', '--rounding-precision \\\\-1', { diff --git a/test/integration-test.js b/test/integration-test.js index f3f02706..4f267d83 100644 --- a/test/integration-test.js +++ b/test/integration-test.js @@ -626,6 +626,10 @@ vows.describe('integration tests').addBatch({ 'rounds .9999 correctly': [ 'a{stroke-width:.99999px}', 'a{stroke-width:1px}' + ], + 'rounds 9.995 correctly': [ + 'a{stroke-width:9.995px}', + 'a{stroke-width:9.99px}' ] }), 'floats custom rounding': cssContext({ -- 2.34.1