Prechádzať zdrojové kódy

Re-generate emoji picker, fix bug with missing modifiers

This fixes the insertion of "keycap numbers" as well as of some emoji
that contained the emoji modifier in the middle of the codepoint chain.
Danilo Bargen 5 rokov pred
rodič
commit
79ff5d6454

+ 220 - 51
src/helpers/emoji.ts

@@ -1151,6 +1151,7 @@ const SHORTNAMES = {
     'jeans': '👖',
     'jigsaw': '🧩',
     'jolly_roger': '🏴‍☠️',
+    'joy': '😂',
     'joyful': '😂',
     'joyful_cat': '😹',
     'joystick': '🕹️',
@@ -1284,12 +1285,6 @@ const SHORTNAMES = {
     'man_biking_tone3': '🚴🏽‍♂️',
     'man_biking_tone4': '🚴🏾‍♂️',
     'man_biking_tone5': '🚴🏿‍♂️',
-    'man_bouncing_ball': '⛹️‍♂️',
-    'man_bouncing_ball_tone1': '⛹🏻‍♂️',
-    'man_bouncing_ball_tone2': '⛹🏼‍♂️',
-    'man_bouncing_ball_tone3': '⛹🏽‍♂️',
-    'man_bouncing_ball_tone4': '⛹🏾‍♂️',
-    'man_bouncing_ball_tone5': '⛹🏿‍♂️',
     'man_bowing': '🙇‍♂️',
     'man_bowing_tone1': '🙇🏻‍♂️',
     'man_bowing_tone2': '🙇🏼‍♂️',
@@ -1338,12 +1333,6 @@ const SHORTNAMES = {
     'man_deaf_tone3': '🧏🏽‍♂️',
     'man_deaf_tone4': '🧏🏾‍♂️',
     'man_deaf_tone5': '🧏🏿‍♂️',
-    'man_detective': '🕵️‍♂️',
-    'man_detective_tone1': '🕵🏻‍♂️',
-    'man_detective_tone2': '🕵🏼‍♂️',
-    'man_detective_tone3': '🕵🏽‍♂️',
-    'man_detective_tone4': '🕵🏾‍♂️',
-    'man_detective_tone5': '🕵🏿‍♂️',
     'man_elf': '🧝‍♂️',
     'man_elf_tone1': '🧝🏻‍♂️',
     'man_elf_tone2': '🧝🏼‍♂️',
@@ -1411,12 +1400,6 @@ const SHORTNAMES = {
     'man_getting_haircut_tone3': '💇🏽‍♂️',
     'man_getting_haircut_tone4': '💇🏾‍♂️',
     'man_getting_haircut_tone5': '💇🏿‍♂️',
-    'man_golfing': '🏌️‍♂️',
-    'man_golfing_tone1': '🏌🏻‍♂️',
-    'man_golfing_tone2': '🏌🏼‍♂️',
-    'man_golfing_tone3': '🏌🏽‍♂️',
-    'man_golfing_tone4': '🏌🏾‍♂️',
-    'man_golfing_tone5': '🏌🏿‍♂️',
     'man_guard': '💂‍♂️',
     'man_guard_tone1': '💂🏻‍♂️',
     'man_guard_tone2': '💂🏼‍♂️',
@@ -1459,12 +1442,6 @@ const SHORTNAMES = {
     'man_kneeling_tone3': '🧎🏽‍♂️',
     'man_kneeling_tone4': '🧎🏾‍♂️',
     'man_kneeling_tone5': '🧎🏿‍♂️',
-    'man_lifting_weights': '🏋️‍♂️',
-    'man_lifting_weights_tone1': '🏋🏻‍♂️',
-    'man_lifting_weights_tone2': '🏋🏼‍♂️',
-    'man_lifting_weights_tone3': '🏋🏽‍♂️',
-    'man_lifting_weights_tone4': '🏋🏾‍♂️',
-    'man_lifting_weights_tone5': '🏋🏿‍♂️',
     'man_lotus_position': '🧘‍♂️',
     'man_lotus_position_tone1': '🧘🏻‍♂️',
     'man_lotus_position_tone2': '🧘🏼‍♂️',
@@ -2712,12 +2689,6 @@ const SHORTNAMES = {
     'woman_biking_tone3': '🚴🏽‍♀️',
     'woman_biking_tone4': '🚴🏾‍♀️',
     'woman_biking_tone5': '🚴🏿‍♀️',
-    'woman_bouncing_ball': '⛹️‍♀️',
-    'woman_bouncing_ball_tone1': '⛹🏻‍♀️',
-    'woman_bouncing_ball_tone2': '⛹🏼‍♀️',
-    'woman_bouncing_ball_tone3': '⛹🏽‍♀️',
-    'woman_bouncing_ball_tone4': '⛹🏾‍♀️',
-    'woman_bouncing_ball_tone5': '⛹🏿‍♀️',
     'woman_bowing': '🙇‍♀️',
     'woman_bowing_tone1': '🙇🏻‍♀️',
     'woman_bowing_tone2': '🙇🏼‍♀️',
@@ -2760,12 +2731,6 @@ const SHORTNAMES = {
     'woman_deaf_tone3': '🧏🏽‍♀️',
     'woman_deaf_tone4': '🧏🏾‍♀️',
     'woman_deaf_tone5': '🧏🏿‍♀️',
-    'woman_detective': '🕵️‍♀️',
-    'woman_detective_tone1': '🕵🏻‍♀️',
-    'woman_detective_tone2': '🕵🏼‍♀️',
-    'woman_detective_tone3': '🕵🏽‍♀️',
-    'woman_detective_tone4': '🕵🏾‍♀️',
-    'woman_detective_tone5': '🕵🏿‍♀️',
     'woman_elf': '🧝‍♀️',
     'woman_elf_tone1': '🧝🏻‍♀️',
     'woman_elf_tone2': '🧝🏼‍♀️',
@@ -2833,12 +2798,6 @@ const SHORTNAMES = {
     'woman_getting_haircut_tone3': '💇🏽‍♀️',
     'woman_getting_haircut_tone4': '💇🏾‍♀️',
     'woman_getting_haircut_tone5': '💇🏿‍♀️',
-    'woman_golfing': '🏌️‍♀️',
-    'woman_golfing_tone1': '🏌🏻‍♀️',
-    'woman_golfing_tone2': '🏌🏼‍♀️',
-    'woman_golfing_tone3': '🏌🏽‍♀️',
-    'woman_golfing_tone4': '🏌🏾‍♀️',
-    'woman_golfing_tone5': '🏌🏿‍♀️',
     'woman_guard': '💂‍♀️',
     'woman_guard_tone1': '💂🏻‍♀️',
     'woman_guard_tone2': '💂🏼‍♀️',
@@ -2887,12 +2846,6 @@ const SHORTNAMES = {
     'woman_kneeling_tone3': '🧎🏽‍♀️',
     'woman_kneeling_tone4': '🧎🏾‍♀️',
     'woman_kneeling_tone5': '🧎🏿‍♀️',
-    'woman_lifting_weights': '🏋️‍♀️',
-    'woman_lifting_weights_tone1': '🏋🏻‍♀️',
-    'woman_lifting_weights_tone2': '🏋🏼‍♀️',
-    'woman_lifting_weights_tone3': '🏋🏽‍♀️',
-    'woman_lifting_weights_tone4': '🏋🏾‍♀️',
-    'woman_lifting_weights_tone5': '🏋🏿‍♀️',
     'woman_lotus_position': '🧘‍♀️',
     'woman_lotus_position_tone1': '🧘🏻‍♀️',
     'woman_lotus_position_tone2': '🧘🏼‍♀️',
@@ -3122,6 +3075,216 @@ const SHORTNAMES = {
     'zzz': '💤',
 };
 
+// Generated with tools/twemoji/generate-textdefault-emoji.py
+const TEXT_DEFAULT_EMOJI = [
+    '1f170',
+    '1f171',
+    '1f17e',
+    '1f17f',
+    '1f202',
+    '1f237',
+    '1f321',
+    '1f324',
+    '1f325',
+    '1f326',
+    '1f327',
+    '1f328',
+    '1f329',
+    '1f32a',
+    '1f32b',
+    '1f32c',
+    '1f336',
+    '1f37d',
+    '1f396',
+    '1f397',
+    '1f399',
+    '1f39a',
+    '1f39b',
+    '1f39e',
+    '1f39f',
+    '1f3cb',
+    '1f3cc',
+    '1f3cd',
+    '1f3ce',
+    '1f3d4',
+    '1f3d5',
+    '1f3d6',
+    '1f3d7',
+    '1f3d8',
+    '1f3d9',
+    '1f3da',
+    '1f3db',
+    '1f3dc',
+    '1f3dd',
+    '1f3de',
+    '1f3df',
+    '1f3f3',
+    '1f3f5',
+    '1f3f7',
+    '1f43f',
+    '1f441',
+    '1f4fd',
+    '1f549',
+    '1f54a',
+    '1f56f',
+    '1f570',
+    '1f573',
+    '1f574',
+    '1f575',
+    '1f576',
+    '1f577',
+    '1f578',
+    '1f579',
+    '1f587',
+    '1f58a',
+    '1f58b',
+    '1f58c',
+    '1f58d',
+    '1f590',
+    '1f5a5',
+    '1f5a8',
+    '1f5b1',
+    '1f5b2',
+    '1f5bc',
+    '1f5c2',
+    '1f5c3',
+    '1f5c4',
+    '1f5d1',
+    '1f5d2',
+    '1f5d3',
+    '1f5dc',
+    '1f5dd',
+    '1f5de',
+    '1f5e1',
+    '1f5e3',
+    '1f5e8',
+    '1f5ef',
+    '1f5f3',
+    '1f5fa',
+    '1f6cb',
+    '1f6cd',
+    '1f6ce',
+    '1f6cf',
+    '1f6e0',
+    '1f6e1',
+    '1f6e2',
+    '1f6e3',
+    '1f6e4',
+    '1f6e5',
+    '1f6e9',
+    '1f6f0',
+    '1f6f3',
+    '203c',
+    '2049',
+    '2122',
+    '2139',
+    '2194',
+    '2195',
+    '2196',
+    '2197',
+    '2198',
+    '2199',
+    '21a9',
+    '21aa',
+    '2328',
+    '23cf',
+    '23ed',
+    '23ee',
+    '23ef',
+    '23f1',
+    '23f2',
+    '23f8',
+    '23f9',
+    '23fa',
+    '24c2',
+    '25aa',
+    '25ab',
+    '25b6',
+    '25c0',
+    '25fb',
+    '25fc',
+    '2600',
+    '2601',
+    '2602',
+    '2603',
+    '2604',
+    '260e',
+    '2611',
+    '2618',
+    '261d',
+    '2620',
+    '2622',
+    '2623',
+    '2626',
+    '262a',
+    '262e',
+    '262f',
+    '2638',
+    '2639',
+    '263a',
+    '2640',
+    '2642',
+    '265f',
+    '2660',
+    '2663',
+    '2665',
+    '2666',
+    '2668',
+    '267b',
+    '267e',
+    '2692',
+    '2694',
+    '2695',
+    '2696',
+    '2697',
+    '2699',
+    '269b',
+    '269c',
+    '26a0',
+    '26b0',
+    '26b1',
+    '26c8',
+    '26cf',
+    '26d1',
+    '26d3',
+    '26e9',
+    '26f0',
+    '26f1',
+    '26f4',
+    '26f7',
+    '26f8',
+    '26f9',
+    '2702',
+    '2708',
+    '2709',
+    '270c',
+    '270d',
+    '270f',
+    '2712',
+    '2714',
+    '2716',
+    '271d',
+    '2721',
+    '2733',
+    '2734',
+    '2744',
+    '2747',
+    '2763',
+    '2764',
+    '27a1',
+    '2934',
+    '2935',
+    '2b05',
+    '2b06',
+    '2b07',
+    '3030',
+    '303d',
+    '3297',
+    '3299',
+    'a9',
+    'ae',
+];
+
 // Characters that should never be matches as emoji when unqualified.
 const TEXT_WHEN_UNQUALIFIED = ['©', '®', '™'];
 
@@ -3184,11 +3347,17 @@ export function parseEmoji(text: string): Array<threema.EmojiInfo | string> {
         if (forceText) {
             result.push(emoji);
         } else {
-            const codepoint = twemoji.convert.toCodePoint(emoji);
-            const strippedCodepoint = codepoint.replace(/-fe0[ef]$/, '');
+            const codepoint = twemoji.convert.toCodePoint(emoji)
+                // Because for some reason twemoji filenames don't include the
+                // emoji specifier in the keycap signs, remove it manually.
+                .replace(/-fe0[ef]-20e3$/, '-20e3');
+            const strippedCodepoint = codepoint
+                .replace(/-fe0[ef]$/, '');
+            const isTextDefault = TEXT_DEFAULT_EMOJI.includes(codepoint)
+                               || TEXT_DEFAULT_EMOJI.includes(strippedCodepoint);
             result.push({
                 emojiString: emoji,
-                imgPath: `emoji/png32/${strippedCodepoint}.png`,
+                imgPath: `emoji/png32/${isTextDefault ? strippedCodepoint : codepoint}.png`,
                 codepoint: codepoint,
             });
         }

+ 65 - 65
src/partials/emoji-picker.html

@@ -23,7 +23,7 @@
             <span class="em em-people-1f929" role="option" tabindex="0" data-c="1f929" data-s=":starstruck:" title="star-struck">&#x1f929;</span>
             <span class="em em-people-1f618" role="option" tabindex="0" data-c="1f618" data-s=":flirty:" title="face blowing a kiss">&#x1f618;</span>
             <span class="em em-people-1f617" role="option" tabindex="0" data-c="1f617" data-s=":kiss:" title="kissing face">&#x1f617;</span>
-            <span class="em em-people-263a" role="option" tabindex="0" data-c="263a" data-s=":relaxed:" title="smiling face">&#x263a;</span>
+            <span class="em em-people-263a" role="option" tabindex="0" data-c="263a" data-s=":relaxed:" title="smiling face">&#x263a;&#xfe0f;</span>
             <span class="em em-people-1f61a" role="option" tabindex="0" data-c="1f61a" data-s=":loving_kiss:" title="kissing face with closed eyes">&#x1f61a;</span>
             <span class="em em-people-1f619" role="option" tabindex="0" data-c="1f619" data-s=":happy_kiss:" title="kissing face with smiling eyes">&#x1f619;</span>
             <span class="em em-people-1f60b" role="option" tabindex="0" data-c="1f60b" data-s=":yum:" title="face savoring food">&#x1f60b;</span>
@@ -70,7 +70,7 @@
             <span class="em em-people-1f615" role="option" tabindex="0" data-c="1f615" data-s=":confused:" title="confused face">&#x1f615;</span>
             <span class="em em-people-1f61f" role="option" tabindex="0" data-c="1f61f" data-s=":worried:" title="worried face">&#x1f61f;</span>
             <span class="em em-people-1f641" role="option" tabindex="0" data-c="1f641" data-s=":cheerless:" title="slightly frowning face">&#x1f641;</span>
-            <span class="em em-people-2639" role="option" tabindex="0" data-c="2639" data-s=":sad:" title="frowning face">&#x2639;</span>
+            <span class="em em-people-2639" role="option" tabindex="0" data-c="2639" data-s=":sad:" title="frowning face">&#x2639;&#xfe0f;</span>
             <span class="em em-people-1f62e" role="option" tabindex="0" data-c="1f62e" data-s=":surprised:" title="face with open mouth">&#x1f62e;</span>
             <span class="em em-people-1f62f" role="option" tabindex="0" data-c="1f62f" data-s=":hushed:" title="hushed face">&#x1f62f;</span>
             <span class="em em-people-1f632" role="option" tabindex="0" data-c="1f632" data-s=":astonished:" title="astonished face">&#x1f632;</span>
@@ -129,9 +129,9 @@
             <span class="em em-people-1f49e" role="option" tabindex="0" data-c="1f49e" data-s=":revolving_hearts:" title="revolving hearts">&#x1f49e;</span>
             <span class="em em-people-1f495" role="option" tabindex="0" data-c="1f495" data-s=":two_hearts:" title="two hearts">&#x1f495;</span>
             <span class="em em-people-1f49f" role="option" tabindex="0" data-c="1f49f" data-s=":heart_decoration:" title="heart decoration">&#x1f49f;</span>
-            <span class="em em-people-2763" role="option" tabindex="0" data-c="2763" data-s=":heart_exclamation:" title="heart exclamation">&#x2763;</span>
+            <span class="em em-people-2763" role="option" tabindex="0" data-c="2763" data-s=":heart_exclamation:" title="heart exclamation">&#x2763;&#xfe0f;</span>
             <span class="em em-people-1f494" role="option" tabindex="0" data-c="1f494" data-s=":broken_heart:" title="broken heart">&#x1f494;</span>
-            <span class="em em-people-2764" role="option" tabindex="0" data-c="2764" data-s=":heart:" title="red heart">&#x2764;</span>
+            <span class="em em-people-2764" role="option" tabindex="0" data-c="2764" data-s=":heart:" title="red heart">&#x2764;&#xfe0f;</span>
             <span class="em em-people-1f9e1" role="option" tabindex="0" data-c="1f9e1" data-s=":orange_heart:" title="orange heart">&#x1f9e1;</span>
             <span class="em em-people-1f49b" role="option" tabindex="0" data-c="1f49b" data-s=":yellow_heart:" title="yellow heart">&#x1f49b;</span>
             <span class="em em-people-1f49a" role="option" tabindex="0" data-c="1f49a" data-s=":green_heart:" title="green heart">&#x1f49a;</span>
@@ -149,7 +149,7 @@
             <span class="em em-people-1f573" role="option" tabindex="0" data-c="1f573" data-s=":hole:" title="hole">&#x1f573;&#xfe0f;</span>
             <span class="em em-people-1f4a3" role="option" tabindex="0" data-c="1f4a3" data-s=":bomb:" title="bomb">&#x1f4a3;</span>
             <span class="em em-people-1f4ac" role="option" tabindex="0" data-c="1f4ac" data-s=":speech:" title="speech balloon">&#x1f4ac;</span>
-            <span class="em em-people-1f441-200d-1f5e8" role="option" tabindex="0" data-c="1f441-200d-1f5e8" data-s=":eye_bubble:" title="eye in speech bubble">&#x1f441;&#x200d;&#x1f5e8;</span>
+            <span class="em em-people-1f441-200d-1f5e8" role="option" tabindex="0" data-c="1f441-fe0f-200d-1f5e8-fe0f" data-s=":eye_bubble:" title="eye in speech bubble">&#x1f441;&#xfe0f;&#x200d;&#x1f5e8;&#xfe0f;</span>
             <span class="em em-people-1f5e8" role="option" tabindex="0" data-c="1f5e8" data-s=":left_speech:" title="left speech bubble">&#x1f5e8;&#xfe0f;</span>
             <span class="em em-people-1f5ef" role="option" tabindex="0" data-c="1f5ef" data-s=":right_anger_speech:" title="right anger bubble">&#x1f5ef;&#xfe0f;</span>
             <span class="em em-people-1f4ad" role="option" tabindex="0" data-c="1f4ad" data-s=":thought:" title="thought balloon">&#x1f4ad;</span>
@@ -196,7 +196,7 @@
             <span class="em em-people-1f90f-1f3fd" role="option" tabindex="0" data-c="1f90f-1f3fd" data-s=":pinch_tone3:" data-t="3" title="pinching hand: medium skin tone">&#x1f90f;&#x1f3fd;</span>
             <span class="em em-people-1f90f-1f3fe" role="option" tabindex="0" data-c="1f90f-1f3fe" data-s=":pinch_tone4:" data-t="4" title="pinching hand: medium-dark skin tone">&#x1f90f;&#x1f3fe;</span>
             <span class="em em-people-1f90f-1f3ff" role="option" tabindex="0" data-c="1f90f-1f3ff" data-s=":pinch_tone5:" data-t="5" title="pinching hand: dark skin tone">&#x1f90f;&#x1f3ff;</span>
-            <span class="em em-people-270c" role="option" tabindex="0" data-c="270c" data-s=":victory:" data-t="0" title="victory hand">&#x270c;</span>
+            <span class="em em-people-270c" role="option" tabindex="0" data-c="270c" data-s=":victory:" data-t="0" title="victory hand">&#x270c;&#xfe0f;</span>
             <span class="em em-people-270c-1f3fb" role="option" tabindex="0" data-c="270c-1f3fb" data-s=":victory_tone1:" data-t="1" title="victory hand: light skin tone">&#x270c;&#x1f3fb;</span>
             <span class="em em-people-270c-1f3fc" role="option" tabindex="0" data-c="270c-1f3fc" data-s=":victory_tone2:" data-t="2" title="victory hand: medium-light skin tone">&#x270c;&#x1f3fc;</span>
             <span class="em em-people-270c-1f3fd" role="option" tabindex="0" data-c="270c-1f3fd" data-s=":victory_tone3:" data-t="3" title="victory hand: medium skin tone">&#x270c;&#x1f3fd;</span>
@@ -256,7 +256,7 @@
             <span class="em em-people-1f447-1f3fd" role="option" tabindex="0" data-c="1f447-1f3fd" data-s=":point_down_tone3:" data-t="3" title="backhand index pointing down: medium skin tone">&#x1f447;&#x1f3fd;</span>
             <span class="em em-people-1f447-1f3fe" role="option" tabindex="0" data-c="1f447-1f3fe" data-s=":point_down_tone4:" data-t="4" title="backhand index pointing down: medium-dark skin tone">&#x1f447;&#x1f3fe;</span>
             <span class="em em-people-1f447-1f3ff" role="option" tabindex="0" data-c="1f447-1f3ff" data-s=":point_down_tone5:" data-t="5" title="backhand index pointing down: dark skin tone">&#x1f447;&#x1f3ff;</span>
-            <span class="em em-people-261d" role="option" tabindex="0" data-c="261d" data-s=":point_up:" data-t="0" title="index pointing up">&#x261d;</span>
+            <span class="em em-people-261d" role="option" tabindex="0" data-c="261d" data-s=":point_up:" data-t="0" title="index pointing up">&#x261d;&#xfe0f;</span>
             <span class="em em-people-261d-1f3fb" role="option" tabindex="0" data-c="261d-1f3fb" data-s=":point_up_tone1:" data-t="1" title="index pointing up: light skin tone">&#x261d;&#x1f3fb;</span>
             <span class="em em-people-261d-1f3fc" role="option" tabindex="0" data-c="261d-1f3fc" data-s=":point_up_tone2:" data-t="2" title="index pointing up: medium-light skin tone">&#x261d;&#x1f3fc;</span>
             <span class="em em-people-261d-1f3fd" role="option" tabindex="0" data-c="261d-1f3fd" data-s=":point_up_tone3:" data-t="3" title="index pointing up: medium skin tone">&#x261d;&#x1f3fd;</span>
@@ -329,7 +329,7 @@
             <span class="em em-people-1f64f-1f3fd" role="option" tabindex="0" data-c="1f64f-1f3fd" data-s=":pray_tone3:" data-t="3" title="folded hands: medium skin tone">&#x1f64f;&#x1f3fd;</span>
             <span class="em em-people-1f64f-1f3fe" role="option" tabindex="0" data-c="1f64f-1f3fe" data-s=":pray_tone4:" data-t="4" title="folded hands: medium-dark skin tone">&#x1f64f;&#x1f3fe;</span>
             <span class="em em-people-1f64f-1f3ff" role="option" tabindex="0" data-c="1f64f-1f3ff" data-s=":pray_tone5:" data-t="5" title="folded hands: dark skin tone">&#x1f64f;&#x1f3ff;</span>
-            <span class="em em-people-270d" role="option" tabindex="0" data-c="270d" data-s=":writing_hand:" data-t="0" title="writing hand">&#x270d;</span>
+            <span class="em em-people-270d" role="option" tabindex="0" data-c="270d" data-s=":writing_hand:" data-t="0" title="writing hand">&#x270d;&#xfe0f;</span>
             <span class="em em-people-270d-1f3fb" role="option" tabindex="0" data-c="270d-1f3fb" data-s=":writing_hand_tone1:" data-t="1" title="writing hand: light skin tone">&#x270d;&#x1f3fb;</span>
             <span class="em em-people-270d-1f3fc" role="option" tabindex="0" data-c="270d-1f3fc" data-s=":writing_hand_tone2:" data-t="2" title="writing hand: medium-light skin tone">&#x270d;&#x1f3fc;</span>
             <span class="em em-people-270d-1f3fd" role="option" tabindex="0" data-c="270d-1f3fd" data-s=":writing_hand_tone3:" data-t="3" title="writing hand: medium skin tone">&#x270d;&#x1f3fd;</span>
@@ -434,12 +434,6 @@
             <span class="em em-people-1f9d4-1f3fd" role="option" tabindex="0" data-c="1f9d4-1f3fd" data-s=":bearded_person_tone3:" data-t="3" title="man: medium skin tone, beard">&#x1f9d4;&#x1f3fd;</span>
             <span class="em em-people-1f9d4-1f3fe" role="option" tabindex="0" data-c="1f9d4-1f3fe" data-s=":bearded_person_tone4:" data-t="4" title="man: medium-dark skin tone, beard">&#x1f9d4;&#x1f3fe;</span>
             <span class="em em-people-1f9d4-1f3ff" role="option" tabindex="0" data-c="1f9d4-1f3ff" data-s=":bearded_person_tone5:" data-t="5" title="man: dark skin tone, beard">&#x1f9d4;&#x1f3ff;</span>
-            <span class="em em-people-1f471-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-200d-2642-fe0f" data-s=":blond_man:" data-t="0" title="man: blond hair">&#x1f471;&#x200d;&#x2642;&#xfe0f;</span>
-            <span class="em em-people-1f471-1f3fb-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-1f3fb-200d-2642-fe0f" data-s=":blond_man_tone1:" data-t="1" title="man: light skin tone, blond hair">&#x1f471;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;</span>
-            <span class="em em-people-1f471-1f3fc-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-1f3fc-200d-2642-fe0f" data-s=":blond_man_tone2:" data-t="2" title="man: medium-light skin tone, blond hair">&#x1f471;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;</span>
-            <span class="em em-people-1f471-1f3fd-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-1f3fd-200d-2642-fe0f" data-s=":blond_man_tone3:" data-t="3" title="man: medium skin tone, blond hair">&#x1f471;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;</span>
-            <span class="em em-people-1f471-1f3fe-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-1f3fe-200d-2642-fe0f" data-s=":blond_man_tone4:" data-t="4" title="man: medium-dark skin tone, blond hair">&#x1f471;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;</span>
-            <span class="em em-people-1f471-1f3ff-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-1f3ff-200d-2642-fe0f" data-s=":blond_man_tone5:" data-t="5" title="man: dark skin tone, blond hair">&#x1f471;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;</span>
             <span class="em em-people-1f468-200d-1f9b0" role="option" tabindex="0" data-c="1f468-200d-1f9b0" data-s=":red_haired_man:" data-t="0" title="man: red hair">&#x1f468;&#x200d;&#x1f9b0;</span>
             <span class="em em-people-1f468-1f3fb-200d-1f9b0" role="option" tabindex="0" data-c="1f468-1f3fb-200d-1f9b0" data-s=":red_haired_man_tone1:" data-t="1" title="man: light skin tone, red hair">&#x1f468;&#x1f3fb;&#x200d;&#x1f9b0;</span>
             <span class="em em-people-1f468-1f3fc-200d-1f9b0" role="option" tabindex="0" data-c="1f468-1f3fc-200d-1f9b0" data-s=":red_haired_man_tone2:" data-t="2" title="man: medium-light skin tone, red hair">&#x1f468;&#x1f3fc;&#x200d;&#x1f9b0;</span>
@@ -470,12 +464,6 @@
             <span class="em em-people-1f469-1f3fd" role="option" tabindex="0" data-c="1f469-1f3fd" data-s=":woman_tone3:" data-t="3" title="woman: medium skin tone">&#x1f469;&#x1f3fd;</span>
             <span class="em em-people-1f469-1f3fe" role="option" tabindex="0" data-c="1f469-1f3fe" data-s=":woman_tone4:" data-t="4" title="woman: medium-dark skin tone">&#x1f469;&#x1f3fe;</span>
             <span class="em em-people-1f469-1f3ff" role="option" tabindex="0" data-c="1f469-1f3ff" data-s=":woman_tone5:" data-t="5" title="woman: dark skin tone">&#x1f469;&#x1f3ff;</span>
-            <span class="em em-people-1f471-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-200d-2640-fe0f" data-s=":blond_woman:" data-t="0" title="woman: blond hair">&#x1f471;&#x200d;&#x2640;&#xfe0f;</span>
-            <span class="em em-people-1f471-1f3fb-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-1f3fb-200d-2640-fe0f" data-s=":blond_woman_tone1:" data-t="1" title="woman: light skin tone, blond hair">&#x1f471;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;</span>
-            <span class="em em-people-1f471-1f3fc-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-1f3fc-200d-2640-fe0f" data-s=":blond_woman_tone2:" data-t="2" title="woman: medium-light skin tone, blond hair">&#x1f471;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;</span>
-            <span class="em em-people-1f471-1f3fd-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-1f3fd-200d-2640-fe0f" data-s=":blond_woman_tone3:" data-t="3" title="woman: medium skin tone, blond hair">&#x1f471;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;</span>
-            <span class="em em-people-1f471-1f3fe-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-1f3fe-200d-2640-fe0f" data-s=":blond_woman_tone4:" data-t="4" title="woman: medium-dark skin tone, blond hair">&#x1f471;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;</span>
-            <span class="em em-people-1f471-1f3ff-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-1f3ff-200d-2640-fe0f" data-s=":blond_woman_tone5:" data-t="5" title="woman: dark skin tone, blond hair">&#x1f471;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;</span>
             <span class="em em-people-1f469-200d-1f9b0" role="option" tabindex="0" data-c="1f469-200d-1f9b0" data-s=":red_haired_woman:" data-t="0" title="woman: red hair">&#x1f469;&#x200d;&#x1f9b0;</span>
             <span class="em em-people-1f469-1f3fb-200d-1f9b0" role="option" tabindex="0" data-c="1f469-1f3fb-200d-1f9b0" data-s=":red_haired_woman_tone1:" data-t="1" title="woman: light skin tone, red hair">&#x1f469;&#x1f3fb;&#x200d;&#x1f9b0;</span>
             <span class="em em-people-1f469-1f3fc-200d-1f9b0" role="option" tabindex="0" data-c="1f469-1f3fc-200d-1f9b0" data-s=":red_haired_woman_tone2:" data-t="2" title="woman: medium-light skin tone, red hair">&#x1f469;&#x1f3fc;&#x200d;&#x1f9b0;</span>
@@ -500,6 +488,18 @@
             <span class="em em-people-1f469-1f3fd-200d-1f9b2" role="option" tabindex="0" data-c="1f469-1f3fd-200d-1f9b2" data-s=":bald_woman_tone3:" data-t="3" title="woman: medium skin tone, bald">&#x1f469;&#x1f3fd;&#x200d;&#x1f9b2;</span>
             <span class="em em-people-1f469-1f3fe-200d-1f9b2" role="option" tabindex="0" data-c="1f469-1f3fe-200d-1f9b2" data-s=":bald_woman_tone4:" data-t="4" title="woman: medium-dark skin tone, bald">&#x1f469;&#x1f3fe;&#x200d;&#x1f9b2;</span>
             <span class="em em-people-1f469-1f3ff-200d-1f9b2" role="option" tabindex="0" data-c="1f469-1f3ff-200d-1f9b2" data-s=":bald_woman_tone5:" data-t="5" title="woman: dark skin tone, bald">&#x1f469;&#x1f3ff;&#x200d;&#x1f9b2;</span>
+            <span class="em em-people-1f471-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-200d-2640-fe0f" data-s=":blond_woman:" data-t="0" title="woman: blond hair">&#x1f471;&#x200d;&#x2640;&#xfe0f;</span>
+            <span class="em em-people-1f471-1f3fb-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-1f3fb-200d-2640-fe0f" data-s=":blond_woman_tone1:" data-t="1" title="woman: light skin tone, blond hair">&#x1f471;&#x1f3fb;&#x200d;&#x2640;&#xfe0f;</span>
+            <span class="em em-people-1f471-1f3fc-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-1f3fc-200d-2640-fe0f" data-s=":blond_woman_tone2:" data-t="2" title="woman: medium-light skin tone, blond hair">&#x1f471;&#x1f3fc;&#x200d;&#x2640;&#xfe0f;</span>
+            <span class="em em-people-1f471-1f3fd-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-1f3fd-200d-2640-fe0f" data-s=":blond_woman_tone3:" data-t="3" title="woman: medium skin tone, blond hair">&#x1f471;&#x1f3fd;&#x200d;&#x2640;&#xfe0f;</span>
+            <span class="em em-people-1f471-1f3fe-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-1f3fe-200d-2640-fe0f" data-s=":blond_woman_tone4:" data-t="4" title="woman: medium-dark skin tone, blond hair">&#x1f471;&#x1f3fe;&#x200d;&#x2640;&#xfe0f;</span>
+            <span class="em em-people-1f471-1f3ff-200d-2640-fe0f" role="option" tabindex="0" data-c="1f471-1f3ff-200d-2640-fe0f" data-s=":blond_woman_tone5:" data-t="5" title="woman: dark skin tone, blond hair">&#x1f471;&#x1f3ff;&#x200d;&#x2640;&#xfe0f;</span>
+            <span class="em em-people-1f471-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-200d-2642-fe0f" data-s=":blond_man:" data-t="0" title="man: blond hair">&#x1f471;&#x200d;&#x2642;&#xfe0f;</span>
+            <span class="em em-people-1f471-1f3fb-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-1f3fb-200d-2642-fe0f" data-s=":blond_man_tone1:" data-t="1" title="man: light skin tone, blond hair">&#x1f471;&#x1f3fb;&#x200d;&#x2642;&#xfe0f;</span>
+            <span class="em em-people-1f471-1f3fc-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-1f3fc-200d-2642-fe0f" data-s=":blond_man_tone2:" data-t="2" title="man: medium-light skin tone, blond hair">&#x1f471;&#x1f3fc;&#x200d;&#x2642;&#xfe0f;</span>
+            <span class="em em-people-1f471-1f3fd-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-1f3fd-200d-2642-fe0f" data-s=":blond_man_tone3:" data-t="3" title="man: medium skin tone, blond hair">&#x1f471;&#x1f3fd;&#x200d;&#x2642;&#xfe0f;</span>
+            <span class="em em-people-1f471-1f3fe-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-1f3fe-200d-2642-fe0f" data-s=":blond_man_tone4:" data-t="4" title="man: medium-dark skin tone, blond hair">&#x1f471;&#x1f3fe;&#x200d;&#x2642;&#xfe0f;</span>
+            <span class="em em-people-1f471-1f3ff-200d-2642-fe0f" role="option" tabindex="0" data-c="1f471-1f3ff-200d-2642-fe0f" data-s=":blond_man_tone5:" data-t="5" title="man: dark skin tone, blond hair">&#x1f471;&#x1f3ff;&#x200d;&#x2642;&#xfe0f;</span>
             <span class="em em-people-1f9d3" role="option" tabindex="0" data-c="1f9d3" data-s=":older_adult:" data-t="0" title="older person">&#x1f9d3;</span>
             <span class="em em-people-1f9d3-1f3fb" role="option" tabindex="0" data-c="1f9d3-1f3fb" data-s=":older_adult_tone1:" data-t="1" title="older person: light skin tone">&#x1f9d3;&#x1f3fb;</span>
             <span class="em em-people-1f9d3-1f3fc" role="option" tabindex="0" data-c="1f9d3-1f3fc" data-s=":older_adult_tone2:" data-t="2" title="older person: medium-light skin tone">&#x1f9d3;&#x1f3fc;</span>
@@ -1780,13 +1780,13 @@
             <span class="em em-activity-1f3b2" role="option" tabindex="0" data-c="1f3b2" data-s=":game_die:" title="game die">&#x1f3b2;</span>
             <span class="em em-activity-1f9e9" role="option" tabindex="0" data-c="1f9e9" data-s=":jigsaw:" title="puzzle piece">&#x1f9e9;</span>
             <span class="em em-activity-1f9f8" role="option" tabindex="0" data-c="1f9f8" data-s=":teddy_bear:" title="teddy bear">&#x1f9f8;</span>
-            <span class="em em-activity-2660" role="option" tabindex="0" data-c="2660" data-s=":spades:" title="spade suit">&#x2660;</span>
-            <span class="em em-activity-2665" role="option" tabindex="0" data-c="2665" data-s=":hearts:" title="heart suit">&#x2665;</span>
-            <span class="em em-activity-2666" role="option" tabindex="0" data-c="2666" data-s=":diamonds:" title="diamond suit">&#x2666;</span>
-            <span class="em em-activity-2663" role="option" tabindex="0" data-c="2663" data-s=":clubs:" title="club suit">&#x2663;</span>
+            <span class="em em-activity-2660" role="option" tabindex="0" data-c="2660" data-s=":spades:" title="spade suit">&#x2660;&#xfe0f;</span>
+            <span class="em em-activity-2665" role="option" tabindex="0" data-c="2665" data-s=":hearts:" title="heart suit">&#x2665;&#xfe0f;</span>
+            <span class="em em-activity-2666" role="option" tabindex="0" data-c="2666" data-s=":diamonds:" title="diamond suit">&#x2666;&#xfe0f;</span>
+            <span class="em em-activity-2663" role="option" tabindex="0" data-c="2663" data-s=":clubs:" title="club suit">&#x2663;&#xfe0f;</span>
             <span class="em em-activity-265f" role="option" tabindex="0" data-c="265f" data-s=":chess_pawn:" title="chess pawn">&#x265f;&#xfe0f;</span>
             <span class="em em-activity-1f0cf" role="option" tabindex="0" data-c="1f0cf" data-s=":black_joker:" title="joker">&#x1f0cf;</span>
-            <span class="em em-activity-1f004" role="option" tabindex="0" data-c="1f004" data-s=":mahjong:" title="mahjong red dragon">&#x1f004;&#xfe0f;</span>
+            <span class="em em-activity-1f004" role="option" tabindex="0" data-c="1f004" data-s=":mahjong:" title="mahjong red dragon">&#x1f004;</span>
             <span class="em em-activity-1f3b4" role="option" tabindex="0" data-c="1f3b4" data-s=":flower_cards:" title="flower playing cards">&#x1f3b4;</span>
             <span class="em em-activity-1f3ad" role="option" tabindex="0" data-c="1f3ad" data-s=":performing_arts:" title="performing arts">&#x1f3ad;</span>
             <span class="em em-activity-1f5bc" role="option" tabindex="0" data-c="1f5bc" data-s=":frame_photo:" title="framed picture">&#x1f5bc;&#xfe0f;</span>
@@ -1918,7 +1918,7 @@
             <span class="em em-travel-26f4" role="option" tabindex="0" data-c="26f4" data-s=":ferry:" title="ferry">&#x26f4;&#xfe0f;</span>
             <span class="em em-travel-1f6e5" role="option" tabindex="0" data-c="1f6e5" data-s=":motorboat:" title="motor boat">&#x1f6e5;&#xfe0f;</span>
             <span class="em em-travel-1f6a2" role="option" tabindex="0" data-c="1f6a2" data-s=":ship:" title="ship">&#x1f6a2;</span>
-            <span class="em em-travel-2708" role="option" tabindex="0" data-c="2708" data-s=":airplane:" title="airplane">&#x2708;</span>
+            <span class="em em-travel-2708" role="option" tabindex="0" data-c="2708" data-s=":airplane:" title="airplane">&#x2708;&#xfe0f;</span>
             <span class="em em-travel-1f6e9" role="option" tabindex="0" data-c="1f6e9" data-s=":small_airplane:" title="small airplane">&#x1f6e9;&#xfe0f;</span>
             <span class="em em-travel-1f6eb" role="option" tabindex="0" data-c="1f6eb" data-s=":airplane_departure:" title="airplane departure">&#x1f6eb;</span>
             <span class="em em-travel-1f6ec" role="option" tabindex="0" data-c="1f6ec" data-s=":airplane_arriving:" title="airplane arrival">&#x1f6ec;</span>
@@ -1981,11 +1981,11 @@
             <span class="em em-travel-1f31d" role="option" tabindex="0" data-c="1f31d" data-s=":full_moon_face:" title="full moon face">&#x1f31d;</span>
             <span class="em em-travel-1f31e" role="option" tabindex="0" data-c="1f31e" data-s=":sun_face:" title="sun with face">&#x1f31e;</span>
             <span class="em em-travel-1fa90" role="option" tabindex="0" data-c="1fa90" data-s=":ringed_planet:" title="ringed planet">&#x1fa90;</span>
-            <span class="em em-travel-2b50" role="option" tabindex="0" data-c="2b50" data-s=":star:" title="star">&#x2b50;&#xfe0f;</span>
+            <span class="em em-travel-2b50" role="option" tabindex="0" data-c="2b50" data-s=":star:" title="star">&#x2b50;</span>
             <span class="em em-travel-1f31f" role="option" tabindex="0" data-c="1f31f" data-s=":star2:" title="glowing star">&#x1f31f;</span>
             <span class="em em-travel-1f320" role="option" tabindex="0" data-c="1f320" data-s=":star3:" title="shooting star">&#x1f320;</span>
             <span class="em em-travel-1f30c" role="option" tabindex="0" data-c="1f30c" data-s=":milky_way:" title="milky way">&#x1f30c;</span>
-            <span class="em em-travel-2601" role="option" tabindex="0" data-c="2601" data-s=":cloud:" title="cloud">&#x2601;</span>
+            <span class="em em-travel-2601" role="option" tabindex="0" data-c="2601" data-s=":cloud:" title="cloud">&#x2601;&#xfe0f;</span>
             <span class="em em-travel-26c5" role="option" tabindex="0" data-c="26c5" data-s=":partly_sunny:" title="sun behind cloud">&#x26c5;</span>
             <span class="em em-travel-26c8" role="option" tabindex="0" data-c="26c8" data-s=":storm:" title="cloud with lightning and rain">&#x26c8;&#xfe0f;</span>
             <span class="em em-travel-1f324" role="option" tabindex="0" data-c="1f324" data-s=":overcast:" title="sun behind small cloud">&#x1f324;&#xfe0f;</span>
@@ -2004,7 +2004,7 @@
             <span class="em em-travel-2614" role="option" tabindex="0" data-c="2614" data-s=":umbrella_rain:" title="umbrella with rain drops">&#x2614;</span>
             <span class="em em-travel-26f1" role="option" tabindex="0" data-c="26f1" data-s=":beach_umbrella:" title="umbrella on ground">&#x26f1;&#xfe0f;</span>
             <span class="em em-travel-26a1" role="option" tabindex="0" data-c="26a1" data-s=":zap:" title="high voltage">&#x26a1;</span>
-            <span class="em em-travel-2744" role="option" tabindex="0" data-c="2744" data-s=":snowflake:" title="snowflake">&#x2744;</span>
+            <span class="em em-travel-2744" role="option" tabindex="0" data-c="2744" data-s=":snowflake:" title="snowflake">&#x2744;&#xfe0f;</span>
             <span class="em em-travel-2603" role="option" tabindex="0" data-c="2603" data-s=":snowy_snowman:" title="snowman">&#x2603;&#xfe0f;</span>
             <span class="em em-travel-26c4" role="option" tabindex="0" data-c="26c4" data-s=":snowman:" title="snowman without snow">&#x26c4;</span>
             <span class="em em-travel-2604" role="option" tabindex="0" data-c="2604" data-s=":comet:" title="comet">&#x2604;&#xfe0f;</span>
@@ -2089,7 +2089,7 @@
             <span class="em em-objects-1f941" role="option" tabindex="0" data-c="1f941" data-s=":drum:" title="drum">&#x1f941;</span>
             <span class="em em-objects-1f4f1" role="option" tabindex="0" data-c="1f4f1" data-s=":mobile:" title="mobile phone">&#x1f4f1;</span>
             <span class="em em-objects-1f4f2" role="option" tabindex="0" data-c="1f4f2" data-s=":mobile_calling:" title="mobile phone with arrow">&#x1f4f2;</span>
-            <span class="em em-objects-260e" role="option" tabindex="0" data-c="260e" data-s=":telephone:" title="telephone">&#x260e;</span>
+            <span class="em em-objects-260e" role="option" tabindex="0" data-c="260e" data-s=":telephone:" title="telephone">&#x260e;&#xfe0f;</span>
             <span class="em em-objects-1f4de" role="option" tabindex="0" data-c="1f4de" data-s=":telephone_receiver:" title="telephone receiver">&#x1f4de;</span>
             <span class="em em-objects-1f4df" role="option" tabindex="0" data-c="1f4df" data-s=":pager:" title="pager">&#x1f4df;</span>
             <span class="em em-objects-1f4e0" role="option" tabindex="0" data-c="1f4e0" data-s=":fax:" title="fax machine">&#x1f4e0;</span>
@@ -2150,7 +2150,7 @@
             <span class="em em-objects-1f4b9" role="option" tabindex="0" data-c="1f4b9" data-s=":ja_chart:" title="chart increasing with yen">&#x1f4b9;</span>
             <span class="em em-objects-1f4b1" role="option" tabindex="0" data-c="1f4b1" data-s=":currency_exchange:" title="currency exchange">&#x1f4b1;</span>
             <span class="em em-objects-1f4b2" role="option" tabindex="0" data-c="1f4b2" data-s=":dollar_sign:" title="heavy dollar sign">&#x1f4b2;</span>
-            <span class="em em-objects-2709" role="option" tabindex="0" data-c="2709" data-s=":envelope:" title="envelope">&#x2709;</span>
+            <span class="em em-objects-2709" role="option" tabindex="0" data-c="2709" data-s=":envelope:" title="envelope">&#x2709;&#xfe0f;</span>
             <span class="em em-objects-1f4e7" role="option" tabindex="0" data-c="1f4e7" data-s=":email:" title="e-mail">&#x1f4e7;</span>
             <span class="em em-objects-1f4e8" role="option" tabindex="0" data-c="1f4e8" data-s=":incoming_envelope:" title="incoming envelope">&#x1f4e8;</span>
             <span class="em em-objects-1f4e9" role="option" tabindex="0" data-c="1f4e9" data-s=":envelope_arrow:" title="envelope with arrow">&#x1f4e9;</span>
@@ -2163,8 +2163,8 @@
             <span class="em em-objects-1f4ed" role="option" tabindex="0" data-c="1f4ed" data-s=":mailbox_no_mail:" title="open mailbox with lowered flag">&#x1f4ed;</span>
             <span class="em em-objects-1f4ee" role="option" tabindex="0" data-c="1f4ee" data-s=":postbox:" title="postbox">&#x1f4ee;</span>
             <span class="em em-objects-1f5f3" role="option" tabindex="0" data-c="1f5f3" data-s=":ballot_box:" title="ballot box with ballot">&#x1f5f3;&#xfe0f;</span>
-            <span class="em em-objects-270f" role="option" tabindex="0" data-c="270f" data-s=":pencil:" title="pencil">&#x270f;</span>
-            <span class="em em-objects-2712" role="option" tabindex="0" data-c="2712" data-s=":black_nib:" title="black nib">&#x2712;</span>
+            <span class="em em-objects-270f" role="option" tabindex="0" data-c="270f" data-s=":pencil:" title="pencil">&#x270f;&#xfe0f;</span>
+            <span class="em em-objects-2712" role="option" tabindex="0" data-c="2712" data-s=":black_nib:" title="black nib">&#x2712;&#xfe0f;</span>
             <span class="em em-objects-1f58b" role="option" tabindex="0" data-c="1f58b" data-s=":fountain_pen:" title="fountain pen">&#x1f58b;&#xfe0f;</span>
             <span class="em em-objects-1f58a" role="option" tabindex="0" data-c="1f58a" data-s=":pen:" title="pen">&#x1f58a;&#xfe0f;</span>
             <span class="em em-objects-1f58c" role="option" tabindex="0" data-c="1f58c" data-s=":paintbrush:" title="paintbrush">&#x1f58c;&#xfe0f;</span>
@@ -2189,7 +2189,7 @@
             <span class="em em-objects-1f587" role="option" tabindex="0" data-c="1f587" data-s=":paperclips:" title="linked paperclips">&#x1f587;&#xfe0f;</span>
             <span class="em em-objects-1f4cf" role="option" tabindex="0" data-c="1f4cf" data-s=":straight_ruler:" title="straight ruler">&#x1f4cf;</span>
             <span class="em em-objects-1f4d0" role="option" tabindex="0" data-c="1f4d0" data-s=":triangular_ruler:" title="triangular ruler">&#x1f4d0;</span>
-            <span class="em em-objects-2702" role="option" tabindex="0" data-c="2702" data-s=":scissors:" title="scissors">&#x2702;</span>
+            <span class="em em-objects-2702" role="option" tabindex="0" data-c="2702" data-s=":scissors:" title="scissors">&#x2702;&#xfe0f;</span>
             <span class="em em-objects-1f5c3" role="option" tabindex="0" data-c="1f5c3" data-s=":card_box:" title="card file box">&#x1f5c3;&#xfe0f;</span>
             <span class="em em-objects-1f5c4" role="option" tabindex="0" data-c="1f5c4" data-s=":file_cabinet:" title="file cabinet">&#x1f5c4;&#xfe0f;</span>
             <span class="em em-objects-1f5d1" role="option" tabindex="0" data-c="1f5d1" data-s=":trashcan:" title="wastebasket">&#x1f5d1;&#xfe0f;</span>
@@ -2288,14 +2288,14 @@
             <span class="em em-symbols-2623" role="option" tabindex="0" data-c="2623" data-s=":biohazard:" title="biohazard">&#x2623;&#xfe0f;</span>
             <span class="em em-symbols-2b06" role="option" tabindex="0" data-c="2b06" data-s=":arrow_up:" title="up arrow">&#x2b06;&#xfe0f;</span>
             <span class="em em-symbols-2197" role="option" tabindex="0" data-c="2197" data-s=":arrow_upper_right:" title="up-right arrow">&#x2197;&#xfe0f;</span>
-            <span class="em em-symbols-27a1" role="option" tabindex="0" data-c="27a1" data-s=":arrow_right:" title="right arrow">&#x27a1;</span>
+            <span class="em em-symbols-27a1" role="option" tabindex="0" data-c="27a1" data-s=":arrow_right:" title="right arrow">&#x27a1;&#xfe0f;</span>
             <span class="em em-symbols-2198" role="option" tabindex="0" data-c="2198" data-s=":arrow_lower_right:" title="down-right arrow">&#x2198;&#xfe0f;</span>
             <span class="em em-symbols-2b07" role="option" tabindex="0" data-c="2b07" data-s=":arrow_down:" title="down arrow">&#x2b07;&#xfe0f;</span>
             <span class="em em-symbols-2199" role="option" tabindex="0" data-c="2199" data-s=":arrow_lower_left:" title="down-left arrow">&#x2199;&#xfe0f;</span>
             <span class="em em-symbols-2b05" role="option" tabindex="0" data-c="2b05" data-s=":arrow_left:" title="left arrow">&#x2b05;&#xfe0f;</span>
             <span class="em em-symbols-2196" role="option" tabindex="0" data-c="2196" data-s=":arrow_upper_left:" title="up-left arrow">&#x2196;&#xfe0f;</span>
-            <span class="em em-symbols-2195" role="option" tabindex="0" data-c="2195" data-s=":arrow_up_down:" title="up-down arrow">&#x2195;</span>
-            <span class="em em-symbols-2194" role="option" tabindex="0" data-c="2194" data-s=":arrow_left_right:" title="left-right arrow">&#x2194;</span>
+            <span class="em em-symbols-2195" role="option" tabindex="0" data-c="2195" data-s=":arrow_up_down:" title="up-down arrow">&#x2195;&#xfe0f;</span>
+            <span class="em em-symbols-2194" role="option" tabindex="0" data-c="2194" data-s=":arrow_left_right:" title="left-right arrow">&#x2194;&#xfe0f;</span>
             <span class="em em-symbols-21a9" role="option" tabindex="0" data-c="21a9" data-s=":arrow_left_hook:" title="right arrow curving left">&#x21a9;&#xfe0f;</span>
             <span class="em em-symbols-21aa" role="option" tabindex="0" data-c="21aa" data-s=":arrow_right_hook:" title="left arrow curving right">&#x21aa;&#xfe0f;</span>
             <span class="em em-symbols-2934" role="option" tabindex="0" data-c="2934" data-s=":arrow_heading_up:" title="right arrow curving up">&#x2934;&#xfe0f;</span>
@@ -2310,12 +2310,12 @@
             <span class="em em-symbols-1f6d0" role="option" tabindex="0" data-c="1f6d0" data-s=":place_of_worship:" title="place of worship">&#x1f6d0;</span>
             <span class="em em-symbols-269b" role="option" tabindex="0" data-c="269b" data-s=":atom:" title="atom symbol">&#x269b;&#xfe0f;</span>
             <span class="em em-symbols-1f549" role="option" tabindex="0" data-c="1f549" data-s=":om_symbol:" title="om">&#x1f549;&#xfe0f;</span>
-            <span class="em em-symbols-2721" role="option" tabindex="0" data-c="2721" data-s=":star_of_david:" title="star of David">&#x2721;</span>
-            <span class="em em-symbols-2638" role="option" tabindex="0" data-c="2638" data-s=":wheel_of_dharma:" title="wheel of dharma">&#x2638;</span>
-            <span class="em em-symbols-262f" role="option" tabindex="0" data-c="262f" data-s=":yin_yang:" title="yin yang">&#x262f;</span>
-            <span class="em em-symbols-271d" role="option" tabindex="0" data-c="271d" data-s=":cross:" title="latin cross">&#x271d;</span>
+            <span class="em em-symbols-2721" role="option" tabindex="0" data-c="2721" data-s=":star_of_david:" title="star of David">&#x2721;&#xfe0f;</span>
+            <span class="em em-symbols-2638" role="option" tabindex="0" data-c="2638" data-s=":wheel_of_dharma:" title="wheel of dharma">&#x2638;&#xfe0f;</span>
+            <span class="em em-symbols-262f" role="option" tabindex="0" data-c="262f" data-s=":yin_yang:" title="yin yang">&#x262f;&#xfe0f;</span>
+            <span class="em em-symbols-271d" role="option" tabindex="0" data-c="271d" data-s=":cross:" title="latin cross">&#x271d;&#xfe0f;</span>
             <span class="em em-symbols-2626" role="option" tabindex="0" data-c="2626" data-s=":orthodox_cross:" title="orthodox cross">&#x2626;&#xfe0f;</span>
-            <span class="em em-symbols-262a" role="option" tabindex="0" data-c="262a" data-s=":star_and_crescent:" title="star and crescent">&#x262a;</span>
+            <span class="em em-symbols-262a" role="option" tabindex="0" data-c="262a" data-s=":star_and_crescent:" title="star and crescent">&#x262a;&#xfe0f;</span>
             <span class="em em-symbols-262e" role="option" tabindex="0" data-c="262e" data-s=":peace:" title="peace symbol">&#x262e;&#xfe0f;</span>
             <span class="em em-symbols-1f54e" role="option" tabindex="0" data-c="1f54e" data-s=":menorah:" title="menorah">&#x1f54e;</span>
             <span class="em em-symbols-1f52f" role="option" tabindex="0" data-c="1f52f" data-s=":six_pointed_star:" title="dotted six-pointed star">&#x1f52f;</span>
@@ -2335,11 +2335,11 @@
             <span class="em em-symbols-1f500" role="option" tabindex="0" data-c="1f500" data-s=":shuffle:" title="shuffle tracks button">&#x1f500;</span>
             <span class="em em-symbols-1f501" role="option" tabindex="0" data-c="1f501" data-s=":repeat:" title="repeat button">&#x1f501;</span>
             <span class="em em-symbols-1f502" role="option" tabindex="0" data-c="1f502" data-s=":repeat_single:" title="repeat single button">&#x1f502;</span>
-            <span class="em em-symbols-25b6" role="option" tabindex="0" data-c="25b6" data-s=":play:" title="play button">&#x25b6;</span>
+            <span class="em em-symbols-25b6" role="option" tabindex="0" data-c="25b6" data-s=":play:" title="play button">&#x25b6;&#xfe0f;</span>
             <span class="em em-symbols-23e9" role="option" tabindex="0" data-c="23e9" data-s=":fast_forward:" title="fast-forward button">&#x23e9;</span>
             <span class="em em-symbols-23ed" role="option" tabindex="0" data-c="23ed" data-s=":next_track:" title="next track button">&#x23ed;&#xfe0f;</span>
             <span class="em em-symbols-23ef" role="option" tabindex="0" data-c="23ef" data-s=":play_pause:" title="play or pause button">&#x23ef;&#xfe0f;</span>
-            <span class="em em-symbols-25c0" role="option" tabindex="0" data-c="25c0" data-s=":reverse:" title="reverse button">&#x25c0;</span>
+            <span class="em em-symbols-25c0" role="option" tabindex="0" data-c="25c0" data-s=":reverse:" title="reverse button">&#x25c0;&#xfe0f;</span>
             <span class="em em-symbols-23ea" role="option" tabindex="0" data-c="23ea" data-s=":rewind:" title="fast reverse button">&#x23ea;</span>
             <span class="em em-symbols-23ee" role="option" tabindex="0" data-c="23ee" data-s=":previous_track:" title="last track button">&#x23ee;&#xfe0f;</span>
             <span class="em em-symbols-1f53c" role="option" tabindex="0" data-c="1f53c" data-s=":up_button:" title="upwards button">&#x1f53c;</span>
@@ -2367,9 +2367,9 @@
             <span class="em em-symbols-1f530" role="option" tabindex="0" data-c="1f530" data-s=":ja_beginner:" title="Japanese symbol for beginner">&#x1f530;</span>
             <span class="em em-symbols-2b55" role="option" tabindex="0" data-c="2b55" data-s=":o:" title="hollow red circle">&#x2b55;</span>
             <span class="em em-symbols-2705" role="option" tabindex="0" data-c="2705" data-s=":white_check_mark:" title="check mark button">&#x2705;</span>
-            <span class="em em-symbols-2611" role="option" tabindex="0" data-c="2611" data-s=":checked_ballot:" title="check box with check">&#x2611;</span>
-            <span class="em em-symbols-2714" role="option" tabindex="0" data-c="2714" data-s=":check_mark:" title="check mark">&#x2714;</span>
-            <span class="em em-symbols-2716" role="option" tabindex="0" data-c="2716" data-s=":multiplication:" title="multiplication sign">&#x2716;</span>
+            <span class="em em-symbols-2611" role="option" tabindex="0" data-c="2611" data-s=":checked_ballot:" title="check box with check">&#x2611;&#xfe0f;</span>
+            <span class="em em-symbols-2714" role="option" tabindex="0" data-c="2714" data-s=":check_mark:" title="check mark">&#x2714;&#xfe0f;</span>
+            <span class="em em-symbols-2716" role="option" tabindex="0" data-c="2716" data-s=":multiplication:" title="multiplication sign">&#x2716;&#xfe0f;</span>
             <span class="em em-symbols-274c" role="option" tabindex="0" data-c="274c" data-s=":x:" title="cross mark">&#x274c;</span>
             <span class="em em-symbols-274e" role="option" tabindex="0" data-c="274e" data-s=":cross_mark_button:" title="cross mark button">&#x274e;</span>
             <span class="em em-symbols-2795" role="option" tabindex="0" data-c="2795" data-s=":plus:" title="plus sign">&#x2795;</span>
@@ -2378,9 +2378,9 @@
             <span class="em em-symbols-27b0" role="option" tabindex="0" data-c="27b0" data-s=":curly_loop:" title="curly loop">&#x27b0;</span>
             <span class="em em-symbols-27bf" role="option" tabindex="0" data-c="27bf" data-s=":double_curly_loop:" title="double curly loop">&#x27bf;</span>
             <span class="em em-symbols-303d" role="option" tabindex="0" data-c="303d" data-s=":part_alternation_mark:" title="part alternation mark">&#x303d;&#xfe0f;</span>
-            <span class="em em-symbols-2733" role="option" tabindex="0" data-c="2733" data-s=":eight_spoked_asterisk:" title="eight-spoked asterisk">&#x2733;</span>
-            <span class="em em-symbols-2734" role="option" tabindex="0" data-c="2734" data-s=":eight_pointed_star:" title="eight-pointed star">&#x2734;</span>
-            <span class="em em-symbols-2747" role="option" tabindex="0" data-c="2747" data-s=":sparkle:" title="sparkle">&#x2747;</span>
+            <span class="em em-symbols-2733" role="option" tabindex="0" data-c="2733" data-s=":eight_spoked_asterisk:" title="eight-spoked asterisk">&#x2733;&#xfe0f;</span>
+            <span class="em em-symbols-2734" role="option" tabindex="0" data-c="2734" data-s=":eight_pointed_star:" title="eight-pointed star">&#x2734;&#xfe0f;</span>
+            <span class="em em-symbols-2747" role="option" tabindex="0" data-c="2747" data-s=":sparkle:" title="sparkle">&#x2747;&#xfe0f;</span>
             <span class="em em-symbols-203c" role="option" tabindex="0" data-c="203c" data-s=":bangbang:" title="double exclamation mark">&#x203c;&#xfe0f;</span>
             <span class="em em-symbols-2049" role="option" tabindex="0" data-c="2049" data-s=":interrobang:" title="exclamation question mark">&#x2049;&#xfe0f;</span>
             <span class="em em-symbols-2753" role="option" tabindex="0" data-c="2753" data-s=":question:" title="question mark">&#x2753;</span>
@@ -2388,21 +2388,21 @@
             <span class="em em-symbols-2755" role="option" tabindex="0" data-c="2755" data-s=":white_exclamation:" title="white exclamation mark">&#x2755;</span>
             <span class="em em-symbols-2757" role="option" tabindex="0" data-c="2757" data-s=":exclamation:" title="exclamation mark">&#x2757;</span>
             <span class="em em-symbols-3030" role="option" tabindex="0" data-c="3030" data-s=":wavy_dash:" title="wavy dash">&#x3030;&#xfe0f;</span>
-            <span class="em em-symbols-a9" role="option" tabindex="0" data-c="a9" data-s=":copyright:" title="copyright">&#xa9;&#xfe0f;</span>
-            <span class="em em-symbols-ae" role="option" tabindex="0" data-c="ae" data-s=":registered:" title="registered">&#xae;&#xfe0f;</span>
+            <span class="em em-symbols-a9" role="option" tabindex="0" data-c="00a9" data-s=":copyright:" title="copyright">&#x00a9;&#xfe0f;</span>
+            <span class="em em-symbols-ae" role="option" tabindex="0" data-c="00ae" data-s=":registered:" title="registered">&#x00ae;&#xfe0f;</span>
             <span class="em em-symbols-2122" role="option" tabindex="0" data-c="2122" data-s=":tm:" title="trade mark">&#x2122;&#xfe0f;</span>
-            <span class="em em-symbols-23-20e3" role="option" tabindex="0" data-c="23-20e3" data-s=":hash:" title="keycap: #">&#x23;&#x20e3;</span>
-            <span class="em em-symbols-2a-20e3" role="option" tabindex="0" data-c="2a-20e3" data-s=":asterisk:" title="keycap: *">&#x2a;&#x20e3;</span>
-            <span class="em em-symbols-30-20e3" role="option" tabindex="0" data-c="30-20e3" data-s=":zero:" title="keycap: 0">&#x30;&#x20e3;</span>
-            <span class="em em-symbols-31-20e3" role="option" tabindex="0" data-c="31-20e3" data-s=":one:" title="keycap: 1">&#x31;&#x20e3;</span>
-            <span class="em em-symbols-32-20e3" role="option" tabindex="0" data-c="32-20e3" data-s=":two:" title="keycap: 2">&#x32;&#x20e3;</span>
-            <span class="em em-symbols-33-20e3" role="option" tabindex="0" data-c="33-20e3" data-s=":three:" title="keycap: 3">&#x33;&#x20e3;</span>
-            <span class="em em-symbols-34-20e3" role="option" tabindex="0" data-c="34-20e3" data-s=":four:" title="keycap: 4">&#x34;&#x20e3;</span>
-            <span class="em em-symbols-35-20e3" role="option" tabindex="0" data-c="35-20e3" data-s=":five:" title="keycap: 5">&#x35;&#x20e3;</span>
-            <span class="em em-symbols-36-20e3" role="option" tabindex="0" data-c="36-20e3" data-s=":six:" title="keycap: 6">&#x36;&#x20e3;</span>
-            <span class="em em-symbols-37-20e3" role="option" tabindex="0" data-c="37-20e3" data-s=":seven:" title="keycap: 7">&#x37;&#x20e3;</span>
-            <span class="em em-symbols-38-20e3" role="option" tabindex="0" data-c="38-20e3" data-s=":eight:" title="keycap: 8">&#x38;&#x20e3;</span>
-            <span class="em em-symbols-39-20e3" role="option" tabindex="0" data-c="39-20e3" data-s=":nine:" title="keycap: 9">&#x39;&#x20e3;</span>
+            <span class="em em-symbols-23-20e3" role="option" tabindex="0" data-c="0023-fe0f-20e3" data-s=":hash:" title="keycap: #">&#x0023;&#xfe0f;&#x20e3;</span>
+            <span class="em em-symbols-2a-20e3" role="option" tabindex="0" data-c="002a-fe0f-20e3" data-s=":asterisk:" title="keycap: *">&#x002a;&#xfe0f;&#x20e3;</span>
+            <span class="em em-symbols-30-20e3" role="option" tabindex="0" data-c="0030-fe0f-20e3" data-s=":zero:" title="keycap: 0">&#x0030;&#xfe0f;&#x20e3;</span>
+            <span class="em em-symbols-31-20e3" role="option" tabindex="0" data-c="0031-fe0f-20e3" data-s=":one:" title="keycap: 1">&#x0031;&#xfe0f;&#x20e3;</span>
+            <span class="em em-symbols-32-20e3" role="option" tabindex="0" data-c="0032-fe0f-20e3" data-s=":two:" title="keycap: 2">&#x0032;&#xfe0f;&#x20e3;</span>
+            <span class="em em-symbols-33-20e3" role="option" tabindex="0" data-c="0033-fe0f-20e3" data-s=":three:" title="keycap: 3">&#x0033;&#xfe0f;&#x20e3;</span>
+            <span class="em em-symbols-34-20e3" role="option" tabindex="0" data-c="0034-fe0f-20e3" data-s=":four:" title="keycap: 4">&#x0034;&#xfe0f;&#x20e3;</span>
+            <span class="em em-symbols-35-20e3" role="option" tabindex="0" data-c="0035-fe0f-20e3" data-s=":five:" title="keycap: 5">&#x0035;&#xfe0f;&#x20e3;</span>
+            <span class="em em-symbols-36-20e3" role="option" tabindex="0" data-c="0036-fe0f-20e3" data-s=":six:" title="keycap: 6">&#x0036;&#xfe0f;&#x20e3;</span>
+            <span class="em em-symbols-37-20e3" role="option" tabindex="0" data-c="0037-fe0f-20e3" data-s=":seven:" title="keycap: 7">&#x0037;&#xfe0f;&#x20e3;</span>
+            <span class="em em-symbols-38-20e3" role="option" tabindex="0" data-c="0038-fe0f-20e3" data-s=":eight:" title="keycap: 8">&#x0038;&#xfe0f;&#x20e3;</span>
+            <span class="em em-symbols-39-20e3" role="option" tabindex="0" data-c="0039-fe0f-20e3" data-s=":nine:" title="keycap: 9">&#x0039;&#xfe0f;&#x20e3;</span>
             <span class="em em-symbols-1f51f" role="option" tabindex="0" data-c="1f51f" data-s=":ten:" title="keycap: 10">&#x1f51f;</span>
             <span class="em em-symbols-1f520" role="option" tabindex="0" data-c="1f520" data-s=":upper_abcd:" title="input latin uppercase">&#x1f520;</span>
             <span class="em em-symbols-1f521" role="option" tabindex="0" data-c="1f521" data-s=":abcd:" title="input latin lowercase">&#x1f521;</span>
@@ -2465,7 +2465,7 @@
             <span class="em em-symbols-25fb" role="option" tabindex="0" data-c="25fb" data-s=":medium_white_square:" title="white medium square">&#x25fb;&#xfe0f;</span>
             <span class="em em-symbols-25fe" role="option" tabindex="0" data-c="25fe" data-s=":medium_small_black_square:" title="black medium-small square">&#x25fe;</span>
             <span class="em em-symbols-25fd" role="option" tabindex="0" data-c="25fd" data-s=":medium_small_white_square:" title="white medium-small square">&#x25fd;</span>
-            <span class="em em-symbols-25aa" role="option" tabindex="0" data-c="25aa" data-s=":small_black_square:" title="black small square">&#x25aa;</span>
+            <span class="em em-symbols-25aa" role="option" tabindex="0" data-c="25aa" data-s=":small_black_square:" title="black small square">&#x25aa;&#xfe0f;</span>
             <span class="em em-symbols-25ab" role="option" tabindex="0" data-c="25ab" data-s=":small_white_square:" title="white small square">&#x25ab;&#xfe0f;</span>
             <span class="em em-symbols-1f536" role="option" tabindex="0" data-c="1f536" data-s=":large_orange_diamond:" title="large orange diamond">&#x1f536;</span>
             <span class="em em-symbols-1f537" role="option" tabindex="0" data-c="1f537" data-s=":large_blue_diamond:" title="large blue diamond">&#x1f537;</span>

+ 5 - 39
tools/twemoji/generate-emoji-picker.py

@@ -31,40 +31,6 @@ def make_hexchar(codepoint):
     return '&#x%s;' % codepoint.replace('-', ';&#x')
 
 
-# Data extracted from http://xahlee.info/comp/text_vs_emoji.html
-text_default_codepoints = [
-    '1f004', '1f170', '1f171', '1f17e', '1f17f', '1f202', '1f237', '1f321',
-    '1f324', '1f325', '1f326', '1f327', '1f328', '1f329', '1f32a', '1f32b',
-    '1f32c', '1f336', '1f37d', '1f396', '1f397', '1f399', '1f39a', '1f39b',
-    '1f39e', '1f39f', '1f3cb', '1f3cc', '1f3cd', '1f3ce', '1f3d4', '1f3d5',
-    '1f3d6', '1f3d7', '1f3d8', '1f3d9', '1f3da', '1f3db', '1f3dc', '1f3dd',
-    '1f3de', '1f3df', '1f3f3', '1f3f5', '1f3f7', '1f43f', '1f441', '1f4fd',
-    '1f549', '1f54a', '1f56f', '1f570', '1f573', '1f574', '1f575', '1f576',
-    '1f577', '1f578', '1f579', '1f587', '1f58a', '1f58b', '1f58c', '1f58d',
-    '1f590', '1f5a5', '1f5a8', '1f5b1', '1f5b2', '1f5bc', '1f5c2', '1f5c3',
-    '1f5c4', '1f5d1', '1f5d2', '1f5d3', '1f5dc', '1f5dd', '1f5de', '1f5e1',
-    '1f5e3', '1f5e8', '1f5ef', '1f5f3', '1f5fa', '1f6cb', '1f6cd', '1f6ce',
-    '1f6cf', '1f6e0', '1f6e1', '1f6e2', '1f6e3', '1f6e4', '1f6e5', '1f6e9',
-    '1f6f0', '1f6f3', '203c', '2049', '2122', '2139', '2196', '2197', '2198',
-    '2199', '21a9', '21aa', '2328', '23cf', '23ed', '23ee', '23ef', '23f1',
-    '23f2', '23f8', '23f9', '23fa', '24c2', '25ab', '25fb', '25fc', '2600',
-    '2602', '2603', '2604', '2618', '2620', '2622', '2623', '2626', '262e',
-    '2640', '2642', '265f', '2668', '267b', '267e', '2692', '2694', '2695',
-    '2696', '2697', '2699', '269b', '269c', '26a0', '26b0', '26b1', '26c8',
-    '26cf', '26d1', '26d3', '26e9', '26f0', '26f1', '26f4', '26f7', '26f8',
-    '26f9', '2934', '2935', '2b05', '2b06', '2b07', '2b50', '3030', '303d',
-    '3297', '3299', 'a9', 'ae',
-]
-
-
-def is_text_default(codepoint):
-    """
-    Temporary hack, see https://github.com/milesj/emojibase/issues/37.
-
-    """
-    return codepoint in text_default_codepoints
-
-
 # Generate HTML
 
 print('<div class="twemoji-picker" data-skintone="0">')
@@ -77,12 +43,8 @@ for i, category in enumerate(category_order):
     print('        <div class="content" role="listbox">')
 
     def print_emoji(emoji):
-        if emoji['representation'] == 'text-default' or is_text_default(emoji['codepoint']):
-            hex_codepoint = emoji['codepoint'].lower() + '-fe0f'
-        else:
-            hex_codepoint = emoji['codepoint'].lower()
         print('            ', end='')
-        print('<span class="em em-{}-{}"'.format(category['id'], emoji['codepoint'].lower()), end='')
+        print('<span class="em em-{}-{}"'.format(category['id'], emoji['twemoji_codepoint'].lower()), end='')
         print(' role="option" tabindex="0"', end='')
         print(' data-c="{}"'.format(emoji['codepoint'].lower()), end='')
         print(' data-s="{}"'.format(emoji['shortname']), end='')
@@ -91,6 +53,10 @@ for i, category in enumerate(category_order):
         if 'skintone' in emoji:
             print(' data-t="{}"'.format(emoji['skintone']), end='')
         print(' title="{}"'.format(emoji['name']), end='')
+        if emoji['representation'] == 'text-default':
+            hex_codepoint = emoji['codepoint'].lower() + '-fe0f'
+        else:
+            hex_codepoint = emoji['codepoint'].lower()
         print('>{}</span>'.format(make_hexchar(hex_codepoint)))
 
     for emoji in groups[category['id']]:

+ 1 - 2
tools/twemoji/generate-shortname-mapping.py

@@ -14,8 +14,7 @@ for emoji_list in groups.values():
             mappings.append((shortname.strip(':'), emoji['emoji']))
 
 # Custom shortcodes
-mappings.append(('slight_smile', '🙂'))
-mappings.append(('slight_frown', '🙁'))
+mappings.append(('joy', '😂'))
 
 print('// Generated with tools/twemoji/generate-shortname-mapping.py')
 print('const SHORTNAMES = {')

+ 22 - 0
tools/twemoji/generate-textdefault-emoji.py

@@ -0,0 +1,22 @@
+#!/usr/bin/env python3
+import json
+import re
+
+GROUPS_JSON = '../../../twemoji-picker/generated/groups.json'
+
+with open(GROUPS_JSON, 'r') as f:
+    groups = json.loads(f.read())
+
+text_default = []
+
+for emoji_list in groups.values():
+    for emoji in emoji_list:
+        if emoji['representation'] == 'text-default':
+            text_default.append(emoji['codepoint'])
+            text_default.append(re.sub(r'-fe0[ef]$', '', emoji['codepoint']))
+
+print('// Generated with tools/twemoji/generate-textdefault-emoji.py')
+print('const TEXT_DEFAULT_EMOJI = [')
+for codepoint in sorted(set(text_default)):
+    print("    '{}',".format(codepoint))
+print('];')