aboutsummaryrefslogtreecommitdiffstats
path: root/src/selector/preFilter.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/selector/preFilter.js')
-rw-r--r--src/selector/preFilter.js90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/selector/preFilter.js b/src/selector/preFilter.js
new file mode 100644
index 000000000..4a2fb489a
--- /dev/null
+++ b/src/selector/preFilter.js
@@ -0,0 +1,90 @@
+import rpseudo from "./var/rpseudo.js";
+import filterMatchExpr from "./filterMatchExpr.js";
+import unescapeSelector from "./unescapeSelector.js";
+import selectorError from "./selectorError.js";
+import tokenize from "./tokenize.js";
+
+var preFilter = {
+ ATTR: function( match ) {
+ match[ 1 ] = unescapeSelector( match[ 1 ] );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[ 3 ] = unescapeSelector( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" );
+
+ if ( match[ 2 ] === "~=" ) {
+ match[ 3 ] = " " + match[ 3 ] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ CHILD: function( match ) {
+
+ /* matches from filterMatchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[ 1 ] = match[ 1 ].toLowerCase();
+
+ if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
+
+ // nth-* requires argument
+ if ( !match[ 3 ] ) {
+ selectorError( match[ 0 ] );
+ }
+
+ // numeric x and y parameters for jQuery.expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[ 4 ] = +( match[ 4 ] ?
+ match[ 5 ] + ( match[ 6 ] || 1 ) :
+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" )
+ );
+ match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[ 3 ] ) {
+ selectorError( match[ 0 ] );
+ }
+
+ return match;
+ },
+
+ PSEUDO: function( match ) {
+ var excess,
+ unquoted = !match[ 6 ] && match[ 2 ];
+
+ if ( filterMatchExpr.CHILD.test( match[ 0 ] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[ 3 ] ) {
+ match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+
+ // Get excess from tokenize (recursively)
+ ( excess = tokenize( unquoted, true ) ) &&
+
+ // advance to the next closing parenthesis
+ ( excess = unquoted.indexOf( ")", unquoted.length - excess ) -
+ unquoted.length ) ) {
+
+ // excess is a negative index
+ match[ 0 ] = match[ 0 ].slice( 0, excess );
+ match[ 2 ] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+};
+
+export default preFilter;