140 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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;
 |