diff --git a/src/renderer/utils/suggestText.js b/src/renderer/utils/suggestText.js new file mode 100644 index 00000000..2f7dd800 --- /dev/null +++ b/src/renderer/utils/suggestText.js @@ -0,0 +1,27 @@ +// https://github.com/tootsuite/mastodon/blob/master/app/javascript/mastodon/components/autosuggest_textarea.js +const textAtCursorMatch = (str, cursorPosition, separator = '@') => { + let word + + let left = str.slice(0, cursorPosition).search(/\S+$/) + let right = str.slice(cursorPosition).search(/\s/) + + if (right < 0) { + word = str.slice(left) + } else { + word = str.slice(left, right + cursorPosition) + } + + if (!word || word.trim().length < 3 || [separator].indexOf(word[0]) === -1) { + return [null, null] + } + + word = word.trim().toLowerCase() + + if (word.length > 0) { + return [left + 1, word] + } else { + return [null, null] + } +} + +export default textAtCursorMatch diff --git a/test/mocha/suggestText.spec.js b/test/mocha/suggestText.spec.js new file mode 100644 index 00000000..722ef5fe --- /dev/null +++ b/test/mocha/suggestText.spec.js @@ -0,0 +1,45 @@ +import assert from 'assert' +import suggestText from '../../src/renderer/utils/suggestText' + +describe('account', () => { + context('Only account name', () => { + const str = '@h3pote' + it('should match', () => { + const [start, word] = suggestText(str, 7) + assert.strictEqual(str, word) + assert.strictEqual(start, 1) + }) + }) + context('Beginning of the sentence', () => { + const str = '@h3pote toot body' + it('should match', () => { + const [start, word] = suggestText(str, 7) + assert.strictEqual(word, '@h3pote') + assert.strictEqual(start, 1) + }) + }) + context('Halfway of the sentence', () => { + const str = 'toot body @h3pote toot' + it('should match', () => { + const [start, word] = suggestText(str, 17) + assert.strictEqual(word, '@h3pote') + assert.strictEqual(start, 11) + }) + }) + context('End of the sentence', () => { + const str = 'toot body @h3pote' + it('should match', () => { + const [start, word] = suggestText(str, 17) + assert.strictEqual(word, '@h3pote') + assert.strictEqual(start, 11) + }) + }) + context('No space', () => { + const str = 'tootbody@h3pote' + it('should not match', () => { + const [start, word] = suggestText(str, 15) + assert.strictEqual(word, null) + assert.strictEqual(start, null) + }) + }) +})