Fixes #910 - too aggressive precision optimizations.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Mon, 13 Mar 2017 21:22:22 +0000 (22:22 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Wed, 15 Mar 2017 10:07:40 +0000 (11:07 +0100)
Why:

* Precision rounding should only apply when a value is positively
identified as a numeric or unit value.

History.md
lib/optimizer/level-1/optimize.js
test/integration-test.js
test/optimizer/level-1/optimize-test.js

index c69b43d..596954b 100644 (file)
@@ -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)
 ==================
 
index 546f815..9c0b65b 100644 (file)
@@ -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;
index ff454ee..97021f5 100644 (file)
@@ -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}',
index bf504c9..ee86a6f 100644 (file)
@@ -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}',