specificity.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. module.exports = function specificity(simpleSelector) {
  2. var A = 0;
  3. var B = 0;
  4. var C = 0;
  5. simpleSelector.sequence.each(function walk(data) {
  6. switch (data.type) {
  7. case 'SimpleSelector':
  8. case 'Negation':
  9. data.sequence.each(walk);
  10. break;
  11. case 'Id':
  12. A++;
  13. break;
  14. case 'Class':
  15. case 'Attribute':
  16. case 'FunctionalPseudo':
  17. B++;
  18. break;
  19. case 'Identifier':
  20. if (data.name !== '*') {
  21. C++;
  22. }
  23. break;
  24. case 'PseudoElement':
  25. C++;
  26. break;
  27. case 'PseudoClass':
  28. var name = data.name.toLowerCase();
  29. if (name === 'before' ||
  30. name === 'after' ||
  31. name === 'first-line' ||
  32. name === 'first-letter') {
  33. C++;
  34. } else {
  35. B++;
  36. }
  37. break;
  38. }
  39. });
  40. return [A, B, C];
  41. };