From c7b013de2ceaf0200b68a0b9038273190a239dc3 Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Sat, 4 Oct 2014 10:32:09 +0100 Subject: [PATCH] Fixes advanced optimizer. * It was broken since we use tokenized data now. --- lib/selectors/optimizers/advanced.js | 63 ++++++++++++++++------------ 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/lib/selectors/optimizers/advanced.js b/lib/selectors/optimizers/advanced.js index 55267742..a4cfe613 100644 --- a/lib/selectors/optimizers/advanced.js +++ b/lib/selectors/optimizers/advanced.js @@ -1,5 +1,6 @@ var PropertyOptimizer = require('../../properties/optimizer'); var CleanUp = require('./clean-up'); +var Splitter = require('../../utils/splitter'); var specialSelectors = { '*': /\-(moz|ms|o|webkit)\-/, @@ -61,7 +62,6 @@ AdvancedOptimizer.prototype.mergeAdjacent = function (tokens) { // TODO: broken due to joining/splitting if (lastToken.selector && token.selector.join(',') == lastToken.selector.join(',')) { var joinAt = [lastToken.body.length]; - lastToken.body = lastToken.body.concat(token.body); // TODO: broken due to joining/splitting lastToken.body = this.propertyOptimizer.process(lastToken.body.concat(token.body).join(';'), joinAt, false, token.selector.join(',')).split(';'); forRemoval.push(i); @@ -92,9 +92,9 @@ AdvancedOptimizer.prototype.reduceNonAdjacent = function (tokens) { continue; var complexSelector = token.selector; - var selectors = complexSelector.length > 1 && !this.isSpecial(complexSelector, this.options) ? - complexSelector : - [complexSelector]; + var selectors = complexSelector.length > 1 && !this.isSpecial(complexSelector.join(','), this.options) ? + [complexSelector.join(',')].concat(complexSelector) : + [complexSelector.join(',')]; for (var j = 0, m = selectors.length; j < m; j++) { // TODO: broken due to joining/splitting @@ -151,7 +151,7 @@ AdvancedOptimizer.prototype.reduceComplexNonAdjacentCases = function (tokens, po allSelectors: for (var complexSelector in positions) { - if (positions[complexSelector].length == 1) + if (complexSelector.indexOf(',') == -1) continue; var into = positions[complexSelector]; @@ -159,10 +159,9 @@ AdvancedOptimizer.prototype.reduceComplexNonAdjacentCases = function (tokens, po var intoToken = tokens[intoPosition]; // TODO: broken due to joining/splitting - // var selectors = this.isSpecial(complexSelector) ? - // [complexSelector] : - // complexSelector; - var selectors = complexSelector.split(','); + var selectors = this.isSpecial(complexSelector) ? + [complexSelector] : + new Splitter(',').split(complexSelector); var reducedBodies = []; for (var j = 0, m = selectors.length; j < m; j++) { @@ -179,7 +178,7 @@ AdvancedOptimizer.prototype.reduceComplexNonAdjacentCases = function (tokens, po }, callback: function (token, newBody, processedCount, tokenIdx) { if (tokenIdx === 0) - reducedBodies.push(newBody); + reducedBodies.push(newBody.join(';')); } }); @@ -187,7 +186,7 @@ AdvancedOptimizer.prototype.reduceComplexNonAdjacentCases = function (tokens, po continue allSelectors; } - intoToken.body = reducedBodies[0]; + intoToken.body = reducedBodies[0].split(';'); reduced = true; } @@ -219,15 +218,15 @@ AdvancedOptimizer.prototype.reduceSelector = function (tokens, selector, data, o } // TODO: broken due to joining/splitting - var optimizedBody = this.propertyOptimizer.process(bodies.join(';'), joinsAt, true, selector).split(';'); - var optimizedProperties = optimizedBody; + var optimizedBody = this.propertyOptimizer.process(bodies.join(';'), joinsAt, true, selector); + var optimizedProperties = optimizedBody.split(';'); var processedCount = processedTokens.length; var propertyIdx = optimizedProperties.length - 1; var tokenIdx = processedCount - 1; while (tokenIdx >= 0) { - if ((tokenIdx === 0 || splitBodies[tokenIdx].join(';').indexOf(optimizedProperties[propertyIdx]) > -1) && propertyIdx > -1) { + if ((tokenIdx === 0 || splitBodies[tokenIdx].indexOf(optimizedProperties[propertyIdx]) > -1) && propertyIdx > -1) { propertyIdx--; continue; } @@ -259,22 +258,34 @@ function optimizeProperties(tokens, propertyOptimizer) { } AdvancedOptimizer.prototype.optimize = function (tokens) { - optimizeProperties(tokens, this.propertyOptimizer); + var self = this; - // Run until 2 last operations do not yield any changes - while (true) { - if (this.noChanges()) - break; - this.removeDuplicates(tokens); + function _optimize(tokens) { + tokens.forEach(function (token) { + if (token.block) + _optimize(token.body); + }); + + optimizeProperties(tokens, self.propertyOptimizer); + + // Run until 2 last operations do not yield any changes + self.minificationsMade = []; + while (true) { + if (self.noChanges()) + break; + self.removeDuplicates(tokens); - if (this.noChanges()) - break; - this.mergeAdjacent(tokens); + if (self.noChanges()) + break; + self.mergeAdjacent(tokens); - if (this.noChanges()) - break; - this.reduceNonAdjacent(tokens); + if (self.noChanges()) + break; + self.reduceNonAdjacent(tokens); + } } + + _optimize(tokens); }; module.exports = AdvancedOptimizer; -- 2.34.1