var PropertyOptimizer = require('../../properties/optimizer');
var CleanUp = require('./clean-up');
+var Splitter = require('../../utils/splitter');
var specialSelectors = {
'*': /\-(moz|ms|o|webkit)\-/,
// 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);
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
allSelectors:
for (var complexSelector in positions) {
- if (positions[complexSelector].length == 1)
+ if (complexSelector.indexOf(',') == -1)
continue;
var into = positions[complexSelector];
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++) {
},
callback: function (token, newBody, processedCount, tokenIdx) {
if (tokenIdx === 0)
- reducedBodies.push(newBody);
+ reducedBodies.push(newBody.join(';'));
}
});
continue allSelectors;
}
- intoToken.body = reducedBodies[0];
+ intoToken.body = reducedBodies[0].split(';');
reduced = true;
}
}
// 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;
}
}
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;