/* Copyright (c) 2010, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.html version: 3.3.0 build: 3167 */ YUI.add('autocomplete-filters', function(Y) { /** * Provides pre-built result matching filters for AutoComplete. * * @module autocomplete * @submodule autocomplete-filters * @class AutoCompleteFilters * @static */ var YArray = Y.Array, YObject = Y.Object, WordBreak = Y.Text.WordBreak, Filters = Y.mix(Y.namespace('AutoCompleteFilters'), { // -- Public Methods ------------------------------------------------------- /** * Returns an array of results that contain all of the characters in the * query, in any order (not necessarily consecutive). Case-insensitive. * * @method charMatch * @param {String} query Query to match * @param {Array} results Results to filter * @return {Array} Filtered results * @static */ charMatch: function (query, results, caseSensitive) { // The caseSensitive parameter is only intended for use by // charMatchCase(). It's intentionally undocumented. var queryChars = YArray.unique((caseSensitive ? query : query.toLowerCase()).split('')); return YArray.filter(results, function (result) { result = result.text; if (!caseSensitive) { result = result.toLowerCase(); } return YArray.every(queryChars, function (chr) { return result.indexOf(chr) !== -1; }); }); }, /** * Case-sensitive version of charMatch(). * * @method charMatchCase * @param {String} query Query to match * @param {Array} results Results to filter * @return {Array} Filtered results * @static */ charMatchCase: function (query, results) { return Filters.charMatch(query, results, true); }, /** * Returns an array of results that contain the complete query as a phrase. * Case-insensitive. * * @method phraseMatch * @param {String} query Query to match * @param {Array} results Results to filter * @return {Array} Filtered results * @static */ phraseMatch: function (query, results, caseSensitive) { // The caseSensitive parameter is only intended for use by // phraseMatchCase(). It's intentionally undocumented. if (!caseSensitive) { query = query.toLowerCase(); } return YArray.filter(results, function (result) { return (caseSensitive ? result.text : result.text.toLowerCase()).indexOf(query) !== -1; }); }, /** * Case-sensitive version of phraseMatch(). * * @method phraseMatchCase * @param {String} query Query to match * @param {Array} results Results to filter * @return {Array} Filtered results * @static */ phraseMatchCase: function (query, results) { return Filters.phraseMatch(query, results, true); }, /** * Returns an array of results that start with the complete query as a * phrase. Case-insensitive. * * @method startsWith * @param {String} query Query to match * @param {Array} results Results to filter * @return {Array} Filtered results * @static */ startsWith: function (query, results, caseSensitive) { // The caseSensitive parameter is only intended for use by // startsWithCase(). It's intentionally undocumented. if (!caseSensitive) { query = query.toLowerCase(); } return YArray.filter(results, function (result) { return (caseSensitive ? result.text : result.text.toLowerCase()).indexOf(query) === 0; }); }, /** * Case-sensitive version of startsWith(). * * @method startsWithCase * @param {String} query Query to match * @param {Array} results Results to filter * @return {Array} Filtered results * @static */ startsWithCase: function (query, results) { return Filters.startsWith(query, results, true); }, /** * Returns an array of results that contain all of the words in the query, * in any order. Non-word characters like whitespace and certain punctuation * are ignored. Case-insensitive. * * @method wordMatch * @param {String} query Query to match * @param {Array} results Results to filter * @return {Array} Filtered results * @static */ wordMatch: function (query, results, caseSensitive) { // The caseSensitive parameter is only intended for use by // wordMatchCase(). It's intentionally undocumented. var options = {ignoreCase: !caseSensitive}, queryWords = WordBreak.getUniqueWords(query, options); return YArray.filter(results, function (result) { // Convert resultWords array to a hash for fast lookup. var resultWords = YArray.hash(WordBreak.getUniqueWords(result.text, options)); return YArray.every(queryWords, function (word) { return YObject.owns(resultWords, word); }); }); }, /** * Case-sensitive version of wordMatch(). * * @method wordMatchCase * @param {String} query Query to match * @param {Array} results Results to filter * @return {Array} Filtered results * @static */ wordMatchCase: function (query, results) { return Filters.wordMatch(query, results, true); } }); }, '3.3.0' ,{requires:['array-extras', 'text-wordbreak']});