| module.exports = function specificity(simpleSelector) { |
| var A = 0; |
| var B = 0; |
| var C = 0; |
| |
| simpleSelector.children.each(function walk(node) { |
| switch (node.type) { |
| case 'SelectorList': |
| case 'Selector': |
| node.children.each(walk); |
| break; |
| |
| case 'IdSelector': |
| A++; |
| break; |
| |
| case 'ClassSelector': |
| case 'AttributeSelector': |
| B++; |
| break; |
| |
| case 'PseudoClassSelector': |
| switch (node.name.toLowerCase()) { |
| case 'not': |
| node.children.each(walk); |
| break; |
| |
| case 'before': |
| case 'after': |
| case 'first-line': |
| case 'first-letter': |
| C++; |
| break; |
| |
| // TODO: support for :nth-*(.. of <SelectorList>), :matches(), :has() |
| |
| default: |
| B++; |
| } |
| break; |
| |
| case 'PseudoElementSelector': |
| C++; |
| break; |
| |
| case 'TypeSelector': |
| // ignore universal selector |
| if (node.name.charAt(node.name.length - 1) !== '*') { |
| C++; |
| } |
| break; |
| |
| } |
| }); |
| |
| return [A, B, C]; |
| }; |