From 9f1f358fc1d87e56408de1031c9ab0ec2efe0dad Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Mon, 10 Aug 2015 08:49:44 +0100 Subject: [PATCH] Fixes #644 - adds time unit optimizations. It adds the following optimizations: * second -> milisecond, e.g. 0.005s -> 5ms * milisecond -> second, e.g. 500ms -> .5s --- History.md | 1 + lib/selectors/simple.js | 20 ++++++++++++++++++++ test/fixtures/big-min.css | 2 +- test/selectors/simple-test.js | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 4461e286..9fc82be4 100644 --- a/History.md +++ b/History.md @@ -3,6 +3,7 @@ * Unifies wrappers for simple & advanced optimizations. * Fixed issue [#599](https://github.com/jakubpawlowicz/clean-css/issues/599) - support for inlined source maps. +* Fixed issue [#644](https://github.com/jakubpawlowicz/clean-css/issues/644) - adds time unit optimizations. [3.3.9 / 2015-08-09](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.8...v3.3.9) ================== diff --git a/lib/selectors/simple.js b/lib/selectors/simple.js index 97d2ec41..4f0bc4bf 100644 --- a/lib/selectors/simple.js +++ b/lib/selectors/simple.js @@ -19,6 +19,8 @@ var FONT_NUMERAL_WEIGHTS = ['100', '200', '300', '400', '500', '600', '700', '80 var FONT_NAME_WEIGHTS = ['normal', 'bold', 'bolder', 'lighter']; var FONT_NAME_WEIGHTS_WITHOUT_NORMAL = ['bold', 'bolder', 'lighter']; +var TIME_VALUE = /^(\-?[\d\.]+)(m?s)$/; + var valueMinifiers = { 'background': function (value, index, total) { return index === 0 && total == 1 && (value == 'none' || value == 'transparent') ? '0 0' : value; @@ -167,6 +169,23 @@ function colorMininifier(_, value, compatibility) { return HexNameShortener.shorten(value); } +function timeUnitMinifier(_, value) { + if (!TIME_VALUE.test(value)) + return value; + + return value.replace(TIME_VALUE, function (match, val, unit) { + var newValue; + + if (unit == 'ms') { + newValue = parseInt(val) / 1000 + 's'; + } else if (unit == 's') { + newValue = parseFloat(val) * 1000 + 'ms'; + } + + return newValue.length < match.length ? newValue : match; + }); +} + function minifyBorderRadius(property) { var values = property.value; var spliceAt; @@ -266,6 +285,7 @@ function optimizeBody(properties, options) { value = whitespaceMinifier(name, value); value = precisionMinifier(name, value, options.precision); + value = timeUnitMinifier(name, value); value = zeroMinifier(name, value); if (options.compatibility.properties.zeroUnits) { value = zeroDegMinifier(name, value); diff --git a/test/fixtures/big-min.css b/test/fixtures/big-min.css index cc5a462a..c22c9683 100644 --- a/test/fixtures/big-min.css +++ b/test/fixtures/big-min.css @@ -1262,7 +1262,7 @@ label i{font-style:normal;display:none} .conteneur_lives.popuped .lives{position:relative} .conteneur_lives .live{width:328px;right:0;background-color:#F6F6F6} .conteneur_lives .live .bandeau{height:25px;width:320px;padding-right:8px;overflow:hidden;line-height:23px;cursor:pointer;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#d20303,#bf0202);background-image:-ms-linear-gradient(top,#d20303,#bf0202);background-image:-webkit-gradient(linear,0 0,0 100%,from(#d20303),to(#bf0202));background-image:-webkit-linear-gradient(top,#d20303,#bf0202);background-image:-o-linear-gradient(top,#d20303,#bf0202);background-image:linear-gradient(top,#d20303,#bf0202);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d20303', endColorstr='#bf0202', GradientType=0)} -.conteneur_lives .live.petit .bandeau:hover{background-color:#fe2f2f;background-position:0 -25px;-webkit-transition:background-position .06s linear;-moz-transition:background-position .06s linear;-ms-transition:background-position .06s linear;-o-transition:background-position .06s linear;transition:background-position .06s linear;cursor:pointer} +.conteneur_lives .live.petit .bandeau:hover{background-color:#fe2f2f;background-position:0 -25px;-webkit-transition:background-position 60ms linear;-moz-transition:background-position 60ms linear;-ms-transition:background-position 60ms linear;-o-transition:background-position 60ms linear;transition:background-position 60ms linear;cursor:pointer} .conteneur_lives .live .bandeau .titre{float:left;padding:0 7px;width:220px;font-family:arial,sans-serif;font-size:13px;font-weight:700} .conteneur_lives .lives .chrome .titre{float:left;width:230px;height:25px;overflow:hidden;color:#fff;text-align:left;font-weight:700;font-family:arial,sans-serif;font-size:13px;line-height:25px} .conteneur_lives .lives .chrome .titre .tt_live{display:inline-block;width:20px;height:10px;margin:0 5px 0 16px;text-indent:-9999px;background:url(/medias/web/img/sprites/icos_live.png) -162px 0} diff --git a/test/selectors/simple-test.js b/test/selectors/simple-test.js index ee93368a..83cfd548 100644 --- a/test/selectors/simple-test.js +++ b/test/selectors/simple-test.js @@ -688,4 +688,36 @@ vows.describe('simple optimizations') ] }) ) + .addBatch( + propertyContext('time units', { + 'positive miliseconds to seconds': [ + 'div{transition-duration:500ms}', + [['transition-duration', '.5s']] + ], + 'negative miliseconds to seconds': [ + 'div{transition-duration:-500ms}', + [['transition-duration', '-.5s']] + ], + 'miliseconds to seconds when results in a too long value': [ + 'div{transition-duration:1515ms}', + [['transition-duration', '1515ms']] + ], + 'zero miliseconds to seconds': [ + 'div{transition-duration:0ms}', + [['transition-duration', '0s']] + ], + 'positive seconds to miliseconds': [ + 'div{transition-duration:0.005s}', + [['transition-duration', '5ms']] + ], + 'negative seconds to miliseconds': [ + 'div{transition-duration:-0.005s}', + [['transition-duration', '-5ms']] + ], + 'seconds to miliseconds when results in a too long value': [ + 'div{transition-duration:1.2s}', + [['transition-duration', '1.2s']] + ] + }) + ) .export(module); -- 2.34.1