UNPKG

scancss

Version:

A robust CSS stylesheet statistics collector and analyzer

56 lines (42 loc) 1.3 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.calculateSpecificity = calculateSpecificity; var _cssPseudoClasses = require('../../constants/cssPseudoClasses'); var _cssPseudoElements = require('../../constants/cssPseudoElements'); var _reLeadingColons = require('../../constants/reLeadingColons'); /** * https://www.w3.org/TR/selectors-3/#specificity */ function calculateSpecificity(selector) { if (selector.type === 'id') { return [1, 0, 0]; } if (selector.type === 'class' || selector.type === 'attribute') { return [0, 1, 0]; } if (selector.type === 'tag') { return [0, 0, 1]; } if (selector.type === 'pseudo') { const pseudoName = selector.value.replace(_reLeadingColons.reLeadingColons, ''); if (_cssPseudoClasses.cssPseudoClasses.includes(pseudoName)) { /** * TODO: change calculation of `has`, `matches`, `not`, `nth-child`, `nth-last-child` * according to future spec https://drafts.csswg.org/selectors-4/#specificity-rules */ if (['something', 'not'].includes(pseudoName)) { return [0, 0, 0]; } return [0, 1, 0]; } if (_cssPseudoElements.cssPseudoElements.includes(pseudoName)) { return [0, 0, 1]; } } if (selector.type === 'universal') { return [0, 0, 0]; } return [0, 0, 0]; }