@wordpress/components
Version:
UI components for WordPress.
66 lines (65 loc) • 2.14 kB
JavaScript
// packages/components/src/autocomplete/get-autocomplete-match.ts
import removeAccents from "remove-accents";
function getAutocompleteMatch(textContent, completers, options) {
const {
matchCount,
isBackspacing,
getTextAfterSelection,
lastCompletion
} = options;
if (!textContent) {
return null;
}
let completer = null;
let triggerIndex = -1;
let matchedEndIndex = -1;
let matchedPrefixLength = 0;
for (const currentCompleter of completers) {
const currentIndex = textContent.lastIndexOf(currentCompleter.triggerPrefix);
if (currentIndex < 0) {
continue;
}
const currentEndIndex = currentIndex + currentCompleter.triggerPrefix.length;
if (currentEndIndex > matchedEndIndex || currentEndIndex === matchedEndIndex && currentCompleter.triggerPrefix.length > matchedPrefixLength) {
completer = currentCompleter;
triggerIndex = currentIndex;
matchedEndIndex = currentEndIndex;
matchedPrefixLength = currentCompleter.triggerPrefix.length;
}
}
if (!completer) {
return null;
}
const {
allowContext,
triggerPrefix
} = completer;
const textWithoutTrigger = textContent.slice(triggerIndex + triggerPrefix.length);
if (textWithoutTrigger.length > 50) {
return null;
}
const mismatch = matchCount === 0;
const wordsFromTrigger = textWithoutTrigger.split(/\s/);
const hasOneTriggerWord = wordsFromTrigger.length === 1;
const matchingWhileBackspacing = isBackspacing && wordsFromTrigger.length <= 3;
if (mismatch && !(matchingWhileBackspacing || hasOneTriggerWord)) {
return null;
}
if (allowContext && !allowContext(textContent.slice(0, triggerIndex), getTextAfterSelection())) {
return null;
}
if (/^\s/.test(textWithoutTrigger) || /\s\s+$/.test(textWithoutTrigger)) {
return null;
}
if (lastCompletion && lastCompletion.name === completer.name && textWithoutTrigger.trimEnd() === lastCompletion.value) {
return null;
}
return {
completer,
filterValue: removeAccents(textWithoutTrigger)
};
}
export {
getAutocompleteMatch
};
//# sourceMappingURL=get-autocomplete-match.mjs.map