From 5f7195b3faa1f4e27fe0dce45d13231f41a348be Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sat, 14 May 2016 22:59:25 +0900 Subject: [PATCH] Match emojis from the beginning before trying fuzzy matches Fixes flarum/core#901. --- extensions/emoji/js/forum/dist/extension.js | 27 ++++++++++++++----- .../js/forum/src/addComposerAutocomplete.js | 27 +++++++++++++------ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/extensions/emoji/js/forum/dist/extension.js b/extensions/emoji/js/forum/dist/extension.js index ff1462373..668b58785 100644 --- a/extensions/emoji/js/forum/dist/extension.js +++ b/extensions/emoji/js/forum/dist/extension.js @@ -215,18 +215,33 @@ System.register('flarum/emoji/addComposerAutocomplete', ['flarum/extend', 'flaru var suggestions = []; var similarEmoji = []; + // Build a regular expression to do a fuzzy match of the given input string var fuzzyRegexp = function fuzzyRegexp(str) { var reEscape = new RegExp('\\(([' + '+.*?[]{}()^$|\\'.replace(/(.)/g, '\\$1') + '])\\)', 'g'); return new RegExp('(.*)' + str.toLowerCase().replace(/(.)/g, '($1)(.*?)').replace(reEscape, '(\\$1)') + '$', 'i'); }; - var regTyped = fuzzyRegexp(typed); - for (var i = 0, maxSuggestions = 7; i < emojiKeys.length && maxSuggestions > 0; i++) { - if (regTyped.test(emojiKeys[i])) { - --maxSuggestions; - similarEmoji.push(emojiKeys[i]); + + var maxSuggestions = 7; + + var findMatchingEmojis = function findMatchingEmojis(matcher) { + for (var _i = 0; _i < emojiKeys.length && maxSuggestions > 0; _i++) { + if (matcher(emojiKeys[_i])) { + --maxSuggestions; + similarEmoji.push(emojiKeys[_i]); + } } - } + }; + + // First, try to find all emojis starting with the given string + findMatchingEmojis(function (emoji) { + return emoji.indexOf(typed) === 0; + }); + + // If there are still suggestions left, try for some fuzzy matches + findMatchingEmojis(function (emoji) { + return regTyped.test(emoji); + }); similarEmoji = similarEmoji.sort(function (a, b) { return a.length - b.length; diff --git a/extensions/emoji/js/forum/src/addComposerAutocomplete.js b/extensions/emoji/js/forum/src/addComposerAutocomplete.js index 1dfbf3fa4..6f5645fc5 100644 --- a/extensions/emoji/js/forum/src/addComposerAutocomplete.js +++ b/extensions/emoji/js/forum/src/addComposerAutocomplete.js @@ -86,20 +86,31 @@ export default function addComposerAutocomplete() { const suggestions = []; let similarEmoji = []; + // Build a regular expression to do a fuzzy match of the given input string const fuzzyRegexp = function(str) { const reEscape = new RegExp('\\(([' + ('+.*?[]{}()^$|\\'.replace(/(.)/g, '\\$1')) + '])\\)', 'g'); return new RegExp('(.*)' + (str.toLowerCase().replace(/(.)/g, '($1)(.*?)')).replace(reEscape, '(\\$1)') + '$', 'i'); }; - const regTyped = fuzzyRegexp(typed); - for (var i=0, maxSuggestions = 7; i < emojiKeys.length && maxSuggestions > 0; i++) { - if(regTyped.test(emojiKeys[i])) { - --maxSuggestions; - similarEmoji.push(emojiKeys[i]); - } - } - similarEmoji = similarEmoji.sort((a,b) => { + let maxSuggestions = 7; + + const findMatchingEmojis = matcher => { + for (let i = 0; i < emojiKeys.length && maxSuggestions > 0; i++) { + if (matcher(emojiKeys[i])) { + --maxSuggestions; + similarEmoji.push(emojiKeys[i]); + } + } + }; + + // First, try to find all emojis starting with the given string + findMatchingEmojis(emoji => emoji.indexOf(typed) === 0); + + // If there are still suggestions left, try for some fuzzy matches + findMatchingEmojis(emoji => regTyped.test(emoji)); + + similarEmoji = similarEmoji.sort((a, b) => { return a.length - b.length });