| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | var canReorder = require('./reorderable').canReorder;var canReorderSingle = require('./reorderable').canReorderSingle;var extractProperties = require('./extract-properties');var rulesOverlap = require('./rules-overlap');var serializeRules = require('../../writer/one-time').rules;var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;var Token = require('../../tokenizer/token');function mergeMediaQueries(tokens, context) {  var mergeSemantically = context.options.level[OptimizationLevel.Two].mergeSemantically;  var specificityCache = context.cache.specificity;  var candidates = {};  var reduced = [];  for (var i = tokens.length - 1; i >= 0; i--) {    var token = tokens[i];    if (token[0] != Token.NESTED_BLOCK) {      continue;    }    var key = serializeRules(token[1]);    var candidate = candidates[key];    if (!candidate) {      candidate = [];      candidates[key] = candidate;    }    candidate.push(i);  }  for (var name in candidates) {    var positions = candidates[name];    positionLoop:    for (var j = positions.length - 1; j > 0; j--) {      var positionOne = positions[j];      var tokenOne = tokens[positionOne];      var positionTwo = positions[j - 1];      var tokenTwo = tokens[positionTwo];      directionLoop:      for (var direction = 1; direction >= -1; direction -= 2) {        var topToBottom = direction == 1;        var from = topToBottom ? positionOne + 1 : positionTwo - 1;        var to = topToBottom ? positionTwo : positionOne;        var delta = topToBottom ? 1 : -1;        var source = topToBottom ? tokenOne : tokenTwo;        var target = topToBottom ? tokenTwo : tokenOne;        var movedProperties = extractProperties(source);        while (from != to) {          var traversedProperties = extractProperties(tokens[from]);          from += delta;          if (mergeSemantically && allSameRulePropertiesCanBeReordered(movedProperties, traversedProperties, specificityCache)) {            continue;          }          if (!canReorder(movedProperties, traversedProperties, specificityCache))            continue directionLoop;        }        target[2] = topToBottom ?          source[2].concat(target[2]) :          target[2].concat(source[2]);        source[2] = [];        reduced.push(target);        continue positionLoop;      }    }  }  return reduced;}function allSameRulePropertiesCanBeReordered(movedProperties, traversedProperties, specificityCache) {  var movedProperty;  var movedRule;  var traversedProperty;  var traversedRule;  var i, l;  var j, m;  for (i = 0, l = movedProperties.length; i < l; i++) {    movedProperty = movedProperties[i];    movedRule = movedProperty[5];    for (j = 0, m = traversedProperties.length; j < m; j++) {      traversedProperty = traversedProperties[j];      traversedRule = traversedProperty[5];      if (rulesOverlap(movedRule, traversedRule, true) && !canReorderSingle(movedProperty, traversedProperty, specificityCache)) {        return false;      }    }  }  return true;}module.exports = mergeMediaQueries;
 |