| 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]; | 
| }; |