@wordpress/block-library
Version:
Block library for the WordPress editor.
84 lines (73 loc) • 2.26 kB
JavaScript
/**
* External dependencies
*/
import removeAccents from 'remove-accents';
/**
* Sanitizes the search input string.
*
* @param {string} input The search input to normalize.
*
* @return {string} The normalized search input.
*/
function normalizeSearchInput() {
let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
// Disregard diacritics.
input = removeAccents(input); // Trim & Lowercase.
input = input.trim().toLowerCase();
return input;
}
/**
* Get the search rank for a given pattern and a specific search term.
*
* @param {Object} pattern Pattern to rank
* @param {string} searchValue Search term
* @return {number} A pattern search rank
*/
function getPatternSearchRank(pattern, searchValue) {
const normalizedSearchValue = normalizeSearchInput(searchValue);
const normalizedTitle = normalizeSearchInput(pattern.title);
let rank = 0;
if (normalizedSearchValue === normalizedTitle) {
rank += 30;
} else if (normalizedTitle.startsWith(normalizedSearchValue)) {
rank += 20;
} else {
const searchTerms = normalizedSearchValue.split(' ');
const hasMatchedTerms = searchTerms.every(searchTerm => normalizedTitle.includes(searchTerm)); // Prefer pattern with every search word in the title.
if (hasMatchedTerms) {
rank += 10;
}
}
return rank;
}
/**
* Filters an pattern list given a search term.
*
* @param {Array} patterns Item list
* @param {string} searchValue Search input.
*
* @return {Array} Filtered pattern list.
*/
export function searchPatterns() {
let patterns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
let searchValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
if (!searchValue) {
return patterns;
}
const rankedPatterns = patterns.map(pattern => {
return [pattern, getPatternSearchRank(pattern, searchValue)];
}).filter(_ref => {
let [, rank] = _ref;
return rank > 0;
});
rankedPatterns.sort((_ref2, _ref3) => {
let [, rank1] = _ref2;
let [, rank2] = _ref3;
return rank2 - rank1;
});
return rankedPatterns.map(_ref4 => {
let [pattern] = _ref4;
return pattern;
});
}
//# sourceMappingURL=search.js.map