merge-adjacent.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. var optimizeProperties = require('../properties/optimizer');
  2. var stringifyBody = require('../stringifier/one-time').body;
  3. var stringifySelectors = require('../stringifier/one-time').selectors;
  4. var cleanUpSelectors = require('./clean-up').selectors;
  5. var isSpecial = require('./is-special');
  6. function mergeAdjacent(tokens, options, context) {
  7. var lastToken = [null, [], []];
  8. var adjacentSpace = options.compatibility.selectors.adjacentSpace;
  9. for (var i = 0, l = tokens.length; i < l; i++) {
  10. var token = tokens[i];
  11. if (token[0] != 'selector') {
  12. lastToken = [null, [], []];
  13. continue;
  14. }
  15. if (lastToken[0] == 'selector' && stringifySelectors(token[1]) == stringifySelectors(lastToken[1])) {
  16. var joinAt = [lastToken[2].length];
  17. Array.prototype.push.apply(lastToken[2], token[2]);
  18. optimizeProperties(token[1], lastToken[2], joinAt, true, options, context);
  19. token[2] = [];
  20. } else if (lastToken[0] == 'selector' && stringifyBody(token[2]) == stringifyBody(lastToken[2]) &&
  21. !isSpecial(options, stringifySelectors(token[1])) && !isSpecial(options, stringifySelectors(lastToken[1]))) {
  22. lastToken[1] = cleanUpSelectors(lastToken[1].concat(token[1]), false, adjacentSpace);
  23. token[2] = [];
  24. } else {
  25. lastToken = token;
  26. }
  27. }
  28. }
  29. module.exports = mergeAdjacent;