diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2023-10-14 15:05:55 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2023-10-14 15:05:55 +0800 |
| commit | c06f7ee0a40255214c477e13d9b956a7e07c2900 (patch) | |
| tree | f5982a568ef8fab865d0142e71c7494fea3e4c1b /node_modules/csso/lib/restructure/prepare/processSelector.js | |
| parent | 3fd9400d4dccc25aa29b5702216732e0b7542073 (diff) | |
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/csso/lib/restructure/prepare/processSelector.js')
| -rw-r--r-- | node_modules/csso/lib/restructure/prepare/processSelector.js | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/node_modules/csso/lib/restructure/prepare/processSelector.js b/node_modules/csso/lib/restructure/prepare/processSelector.js new file mode 100644 index 00000000..55a4fed8 --- /dev/null +++ b/node_modules/csso/lib/restructure/prepare/processSelector.js @@ -0,0 +1,97 @@ +import { generate } from 'css-tree'; +import specificity from './specificity.js'; + +const nonFreezePseudoElements = new Set([ + 'first-letter', + 'first-line', + 'after', + 'before' +]); +const nonFreezePseudoClasses = new Set([ + 'link', + 'visited', + 'hover', + 'active', + 'first-letter', + 'first-line', + 'after', + 'before' +]); + +export default function processSelector(node, usageData) { + const pseudos = new Set(); + + node.prelude.children.forEach(function(simpleSelector) { + let tagName = '*'; + let scope = 0; + + simpleSelector.children.forEach(function(node) { + switch (node.type) { + case 'ClassSelector': + if (usageData && usageData.scopes) { + const classScope = usageData.scopes[node.name] || 0; + + if (scope !== 0 && classScope !== scope) { + throw new Error('Selector can\'t has classes from different scopes: ' + generate(simpleSelector)); + } + + scope = classScope; + } + + break; + + case 'PseudoClassSelector': { + const name = node.name.toLowerCase(); + + if (!nonFreezePseudoClasses.has(name)) { + pseudos.add(`:${name}`); + } + + break; + } + + case 'PseudoElementSelector': { + const name = node.name.toLowerCase(); + + if (!nonFreezePseudoElements.has(name)) { + pseudos.add(`::${name}`); + } + + break; + } + + case 'TypeSelector': + tagName = node.name.toLowerCase(); + break; + + case 'AttributeSelector': + if (node.flags) { + pseudos.add(`[${node.flags.toLowerCase()}]`); + } + + break; + + case 'Combinator': + tagName = '*'; + break; + } + }); + + simpleSelector.compareMarker = specificity(simpleSelector).toString(); + simpleSelector.id = null; // pre-init property to avoid multiple hidden class + simpleSelector.id = generate(simpleSelector); + + if (scope) { + simpleSelector.compareMarker += ':' + scope; + } + + if (tagName !== '*') { + simpleSelector.compareMarker += ',' + tagName; + } + }); + + // add property to all rule nodes to avoid multiple hidden class + node.pseudoSignature = pseudos.size > 0 + ? [...pseudos].sort().join(',') + : false; +}; |
