Skip to content

Commit 0309cc8

Browse files
authored
improve specificity calculation (#129)
1 parent cb23b6f commit 0309cc8

File tree

4 files changed

+74
-8
lines changed

4 files changed

+74
-8
lines changed

experimental/css-has-pseudo/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changes to CSS Has Pseudo
22

3+
### Unreleased
4+
5+
- Improved : selector specificity calculation
6+
37
### 0.1.1 (January 5, 2022)
48

59
- Added : support for id and tag selector specificity.

experimental/css-has-pseudo/src/index.js

+33-4
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,39 @@ function selectorSpecificity(node) {
131131
case ':has':
132132
case ':not':
133133
{
134-
const pseudoSpecificity = selectorSpecificity(node.nodes[0]);
135-
a += pseudoSpecificity.a;
136-
b += pseudoSpecificity.b;
137-
c += pseudoSpecificity.c;
134+
if (node.nodes && node.nodes.length > 0) {
135+
let mostSpecificListItem = {
136+
a: 0,
137+
b: 0,
138+
c: 0,
139+
};
140+
141+
node.nodes.forEach((child) => {
142+
const itemSpecificity = selectorSpecificity(child);
143+
if (itemSpecificity.a > mostSpecificListItem.a) {
144+
mostSpecificListItem = itemSpecificity;
145+
return;
146+
} else if (itemSpecificity.a < mostSpecificListItem.a) {
147+
return;
148+
}
149+
150+
if (itemSpecificity.b > mostSpecificListItem.b) {
151+
mostSpecificListItem = itemSpecificity;
152+
return;
153+
} else if (itemSpecificity.b < mostSpecificListItem.b) {
154+
return;
155+
}
156+
157+
if (itemSpecificity.c > mostSpecificListItem.c) {
158+
mostSpecificListItem = itemSpecificity;
159+
return;
160+
}
161+
});
162+
163+
a += mostSpecificListItem.a;
164+
b += mostSpecificListItem.b;
165+
c += mostSpecificListItem.c;
166+
}
138167
break;
139168
}
140169

plugins/postcss-nesting/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changes to PostCSS Nesting
22

3+
### Unreleased
4+
5+
- Improved : selector specificity calculation
6+
37
### 10.1.1 (January 2, 2022)
48

59
- Removed Sourcemaps from package tarball.

plugins/postcss-nesting/src/lib/merge-selectors/specificity.js

+33-4
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,39 @@ export function selectorSpecificity(node) {
6666
case ':has':
6767
case ':not':
6868
{
69-
const pseudoSpecificity = selectorSpecificity(node.nodes[0]);
70-
a += pseudoSpecificity.a;
71-
b += pseudoSpecificity.b;
72-
c += pseudoSpecificity.c;
69+
if (node.nodes && node.nodes.length > 0) {
70+
let mostSpecificListItem = {
71+
a: 0,
72+
b: 0,
73+
c: 0,
74+
};
75+
76+
node.nodes.forEach((child) => {
77+
const itemSpecificity = selectorSpecificity(child);
78+
if (itemSpecificity.a > mostSpecificListItem.a) {
79+
mostSpecificListItem = itemSpecificity;
80+
return;
81+
} else if (itemSpecificity.a < mostSpecificListItem.a) {
82+
return;
83+
}
84+
85+
if (itemSpecificity.b > mostSpecificListItem.b) {
86+
mostSpecificListItem = itemSpecificity;
87+
return;
88+
} else if (itemSpecificity.b < mostSpecificListItem.b) {
89+
return;
90+
}
91+
92+
if (itemSpecificity.c > mostSpecificListItem.c) {
93+
mostSpecificListItem = itemSpecificity;
94+
return;
95+
}
96+
});
97+
98+
a += mostSpecificListItem.a;
99+
b += mostSpecificListItem.b;
100+
c += mostSpecificListItem.c;
101+
}
73102
break;
74103
}
75104

0 commit comments

Comments
 (0)