diff options
| author | Shpuld Shpuldson <shp@cock.li> | 2020-08-28 12:02:52 +0300 |
|---|---|---|
| committer | Shpuld Shpuldson <shp@cock.li> | 2020-08-28 12:02:52 +0300 |
| commit | 0347d79bda97a90eab3afaf9ab6aafb784b2e10d (patch) | |
| tree | 792d3a2a72574ad420c13a8850a1afcaa70a3547 /src | |
| parent | f5e4ad601ac47f7b0a2f3cdc24e0f6be9be17d21 (diff) | |
Rewrite word split imperatively for control
Diffstat (limited to 'src')
| -rw-r--r-- | src/services/completion/completion.js | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/src/services/completion/completion.js b/src/services/completion/completion.js index f74f8048..8a6eba7e 100644 --- a/src/services/completion/completion.js +++ b/src/services/completion/completion.js @@ -4,15 +4,13 @@ export const replaceWord = (str, toReplace, replacement) => { return str.slice(0, toReplace.start) + replacement + str.slice(toReplace.end) } -// This seems to work fine 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) } -// This works fine export const addPositionToWords = (words) => { return reduce(words, (result, word) => { const data = { @@ -36,37 +34,36 @@ export const addPositionToWords = (words) => { }, []) } -// This needs to be altered, split words at space -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 } |
