Project

General

Profile

1
define( [
2
	"./core",
3
	"./var/document",
4
	"./var/documentElement",
5
	"./var/hasOwn",
6
	"./var/indexOf"
7
], function( jQuery, document, documentElement, hasOwn, indexOf ) {
8

    
9
"use strict";
10

    
11
/*
12
 * Optional (non-Sizzle) selector module for custom builds.
13
 *
14
 * Note that this DOES NOT SUPPORT many documented jQuery
15
 * features in exchange for its smaller size:
16
 *
17
 * Attribute not equal selector
18
 * Positional selectors (:first; :eq(n); :odd; etc.)
19
 * Type selectors (:input; :checkbox; :button; etc.)
20
 * State-based selectors (:animated; :visible; :hidden; etc.)
21
 * :has(selector)
22
 * :not(complex selector)
23
 * custom selectors via Sizzle extensions
24
 * Leading combinators (e.g., $collection.find("> *"))
25
 * Reliable functionality on XML fragments
26
 * Requiring all parts of a selector to match elements under context
27
 *   (e.g., $div.find("div > *") now matches children of $div)
28
 * Matching against non-elements
29
 * Reliable sorting of disconnected nodes
30
 * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit)
31
 *
32
 * If any of these are unacceptable tradeoffs, either use Sizzle or
33
 * customize this stub for the project's specific needs.
34
 */
35

    
36
var hasDuplicate, sortInput,
37
	sortStable = jQuery.expando.split( "" ).sort( sortOrder ).join( "" ) === jQuery.expando,
38
	matches = documentElement.matches ||
39
		documentElement.webkitMatchesSelector ||
40
		documentElement.mozMatchesSelector ||
41
		documentElement.oMatchesSelector ||
42
		documentElement.msMatchesSelector,
43

    
44
	// CSS string/identifier serialization
45
	// https://drafts.csswg.org/cssom/#common-serializing-idioms
46
	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,
47
	fcssescape = function( ch, asCodePoint ) {
48
		if ( asCodePoint ) {
49

    
50
			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
51
			if ( ch === "\0" ) {
52
				return "\uFFFD";
53
			}
54

    
55
			// Control characters and (dependent upon position) numbers get escaped as code points
56
			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
57
		}
58

    
59
		// Other potentially-special ASCII characters get backslash-escaped
60
		return "\\" + ch;
61
	};
62

    
63
function sortOrder( a, b ) {
64

    
65
	// Flag for duplicate removal
66
	if ( a === b ) {
67
		hasDuplicate = true;
68
		return 0;
69
	}
70

    
71
	// Sort on method existence if only one input has compareDocumentPosition
72
	var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
73
	if ( compare ) {
74
		return compare;
75
	}
76

    
77
	// Calculate position if both inputs belong to the same document
78
	compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
79
		a.compareDocumentPosition( b ) :
80

    
81
		// Otherwise we know they are disconnected
82
		1;
83

    
84
	// Disconnected nodes
85
	if ( compare & 1 ) {
86

    
87
		// Choose the first element that is related to our preferred document
88
		if ( a === document || a.ownerDocument === document &&
89
			jQuery.contains( document, a ) ) {
90
			return -1;
91
		}
92
		if ( b === document || b.ownerDocument === document &&
93
			jQuery.contains( document, b ) ) {
94
			return 1;
95
		}
96

    
97
		// Maintain original order
98
		return sortInput ?
99
			( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
100
			0;
101
	}
102

    
103
	return compare & 4 ? -1 : 1;
104
}
105

    
106
function uniqueSort( results ) {
107
	var elem,
108
		duplicates = [],
109
		j = 0,
110
		i = 0;
111

    
112
	hasDuplicate = false;
113
	sortInput = !sortStable && results.slice( 0 );
114
	results.sort( sortOrder );
115

    
116
	if ( hasDuplicate ) {
117
		while ( ( elem = results[ i++ ] ) ) {
118
			if ( elem === results[ i ] ) {
119
				j = duplicates.push( i );
120
			}
121
		}
122
		while ( j-- ) {
123
			results.splice( duplicates[ j ], 1 );
124
		}
125
	}
126

    
127
	// Clear input after sorting to release objects
128
	// See https://github.com/jquery/sizzle/pull/225
129
	sortInput = null;
130

    
131
	return results;
132
}
133

    
134
function escape( sel ) {
135
	return ( sel + "" ).replace( rcssescape, fcssescape );
136
}
137

    
138
jQuery.extend( {
139
	uniqueSort: uniqueSort,
140
	unique: uniqueSort,
141
	escapeSelector: escape,
142
	find: function( selector, context, results, seed ) {
143
		var elem, nodeType,
144
			i = 0;
145

    
146
		results = results || [];
147
		context = context || document;
148

    
149
		// Same basic safeguard as Sizzle
150
		if ( !selector || typeof selector !== "string" ) {
151
			return results;
152
		}
153

    
154
		// Early return if context is not an element or document
155
		if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 ) {
156
			return [];
157
		}
158

    
159
		if ( seed ) {
160
			while ( ( elem = seed[ i++ ] ) ) {
161
				if ( jQuery.find.matchesSelector( elem, selector ) ) {
162
					results.push( elem );
163
				}
164
			}
165
		} else {
166
			jQuery.merge( results, context.querySelectorAll( selector ) );
167
		}
168

    
169
		return results;
170
	},
171
	text: function( elem ) {
172
		var node,
173
			ret = "",
174
			i = 0,
175
			nodeType = elem.nodeType;
176

    
177
		if ( !nodeType ) {
178

    
179
			// If no nodeType, this is expected to be an array
180
			while ( ( node = elem[ i++ ] ) ) {
181

    
182
				// Do not traverse comment nodes
183
				ret += jQuery.text( node );
184
			}
185
		} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
186

    
187
			// Use textContent for elements
188
			return elem.textContent;
189
		} else if ( nodeType === 3 || nodeType === 4 ) {
190
			return elem.nodeValue;
191
		}
192

    
193
		// Do not include comment or processing instruction nodes
194

    
195
		return ret;
196
	},
197
	contains: function( a, b ) {
198
		var adown = a.nodeType === 9 ? a.documentElement : a,
199
			bup = b && b.parentNode;
200
		return a === bup || !!( bup && bup.nodeType === 1 && adown.contains( bup ) );
201
	},
202
	isXMLDoc: function( elem ) {
203

    
204
		// documentElement is verified for cases where it doesn't yet exist
205
		// (such as loading iframes in IE - #4833)
206
		var documentElement = elem && ( elem.ownerDocument || elem ).documentElement;
207
		return documentElement ? documentElement.nodeName !== "HTML" : false;
208
	},
209
	expr: {
210
		attrHandle: {},
211
		match: {
212
			bool: new RegExp( "^(?:checked|selected|async|autofocus|autoplay|controls|defer" +
213
				"|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$", "i" ),
214
			needsContext: /^[\x20\t\r\n\f]*[>+~]/
215
		}
216
	}
217
} );
218

    
219
jQuery.extend( jQuery.find, {
220
	matches: function( expr, elements ) {
221
		return jQuery.find( expr, null, null, elements );
222
	},
223
	matchesSelector: function( elem, expr ) {
224
		return matches.call( elem, expr );
225
	},
226
	attr: function( elem, name ) {
227
		var fn = jQuery.expr.attrHandle[ name.toLowerCase() ],
228

    
229
			// Don't get fooled by Object.prototype properties (jQuery #13807)
230
			value = fn && hasOwn.call( jQuery.expr.attrHandle, name.toLowerCase() ) ?
231
				fn( elem, name, jQuery.isXMLDoc( elem ) ) :
232
				undefined;
233
		return value !== undefined ? value : elem.getAttribute( name );
234
	}
235
} );
236

    
237
} );
(17-17/22)