2 Copyright (c) 2010, Yahoo! Inc. All rights reserved.
3 Code licensed under the BSD License:
4 http://developer.yahoo.com/yui/license.html
8 YUI.add('autocomplete-filters', function(Y) {
11 * Provides pre-built result matching filters for AutoComplete.
13 * @module autocomplete
14 * @submodule autocomplete-filters
15 * @class AutoCompleteFilters
21 WordBreak = Y.Text.WordBreak,
23 Filters = Y.mix(Y.namespace('AutoCompleteFilters'), {
24 // -- Public Methods -------------------------------------------------------
27 * Returns an array of results that contain all of the characters in the
28 * query, in any order (not necessarily consecutive). Case-insensitive.
31 * @param {String} query Query to match
32 * @param {Array} results Results to filter
33 * @return {Array} Filtered results
36 charMatch: function (query, results, caseSensitive) {
37 // The caseSensitive parameter is only intended for use by
38 // charMatchCase(). It's intentionally undocumented.
40 var queryChars = YArray.unique((caseSensitive ? query :
41 query.toLowerCase()).split(''));
43 return YArray.filter(results, function (result) {
47 result = result.toLowerCase();
50 return YArray.every(queryChars, function (chr) {
51 return result.indexOf(chr) !== -1;
57 * Case-sensitive version of <code>charMatch()</code>.
59 * @method charMatchCase
60 * @param {String} query Query to match
61 * @param {Array} results Results to filter
62 * @return {Array} Filtered results
65 charMatchCase: function (query, results) {
66 return Filters.charMatch(query, results, true);
70 * Returns an array of results that contain the complete query as a phrase.
74 * @param {String} query Query to match
75 * @param {Array} results Results to filter
76 * @return {Array} Filtered results
79 phraseMatch: function (query, results, caseSensitive) {
80 // The caseSensitive parameter is only intended for use by
81 // phraseMatchCase(). It's intentionally undocumented.
84 query = query.toLowerCase();
87 return YArray.filter(results, function (result) {
88 return (caseSensitive ? result.text : result.text.toLowerCase()).indexOf(query) !== -1;
93 * Case-sensitive version of <code>phraseMatch()</code>.
95 * @method phraseMatchCase
96 * @param {String} query Query to match
97 * @param {Array} results Results to filter
98 * @return {Array} Filtered results
101 phraseMatchCase: function (query, results) {
102 return Filters.phraseMatch(query, results, true);
106 * Returns an array of results that start with the complete query as a
107 * phrase. Case-insensitive.
110 * @param {String} query Query to match
111 * @param {Array} results Results to filter
112 * @return {Array} Filtered results
115 startsWith: function (query, results, caseSensitive) {
116 // The caseSensitive parameter is only intended for use by
117 // startsWithCase(). It's intentionally undocumented.
119 if (!caseSensitive) {
120 query = query.toLowerCase();
123 return YArray.filter(results, function (result) {
124 return (caseSensitive ? result.text : result.text.toLowerCase()).indexOf(query) === 0;
129 * Case-sensitive version of <code>startsWith()</code>.
131 * @method startsWithCase
132 * @param {String} query Query to match
133 * @param {Array} results Results to filter
134 * @return {Array} Filtered results
137 startsWithCase: function (query, results) {
138 return Filters.startsWith(query, results, true);
142 * Returns an array of results that contain all of the words in the query,
143 * in any order. Non-word characters like whitespace and certain punctuation
144 * are ignored. Case-insensitive.
147 * @param {String} query Query to match
148 * @param {Array} results Results to filter
149 * @return {Array} Filtered results
152 wordMatch: function (query, results, caseSensitive) {
153 // The caseSensitive parameter is only intended for use by
154 // wordMatchCase(). It's intentionally undocumented.
156 var options = {ignoreCase: !caseSensitive},
157 queryWords = WordBreak.getUniqueWords(query, options);
159 return YArray.filter(results, function (result) {
160 // Convert resultWords array to a hash for fast lookup.
161 var resultWords = YArray.hash(WordBreak.getUniqueWords(result.text,
164 return YArray.every(queryWords, function (word) {
165 return YObject.owns(resultWords, word);
171 * Case-sensitive version of <code>wordMatch()</code>.
173 * @method wordMatchCase
174 * @param {String} query Query to match
175 * @param {Array} results Results to filter
176 * @return {Array} Filtered results
179 wordMatchCase: function (query, results) {
180 return Filters.wordMatch(query, results, true);
185 }, '3.3.0' ,{requires:['array-extras', 'text-wordbreak']});