mirror of
https://github.com/flarum/core.git
synced 2025-08-08 09:26:34 +02:00
Match emojis from the beginning before trying fuzzy matches
Fixes flarum/core#901.
This commit is contained in:
27
extensions/emoji/js/forum/dist/extension.js
vendored
27
extensions/emoji/js/forum/dist/extension.js
vendored
@@ -215,18 +215,33 @@ System.register('flarum/emoji/addComposerAutocomplete', ['flarum/extend', 'flaru
|
|||||||
var suggestions = [];
|
var suggestions = [];
|
||||||
var similarEmoji = [];
|
var similarEmoji = [];
|
||||||
|
|
||||||
|
// Build a regular expression to do a fuzzy match of the given input string
|
||||||
var fuzzyRegexp = function fuzzyRegexp(str) {
|
var fuzzyRegexp = function fuzzyRegexp(str) {
|
||||||
var reEscape = new RegExp('\\(([' + '+.*?[]{}()^$|\\'.replace(/(.)/g, '\\$1') + '])\\)', 'g');
|
var reEscape = new RegExp('\\(([' + '+.*?[]{}()^$|\\'.replace(/(.)/g, '\\$1') + '])\\)', 'g');
|
||||||
return new RegExp('(.*)' + str.toLowerCase().replace(/(.)/g, '($1)(.*?)').replace(reEscape, '(\\$1)') + '$', 'i');
|
return new RegExp('(.*)' + str.toLowerCase().replace(/(.)/g, '($1)(.*?)').replace(reEscape, '(\\$1)') + '$', 'i');
|
||||||
};
|
};
|
||||||
|
|
||||||
var regTyped = fuzzyRegexp(typed);
|
var regTyped = fuzzyRegexp(typed);
|
||||||
for (var i = 0, maxSuggestions = 7; i < emojiKeys.length && maxSuggestions > 0; i++) {
|
|
||||||
if (regTyped.test(emojiKeys[i])) {
|
var maxSuggestions = 7;
|
||||||
--maxSuggestions;
|
|
||||||
similarEmoji.push(emojiKeys[i]);
|
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) {
|
similarEmoji = similarEmoji.sort(function (a, b) {
|
||||||
return a.length - b.length;
|
return a.length - b.length;
|
||||||
|
@@ -86,20 +86,31 @@ export default function addComposerAutocomplete() {
|
|||||||
const suggestions = [];
|
const suggestions = [];
|
||||||
let similarEmoji = [];
|
let similarEmoji = [];
|
||||||
|
|
||||||
|
// Build a regular expression to do a fuzzy match of the given input string
|
||||||
const fuzzyRegexp = function(str) {
|
const fuzzyRegexp = function(str) {
|
||||||
const reEscape = new RegExp('\\(([' + ('+.*?[]{}()^$|\\'.replace(/(.)/g, '\\$1')) + '])\\)', 'g');
|
const reEscape = new RegExp('\\(([' + ('+.*?[]{}()^$|\\'.replace(/(.)/g, '\\$1')) + '])\\)', 'g');
|
||||||
return new RegExp('(.*)' + (str.toLowerCase().replace(/(.)/g, '($1)(.*?)')).replace(reEscape, '(\\$1)') + '$', 'i');
|
return new RegExp('(.*)' + (str.toLowerCase().replace(/(.)/g, '($1)(.*?)')).replace(reEscape, '(\\$1)') + '$', 'i');
|
||||||
};
|
};
|
||||||
|
|
||||||
const regTyped = fuzzyRegexp(typed);
|
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
|
return a.length - b.length
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user