You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.9 KiB
140 lines
3.9 KiB
var mergeAdjacent = require('./merge-adjacent');
|
|
var mergeMediaQueries = require('./merge-media-queries');
|
|
var mergeNonAdjacentByBody = require('./merge-non-adjacent-by-body');
|
|
var mergeNonAdjacentBySelector = require('./merge-non-adjacent-by-selector');
|
|
var reduceNonAdjacent = require('./reduce-non-adjacent');
|
|
var removeDuplicateFontAtRules = require('./remove-duplicate-font-at-rules');
|
|
var removeDuplicateMediaQueries = require('./remove-duplicate-media-queries');
|
|
var removeDuplicates = require('./remove-duplicates');
|
|
var removeUnusedAtRules = require('./remove-unused-at-rules');
|
|
var restructure = require('./restructure');
|
|
|
|
var optimizeProperties = require('./properties/optimize');
|
|
|
|
var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
|
|
|
|
var Token = require('../../tokenizer/token');
|
|
|
|
function removeEmpty(tokens) {
|
|
for (var i = 0, l = tokens.length; i < l; i++) {
|
|
var token = tokens[i];
|
|
var isEmpty = false;
|
|
|
|
switch (token[0]) {
|
|
case Token.RULE:
|
|
isEmpty = token[1].length === 0 || token[2].length === 0;
|
|
break;
|
|
case Token.NESTED_BLOCK:
|
|
removeEmpty(token[2]);
|
|
isEmpty = token[2].length === 0;
|
|
break;
|
|
case Token.AT_RULE:
|
|
isEmpty = token[1].length === 0;
|
|
break;
|
|
case Token.AT_RULE_BLOCK:
|
|
isEmpty = token[2].length === 0;
|
|
}
|
|
|
|
if (isEmpty) {
|
|
tokens.splice(i, 1);
|
|
i--;
|
|
l--;
|
|
}
|
|
}
|
|
}
|
|
|
|
function recursivelyOptimizeBlocks(tokens, context) {
|
|
for (var i = 0, l = tokens.length; i < l; i++) {
|
|
var token = tokens[i];
|
|
|
|
if (token[0] == Token.NESTED_BLOCK) {
|
|
var isKeyframes = /@(-moz-|-o-|-webkit-)?keyframes/.test(token[1][0][1]);
|
|
level2Optimize(token[2], context, !isKeyframes);
|
|
}
|
|
}
|
|
}
|
|
|
|
function recursivelyOptimizeProperties(tokens, context) {
|
|
for (var i = 0, l = tokens.length; i < l; i++) {
|
|
var token = tokens[i];
|
|
|
|
switch (token[0]) {
|
|
case Token.RULE:
|
|
optimizeProperties(token[2], true, true, context);
|
|
break;
|
|
case Token.NESTED_BLOCK:
|
|
recursivelyOptimizeProperties(token[2], context);
|
|
}
|
|
}
|
|
}
|
|
|
|
function level2Optimize(tokens, context, withRestructuring) {
|
|
var levelOptions = context.options.level[OptimizationLevel.Two];
|
|
var level2Plugins = context.options.plugins.level2Block;
|
|
var reduced;
|
|
var i;
|
|
|
|
recursivelyOptimizeBlocks(tokens, context);
|
|
recursivelyOptimizeProperties(tokens, context);
|
|
|
|
if (levelOptions.removeDuplicateRules) {
|
|
removeDuplicates(tokens, context);
|
|
}
|
|
|
|
if (levelOptions.mergeAdjacentRules) {
|
|
mergeAdjacent(tokens, context);
|
|
}
|
|
|
|
if (levelOptions.reduceNonAdjacentRules) {
|
|
reduceNonAdjacent(tokens, context);
|
|
}
|
|
|
|
if (levelOptions.mergeNonAdjacentRules && levelOptions.mergeNonAdjacentRules != 'body') {
|
|
mergeNonAdjacentBySelector(tokens, context);
|
|
}
|
|
|
|
if (levelOptions.mergeNonAdjacentRules && levelOptions.mergeNonAdjacentRules != 'selector') {
|
|
mergeNonAdjacentByBody(tokens, context);
|
|
}
|
|
|
|
if (levelOptions.restructureRules && levelOptions.mergeAdjacentRules && withRestructuring) {
|
|
restructure(tokens, context);
|
|
mergeAdjacent(tokens, context);
|
|
}
|
|
|
|
if (levelOptions.restructureRules && !levelOptions.mergeAdjacentRules && withRestructuring) {
|
|
restructure(tokens, context);
|
|
}
|
|
|
|
if (levelOptions.removeDuplicateFontRules) {
|
|
removeDuplicateFontAtRules(tokens, context);
|
|
}
|
|
|
|
if (levelOptions.removeDuplicateMediaBlocks) {
|
|
removeDuplicateMediaQueries(tokens, context);
|
|
}
|
|
|
|
if (levelOptions.removeUnusedAtRules) {
|
|
removeUnusedAtRules(tokens, context);
|
|
}
|
|
|
|
if (levelOptions.mergeMedia) {
|
|
reduced = mergeMediaQueries(tokens, context);
|
|
for (i = reduced.length - 1; i >= 0; i--) {
|
|
level2Optimize(reduced[i][2], context, false);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < level2Plugins.length; i++) {
|
|
level2Plugins[i](tokens);
|
|
}
|
|
|
|
if (levelOptions.removeEmpty) {
|
|
removeEmpty(tokens);
|
|
}
|
|
|
|
return tokens;
|
|
}
|
|
|
|
module.exports = level2Optimize;
|