Spaces:
Running
Running
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; | |