summaryrefslogtreecommitdiffstats
path: root/webapp/utils/emoticons.jsx
diff options
context:
space:
mode:
authorHarrison Healey <harrisonmhealey@gmail.com>2016-05-09 03:17:26 -0400
committerCorey Hulen <corey@hulen.com>2016-05-09 00:17:26 -0700
commit761f59645dfcb55f13570ba0b05cf22c5333b084 (patch)
tree0b4e800172f4960c2f52908e1db79d6b20cf2b21 /webapp/utils/emoticons.jsx
parente8b3e0a7bc0e51df0532280f56d4fd9a97f138cc (diff)
downloadchat-761f59645dfcb55f13570ba0b05cf22c5333b084.tar.gz
chat-761f59645dfcb55f13570ba0b05cf22c5333b084.tar.bz2
chat-761f59645dfcb55f13570ba0b05cf22c5333b084.zip
PLT-2816 Fixed handling of Unicode 8 emojis (#2924)
* Updated twemoji to properly recognize Unicode 8.0 emojis * Updated unicode emoji parser to only render emojis we support as images * Corrected filename for South African flag emoji * Added Mattermost emoticons! * Added additional emoticons to test files
Diffstat (limited to 'webapp/utils/emoticons.jsx')
-rw-r--r--webapp/utils/emoticons.jsx41
1 files changed, 31 insertions, 10 deletions
diff --git a/webapp/utils/emoticons.jsx b/webapp/utils/emoticons.jsx
index 86f7a5b7b..505e10c19 100644
--- a/webapp/utils/emoticons.jsx
+++ b/webapp/utils/emoticons.jsx
@@ -29,10 +29,12 @@ const emoticonPatterns = {
thumbsdown: /(^|\s)(:\-1:)(?=$|\s)/g // :-1:
};
-export const emoticons = initializeEmoticons();
+let emoticonsByName;
+let emoticonsByCodePoint;
function initializeEmoticons() {
- const emoticonMap = new Map();
+ emoticonsByName = new Map();
+ emoticonsByCodePoint = new Set();
for (const emoji of emojis) {
const unicode = emoji.emoji;
@@ -40,6 +42,8 @@ function initializeEmoticons() {
let filename = '';
if (unicode) {
// this is a unicode emoji so the character code determines the file name
+ let codepoint = '';
+
for (let i = 0; i < unicode.length; i += 2) {
const code = fixedCharCodeAt(unicode, i);
@@ -50,25 +54,26 @@ function initializeEmoticons() {
// some emoji (such as country flags) span multiple unicode characters
if (i !== 0) {
- filename += '-';
+ codepoint += '-';
}
- filename += pad(code.toString(16));
+ codepoint += pad(code.toString(16));
}
+
+ filename = codepoint;
+ emoticonsByCodePoint.add(codepoint);
} else {
// this isn't a unicode emoji so the first alias determines the file name
filename = emoji.aliases[0];
}
for (const alias of emoji.aliases) {
- emoticonMap.set(alias, {
+ emoticonsByName.set(alias, {
alias,
path: getImagePathForEmoticon(filename)
});
}
}
-
- return emoticonMap;
}
// Pads a hexadecimal number with zeroes to be at least 4 digits long
@@ -110,14 +115,30 @@ function fixedCharCodeAt(str, idx = 0) {
return code;
}
+export function getEmoticonsByName() {
+ if (!emoticonsByName) {
+ initializeEmoticons();
+ }
+
+ return emoticonsByName;
+}
+
+export function getEmoticonsByCodePoint() {
+ if (!emoticonsByCodePoint) {
+ initializeEmoticons();
+ }
+
+ return emoticonsByCodePoint;
+}
+
export function handleEmoticons(text, tokens) {
let output = text;
function replaceEmoticonWithToken(fullMatch, prefix, matchText, name) {
- if (emoticons.has(name)) {
+ if (getEmoticonsByName().has(name)) {
const index = tokens.size;
const alias = `MM_EMOTICON${index}`;
- const path = emoticons.get(name).path;
+ const path = getEmoticonsByName().get(name).path;
tokens.set(alias, {
value: `<img align="absmiddle" alt="${matchText}" class="emoticon" src="${path}" title="${matchText}" />`,
@@ -141,6 +162,6 @@ export function handleEmoticons(text, tokens) {
return output;
}
-function getImagePathForEmoticon(name) {
+export function getImagePathForEmoticon(name) {
return Constants.EMOJI_PATH + '/' + name + '.png';
}