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.
		
		
		
		
		
			
		
			
				
					
					
						
							134 lines
						
					
					
						
							3.8 KiB
						
					
					
				
			
		
		
	
	
							134 lines
						
					
					
						
							3.8 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 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); | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  if (levelOptions.removeEmpty) { | 
						|
    removeEmpty(tokens); | 
						|
  } | 
						|
 | 
						|
  return tokens; | 
						|
} | 
						|
 | 
						|
module.exports = level2Optimize;
 | 
						|
 |