3 Copyright 2012 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.
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 query,
27 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 `charMatch()`.
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 `phraseMatch()`.
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 phrase.
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 `startsWith()`.
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 either
148 whole words or parts of words in the result. Non-word characters like
149 whitespace and certain punctuation are ignored. Case-insensitive.
151 This is basically a combination of `wordMatch()` (by ignoring whitespace and
152 word order) and `phraseMatch()` (by allowing partial matching instead of
153 requiring the entire word to match).
155 Example use case: Trying to find personal names independently of name order
156 (Western or Eastern order) and supporting immediate feedback by allowing
157 partial occurences. So queries like "J. Doe", "Doe, John", and "J. D." would
158 all match "John Doe".
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 `subWordMatch()`.
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, in
201 any order. Non-word characters like whitespace and certain punctuation are
202 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 `wordMatch()`.
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.5.1' ,{requires:['array-extras', 'text-wordbreak']});