12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- var canReorder = require('./reorderable').canReorder;
- var extractProperties = require('./extractor');
- function mergeMediaQueries(tokens) {
- var candidates = {};
- var reduced = [];
- for (var i = tokens.length - 1; i >= 0; i--) {
- var token = tokens[i];
- if (token[0] != 'block')
- continue;
- var candidate = candidates[token[1][0]];
- if (!candidate) {
- candidate = [];
- candidates[token[1][0]] = 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 (!canReorder(movedProperties, traversedProperties))
- continue directionLoop;
- }
- target[2] = topToBottom ?
- source[2].concat(target[2]) :
- target[2].concat(source[2]);
- source[2] = [];
- reduced.push(target);
- continue positionLoop;
- }
- }
- }
- return reduced;
- }
- module.exports = mergeMediaQueries;
|