From: Jakub Pawlowicz Date: Mon, 13 Mar 2017 21:22:22 +0000 (+0100) Subject: Fixes #910 - too aggressive precision optimizations. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=a40e76ddb62e3bf5ebbc25c78959d50209f7a611;p=clean-css.git Fixes #910 - too aggressive precision optimizations. Why: * Precision rounding should only apply when a value is positively identified as a numeric or unit value. --- diff --git a/History.md b/History.md index c69b43d4..596954ba 100644 --- a/History.md +++ b/History.md @@ -5,6 +5,11 @@ * Fixed issue [#890](https://github.com/jakubpawlowicz/clean-css/issues/890) - adds toggle to disable empty tokens removal. * Fixed issue [#886](https://github.com/jakubpawlowicz/clean-css/issues/886) - better multi pseudo class / element merging. +[4.0.9 / 2017-xx-xx](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.8...4.0) +================== + +* Fixed issue [#910](https://github.com/jakubpawlowicz/clean-css/issues/910) - too aggressive precision optimizations. + [4.0.8 / 2017-02-22](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.7...v4.0.8) ================== diff --git a/lib/optimizer/level-1/optimize.js b/lib/optimizer/level-1/optimize.js index 546f8150..9c0b65ba 100644 --- a/lib/optimizer/level-1/optimize.js +++ b/lib/optimizer/level-1/optimize.js @@ -288,14 +288,13 @@ function optimizePixelLengths(_, value, compatibility) { } function optimizePrecision(_, value, precisionOptions) { - var optimizedValue = value.replace(/(\d)\.($|\D)/g, '$1$2'); - - if (!precisionOptions.matcher || value.indexOf('.') === -1) { - return optimizedValue; + if (!precisionOptions.enabled || value.indexOf('.') === -1) { + return value; } - return optimizedValue - .replace(precisionOptions.matcher, function (match, integerPart, fractionPart, unit) { + return value + .replace(precisionOptions.decimalPointMatcher, '$1$2$3') + .replace(precisionOptions.zeroMatcher, function (match, integerPart, fractionPart, unit) { var multiplier = precisionOptions.units[unit].multiplier; var parsedInteger = parseInt(integerPart); var integer = isNaN(parsedInteger) ? 0 : parsedInteger; @@ -649,7 +648,9 @@ function buildPrecisionOptions(roundingPrecision) { } if (optimizable.length > 0) { - precisionOptions.matcher = new RegExp('(\\d*)(\\.\\d+)(' + optimizable.join('|') + ')', 'g'); + precisionOptions.enabled = true; + precisionOptions.decimalPointMatcher = new RegExp('(\\d)\\.($|' + optimizable.join('|') + ')($|\W)', 'g'); + precisionOptions.zeroMatcher = new RegExp('(\\d*)(\\.\\d+)(' + optimizable.join('|') + ')', 'g'); } return precisionOptions; diff --git a/test/integration-test.js b/test/integration-test.js index ff454eee..97021f52 100644 --- a/test/integration-test.js +++ b/test/integration-test.js @@ -672,15 +672,15 @@ vows.describe('integration tests') ], 'missing #1': [ 'body{margin:2.em}', - 'body{margin:2em}' + 'body{margin:2.em}' ], 'missing #2': [ 'p{opacity:1.}', - 'p{opacity:1}' + 'p{opacity:1.}' ], 'missing #3': [ 'p{opacity:11.px}', - 'p{opacity:11px}' + 'p{opacity:11.px}' ], 'minus zero as value to zero': [ 'body{margin:-0}', diff --git a/test/optimizer/level-1/optimize-test.js b/test/optimizer/level-1/optimize-test.js index bf504c9b..ee86a6f0 100644 --- a/test/optimizer/level-1/optimize-test.js +++ b/test/optimizer/level-1/optimize-test.js @@ -640,6 +640,10 @@ vows.describe('level 1 optimizations') 'ems': [ 'a{left:1.1231em}', 'a{left:1.123em}' + ], + 'inside strings': [ + '.block{background-image:image-set(url("//s1.server.com/img.png") 1x)}', + '.block{background-image:image-set(url("//s1.server.com/img.png") 1x)}' ] }, { level: { 1: { roundingPrecision: 3 } } }) ) @@ -656,6 +660,10 @@ vows.describe('level 1 optimizations') 'ems': [ 'a{left:1.1231em}', 'a{left:1.1231em}' + ], + 'inside strings': [ + '.block{background-image:image-set(url("//s1.server.com/img.png") 1x)}', + '.block{background-image:image-set(url("//s1.server.com/img.png") 1x)}' ] }, { level: { 1: { roundingPrecision: 'off' } } }) ) @@ -807,7 +815,7 @@ vows.describe('level 1 optimizations') ], 'missing': [ 'a{opacity:1.}', - 'a{opacity:1}' + 'a{opacity:1.}' ], 'multiple': [ 'a{margin:-0 -0 -0 -0}',