@@ -46,7 +46,6 @@ var zest = (function () {
4646 // parse/split selector into chunks
4747 // chunks contains any custom pseudo-selectors at the end of the chunk
4848 function parseSelector ( selector ) {
49-
5049 // Replace string-based pseudo-selectors in the selector
5150 Object . entries ( pseudoSelectors ) . forEach ( ( [ name , mixed ] ) => {
5251 if ( typeof mixed === 'string' ) {
@@ -60,45 +59,48 @@ var zest = (function () {
6059 // Rejoin parts such that parts end with custom pseudo-selectors
6160 const rejoinedParts = [ ] ;
6261 for ( let i = 0 ; i < parts . length ; i ++ ) {
63- if ( i > 0 && / ^ [ > + ~ ] $ / . test ( parts [ i ] ) ) {
64- const combined = parts [ i ] + ' ' + parts [ i + 1 ] ;
65- containsCustomPseudoSelectors ( rejoinedParts [ rejoinedParts . length - 1 ] ) === false
66- ? rejoinedParts [ rejoinedParts . length - 1 ] += ' ' + combined
67- : rejoinedParts . push ( combined ) ;
68- i ++ ; // Skip the next part as it has been joined
69- } else {
62+ if ( i < 1 || / ^ [ > + ~ ] $ / . test ( parts [ i ] ) === false ) {
7063 rejoinedParts . push ( parts [ i ] ) ;
64+ continue
7165 }
72- }
73-
74- return rejoinedParts . map ( part => {
75- const parts = part . split ( REGEX_PSEUDO_SELECTORS ) ;
76- const customPseudoSelectors = Object . keys ( pseudoSelectors ) ;
77- var baseSelector = parts . shift ( ) ;
78- var pseudosCustom = [ ] ;
79- var pseudosStandard = [ ] ;
80- for ( const part of parts ) {
81- customPseudoSelectors . includes ( part )
82- ? pseudosCustom . push ( part )
83- : pseudosStandard . push ( part ) ;
84- }
85- if ( pseudosStandard . length > 0 ) {
86- // Add standard pseudo-selectors to the baseSelector
87- baseSelector += pseudosStandard . map ( p => `:${ p } ` ) . join ( '' ) ;
88- } else if ( baseSelector && / [ > + ~ ] \s * $ / . test ( baseSelector ) ) {
89- // baseSelector ends with a CSS combinator -> append "*"
90- baseSelector += ' *' ;
91- } else if ( baseSelector && / ^ \s * [ > + ~ ] / . test ( baseSelector ) ) {
92- // baseSelector starts with a CSS combinator -> prepend ":scope"
93- baseSelector = ':scope ' + baseSelector ;
94- } else if ( baseSelector === '' ) {
95- baseSelector = '*' ;
96- }
97- return {
98- baseSelector : baseSelector . trim ( ) ,
99- pseudoParts : pseudosCustom ,
66+ const combined = parts [ i ] + ' ' + parts [ i + 1 ] ;
67+ containsCustomPseudoSelectors ( rejoinedParts [ rejoinedParts . length - 1 ] ) === false
68+ ? rejoinedParts [ rejoinedParts . length - 1 ] += ' ' + combined
69+ : rejoinedParts . push ( combined ) ;
70+ i ++ ; // Skip the next part as it has been joined
71+ }
72+
73+ return rejoinedParts . map ( partMap )
74+ }
75+
76+ // For a given part, separate base selector and custom pseudo-selectors
77+ function partMap ( part ) {
78+ const parts = part . split ( REGEX_PSEUDO_SELECTORS ) ;
79+ const customPseudoSelectors = Object . keys ( pseudoSelectors ) ;
80+ var baseSelector = parts . shift ( ) ;
81+ var pseudosCustom = [ ] ;
82+ var pseudosStandard = [ ] ;
83+ for ( const part of parts ) {
84+ customPseudoSelectors . includes ( part )
85+ ? pseudosCustom . push ( part )
86+ : pseudosStandard . push ( part ) ;
10087 }
101- } )
88+ if ( pseudosStandard . length > 0 ) {
89+ // Add standard pseudo-selectors to the baseSelector
90+ baseSelector += pseudosStandard . map ( p => `:${ p } ` ) . join ( '' ) ;
91+ } else if ( baseSelector && / [ > + ~ ] \s * $ / . test ( baseSelector ) ) {
92+ // baseSelector ends with a CSS combinator -> append "*"
93+ baseSelector += ' *' ;
94+ } else if ( baseSelector && / ^ \s * [ > + ~ ] / . test ( baseSelector ) ) {
95+ // baseSelector starts with a CSS combinator -> prepend ":scope"
96+ baseSelector = ':scope ' + baseSelector ;
97+ } else if ( baseSelector === '' ) {
98+ baseSelector = '*' ;
99+ }
100+ return {
101+ baseSelector : baseSelector . trim ( ) ,
102+ pseudoParts : pseudosCustom ,
103+ }
102104 }
103105
104106 // for the given element, perform a query or match
0 commit comments