Skip to content

Commit c128781

Browse files
committed
Use emoji-mart-fast data and functions to retrieve emojis
This brings a unified emoji dataset and unified default and recent/frequent emojis for both EmojiPicker and emoji autocompletion. It also brings support for searching for `+1`, `:)` etc. Signed-off-by: Jonas Meurer <[email protected]>
1 parent 3e75b61 commit c128781

File tree

6 files changed

+23
-69
lines changed

6 files changed

+23
-69
lines changed

Diff for: package-lock.json

-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: package.json

-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@
8484
"cypress": "^6.5.0",
8585
"cypress-visual-regression": "^1.5.0",
8686
"cypress-vue-unit-test": "^3.5.1",
87-
"emoji-datasource": "^6.0.0",
8887
"eslint": "^7.21.0",
8988
"eslint-loader": "^4.0.2",
9089
"eslint-plugin-cypress": "^2.11.1",

Diff for: src/components/RichContenteditable/RichContenteditable.vue

+7-4
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ import stringLength from 'string-length'
151151
import { t } from '../../l10n'
152152
import AutoCompleteResult from './AutoCompleteResult'
153153
import richEditor from '../../mixins/richEditor/index'
154-
import { allEmojis, emojiSearch } from '../../functions/emoji/index'
154+
import { emojiSearch, addRecent } from '../../functions/emoji'
155155

156156
export default {
157157
name: 'RichContenteditable',
@@ -242,13 +242,16 @@ export default {
242242
// Where to inject the menu popup
243243
menuContainer: this.menuContainer,
244244
// Popup mention autocompletion templates
245-
menuItemTemplate: item => `${item.original.value} :${item.original.short_name}`,
245+
menuItemTemplate: item => `${item.original.native} :${item.original.short_name}`,
246246
// Hide if no results
247247
noMatchTemplate: () => t('No emojis found'),
248248
// Display raw emoji along with its name
249-
selectTemplate: item => item.original.value,
249+
selectTemplate: (item) => {
250+
addRecent(item.original)
251+
return item.original.native
252+
},
250253
// Pass the search results as values
251-
values: (text, cb) => cb(emojiSearch(allEmojis, text)),
254+
values: (text, cb) => cb(emojiSearch(text)),
252255
// Class added to the menu container
253256
containerClass: 'tribute-container-emoji',
254257
// Class added to each list item

Diff for: src/functions/emoji/emoji.js

+14-30
Original file line numberDiff line numberDiff line change
@@ -20,44 +20,28 @@
2020
*
2121
*/
2222

23-
export const allEmojis = EMOJIS
23+
import data from 'emoji-mart-vue-fast/data/all.json'
24+
import { EmojiIndex } from 'emoji-mart-vue-fast/src'
25+
import frequently from 'emoji-mart-vue-fast/src/utils/frequently'
2426

25-
/** later
26-
const DEFAULTS = [
27-
'heart',
28-
'+1',
29-
'-1',
30-
'joy',
31-
'cry',
32-
]
33-
*/
27+
// export const allEmojis = index.buildIndex()
3428

3529
/**
36-
* @param {Array} searchItems Array of emojis
3730
* @param {string} query Emoji search string
31+
* @param {Number} maxResults Maximum of returned emojis
3832
* @returns {Array} list of found emojis
3933
*/
40-
export const emojiSearch = function(searchItems, query) {
41-
if (!query) {
42-
// Return first five emojis for empty searches
43-
return searchItems.slice(0, 5)
34+
export const emojiSearch = function(query, maxResults = 5) {
35+
const index = new EmojiIndex(data)
36+
if (query) {
37+
return index.search(query, 5) || []
4438
}
4539

46-
// First search for exact matches
47-
let results = searchItems.filter(item => item.short_names
48-
.filter(name => name.toLowerCase() === query.toLowerCase()).length > 0)
49-
50-
// Second search for matches that start with query string
51-
results = [...new Set([...results, ...searchItems.filter(item => item.short_names
52-
.filter(name => name.toLowerCase().startsWith(query.toLowerCase())).length > 0)])]
53-
54-
// If we still don't have enough, search for general matches
55-
if (results.length < 5) {
56-
results = [...new Set([...results, ...searchItems.filter(item => item.short_names
57-
.filter(name => name.toLowerCase().includes(query.toLowerCase())).length > 0)])]
58-
}
40+
return frequently.get(5).map((id) => index.emoji(id)) || []
41+
}
5942

60-
return results.slice(0, 5)
43+
export const addRecent = function(id) {
44+
frequently.add(id)
6145
}
6246

63-
export default { allEmojis, emojiSearch }
47+
export default { emojiSearch, addRecent }

Diff for: src/functions/emoji/index.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
*
2121
*/
2222

23-
import { allEmojis, emojiSearch } from './emoji'
23+
import { emojiSearch, addRecent } from './emoji'
2424

25-
export { allEmojis, emojiSearch }
26-
export default { allEmojis, emojiSearch }
25+
export { emojiSearch, addRecent }

Diff for: webpack.common.js

-25
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,6 @@ const BabelLoaderExcludeNodeModulesExcept = require('babel-loader-exclude-node-m
1010
const nodeExternals = require('webpack-node-externals')
1111
const StyleLintPlugin = require('stylelint-webpack-plugin')
1212

13-
const emojisData = require('emoji-datasource/emoji.json')
14-
const EMOJIS = emojisData
15-
.filter(emoji => emoji.short_name)
16-
.reduce((accumulator, current) => {
17-
// Add current emoji
18-
const emoji = Object.assign({}, current)
19-
emoji.value = String.fromCodePoint(...emoji.unified.split('-').map(hex => '0x' + hex))
20-
delete emoji.skin_variations
21-
accumulator.push(emoji)
22-
23-
// Handle variations, take the current emoji and replace with variations
24-
if (current.skin_variations) {
25-
Object.values(current.skin_variations).forEach((variation) => {
26-
const emojiVariation = Object.assign({}, current, variation)
27-
emojiVariation.value = String.fromCodePoint(...emojiVariation.unified.split('-').map(hex => '0x' + hex))
28-
delete emojiVariation.skin_variations
29-
accumulator.push(emojiVariation)
30-
})
31-
}
32-
return accumulator
33-
}, [])
34-
35-
console.info('Emojis count:', EMOJIS.length, typeof emojisData)
36-
3713
// scope variable
3814
// fallback for cypress testing
3915
const appVersion = JSON.stringify(process.env.npm_package_version || 'nextcloud-vue')
@@ -180,7 +156,6 @@ module.exports = {
180156
new DefinePlugin({
181157
SCOPE_VERSION,
182158
TRANSLATIONS: JSON.stringify(translations),
183-
EMOJIS: JSON.stringify(EMOJIS),
184159
}),
185160
],
186161
resolve: {

0 commit comments

Comments
 (0)