diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-10-14 18:08:42 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-10-14 18:08:42 +0300 |
commit | 99670fc6a027caee34a6537c8def2e998d1ac5c2 (patch) | |
tree | a2ea3ec131d3cb155e13140c8486f1be2a5822b4 /app/assets/javascripts/emoji | |
parent | c9ca178ba4c9a3e48d9d069f7d7486a29827cc61 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/emoji')
-rw-r--r-- | app/assets/javascripts/emoji/index.js | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/app/assets/javascripts/emoji/index.js b/app/assets/javascripts/emoji/index.js index b03da311c43..c06ecb3a8d9 100644 --- a/app/assets/javascripts/emoji/index.js +++ b/app/assets/javascripts/emoji/index.js @@ -66,12 +66,8 @@ export function isEmojiNameValid(name) { return validEmojiNames.indexOf(name) >= 0; } -export function getValidEmojiUnicodeValues() { - return Object.values(emojiMap).map(({ e }) => e); -} - -export function getValidEmojiDescriptions() { - return Object.values(emojiMap).map(({ d }) => d); +export function getAllEmoji() { + return emojiMap; } /** @@ -106,16 +102,43 @@ export function getEmoji(query, fallback = false) { } const searchMatchers = { - fuzzy: (value, query) => fuzzaldrinPlus.score(value, query) > 0, // Fuzzy matching compares using a fuzzy matching library - contains: (value, query) => value.indexOf(query.toLowerCase()) >= 0, // Contains matching compares by indexOf - exact: (value, query) => value === query.toLowerCase(), // Exact matching compares by equality + // Fuzzy matching compares using a fuzzy matching library + fuzzy: (value, query) => { + const score = fuzzaldrinPlus.score(value, query) > 0; + return { score, success: score > 0 }; + }, + // Contains matching compares by indexOf + contains: (value, query) => { + const index = value.indexOf(query.toLowerCase()); + return { index, success: index >= 0 }; + }, + // Exact matching compares by equality + exact: (value, query) => { + return { success: value === query.toLowerCase() }; + }, }; const searchPredicates = { - name: (matcher, query) => emoji => matcher(emoji.name, query), // Search by name - alias: (matcher, query) => emoji => emoji.aliases.some(v => matcher(v, query)), // Search by alias - description: (matcher, query) => emoji => matcher(emoji.d, query), // Search by description - unicode: (matcher, query) => emoji => emoji.e === query, // Search by unicode value (always exact) + // Search by name + name: (matcher, query) => emoji => { + const m = matcher(emoji.name, query); + return [{ ...m, emoji, field: emoji.name }]; + }, + // Search by alias + alias: (matcher, query) => emoji => + emoji.aliases.map(alias => { + const m = matcher(alias, query); + return { ...m, emoji, field: alias }; + }), + // Search by description + description: (matcher, query) => emoji => { + const m = matcher(emoji.d, query); + return [{ ...m, emoji, field: emoji.d }]; + }, + // Search by unicode value (always exact) + unicode: (matcher, query) => emoji => { + return [{ emoji, field: emoji.e, success: emoji.e === query }]; + }, }; /** @@ -138,6 +161,8 @@ const searchPredicates = { * matching compares using a fuzzy matching library. * @param {Boolean} opts.fallback If true, a fallback emoji will be returned if * the result set is empty. Defaults to false. + * @param {Boolean} opts.raw Returns the raw match data instead of just the + * matching emoji. * @returns {Object[]} A list of emoji that match the query. */ export function searchEmoji(query, opts) { @@ -150,6 +175,7 @@ export function searchEmoji(query, opts) { fields = ['name', 'alias', 'description', 'unicode'], match = 'exact', fallback = false, + raw = false, } = opts || {}; // optimization for an exact match in name and alias @@ -161,16 +187,22 @@ export function searchEmoji(query, opts) { const matcher = searchMatchers[match] || searchMatchers.exact; const predicates = fields.map(f => searchPredicates[f](matcher, query)); - const results = Object.values(emojiMap).filter(emoji => - predicates.some(predicate => predicate(emoji)), - ); + const results = Object.values(emojiMap) + .flatMap(emoji => predicates.flatMap(predicate => predicate(emoji))) + .filter(r => r.success); // Fallback to question mark for unknown emojis if (fallback && results.length === 0) { + if (raw) { + return [{ emoji: emojiMap.grey_question }]; + } return [emojiMap.grey_question]; } - return results; + if (raw) { + return results; + } + return results.map(r => r.emoji); } let emojiCategoryMap; |