1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- var optimizeProperties = require('../properties/optimizer');
- var removeDuplicates = require('./remove-duplicates');
- var mergeAdjacent = require('./merge-adjacent');
- var reduceNonAdjacent = require('./reduce-non-adjacent');
- var mergeNonAdjacentBySelector = require('./merge-non-adjacent-by-selector');
- var mergeNonAdjacentByBody = require('./merge-non-adjacent-by-body');
- var restructure = require('./restructure');
- var removeDuplicateMediaQueries = require('./remove-duplicate-media-queries');
- var mergeMediaQueries = require('./merge-media-queries');
- function removeEmpty(tokens) {
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
- var isEmpty = false;
- switch (token[0]) {
- case 'selector':
- isEmpty = token[1].length === 0 || token[2].length === 0;
- break;
- case 'block':
- removeEmpty(token[2]);
- isEmpty = token[2].length === 0;
- }
- if (isEmpty) {
- tokens.splice(i, 1);
- i--;
- l--;
- }
- }
- }
- function recursivelyOptimizeBlocks(tokens, options, context) {
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
- if (token[0] == 'block') {
- var isKeyframes = /@(-moz-|-o-|-webkit-)?keyframes/.test(token[1][0]);
- optimize(token[2], options, context, !isKeyframes);
- }
- }
- }
- function recursivelyOptimizeProperties(tokens, options, context) {
- for (var i = 0, l = tokens.length; i < l; i++) {
- var token = tokens[i];
- switch (token[0]) {
- case 'selector':
- optimizeProperties(token[1], token[2], false, true, options, context);
- break;
- case 'block':
- recursivelyOptimizeProperties(token[2], options, context);
- }
- }
- }
- function optimize(tokens, options, context, withRestructuring) {
- recursivelyOptimizeBlocks(tokens, options, context);
- recursivelyOptimizeProperties(tokens, options, context);
- removeDuplicates(tokens);
- mergeAdjacent(tokens, options, context);
- reduceNonAdjacent(tokens, options, context);
- mergeNonAdjacentBySelector(tokens, options, context);
- mergeNonAdjacentByBody(tokens, options);
- if (options.restructuring && withRestructuring) {
- restructure(tokens, options);
- mergeAdjacent(tokens, options, context);
- }
- if (options.mediaMerging) {
- removeDuplicateMediaQueries(tokens);
- var reduced = mergeMediaQueries(tokens);
- for (var i = reduced.length - 1; i >= 0; i--) {
- optimize(reduced[i][2], options, context, false);
- }
- }
- removeEmpty(tokens);
- }
- module.exports = optimize;
|