From fedc34f7c84320b223704e0419757e83823926aa Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Sun, 22 Feb 2015 14:33:29 +0000 Subject: [PATCH] Adds smarter reordering rules. We can reorder two properties if one them is shorthand and the other is granular but they have the same value. Note: it may be improved even further with #429 in place. At that time we may compare exact values, e.g. `margin:0 1px` is currently not swappable with `margin-top:0` but it should. --- lib/selectors/optimizers/advanced.js | 4 +++- test/fixtures/big-min.css | 4 ++-- test/selectors/optimizer-test.js | 22 +++++++++++++--------- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/selectors/optimizers/advanced.js b/lib/selectors/optimizers/advanced.js index f62fbcaf..19465ded 100644 --- a/lib/selectors/optimizers/advanced.js +++ b/lib/selectors/optimizers/advanced.js @@ -80,6 +80,8 @@ function canReorderSingle(right, left) { return true; if (rightName != leftName && rightNameRoot == leftNameRoot && rightName != rightNameRoot && leftName != leftNameRoot) return true; + if (rightName != leftName && rightNameRoot == leftNameRoot && rightValue == leftValue) + return true; return false; } @@ -508,7 +510,7 @@ AdvancedOptimizer.prototype.restructure = function (tokens) { for (var k = 0; k < movedCount; k++) { var movedProperty = movedProperties[k]; - if (movedToBeDropped.indexOf(k) == -1 && !canReorderSingle(property, movedProperty)) { + if (movedToBeDropped.indexOf(k) == -1 && !canReorderSingle(movedProperty, property)) { dropPropertiesAt(i + 1, movedProperty); movedToBeDropped.push(k); delete movableTokens[movedProperty[0]]; diff --git a/test/fixtures/big-min.css b/test/fixtures/big-min.css index be474f49..93cf9af9 100644 --- a/test/fixtures/big-min.css +++ b/test/fixtures/big-min.css @@ -1796,8 +1796,8 @@ form select{padding:1px;height:20px} body.auth-unlogged #core-liberation .form-monlibe-unlogged form{opacity:.3;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";filter:alpha(opacity=30)} #core-liberation .form-monlibe .note-unlogged{position:absolute;border:1px solid;top:130px;left:10px;width:420px;padding:10px 10px 12px} #core-liberation .form-monlibe .note-unlogged p{font-family:Georgia,"Times New Roman",Times,serif;font-size:21px;font-weight:400;line-height:25px} -#core-liberation .form-monlibe .note-unlogged p.small,#core-liberation ul.list-items li h4,#core-liberation ul.list-items-mosts li{font-family:Verdana,Arial,sans-serif} -#core-liberation .form-monlibe .note-unlogged p.small{font-size:12px} +#core-liberation .form-monlibe .note-unlogged p.small{font-family:Verdana,Arial,sans-serif;font-size:12px} +#core-liberation ul.list-items li h4,#core-liberation ul.list-items-mosts li{font-family:Georgia,"Times New Roman",Times,serif} #core-liberation .form-monlibe .monlibe-edit-profile label{float:left;width:70%} #core-liberation .form-monlibe .monlibe-edit-profile p{clear:both} #core-liberation .form-monlibe .monlibe-edit-profile .btn-monlibe{margin-top:30px} diff --git a/test/selectors/optimizer-test.js b/test/selectors/optimizer-test.js index b5eb62a9..679498c4 100644 --- a/test/selectors/optimizer-test.js +++ b/test/selectors/optimizer-test.js @@ -105,19 +105,23 @@ vows.describe(SelectorsOptimizer) ], 'over shorthands': [ 'div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}', - 'div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}' + '.two,div{margin-top:0}.one{margin:0}.two{display:block}' ], 'over shorthands with flush': [ - 'div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}.three{color:red}.four{margin-top:0}', - 'div{margin-top:0}.one{margin:0}.four,.two{margin-top:0}.two{display:block}.three{color:red}' + 'div{margin-top:0}.one{margin:5px}.two{display:block;margin-top:0}.three{color:red}.four{margin-top:0}', + 'div{margin-top:0}.one{margin:5px}.four,.two{margin-top:0}.two{display:block}.three{color:red}' ], - 'over granular': [ - 'div{margin-top:0}.one{margin-bottom:0}.two{display:block;margin-top:0}', - '.two,div{margin-top:0}.one{margin-bottom:0}.two{display:block}' + 'granuar over granular': [ + 'div{margin-top:0}.one{margin-bottom:2px}.two{display:block;margin-top:0}', + '.two,div{margin-top:0}.one{margin-bottom:2px}.two{display:block}' ], - 'over granular with shorthand': [ + 'shorthand over granular with different value': [ + 'div{margin:0}.one{margin-bottom:1px}.two{display:block;margin:0}', + 'div{margin:0}.one{margin-bottom:1px}.two{display:block;margin:0}' + ], + 'shorthand over granular with same value': [ 'div{margin:0}.one{margin-bottom:0}.two{display:block;margin:0}', - 'div{margin:0}.one{margin-bottom:0}.two{display:block;margin:0}' + '.two,div{margin:0}.one{margin-bottom:0}.two{display:block}' ], 'over media without overriding': [ 'div{margin:0}@media{.one{color:red}}.two{display:block;margin:0}', @@ -133,7 +137,7 @@ vows.describe(SelectorsOptimizer) ], 'over media with overriding by a granular': [ 'div{margin:0}@media{.one{margin-bottom:0}}.two{display:block;margin:0}', - 'div{margin:0}@media{.one{margin-bottom:0}}.two{display:block;margin:0}' + '.two,div{margin:0}@media{.one{margin-bottom:0}}.two{display:block}' ], 'over media with overriding by a different granular': [ 'div{margin-top:0}@media{.one{margin-bottom:0}}.two{display:block;margin-top:0}', -- 2.34.1