/**
Provides pre-built accent-folding result matching filters for AutoComplete.
These filters are similar to the ones provided by the `autocomplete-filters`
module, but use accent-aware comparisons. For example, "resume" and "résumé"
will be considered equal when using the accent-folding filters.
@module autocomplete
@submodule autocomplete-filters-accentfold
**/
/**
@class AutoCompleteFilters
@static
**/
var AccentFold = Y.Text.AccentFold,
WordBreak = Y.Text.WordBreak,
YArray = Y.Array,
YObject = Y.Object;
Y.mix(Y.namespace('AutoCompleteFilters'), {
/**
Accent folding version of `charMatch()`.
@method charMatchFold
@param {String} query Query to match
@param {Array} results Results to filter
@return {Array} Filtered results
@static
**/
charMatchFold: function (query, results) {
if (!query) { return results; }
var queryChars = YArray.unique(AccentFold.fold(query).split(''));
return YArray.filter(results, function (result) {
var text = AccentFold.fold(result.text);
return YArray.every(queryChars, function (chr) {
return text.indexOf(chr) !== -1;
});
});
},
/**
Accent folding version of `phraseMatch()`.
@method phraseMatchFold
@param {String} query Query to match
@param {Array} results Results to filter
@return {Array} Filtered results
@static
**/
phraseMatchFold: function (query, results) {
if (!query) { return results; }
query = AccentFold.fold(query);
return YArray.filter(results, function (result) {
return AccentFold.fold(result.text).indexOf(query) !== -1;
});
},
/**
Accent folding version of `startsWith()`.
@method startsWithFold
@param {String} query Query to match
@param {Array} results Results to filter
@return {Array} Filtered results
@static
**/
startsWithFold: function (query, results) {
if (!query) { return results; }
query = AccentFold.fold(query);
return YArray.filter(results, function (result) {
return AccentFold.fold(result.text).indexOf(query) === 0;
});
},
/**
Accent folding version of `subWordMatch()`.
@method subWordMatchFold
@param {String} query Query to match
@param {Array} results Results to filter
@return {Array} Filtered results
@static
**/
subWordMatchFold: function (query, results) {
if (!query) { return results; }
var queryWords = WordBreak.getUniqueWords(AccentFold.fold(query));
return YArray.filter(results, function (result) {
var resultText = AccentFold.fold(result.text);
return YArray.every(queryWords, function (queryWord) {
return resultText.indexOf(queryWord) !== -1;
});
});
},
/**
Accent folding version of `wordMatch()`.
@method wordMatchFold
@param {String} query Query to match
@param {Array} results Results to filter
@return {Array} Filtered results
@static
**/
wordMatchFold: function (query, results) {
if (!query) { return results; }
var queryWords = WordBreak.getUniqueWords(AccentFold.fold(query));
return YArray.filter(results, function (result) {
// Convert resultWords array to a hash for fast lookup.
var resultWords = YArray.hash(WordBreak.getUniqueWords(
AccentFold.fold(result.text)));
return YArray.every(queryWords, function (word) {
return YObject.owns(resultWords, word);
});
});
}
});