3
Copyright 2011 Yahoo! Inc. All rights reserved.
4
Licensed under the BSD License.
5
http://yuilibrary.com/license/
7
YUI.add('autocomplete-filters', function(Y) {
10
* Provides pre-built result matching filters for AutoComplete.
12
* @module autocomplete
13
* @submodule autocomplete-filters
14
* @class AutoCompleteFilters
20
WordBreak = Y.Text.WordBreak,
22
Filters = Y.mix(Y.namespace('AutoCompleteFilters'), {
23
// -- Public Methods -------------------------------------------------------
26
* Returns an array of results that contain all of the characters in the
27
* query, in any order (not necessarily consecutive). Case-insensitive.
30
* @param {String} query Query to match
31
* @param {Array} results Results to filter
32
* @return {Array} Filtered results
35
charMatch: function (query, results, caseSensitive) {
36
// The caseSensitive parameter is only intended for use by
37
// charMatchCase(). It's intentionally undocumented.
39
if (!query) { return results; }
41
var queryChars = YArray.unique((caseSensitive ? query :
42
query.toLowerCase()).split(''));
44
return YArray.filter(results, function (result) {
48
result = result.toLowerCase();
51
return YArray.every(queryChars, function (chr) {
52
return result.indexOf(chr) !== -1;
58
* Case-sensitive version of <code>charMatch()</code>.
60
* @method charMatchCase
61
* @param {String} query Query to match
62
* @param {Array} results Results to filter
63
* @return {Array} Filtered results
66
charMatchCase: function (query, results) {
67
return Filters.charMatch(query, results, true);
71
* Returns an array of results that contain the complete query as a phrase.
75
* @param {String} query Query to match
76
* @param {Array} results Results to filter
77
* @return {Array} Filtered results
80
phraseMatch: function (query, results, caseSensitive) {
81
// The caseSensitive parameter is only intended for use by
82
// phraseMatchCase(). It's intentionally undocumented.
84
if (!query) { return results; }
87
query = query.toLowerCase();
90
return YArray.filter(results, function (result) {
91
return (caseSensitive ? result.text : result.text.toLowerCase()).indexOf(query) !== -1;
96
* Case-sensitive version of <code>phraseMatch()</code>.
98
* @method phraseMatchCase
99
* @param {String} query Query to match
100
* @param {Array} results Results to filter
101
* @return {Array} Filtered results
104
phraseMatchCase: function (query, results) {
105
return Filters.phraseMatch(query, results, true);
109
* Returns an array of results that start with the complete query as a
110
* phrase. Case-insensitive.
113
* @param {String} query Query to match
114
* @param {Array} results Results to filter
115
* @return {Array} Filtered results
118
startsWith: function (query, results, caseSensitive) {
119
// The caseSensitive parameter is only intended for use by
120
// startsWithCase(). It's intentionally undocumented.
122
if (!query) { return results; }
124
if (!caseSensitive) {
125
query = query.toLowerCase();
128
return YArray.filter(results, function (result) {
129
return (caseSensitive ? result.text : result.text.toLowerCase()).indexOf(query) === 0;
134
* Case-sensitive version of <code>startsWith()</code>.
136
* @method startsWithCase
137
* @param {String} query Query to match
138
* @param {Array} results Results to filter
139
* @return {Array} Filtered results
142
startsWithCase: function (query, results) {
143
return Filters.startsWith(query, results, true);
147
* Returns an array of results in which all the words of the query match
148
* either whole words or parts of words in the result. Non-word characters
149
* like whitespace and certain punctuation are ignored. Case-insensitive.
151
* This is basically a combination of <code>wordMatch()</code> (by ignoring
152
* whitespace and word order) and <code>phraseMatch()</code> (by allowing
153
* partial matching instead of requiring the entire word to match).
155
* Example use case: Trying to find personal names independently of name
156
* order (Western or Eastern order) and supporting immediate feedback by
157
* allowing partial occurences. So queries like "J. Doe", "Doe, John", and
158
* "J. D." would all match "John Doe".
160
* @method subWordMatch
161
* @param {String} query Query to match
162
* @param {Array} results Results to filter
163
* @return {Array} Filtered results
166
subWordMatch: function (query, results, caseSensitive) {
167
// The caseSensitive parameter is only intended for use by
168
// subWordMatchCase(). It's intentionally undocumented.
170
if (!query) { return results; }
172
var queryWords = WordBreak.getUniqueWords(query, {
173
ignoreCase: !caseSensitive
176
return YArray.filter(results, function (result) {
177
var resultText = caseSensitive ? result.text :
178
result.text.toLowerCase();
180
return YArray.every(queryWords, function (queryWord) {
181
return resultText.indexOf(queryWord) !== -1;
187
* Case-sensitive version of <code>subWordMatch()</code>.
189
* @method subWordMatchCase
190
* @param {String} query Query to match
191
* @param {Array} results Results to filter
192
* @return {Array} Filtered results
195
subWordMatchCase: function (query, results) {
196
return Filters.subWordMatch(query, results, true);
200
* Returns an array of results that contain all of the words in the query,
201
* in any order. Non-word characters like whitespace and certain punctuation
202
* are ignored. Case-insensitive.
205
* @param {String} query Query to match
206
* @param {Array} results Results to filter
207
* @return {Array} Filtered results
210
wordMatch: function (query, results, caseSensitive) {
211
// The caseSensitive parameter is only intended for use by
212
// wordMatchCase(). It's intentionally undocumented.
214
if (!query) { return results; }
216
var options = {ignoreCase: !caseSensitive},
217
queryWords = WordBreak.getUniqueWords(query, options);
219
return YArray.filter(results, function (result) {
220
// Convert resultWords array to a hash for fast lookup.
221
var resultWords = YArray.hash(WordBreak.getUniqueWords(result.text,
224
return YArray.every(queryWords, function (word) {
225
return YObject.owns(resultWords, word);
231
* Case-sensitive version of <code>wordMatch()</code>.
233
* @method wordMatchCase
234
* @param {String} query Query to match
235
* @param {Array} results Results to filter
236
* @return {Array} Filtered results
239
wordMatchCase: function (query, results) {
240
return Filters.wordMatch(query, results, true);
245
}, '3.4.1' ,{requires:['array-extras', 'text-wordbreak']});