Skip to content
This repository was archived by the owner on May 12, 2021. It is now read-only.

Commit 0a2ff1a

Browse files
feat: improve emoji support
This adds an emoji font (Noto Color Emoji, thanks @mixmix!) and revamps the emoji rendering and suggestion systems to support a bunch of new emoji.
1 parent 746caec commit 0a2ff1a

File tree

10 files changed

+58
-100
lines changed

10 files changed

+58
-100
lines changed

.vscode/settings.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
"abouts",
55
"backlinks",
66
"depnest",
7-
"emojilib",
87
"flatpickr",
98
"msgs",
109
"paramap",
@@ -18,4 +17,4 @@
1817
],
1918
"standard.autoFixOnSave": true,
2019
"editor.tabSize": 2
21-
}
20+
}

main-window.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@ module.exports = function (config) {
130130
})
131131
)
132132

133+
document.head.appendChild(
134+
h('style', {
135+
innerHTML: requireStyle('noto-color-emoji')
136+
})
137+
)
138+
133139
document.head.appendChild(
134140
h('style', {
135141
innerHTML: computed(api.settings.obs.get('patchwork.fontSize'), size => {
@@ -144,7 +150,7 @@ module.exports = function (config) {
144150
h('style', {
145151
innerHTML: computed(api.settings.obs.get('patchwork.fontFamily'), family => {
146152
if (family) {
147-
return 'body, button, input, select, textarea {font-family: ' + family + ';}'
153+
return 'body, button, input, select, textarea { font-family: ' + family + ';}'
148154
}
149155
})
150156
})

modules/emoji.js

-29
This file was deleted.

modules/message/html/markdown.js

+9-23
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ const nest = require('depnest')
55
var htmlEscape = require('html-escape')
66
var watch = require('mutant/watch')
77
const querystring = require('querystring')
8+
const nodeEmoji = require('node-emoji')
89

910
exports.needs = nest({
1011
'blob.sync.url': 'first',
11-
'blob.obs.has': 'first',
12-
'emoji.sync.url': 'first'
12+
'blob.obs.has': 'first'
1313
})
1414

1515
exports.gives = nest('message.html.markdown')
@@ -42,15 +42,15 @@ exports.create = function (api) {
4242
return h('Markdown', {
4343
classList,
4444
hooks: [
45-
LoadingBlobHook(api.blob.obs.has),
46-
LargeEmojiHook()
45+
LoadingBlobHook(api.blob.obs.has)
4746
],
4847
innerHTML: renderer.block(content.text, {
4948
emoji: (emoji) => {
50-
var url = emojiMentions[emoji]
51-
? api.blob.sync.url(emojiMentions[emoji])
52-
: api.emoji.sync.url(emoji)
53-
return renderEmoji(emoji, url)
49+
if (emojiMentions[emoji]) {
50+
return renderEmoji(emoji, api.blob.sync.url(emojiMentions[emoji]))
51+
} else {
52+
return h('span.Emoji', nodeEmoji.get(emoji))
53+
}
5454
},
5555
toUrl: (id) => {
5656
var link = ref.parseLink(id)
@@ -75,6 +75,7 @@ exports.create = function (api) {
7575

7676
function renderEmoji (emoji, url) {
7777
if (!url) return ':' + emoji + ':'
78+
7879
return `
7980
<img
8081
src="${htmlEscape(url)}"
@@ -108,18 +109,3 @@ function LoadingBlobHook (hasBlob) {
108109
}
109110
}
110111
}
111-
112-
function LargeEmojiHook () {
113-
return function (element) {
114-
// do our best with a css selector
115-
element.querySelectorAll('p > img.emoji:only-child').forEach(img => {
116-
// unfortunately `only-child` doesn't take text nodes into account
117-
// check to see if there is actually any text before or after before adding class
118-
var before = img.previousSibling && img.previousSibling.textContent.trim()
119-
var after = img.nextSibling && img.nextSibling.textContent.trim()
120-
if (!before && !after) {
121-
img.classList.add('-large')
122-
}
123-
})
124-
}
125-
}

modules/message/sheet/preview.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
var h = require('mutant/h')
22
var nest = require('depnest')
33
var when = require('mutant/when')
4+
const emoji = require('node-emoji')
45

56
exports.needs = nest({
67
'sheet.display': 'first',
78
'message.html.render': 'first',
89
'intl.sync.i18n': 'first',
9-
'intl.sync.i18n_n': 'first',
10-
'emoji.sync.url': 'first'
10+
'intl.sync.i18n_n': 'first'
1111
})
1212

1313
exports.gives = nest('message.sheet.preview')
@@ -55,8 +55,8 @@ exports.create = function (api) {
5555
],
5656
footer: [
5757
when(isPrivate,
58-
h('img', { src: api.emoji.sync.url('closed_lock_with_key') }),
59-
h('img', { src: api.emoji.sync.url('globe_with_meridians') })
58+
h('span.Emoji', emoji.get('closed_lock_with_key')),
59+
h('span.Emoji', emoji.get('globe_with_meridians'))
6060
),
6161
when(isPrivate,
6262
h('div.info -private', [

modules/suggest.js

+8-17
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
const nest = require('depnest')
2-
var emoji = require('emojilib')
32
var addSuggest = require('suggest-box')
43
var resolve = require('mutant/resolve')
4+
var h = require('hyperscript')
5+
const emoji = require('node-emoji')
56

67
exports.needs = nest({
78
'profile.async.suggest': 'first',
8-
'channel.async.suggest': 'first',
9-
'emoji.sync.names': 'first',
10-
'emoji.sync.url': 'first'
9+
'channel.async.suggest': 'first'
1110
})
1211

1312
exports.gives = nest('suggest.hook')
@@ -29,24 +28,16 @@ exports.create = function (api) {
2928
if (word[word.length - 1] === ':') {
3029
word = word.slice(0, -1)
3130
}
32-
cb(null, suggestEmoji(word).slice(0, 100).map(function (emoji) {
31+
cb(null, emoji.search(word).slice(0, 100).map(function (result) {
32+
// result = { key: emoji}
3333
return {
34-
image: api.emoji.sync.url(emoji),
35-
title: emoji,
36-
subtitle: emoji,
37-
value: ':' + emoji + ':'
34+
title: h('span.Emoji', result.emoji),
35+
subtitle: result.key,
36+
value: `:${result.key}:`
3837
}
3938
}))
4039
}
4140
}, { cls: 'SuggestBox' })
4241
}
4342
})
44-
45-
function suggestEmoji (prefix) {
46-
var availableEmoji = api.emoji.sync.names()
47-
return emoji.ordered.filter(key => {
48-
if (!availableEmoji.includes(key)) return false
49-
return key.startsWith(prefix) || key.includes('_' + prefix) || emoji.lib[key].keywords.some(word => word.startsWith(prefix) || word.startsWith(':' + prefix))
50-
})
51-
}
5243
}

package-lock.json

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

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@
2727
"electron-default-menu": "~1.0.1",
2828
"electron-spellchecker": "^2.0.4",
2929
"electron-window-state": "^5.0.3",
30-
"emoji-named-characters": "^1.0.2",
31-
"emojilib": "^2.4.0",
3230
"escape-string-regexp": "^2.0.0",
3331
"fix-path": "^2.1.0",
3432
"flat": "^4.1.0",
@@ -48,6 +46,8 @@
4846
"moment-timezone": "^0.5.23",
4947
"mutant": "github:mmckegg/mutant#intersection-binding-viewport",
5048
"mutant-pull-reduce": "^1.1.0",
49+
"node-emoji": "^1.10.0",
50+
"noto-color-emoji": "^1.0.1",
5151
"patch-settings": "^1.1.2",
5252
"pull-abortable": "^4.1.1",
5353
"pull-cat": "^1.1.11",

styles/base/base.mcss

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1+
html {
2+
font-size: 12px
3+
}
4+
15
html, body {
26
margin: 0
3-
font: caption
47
overflow: hidden
58
height: 100%
6-
font-size: 12px
79
-webkit-user-select: none
810
}
11+
912
body {
1013
display: flex
1114
flex-direction: column
@@ -42,9 +45,10 @@ a {
4245
* {
4346
box-sizing: border-box
4447
}
45-
input, textarea, keygen, select, button {
46-
font-family: '.SFNSText-Regular', sans-serif
47-
}
4848
::-webkit-file-upload-button {
4949
font-family: inherit
5050
}
51+
52+
Emoji {
53+
font-family: NotoColorEmoji
54+
}

styles/base/markdown.mcss

-12
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,6 @@ Markdown {
5959
margin: 0
6060
}
6161
}
62-
(img.emoji) {
63-
width: 1.5em
64-
height: 1.5em
65-
align-content: center
66-
margin-bottom: -0.3em
67-
68-
-large {
69-
width: 3rem
70-
height: 3rem
71-
}
72-
}
73-
7462
-fullCode {
7563
(pre) {
7664
max-height: none

0 commit comments

Comments
 (0)