Version 3.18.1
Show:

File: autocomplete/js/autocomplete-filters-accentfold.js

            /**
            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);
                        });
                    });
                }
            });