diff options
| author | lain <lain@soykaf.club> | 2020-09-03 14:08:36 +0000 |
|---|---|---|
| committer | lain <lain@soykaf.club> | 2020-09-03 14:08:36 +0000 |
| commit | 4adccf2216effa7fe945d6e8d90197e41bc58706 (patch) | |
| tree | 4b0924d7d40f4be21f8771b61a34bb258a6b008c /src | |
| parent | 02ea1739473bace638aeb215ab84843e9e304dfb (diff) | |
| parent | 5b7decea3dcee8b6f36656ac16fa796563cadfb0 (diff) | |
Merge branch 'fix/autocomplete-fixes' into 'develop'
Rewrite word split for autocomplete, fix #930 fix #681
Closes #681 and #930
See merge request pleroma/pleroma-fe!1218
Diffstat (limited to 'src')
| -rw-r--r-- | src/services/completion/completion.js | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/src/services/completion/completion.js b/src/services/completion/completion.js index df83d03d..8a6eba7e 100644 --- a/src/services/completion/completion.js +++ b/src/services/completion/completion.js @@ -5,7 +5,7 @@ export const replaceWord = (str, toReplace, replacement) => { } export const wordAtPosition = (str, pos) => { - const words = splitIntoWords(str) + const words = splitByWhitespaceBoundary(str) const wordsWithPosition = addPositionToWords(words) return find(wordsWithPosition, ({ start, end }) => start <= pos && end > pos) @@ -34,36 +34,36 @@ export const addPositionToWords = (words) => { }, []) } -export const splitIntoWords = (str) => { - // Split at word boundaries - const regex = /\b/ - const triggers = /[@#:]+$/ - - let split = str.split(regex) - - // Add trailing @ and # to the following word. - const words = reduce(split, (result, word) => { - if (result.length > 0) { - let previous = result.pop() - const matches = previous.match(triggers) - if (matches) { - previous = previous.replace(triggers, '') - word = matches[0] + word - } - result.push(previous) +export const splitByWhitespaceBoundary = (str) => { + let result = [] + let currentWord = '' + for (let i = 0; i < str.length; i++) { + const currentChar = str[i] + // Starting a new word + if (!currentWord) { + currentWord = currentChar + continue } - result.push(word) - - return result - }, []) - - return words + // current character is whitespace while word isn't, or vice versa: + // add our current word to results, start over the current word. + if (!!currentChar.trim() !== !!currentWord.trim()) { + result.push(currentWord) + currentWord = currentChar + continue + } + currentWord += currentChar + } + // Add the last word we were working on + if (currentWord) { + result.push(currentWord) + } + return result } const completion = { wordAtPosition, addPositionToWords, - splitIntoWords, + splitByWhitespaceBoundary, replaceWord } |
