extractor.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // This extractor is used in advanced optimizations
  2. // IMPORTANT: Mind Token class and this code is not related!
  3. // Properties will be tokenized in one step, see #429
  4. var stringifySelectors = require('../stringifier/one-time').selectors;
  5. var stringifyValue = require('../stringifier/one-time').value;
  6. var AT_RULE = 'at-rule';
  7. function extract(token) {
  8. var properties = [];
  9. if (token[0] == 'selector') {
  10. var inSpecificSelector = !/[\.\+>~]/.test(stringifySelectors(token[1]));
  11. for (var i = 0, l = token[2].length; i < l; i++) {
  12. var property = token[2][i];
  13. if (property.indexOf('__ESCAPED') === 0)
  14. continue;
  15. if (property[0] == AT_RULE)
  16. continue;
  17. var name = token[2][i][0][0];
  18. if (name.length === 0)
  19. continue;
  20. if (name.indexOf('--') === 0)
  21. continue;
  22. var value = stringifyValue(token[2], i);
  23. properties.push([
  24. name,
  25. value,
  26. findNameRoot(name),
  27. token[2][i],
  28. name + ':' + value,
  29. token[1],
  30. inSpecificSelector
  31. ]);
  32. }
  33. } else if (token[0] == 'block') {
  34. for (var j = 0, k = token[2].length; j < k; j++) {
  35. properties = properties.concat(extract(token[2][j]));
  36. }
  37. }
  38. return properties;
  39. }
  40. function findNameRoot(name) {
  41. if (name == 'list-style')
  42. return name;
  43. if (name.indexOf('-radius') > 0)
  44. return 'border-radius';
  45. if (name == 'border-collapse' || name == 'border-spacing' || name == 'border-image')
  46. return name;
  47. if (name.indexOf('border-') === 0 && /^border\-\w+\-\w+$/.test(name))
  48. return name.match(/border\-\w+/)[0];
  49. if (name.indexOf('border-') === 0 && /^border\-\w+$/.test(name))
  50. return 'border';
  51. if (name.indexOf('text-') === 0)
  52. return name;
  53. return name.replace(/^\-\w+\-/, '').match(/([a-zA-Z]+)/)[0].toLowerCase();
  54. }
  55. module.exports = extract;