-var select = function( selector, context, results, seed, xml ) {\r
- // Remove excessive whitespace\r
- selector = selector.replace( rtrim, "$1" );\r
- var elements, matcher, i, len, elem, token,\r
- type, findContext, notTokens,\r
- match = selector.match( rgroups ),\r
- tokens = selector.match( rtokens ),\r
- contextNodeType = context.nodeType;\r
-\r
- // POS handling\r
- if ( matchExpr["POS"].test(selector) ) {\r
- return handlePOS( selector, context, results, seed, match );\r
+function matcherFromTokens( tokens ) {\r
+ var checkContext, matcher, j,\r
+ len = tokens.length,\r
+ leadingRelative = Expr.relative[ tokens[0].type ],\r
+ implicitRelative = leadingRelative || Expr.relative[" "],\r
+ i = leadingRelative ? 1 : 0,\r
+\r
+ // The foundational matcher ensures that elements are reachable from top-level context(s)\r
+ matchContext = addCombinator( function( elem ) {\r
+ return elem === checkContext;\r
+ }, implicitRelative, true ),\r
+ matchAnyContext = addCombinator( function( elem ) {\r
+ return indexOf.call( checkContext, elem ) > -1;\r
+ }, implicitRelative, true ),\r
+ matchers = [ function( elem, context, xml ) {\r
+ return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\r
+ (checkContext = context).nodeType ?\r
+ matchContext( elem, context, xml ) :\r
+ matchAnyContext( elem, context, xml ) );\r
+ } ];\r
+\r
+ for ( ; i < len; i++ ) {\r
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {\r
+ matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\r
+ } else {\r
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\r
+\r
+ // Return special upon seeing a positional matcher\r
+ if ( matcher[ expando ] ) {\r
+ // Find the next relative operator (if any) for proper handling\r
+ j = ++i;\r
+ for ( ; j < len; j++ ) {\r
+ if ( Expr.relative[ tokens[j].type ] ) {\r
+ break;\r
+ }\r
+ }\r
+ return setMatcher(\r
+ i > 1 && elementMatcher( matchers ),\r
+ i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),\r
+ matcher,\r
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),\r
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\r
+ j < len && tokens.join("")\r
+ );\r
+ }\r
+ matchers.push( matcher );\r
+ }\r