From a8e7e10f6100e17928008df0e4fb51201f296682 Mon Sep 17 00:00:00 2001 From: ewwwwwwww Date: Sun, 3 Jul 2022 01:12:57 -0700 Subject: [PATCH] new emojifier --- app/soapbox/features/emoji/emoji.js | 99 -------- app/soapbox/features/emoji/emoji.ts | 165 +++++++++++++ .../features/emoji/emoji_compressed.js | 6 +- package.json | 5 +- types/emoji-mart/index.d.ts | 12 + yarn.lock | 228 +++++++++++++++--- 6 files changed, 372 insertions(+), 143 deletions(-) delete mode 100644 app/soapbox/features/emoji/emoji.js create mode 100644 app/soapbox/features/emoji/emoji.ts diff --git a/app/soapbox/features/emoji/emoji.js b/app/soapbox/features/emoji/emoji.js deleted file mode 100644 index 2607c91a9..000000000 --- a/app/soapbox/features/emoji/emoji.js +++ /dev/null @@ -1,99 +0,0 @@ -import Trie from 'substring-trie'; - -import { joinPublicPath } from 'soapbox/utils/static'; - -import unicodeMapping from './emoji_unicode_mapping_light'; - -const trie = new Trie(Object.keys(unicodeMapping)); - -const emojify = (str, customEmojis = {}, autoplay = false) => { - const tagCharsWithoutEmojis = '<&'; - const tagCharsWithEmojis = Object.keys(customEmojis).length ? '<&:' : '<&'; - let rtn = '', tagChars = tagCharsWithEmojis, invisible = 0; - for (;;) { - let match, i = 0, tag; - while (i < str.length && (tag = tagChars.indexOf(str[i])) === -1 && (invisible || !(match = trie.search(str.slice(i))))) { - i += str.codePointAt(i) < 65536 ? 1 : 2; - } - let rend, replacement = ''; - if (i === str.length) { - break; - } else if (str[i] === ':') { - // FIXME: This is insane. - /* eslint-disable no-loop-func */ - if (!(() => { - rend = str.indexOf(':', i + 1) + 1; - if (!rend) return false; // no pair of ':' - const lt = str.indexOf('<', i + 1); - if (!(lt === -1 || lt >= rend)) return false; // tag appeared before closing ':' - const shortname = str.slice(i, rend); - // now got a replacee as ':shortname:' - // if you want additional emoji handler, add statements below which set replacement and return true. - if (shortname in customEmojis) { - const filename = autoplay ? customEmojis[shortname].url : customEmojis[shortname].static_url; - replacement = `${shortname}`; - return true; - } - return false; - })()) rend = ++i; - /* eslint-enable no-loop-func */ - } else if (tag >= 0) { // <, & - rend = str.indexOf('>;'[tag], i + 1) + 1; - if (!rend) { - break; - } - if (tag === 0) { - if (invisible) { - if (str[i + 1] === '/') { // closing tag - if (!--invisible) { - tagChars = tagCharsWithEmojis; - } - } else if (str[rend - 2] !== '/') { // opening tag - invisible++; - } - } else { - if (str.startsWith('