aboutsummaryrefslogtreecommitdiff
path: root/src/services/completion/completion.js
diff options
context:
space:
mode:
authorShpuld Shpuldson <shpuld@gmail.com>2017-06-19 11:32:40 +0300
committerShpuld Shpuldson <shpuld@gmail.com>2017-06-19 11:32:40 +0300
commit3785a863cb27af18fe91403189eff16f662dc2d0 (patch)
treeff1ee977f74e9516fec4ca0691b017ce6f7867ff /src/services/completion/completion.js
parent143aa3b990c0e0fac98c4a097d68e9f7518f1940 (diff)
parent8e5d17a659b157f095ad3850ac3cdd2e537ac38b (diff)
Update branch and fix conflicts.
Diffstat (limited to 'src/services/completion/completion.js')
-rw-r--r--src/services/completion/completion.js70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/services/completion/completion.js b/src/services/completion/completion.js
new file mode 100644
index 00000000..8788d837
--- /dev/null
+++ b/src/services/completion/completion.js
@@ -0,0 +1,70 @@
+import { reduce, find } from 'lodash'
+
+export const replaceWord = (str, toReplace, replacement) => {
+ return str.slice(0, toReplace.start) + replacement + str.slice(toReplace.end)
+}
+
+export const wordAtPosition = (str, pos) => {
+ const words = splitIntoWords(str)
+ const wordsWithPosition = addPositionToWords(words)
+
+ return find(wordsWithPosition, ({start, end}) => start <= pos && end > pos)
+}
+
+export const addPositionToWords = (words) => {
+ return reduce(words, (result, word) => {
+ const data = {
+ word,
+ start: 0,
+ end: word.length
+ }
+
+ if (result.length > 0) {
+ const previous = result.pop()
+
+ data.start += previous.end
+ data.end += previous.end
+
+ result.push(previous)
+ }
+
+ result.push(data)
+
+ return result
+ }, [])
+}
+
+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)
+ }
+ result.push(word)
+
+ return result
+ }, [])
+
+ return words
+}
+
+const completion = {
+ wordAtPosition,
+ addPositionToWords,
+ splitIntoWords,
+ replaceWord
+}
+
+export default completion