@@ -4,6 +4,7 @@ import { sortCompoundSelectorsInsideComplexSelector } from './compound-selector-
4
4
const linkAST = parser ( ) . astSync ( ':link' ) . nodes [ 0 ] ;
5
5
const visitedAST = parser ( ) . astSync ( ':visited' ) . nodes [ 0 ] ;
6
6
const areaHrefAST = parser ( ) . astSync ( 'area[href]' ) . nodes [ 0 ] ;
7
+ const hrefAST = parser ( ) . astSync ( '[href]' ) . nodes [ 0 ] ;
7
8
8
9
export function replaceAnyLink ( rule , result , preserve , areaHrefNeedsFixing ) {
9
10
let updatedSelectors = [ ] ;
@@ -53,26 +54,33 @@ function modifiedSelector(selector, areaHrefNeedsFixing) {
53
54
54
55
// update the selector
55
56
parser ( ( selectorsAST ) => {
56
- let anyLinkCount = 0 ;
57
+ let replacements = [ ] ;
57
58
selectorsAST . walkPseudos ( ( pseudo ) => {
58
59
if ( pseudo . value !== ':any-link' || ( pseudo . nodes && pseudo . nodes . length ) ) {
59
60
return ;
60
61
}
61
62
62
- anyLinkCount ++ ;
63
- } ) ;
63
+ if ( ! areaHrefNeedsFixing ) {
64
+ replacements . push ( [ linkAST . clone ( ) , visitedAST . clone ( ) ] ) ;
65
+ return ;
66
+ }
64
67
65
- if ( ! anyLinkCount ) {
66
- return ;
67
- }
68
+ const tags = getTagElementsNextToPseudo ( pseudo ) ;
69
+ if ( tags . includes ( 'area' ) ) {
70
+ replacements . push ( [ linkAST . clone ( ) , visitedAST . clone ( ) , hrefAST . clone ( ) ] ) ;
71
+ return ;
72
+ }
68
73
69
- let replacements = [ ] ;
70
- for ( let i = 0 ; i < anyLinkCount ; i ++ ) {
71
- if ( areaHrefNeedsFixing ) {
72
- replacements . push ( [ linkAST . clone ( ) , visitedAST . clone ( ) , areaHrefAST . clone ( ) ] ) ;
73
- } else {
74
+ if ( tags . length ) {
74
75
replacements . push ( [ linkAST . clone ( ) , visitedAST . clone ( ) ] ) ;
76
+ return ;
75
77
}
78
+
79
+ replacements . push ( [ linkAST . clone ( ) , visitedAST . clone ( ) , areaHrefAST . clone ( ) ] ) ;
80
+ } ) ;
81
+
82
+ if ( ! replacements . length ) {
83
+ return ;
76
84
}
77
85
78
86
let replacementsCartesianProduct = cartesianProduct ( ...replacements ) ;
@@ -121,3 +129,35 @@ function cartesianProduct(...args) {
121
129
helper ( [ ] , 0 ) ;
122
130
return r ;
123
131
}
132
+
133
+ function getTagElementsNextToPseudo ( pseudo ) {
134
+ let tags = [ ] ;
135
+
136
+ let prev = pseudo . prev ( ) ;
137
+ while ( prev ) {
138
+ if ( prev . type === 'combinator' ) {
139
+ break ;
140
+ }
141
+
142
+ if ( prev . type === 'tag' ) {
143
+ tags . push ( prev . value ) ;
144
+ }
145
+
146
+ prev = prev . prev ( ) ;
147
+ }
148
+
149
+ let next = pseudo . next ( ) ;
150
+ while ( next ) {
151
+ if ( next . type === 'combinator' ) {
152
+ break ;
153
+ }
154
+
155
+ if ( next . type === 'tag' ) {
156
+ tags . push ( next . value ) ;
157
+ }
158
+
159
+ next = next . next ( ) ;
160
+ }
161
+
162
+ return tags ;
163
+ }
0 commit comments