UNPKG

@wordpress/components

Version:
66 lines (65 loc) 2.14 kB
// 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