advanced.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. var optimizeProperties = require('../properties/optimizer');
  2. var removeDuplicates = require('./remove-duplicates');
  3. var mergeAdjacent = require('./merge-adjacent');
  4. var reduceNonAdjacent = require('./reduce-non-adjacent');
  5. var mergeNonAdjacentBySelector = require('./merge-non-adjacent-by-selector');
  6. var mergeNonAdjacentByBody = require('./merge-non-adjacent-by-body');
  7. var restructure = require('./restructure');
  8. var removeDuplicateMediaQueries = require('./remove-duplicate-media-queries');
  9. var mergeMediaQueries = require('./merge-media-queries');
  10. function removeEmpty(tokens) {
  11. for (var i = 0, l = tokens.length; i < l; i++) {
  12. var token = tokens[i];
  13. var isEmpty = false;
  14. switch (token[0]) {
  15. case 'selector':
  16. isEmpty = token[1].length === 0 || token[2].length === 0;
  17. break;
  18. case 'block':
  19. removeEmpty(token[2]);
  20. isEmpty = token[2].length === 0;
  21. }
  22. if (isEmpty) {
  23. tokens.splice(i, 1);
  24. i--;
  25. l--;
  26. }
  27. }
  28. }
  29. function recursivelyOptimizeBlocks(tokens, options, context) {
  30. for (var i = 0, l = tokens.length; i < l; i++) {
  31. var token = tokens[i];
  32. if (token[0] == 'block') {
  33. var isKeyframes = /@(-moz-|-o-|-webkit-)?keyframes/.test(token[1][0]);
  34. optimize(token[2], options, context, !isKeyframes);
  35. }
  36. }
  37. }
  38. function recursivelyOptimizeProperties(tokens, options, context) {
  39. for (var i = 0, l = tokens.length; i < l; i++) {
  40. var token = tokens[i];
  41. switch (token[0]) {
  42. case 'selector':
  43. optimizeProperties(token[1], token[2], false, true, options, context);
  44. break;
  45. case 'block':
  46. recursivelyOptimizeProperties(token[2], options, context);
  47. }
  48. }
  49. }
  50. function optimize(tokens, options, context, withRestructuring) {
  51. recursivelyOptimizeBlocks(tokens, options, context);
  52. recursivelyOptimizeProperties(tokens, options, context);
  53. removeDuplicates(tokens);
  54. mergeAdjacent(tokens, options, context);
  55. reduceNonAdjacent(tokens, options, context);
  56. mergeNonAdjacentBySelector(tokens, options, context);
  57. mergeNonAdjacentByBody(tokens, options);
  58. if (options.restructuring && withRestructuring) {
  59. restructure(tokens, options);
  60. mergeAdjacent(tokens, options, context);
  61. }
  62. if (options.mediaMerging) {
  63. removeDuplicateMediaQueries(tokens);
  64. var reduced = mergeMediaQueries(tokens);
  65. for (var i = reduced.length - 1; i >= 0; i--) {
  66. optimize(reduced[i][2], options, context, false);
  67. }
  68. }
  69. removeEmpty(tokens);
  70. }
  71. module.exports = optimize;