diff --git a/frontend/src/components/MessageContent.tsx b/frontend/src/components/MessageContent.tsx
index 939e19c..28aee27 100644
--- a/frontend/src/components/MessageContent.tsx
+++ b/frontend/src/components/MessageContent.tsx
@@ -1,4 +1,5 @@
import Markdown from 'markdown-to-jsx'
+import { EMOJI_SHORTCODES } from '../lib/emojiShortcodes'
interface MessageContentProps {
content: string
@@ -23,6 +24,38 @@ function MarkdownImageLink({ src, alt, title }: MarkdownImageLinkProps) {
)
}
+const SHORTCODE_PATTERN = /:([a-z0-9_+-]+):/g
+
+// Converts a complete `:name:` shortcode to its emoji, skipping fenced code
+// blocks and inline code spans -- someone pasting code containing
+// `:something:` (a Ruby symbol, a dict key) shouldn't get it silently
+// turned into an emoji. This is render-time only: stored/sent content
+// always keeps the literal `:name:` text, matching how markdown itself is
+// never converted until display.
+function convertShortcodes(text: string): string {
+ const lines = text.split('\n')
+ let inFence = false
+ return lines
+ .map((line) => {
+ if (/^\s*```/.test(line)) {
+ inFence = !inFence
+ return line
+ }
+ if (inFence) return line
+ // Splitting on backtick-delimited spans keeps inline code (`:foo:`)
+ // untouched -- odd-indexed segments are the code spans themselves.
+ return line
+ .split(/(`+[^`]*`+)/g)
+ .map((part, i) =>
+ i % 2 === 0
+ ? part.replace(SHORTCODE_PATTERN, (match, name) => EMOJI_SHORTCODES[name] ?? match)
+ : part,
+ )
+ .join('')
+ })
+ .join('\n')
+}
+
// CommonMark treats a single newline as a soft break (rendered as a space),
// not a visible line break -- only a trailing double-space or blank line
// produces one. The Composer's Shift+Enter has always inserted a plain
@@ -60,5 +93,5 @@ export const MARKDOWN_OPTIONS = {
}
export function MessageContent({ content }: MessageContentProps) {
- return {preserveLineBreaks(content)}
+ return {preserveLineBreaks(convertShortcodes(content))}
}
diff --git a/frontend/src/lib/emojiShortcodes.ts b/frontend/src/lib/emojiShortcodes.ts
new file mode 100644
index 0000000..7a7ec04
--- /dev/null
+++ b/frontend/src/lib/emojiShortcodes.ts
@@ -0,0 +1,967 @@
+// Shortcode -> emoji lookup for :name: conversion in chat messages,
+// generated once from emojibase-data (MIT licensed,
+// https://github.com/milesj/emojibase -- en/shortcodes/github.json), matched
+// against the emoji actually used in emoji.ts. Not a runtime dependency:
+// emojibase-data was only ever a dev-time tool to produce this static
+// lookup, never added to package.json. Uses GitHub's shortcode set (the
+// most broadly recognized convention) rather than Slack/CLDR/JoyPixels
+// variants. If emoji.ts ever adds a new entry, this needs regenerating to
+// match.
+export const EMOJI_SHORTCODES: Record = {
+ '+1': '๐',
+ '-1': '๐',
+ '100': '๐ฏ',
+ '1234': '๐ข',
+ '1st_place_medal': '๐ฅ',
+ '2nd_place_medal': '๐ฅ',
+ '3rd_place_medal': '๐ฅ',
+ '8ball': '๐ฑ',
+ 'a': '๐
ฐ๏ธ',
+ 'ab': '๐',
+ 'abc': '๐ค',
+ 'adhesive_bandage': '๐ฉน',
+ 'adult': '๐ง',
+ 'airplane': 'โ๏ธ',
+ 'alarm_clock': 'โฐ',
+ 'alembic': 'โ๏ธ',
+ 'alien': '๐ฝ',
+ 'ambulance': '๐',
+ 'anatomical_heart': '๐ซ',
+ 'anchor': 'โ',
+ 'anger': '๐ข',
+ 'angry': '๐ ',
+ 'anguished': '๐ง',
+ 'ant': '๐',
+ 'apple': '๐',
+ 'art': '๐จ',
+ 'astonished': '๐ฒ',
+ 'australia': '๐ฆ๐บ',
+ 'avocado': '๐ฅ',
+ 'axe': '๐ช',
+ 'b': '๐
ฑ๏ธ',
+ 'baby': '๐ถ',
+ 'baby_bottle': '๐ผ',
+ 'baby_chick': '๐ค',
+ 'bacon': '๐ฅ',
+ 'badger': '๐ฆก',
+ 'badminton': '๐ธ',
+ 'bagel': '๐ฅฏ',
+ 'baguette_bread': '๐ฅ',
+ 'balance_scale': 'โ๏ธ',
+ 'balloon': '๐',
+ 'ballot_box_with_check': 'โ๏ธ',
+ 'bamboo': '๐',
+ 'banana': '๐',
+ 'bangbang': 'โผ๏ธ',
+ 'bank': '๐ฆ',
+ 'baseball': 'โพ',
+ 'basket': '๐งบ',
+ 'basketball': '๐',
+ 'bat': '๐ฆ',
+ 'bathtub': '๐',
+ 'battery': '๐',
+ 'beach_umbrella': '๐๏ธ',
+ 'bear': '๐ป',
+ 'bed': '๐๏ธ',
+ 'bee': '๐',
+ 'beer': '๐บ',
+ 'beers': '๐ป',
+ 'beginner': '๐ฐ',
+ 'bell': '๐',
+ 'bell_pepper': '๐ซ',
+ 'bellhop_bell': '๐๏ธ',
+ 'bento': '๐ฑ',
+ 'beverage_box': '๐ง',
+ 'bicyclist': '๐ด',
+ 'bike': '๐ฒ',
+ 'biohazard': 'โฃ๏ธ',
+ 'bird': '๐ฆ',
+ 'birthday': '๐',
+ 'black_circle': 'โซ',
+ 'black_flag': '๐ด',
+ 'black_heart': '๐ค',
+ 'black_joker': '๐',
+ 'black_large_square': 'โฌ',
+ 'black_medium_square': 'โผ๏ธ',
+ 'blond_haired_person': '๐ฑ',
+ 'blossom': '๐ผ',
+ 'blowfish': '๐ก',
+ 'blue_book': '๐',
+ 'blue_car': '๐',
+ 'blue_heart': '๐',
+ 'blue_square': '๐ฆ',
+ 'blueberries': '๐ซ',
+ 'blush': '๐',
+ 'boar': '๐',
+ 'boat': 'โต',
+ 'bomb': '๐ฃ',
+ 'bone': '๐ฆด',
+ 'book': '๐',
+ 'bookmark': '๐',
+ 'books': '๐',
+ 'boom': '๐ฅ',
+ 'bouncing_ball_person': 'โน๏ธ',
+ 'bouquet': '๐',
+ 'bow': '๐',
+ 'bow_and_arrow': '๐น',
+ 'bowl_with_spoon': '๐ฅฃ',
+ 'bowling': '๐ณ',
+ 'boxing_glove': '๐ฅ',
+ 'boy': '๐ฆ',
+ 'brain': '๐ง ',
+ 'brazil': '๐ง๐ท',
+ 'bread': '๐',
+ 'bricks': '๐งฑ',
+ 'bridge_at_night': '๐',
+ 'broccoli': '๐ฅฆ',
+ 'broken_heart': '๐',
+ 'broom': '๐งน',
+ 'brown_circle': '๐ค',
+ 'brown_heart': '๐ค',
+ 'brown_square': '๐ซ',
+ 'bubble_tea': '๐ง',
+ 'bucket': '๐ชฃ',
+ 'bug': '๐',
+ 'building_construction': '๐๏ธ',
+ 'bulb': '๐ก',
+ 'burrito': '๐ฏ',
+ 'bus': '๐',
+ 'bust_in_silhouette': '๐ค',
+ 'busts_in_silhouette': '๐ฅ',
+ 'butter': '๐ง',
+ 'butterfly': '๐ฆ',
+ 'cactus': '๐ต',
+ 'cake': '๐ฐ',
+ 'calendar': '๐',
+ 'call_me_hand': '๐ค',
+ 'camel': '๐ซ',
+ 'camera': '๐ท',
+ 'camera_flash': '๐ธ',
+ 'camping': '๐๏ธ',
+ 'canada': '๐จ๐ฆ',
+ 'candle': '๐ฏ๏ธ',
+ 'candy': '๐ฌ',
+ 'canned_food': '๐ฅซ',
+ 'canoe': '๐ถ',
+ 'car': '๐',
+ 'card_file_box': '๐๏ธ',
+ 'card_index': '๐',
+ 'carousel_horse': '๐ ',
+ 'carrot': '๐ฅ',
+ 'cartwheeling': '๐คธ',
+ 'cat': '๐ฑ',
+ 'cat2': '๐',
+ 'cd': '๐ฟ',
+ 'chains': 'โ๏ธ',
+ 'chair': '๐ช',
+ 'champagne': '๐พ',
+ 'checkered_flag': '๐',
+ 'cheese': '๐ง',
+ 'cherries': '๐',
+ 'cherry_blossom': '๐ธ',
+ 'chess_pawn': 'โ๏ธ',
+ 'chestnut': '๐ฐ',
+ 'chicken': '๐',
+ 'child': '๐ง',
+ 'chipmunk': '๐ฟ๏ธ',
+ 'chocolate_bar': '๐ซ',
+ 'chopsticks': '๐ฅข',
+ 'christmas_tree': '๐',
+ 'church': 'โช',
+ 'circus_tent': '๐ช',
+ 'city_sunrise': '๐',
+ 'city_sunset': '๐',
+ 'cityscape': '๐๏ธ',
+ 'clap': '๐',
+ 'clapper': '๐ฌ',
+ 'classical_building': '๐๏ธ',
+ 'climbing': '๐ง',
+ 'clinking_glasses': '๐ฅ',
+ 'clipboard': '๐',
+ 'closed_book': '๐',
+ 'closed_lock_with_key': '๐',
+ 'cloud': 'โ๏ธ',
+ 'cloud_with_lightning_and_rain': 'โ๏ธ',
+ 'cloud_with_rain': '๐ง๏ธ',
+ 'clown_face': '๐คก',
+ 'cn': '๐จ๐ณ',
+ 'cocktail': '๐ธ',
+ 'coconut': '๐ฅฅ',
+ 'coffee': 'โ',
+ 'coffin': 'โฐ๏ธ',
+ 'cold_face': '๐ฅถ',
+ 'cold_sweat': '๐ฐ',
+ 'collision': '๐ฅ',
+ 'comet': 'โ๏ธ',
+ 'compass': '๐งญ',
+ 'computer': '๐ป',
+ 'computer_mouse': '๐ฑ๏ธ',
+ 'confetti_ball': '๐',
+ 'confounded': '๐',
+ 'confused': '๐',
+ 'construction': '๐ง',
+ 'cookie': '๐ช',
+ 'cool': '๐',
+ 'corn': '๐ฝ',
+ 'couch_and_lamp': '๐๏ธ',
+ 'cow': '๐ฎ',
+ 'cow2': '๐',
+ 'cowboy_hat_face': '๐ค ',
+ 'crab': '๐ฆ',
+ 'crayon': '๐๏ธ',
+ 'credit_card': '๐ณ',
+ 'crescent_moon': '๐',
+ 'cricket_game': '๐',
+ 'crocodile': '๐',
+ 'croissant': '๐ฅ',
+ 'crossed_fingers': '๐ค',
+ 'crossed_flags': '๐',
+ 'crossed_swords': 'โ๏ธ',
+ 'cry': '๐ข',
+ 'crying_cat_face': '๐ฟ',
+ 'cucumber': '๐ฅ',
+ 'cup_with_straw': '๐ฅค',
+ 'cupcake': '๐ง',
+ 'cupid': '๐',
+ 'currency_exchange': '๐ฑ',
+ 'curry': '๐',
+ 'cursing_face': '๐คฌ',
+ 'custard': '๐ฎ',
+ 'cut_of_meat': '๐ฅฉ',
+ 'cyclone': '๐',
+ 'dagger': '๐ก๏ธ',
+ 'dango': '๐ก',
+ 'dart': '๐ฏ',
+ 'dash': '๐จ',
+ 'date': '๐
',
+ 'de': '๐ฉ๐ช',
+ 'deaf_person': '๐ง',
+ 'deciduous_tree': '๐ณ',
+ 'deer': '๐ฆ',
+ 'department_store': '๐ฌ',
+ 'desert': '๐๏ธ',
+ 'desert_island': '๐๏ธ',
+ 'desktop_computer': '๐ฅ๏ธ',
+ 'diamond_shape_with_a_dot_inside': '๐ ',
+ 'disappointed': '๐',
+ 'disappointed_relieved': '๐ฅ',
+ 'disguised_face': '๐ฅธ',
+ 'diya_lamp': '๐ช',
+ 'dizzy': '๐ซ',
+ 'dizzy_face': '๐ต',
+ 'dog': '๐ถ',
+ 'dog2': '๐',
+ 'dollar': '๐ต',
+ 'dolphin': '๐ฌ',
+ 'door': '๐ช',
+ 'dotted_line_face': '๐ซฅ',
+ 'doughnut': '๐ฉ',
+ 'dove': '๐๏ธ',
+ 'dragon': '๐',
+ 'dromedary_camel': '๐ช',
+ 'drooling_face': '๐คค',
+ 'drop_of_blood': '๐ฉธ',
+ 'droplet': '๐ง',
+ 'drum': '๐ฅ',
+ 'duck': '๐ฆ',
+ 'dumpling': '๐ฅ',
+ 'dvd': '๐',
+ 'e-mail': '๐ง',
+ 'eagle': '๐ฆ
',
+ 'ear': '๐',
+ 'ear_of_rice': '๐พ',
+ 'ear_with_hearing_aid': '๐ฆป',
+ 'earth_africa': '๐',
+ 'earth_americas': '๐',
+ 'earth_asia': '๐',
+ 'egg': '๐ฅ',
+ 'eggplant': '๐',
+ 'eight_pointed_black_star': 'โด๏ธ',
+ 'eight_spoked_asterisk': 'โณ๏ธ',
+ 'electric_plug': '๐',
+ 'elephant': '๐',
+ 'email': '๐ง',
+ 'envelope_with_arrow': '๐ฉ',
+ 'es': '๐ช๐ธ',
+ 'euro': '๐ถ',
+ 'european_castle': '๐ฐ',
+ 'evergreen_tree': '๐ฒ',
+ 'exclamation': 'โ',
+ 'exploding_head': '๐คฏ',
+ 'expressionless': '๐',
+ 'eye': '๐๏ธ',
+ 'eye_speech_bubble': '๐๏ธโ๐จ๏ธ',
+ 'eyes': '๐',
+ 'face_holding_back_tears': '๐ฅน',
+ 'face_with_diagonal_mouth': '๐ซค',
+ 'face_with_head_bandage': '๐ค',
+ 'face_with_open_eyes_and_hand_over_mouth': '๐ซข',
+ 'face_with_peeking_eye': '๐ซฃ',
+ 'face_with_thermometer': '๐ค',
+ 'facepalm': '๐คฆ',
+ 'facepunch': '๐',
+ 'factory': '๐ญ',
+ 'falafel': '๐ง',
+ 'fallen_leaf': '๐',
+ 'fearful': '๐จ',
+ 'feet': '๐พ',
+ 'ferris_wheel': '๐ก',
+ 'field_hockey': '๐',
+ 'file_cabinet': '๐๏ธ',
+ 'file_folder': '๐',
+ 'fire': '๐ฅ',
+ 'fire_engine': '๐',
+ 'fire_extinguisher': '๐งฏ',
+ 'firecracker': '๐งจ',
+ 'fireworks': '๐',
+ 'first_quarter_moon': '๐',
+ 'first_quarter_moon_with_face': '๐',
+ 'fish': '๐',
+ 'fish_cake': '๐ฅ',
+ 'fishing_pole_and_fish': '๐ฃ',
+ 'fist': 'โ',
+ 'fist_left': '๐ค',
+ 'fist_oncoming': '๐',
+ 'fist_raised': 'โ',
+ 'fist_right': '๐ค',
+ 'flamingo': '๐ฆฉ',
+ 'flashlight': '๐ฆ',
+ 'fleur_de_lis': 'โ๏ธ',
+ 'flight_arrival': '๐ฌ',
+ 'flight_departure': '๐ซ',
+ 'flipper': '๐ฌ',
+ 'floppy_disk': '๐พ',
+ 'flower_playing_cards': '๐ด',
+ 'flushed': '๐ณ',
+ 'flying_disc': '๐ฅ',
+ 'flying_saucer': '๐ธ',
+ 'foggy': '๐',
+ 'foot': '๐ฆถ',
+ 'football': '๐',
+ 'fork_and_knife': '๐ด',
+ 'fortune_cookie': '๐ฅ ',
+ 'fountain': 'โฒ',
+ 'fountain_pen': '๐๏ธ',
+ 'four_leaf_clover': '๐',
+ 'fox_face': '๐ฆ',
+ 'fr': '๐ซ๐ท',
+ 'free': '๐',
+ 'fried_egg': '๐ณ',
+ 'fried_shrimp': '๐ค',
+ 'fries': '๐',
+ 'frog': '๐ธ',
+ 'frowning': '๐ฆ',
+ 'frowning_face': 'โน๏ธ',
+ 'fu': '๐',
+ 'full_moon': '๐',
+ 'full_moon_with_face': '๐',
+ 'game_die': '๐ฒ',
+ 'garlic': '๐ง',
+ 'gb': '๐ฌ๐ง',
+ 'gear': 'โ๏ธ',
+ 'gem': '๐',
+ 'ghost': '๐ป',
+ 'gift': '๐',
+ 'gift_heart': '๐',
+ 'giraffe': '๐ฆ',
+ 'girl': '๐ง',
+ 'goal_net': '๐ฅ
',
+ 'goat': '๐',
+ 'golf': 'โณ',
+ 'gorilla': '๐ฆ',
+ 'grapes': '๐',
+ 'green_apple': '๐',
+ 'green_book': '๐',
+ 'green_circle': '๐ข',
+ 'green_heart': '๐',
+ 'green_salad': '๐ฅ',
+ 'green_square': '๐ฉ',
+ 'grey_exclamation': 'โ',
+ 'grey_question': 'โ',
+ 'grimacing': '๐ฌ',
+ 'grin': '๐',
+ 'grinning': '๐',
+ 'guitar': '๐ธ',
+ 'gun': '๐ซ',
+ 'hamburger': '๐',
+ 'hammer': '๐จ',
+ 'hammer_and_pick': 'โ๏ธ',
+ 'hammer_and_wrench': '๐ ๏ธ',
+ 'hamster': '๐น',
+ 'hand': 'โ',
+ 'hand_over_mouth': '๐คญ',
+ 'hand_with_index_finger_and_thumb_crossed': '๐ซฐ',
+ 'handball_person': '๐คพ',
+ 'handshake': '๐ค',
+ 'hankey': '๐ฉ',
+ 'hatched_chick': '๐ฅ',
+ 'headphones': '๐ง',
+ 'headstone': '๐ชฆ',
+ 'hear_no_evil': '๐',
+ 'heart': 'โค๏ธ',
+ 'heart_decoration': '๐',
+ 'heart_eyes': '๐',
+ 'heart_eyes_cat': '๐ป',
+ 'heart_hands': '๐ซถ',
+ 'heart_on_fire': 'โค๏ธโ๐ฅ',
+ 'heartbeat': '๐',
+ 'heartpulse': '๐',
+ 'hearts': 'โฅ๏ธ',
+ 'heavy_check_mark': 'โ๏ธ',
+ 'heavy_division_sign': 'โ',
+ 'heavy_dollar_sign': '๐ฒ',
+ 'heavy_exclamation_mark': 'โ',
+ 'heavy_minus_sign': 'โ',
+ 'heavy_multiplication_x': 'โ๏ธ',
+ 'heavy_plus_sign': 'โ',
+ 'hedgehog': '๐ฆ',
+ 'helicopter': '๐',
+ 'herb': '๐ฟ',
+ 'hibiscus': '๐บ',
+ 'hindu_temple': '๐',
+ 'hippopotamus': '๐ฆ',
+ 'hocho': '๐ช',
+ 'honey_pot': '๐ฏ',
+ 'honeybee': '๐',
+ 'horse': '๐ด',
+ 'horse_racing': '๐',
+ 'hospital': '๐ฅ',
+ 'hot_face': '๐ฅต',
+ 'hot_pepper': '๐ถ๏ธ',
+ 'hotdog': '๐ญ',
+ 'hotel': '๐จ',
+ 'hourglass': 'โ',
+ 'hourglass_flowing_sand': 'โณ',
+ 'house': '๐ ',
+ 'house_with_garden': '๐ก',
+ 'hugs': '๐ค',
+ 'hushed': '๐ฏ',
+ 'ice_cream': '๐จ',
+ 'ice_cube': '๐ง',
+ 'ice_hockey': '๐',
+ 'ice_skate': 'โธ๏ธ',
+ 'icecream': '๐ฆ',
+ 'imp': '๐ฟ',
+ 'inbox_tray': '๐ฅ',
+ 'incoming_envelope': '๐จ',
+ 'india': '๐ฎ๐ณ',
+ 'infinity': 'โพ๏ธ',
+ 'information_desk_person': '๐',
+ 'innocent': '๐',
+ 'interrobang': 'โ๏ธ',
+ 'iphone': '๐ฑ',
+ 'ireland': '๐ฎ๐ช',
+ 'it': '๐ฎ๐น',
+ 'japanese_goblin': '๐บ',
+ 'japanese_ogre': '๐น',
+ 'jigsaw': '๐งฉ',
+ 'joy': '๐',
+ 'joy_cat': '๐น',
+ 'jp': '๐ฏ๐ต',
+ 'juggling_person': '๐คน',
+ 'kangaroo': '๐ฆ',
+ 'key': '๐',
+ 'keyboard': 'โจ๏ธ',
+ 'keycap_ten': '๐',
+ 'kick_scooter': '๐ด',
+ 'kiss': '๐',
+ 'kissing': '๐',
+ 'kissing_cat': '๐ฝ',
+ 'kissing_closed_eyes': '๐',
+ 'kissing_heart': '๐',
+ 'kissing_smiling_eyes': '๐',
+ 'kite': '๐ช',
+ 'kiwi_fruit': '๐ฅ',
+ 'knife': '๐ช',
+ 'koala': '๐จ',
+ 'kr': '๐ฐ๐ท',
+ 'lacrosse': '๐ฅ',
+ 'lady_beetle': '๐',
+ 'large_blue_circle': '๐ต',
+ 'large_blue_diamond': '๐ท',
+ 'large_orange_diamond': '๐ถ',
+ 'last_quarter_moon': '๐',
+ 'last_quarter_moon_with_face': '๐',
+ 'laughing': '๐',
+ 'leafy_green': '๐ฅฌ',
+ 'leaves': '๐',
+ 'ledger': '๐',
+ 'leg': '๐ฆต',
+ 'lemon': '๐',
+ 'leopard': '๐',
+ 'lion': '๐ฆ',
+ 'lips': '๐',
+ 'lizard': '๐ฆ',
+ 'llama': '๐ฆ',
+ 'lobster': '๐ฆ',
+ 'lock': '๐',
+ 'lock_with_ink_pen': '๐',
+ 'lollipop': '๐ญ',
+ 'lotion_bottle': '๐งด',
+ 'lotus_position': '๐ง',
+ 'loud_sound': '๐',
+ 'loudspeaker': '๐ข',
+ 'love_letter': '๐',
+ 'love_you_gesture': '๐ค',
+ 'luggage': '๐งณ',
+ 'lungs': '๐ซ',
+ 'lying_face': '๐คฅ',
+ 'magic_wand': '๐ช',
+ 'magnet': '๐งฒ',
+ 'mahjong': '๐',
+ 'mailbox': '๐ซ',
+ 'mailbox_closed': '๐ช',
+ 'mailbox_with_mail': '๐ฌ',
+ 'mailbox_with_no_mail': '๐ญ',
+ 'man': '๐จ',
+ 'mandarin': '๐',
+ 'mango': '๐ฅญ',
+ 'mantelpiece_clock': '๐ฐ๏ธ',
+ 'maple_leaf': '๐',
+ 'martial_arts_uniform': '๐ฅ',
+ 'mask': '๐ท',
+ 'mate': '๐ง',
+ 'meat_on_bone': '๐',
+ 'mechanical_arm': '๐ฆพ',
+ 'mechanical_leg': '๐ฆฟ',
+ 'medal_military': '๐๏ธ',
+ 'medal_sports': '๐
',
+ 'medical_symbol': 'โ๏ธ',
+ 'mega': '๐ฃ',
+ 'melon': '๐',
+ 'melting_face': '๐ซ ',
+ 'memo': '๐',
+ 'metal': '๐ค',
+ 'metro': '๐',
+ 'mexico': '๐ฒ๐ฝ',
+ 'microphone': '๐ค',
+ 'microscope': '๐ฌ',
+ 'middle_finger': '๐',
+ 'milk_glass': '๐ฅ',
+ 'minidisc': '๐ฝ',
+ 'mirror': '๐ช',
+ 'money_mouth_face': '๐ค',
+ 'money_with_wings': '๐ธ',
+ 'moneybag': '๐ฐ',
+ 'monkey_face': '๐ต',
+ 'monocle_face': '๐ง',
+ 'moon': '๐',
+ 'moon_cake': '๐ฅฎ',
+ 'mosque': '๐',
+ 'motor_scooter': '๐ต',
+ 'motorcycle': '๐๏ธ',
+ 'mountain': 'โฐ๏ธ',
+ 'mountain_bicyclist': '๐ต',
+ 'mountain_snow': '๐๏ธ',
+ 'mouse': '๐ญ',
+ 'mouse2': '๐',
+ 'movie_camera': '๐ฅ',
+ 'moyai': '๐ฟ',
+ 'muscle': '๐ช',
+ 'mushroom': '๐',
+ 'musical_keyboard': '๐น',
+ 'musical_score': '๐ผ',
+ 'mute': '๐',
+ 'nail_care': '๐
',
+ 'name_badge': '๐',
+ 'nauseated_face': '๐คข',
+ 'negative_squared_cross_mark': 'โ',
+ 'nerd_face': '๐ค',
+ 'netherlands': '๐ณ๐ฑ',
+ 'neutral_face': '๐',
+ 'new': '๐',
+ 'new_moon': '๐',
+ 'new_moon_with_face': '๐',
+ 'newspaper': '๐ฐ',
+ 'night_with_stars': '๐',
+ 'no_bell': '๐',
+ 'no_entry': 'โ',
+ 'no_entry_sign': '๐ซ',
+ 'no_good': '๐
',
+ 'no_mobile_phones': '๐ต',
+ 'no_mouth': '๐ถ',
+ 'norway': '๐ณ๐ด',
+ 'nose': '๐',
+ 'notebook': '๐',
+ 'notebook_with_decorative_cover': '๐',
+ 'nut_and_bolt': '๐ฉ',
+ 'o': 'โญ',
+ 'o2': '๐
พ๏ธ',
+ 'octopus': '๐',
+ 'oden': '๐ข',
+ 'office': '๐ข',
+ 'oil_drum': '๐ข๏ธ',
+ 'ok': '๐',
+ 'ok_hand': '๐',
+ 'ok_person': '๐',
+ 'old_key': '๐๏ธ',
+ 'older_adult': '๐ง',
+ 'older_man': '๐ด',
+ 'older_woman': '๐ต',
+ 'olive': '๐ซ',
+ 'onion': '๐ง
',
+ 'open_book': '๐',
+ 'open_file_folder': '๐',
+ 'open_hands': '๐',
+ 'open_mouth': '๐ฎ',
+ 'orange': '๐',
+ 'orange_book': '๐',
+ 'orange_circle': '๐ ',
+ 'orange_heart': '๐งก',
+ 'orange_square': '๐ง',
+ 'otter': '๐ฆฆ',
+ 'outbox_tray': '๐ค',
+ 'owl': '๐ฆ',
+ 'ox': '๐',
+ 'oyster': '๐ฆช',
+ 'package': '๐ฆ',
+ 'page_facing_up': '๐',
+ 'page_with_curl': '๐',
+ 'pager': '๐',
+ 'paintbrush': '๐๏ธ',
+ 'palm_tree': '๐ด',
+ 'palms_up_together': '๐คฒ',
+ 'pancakes': '๐ฅ',
+ 'panda_face': '๐ผ',
+ 'paperclip': '๐',
+ 'parrot': '๐ฆ',
+ 'partly_sunny': 'โ
',
+ 'partying_face': '๐ฅณ',
+ 'paw_prints': '๐พ',
+ 'peach': '๐',
+ 'peacock': '๐ฆ',
+ 'peanuts': '๐ฅ',
+ 'pear': '๐',
+ 'pen': '๐๏ธ',
+ 'pencil': '๐',
+ 'pencil2': 'โ๏ธ',
+ 'penguin': '๐ง',
+ 'pensive': '๐',
+ 'people_hugging': '๐ซ',
+ 'performing_arts': '๐ญ',
+ 'persevere': '๐ฃ',
+ 'person_fencing': '๐คบ',
+ 'phone': 'โ๏ธ',
+ 'pick': 'โ๏ธ',
+ 'pie': '๐ฅง',
+ 'pig': '๐ท',
+ 'pig2': '๐',
+ 'pig_nose': '๐ฝ',
+ 'pill': '๐',
+ 'pinata': '๐ช
',
+ 'pinched_fingers': '๐ค',
+ 'pinching_hand': '๐ค',
+ 'pineapple': '๐',
+ 'ping_pong': '๐',
+ 'pirate_flag': '๐ดโโ ๏ธ',
+ 'pizza': '๐',
+ 'plate_with_cutlery': '๐ฝ๏ธ',
+ 'pleading_face': '๐ฅบ',
+ 'point_down': '๐',
+ 'point_left': '๐',
+ 'point_right': '๐',
+ 'point_up': 'โ๏ธ',
+ 'point_up_2': '๐',
+ 'police_car': '๐',
+ 'poodle': '๐ฉ',
+ 'poop': '๐ฉ',
+ 'popcorn': '๐ฟ',
+ 'portugal': '๐ต๐น',
+ 'postal_horn': '๐ฏ',
+ 'postbox': '๐ฎ',
+ 'potato': '๐ฅ',
+ 'potted_plant': '๐ชด',
+ 'poultry_leg': '๐',
+ 'pound': '๐ท',
+ 'pout': '๐ก',
+ 'pouting_cat': '๐พ',
+ 'pray': '๐',
+ 'pretzel': '๐ฅจ',
+ 'printer': '๐จ๏ธ',
+ 'punch': '๐',
+ 'purple_circle': '๐ฃ',
+ 'purple_heart': '๐',
+ 'purple_square': '๐ช',
+ 'pushpin': '๐',
+ 'question': 'โ',
+ 'rabbit': '๐ฐ',
+ 'rabbit2': '๐',
+ 'raccoon': '๐ฆ',
+ 'racehorse': '๐',
+ 'racing_car': '๐๏ธ',
+ 'radio': '๐ป',
+ 'radioactive': 'โข๏ธ',
+ 'rage': '๐ก',
+ 'rainbow': '๐',
+ 'rainbow_flag': '๐ณ๏ธโ๐',
+ 'raised_back_of_hand': '๐ค',
+ 'raised_eyebrow': '๐คจ',
+ 'raised_hand': 'โ',
+ 'raised_hand_with_fingers_splayed': '๐๏ธ',
+ 'raised_hands': '๐',
+ 'raising_hand': '๐',
+ 'ramen': '๐',
+ 'rat': '๐',
+ 'razor': '๐ช',
+ 'receipt': '๐งพ',
+ 'recycle': 'โป๏ธ',
+ 'red_car': '๐',
+ 'red_circle': '๐ด',
+ 'red_square': '๐ฅ',
+ 'relieved': '๐',
+ 'reminder_ribbon': '๐๏ธ',
+ 'revolving_hearts': '๐',
+ 'rhinoceros': '๐ฆ',
+ 'ribbon': '๐',
+ 'rice': '๐',
+ 'rice_ball': '๐',
+ 'rice_cracker': '๐',
+ 'right_anger_bubble': '๐ฏ๏ธ',
+ 'ringed_planet': '๐ช',
+ 'robot': '๐ค',
+ 'rocket': '๐',
+ 'rofl': '๐คฃ',
+ 'roll_eyes': '๐',
+ 'roll_of_paper': '๐งป',
+ 'roller_coaster': '๐ข',
+ 'roller_skate': '๐ผ',
+ 'rooster': '๐',
+ 'rose': '๐น',
+ 'rowboat': '๐ฃ',
+ 'ru': '๐ท๐บ',
+ 'rugby_football': '๐',
+ 'running_shirt_with_sash': '๐ฝ',
+ 'safety_pin': '๐งท',
+ 'sailboat': 'โต',
+ 'sake': '๐ถ',
+ 'salt': '๐ง',
+ 'saluting_face': '๐ซก',
+ 'sandwich': '๐ฅช',
+ 'satellite': '๐ก',
+ 'satisfied': '๐',
+ 'sauropod': '๐ฆ',
+ 'saxophone': '๐ท',
+ 'school': '๐ซ',
+ 'scissors': 'โ๏ธ',
+ 'scorpion': '๐ฆ',
+ 'scream': '๐ฑ',
+ 'scream_cat': '๐',
+ 'scroll': '๐',
+ 'see_no_evil': '๐',
+ 'seedling': '๐ฑ',
+ 'selfie': '๐คณ',
+ 'shallow_pan_of_food': '๐ฅ',
+ 'shamrock': 'โ๏ธ',
+ 'shark': '๐ฆ',
+ 'shaved_ice': '๐ง',
+ 'sheep': '๐',
+ 'shell': '๐',
+ 'shield': '๐ก๏ธ',
+ 'shinto_shrine': 'โฉ๏ธ',
+ 'ship': '๐ข',
+ 'shit': '๐ฉ',
+ 'shopping_cart': '๐',
+ 'shower': '๐ฟ',
+ 'shrimp': '๐ฆ',
+ 'shrug': '๐คท',
+ 'shushing_face': '๐คซ',
+ 'skateboard': '๐น',
+ 'ski': '๐ฟ',
+ 'skier': 'โท๏ธ',
+ 'skull': '๐',
+ 'skull_and_crossbones': 'โ ๏ธ',
+ 'skunk': '๐ฆจ',
+ 'sled': '๐ท',
+ 'sleeping': '๐ด',
+ 'sleepy': '๐ช',
+ 'slightly_frowning_face': '๐',
+ 'slightly_smiling_face': '๐',
+ 'slot_machine': '๐ฐ',
+ 'sloth': '๐ฆฅ',
+ 'small_blue_diamond': '๐น',
+ 'small_orange_diamond': '๐ธ',
+ 'small_red_triangle': '๐บ',
+ 'small_red_triangle_down': '๐ป',
+ 'smile': '๐',
+ 'smile_cat': '๐ธ',
+ 'smiley': '๐',
+ 'smiley_cat': '๐บ',
+ 'smiling_face_with_tear': '๐ฅฒ',
+ 'smiling_face_with_three_hearts': '๐ฅฐ',
+ 'smiling_imp': '๐',
+ 'smirk': '๐',
+ 'smirk_cat': '๐ผ',
+ 'smoking': '๐ฌ',
+ 'snail': '๐',
+ 'snake': '๐',
+ 'sneezing_face': '๐คง',
+ 'snowboarder': '๐',
+ 'snowflake': 'โ๏ธ',
+ 'snowman': 'โ',
+ 'snowman_with_snow': 'โ๏ธ',
+ 'soap': '๐งผ',
+ 'sob': '๐ญ',
+ 'soccer': 'โฝ',
+ 'softball': '๐ฅ',
+ 'sound': '๐',
+ 'space_invader': '๐พ',
+ 'spaghetti': '๐',
+ 'sparkle': 'โ๏ธ',
+ 'sparkler': '๐',
+ 'sparkles': 'โจ',
+ 'sparkling_heart': '๐',
+ 'speak_no_evil': '๐',
+ 'speaker': '๐',
+ 'speaking_head': '๐ฃ๏ธ',
+ 'speech_balloon': '๐ฌ',
+ 'spider': '๐ท๏ธ',
+ 'sponge': '๐งฝ',
+ 'spoon': '๐ฅ',
+ 'squid': '๐ฆ',
+ 'stadium': '๐๏ธ',
+ 'star': 'โญ',
+ 'star2': '๐',
+ 'star_struck': '๐คฉ',
+ 'statue_of_liberty': '๐ฝ',
+ 'steam_locomotive': '๐',
+ 'stethoscope': '๐ฉบ',
+ 'stew': '๐ฒ',
+ 'stopwatch': 'โฑ๏ธ',
+ 'straight_ruler': '๐',
+ 'strawberry': '๐',
+ 'stuck_out_tongue': '๐',
+ 'stuck_out_tongue_closed_eyes': '๐',
+ 'stuck_out_tongue_winking_eye': '๐',
+ 'stuffed_flatbread': '๐ฅ',
+ 'sun_behind_large_cloud': '๐ฅ๏ธ',
+ 'sun_behind_rain_cloud': '๐ฆ๏ธ',
+ 'sun_behind_small_cloud': '๐ค๏ธ',
+ 'sun_with_face': '๐',
+ 'sunflower': '๐ป',
+ 'sunglasses': '๐',
+ 'sunny': 'โ๏ธ',
+ 'sunrise': '๐
',
+ 'sunrise_over_mountains': '๐',
+ 'surfer': '๐',
+ 'sushi': '๐ฃ',
+ 'swan': '๐ฆข',
+ 'sweat': '๐',
+ 'sweat_drops': '๐ฆ',
+ 'sweat_smile': '๐
',
+ 'sweden': '๐ธ๐ช',
+ 'sweet_potato': '๐ ',
+ 'swimmer': '๐',
+ 'symbols': '๐ฃ',
+ 'syringe': '๐',
+ 't-rex': '๐ฆ',
+ 'taco': '๐ฎ',
+ 'tada': '๐',
+ 'takeout_box': '๐ฅก',
+ 'tangerine': '๐',
+ 'taxi': '๐',
+ 'tea': '๐ต',
+ 'teapot': '๐ซ',
+ 'telephone': 'โ๏ธ',
+ 'telephone_receiver': '๐',
+ 'telescope': '๐ญ',
+ 'tennis': '๐พ',
+ 'tent': 'โบ',
+ 'thinking': '๐ค',
+ 'thought_balloon': '๐ญ',
+ 'thumbsdown': '๐',
+ 'thumbsup': '๐',
+ 'ticket': '๐ซ',
+ 'tiger': '๐ฏ',
+ 'tiger2': '๐
',
+ 'timer_clock': 'โฒ๏ธ',
+ 'tipping_hand_person': '๐',
+ 'tired_face': '๐ซ',
+ 'toilet': '๐ฝ',
+ 'tokyo_tower': '๐ผ',
+ 'tomato': '๐
',
+ 'tongue': '๐
',
+ 'toolbox': '๐งฐ',
+ 'tooth': '๐ฆท',
+ 'toothbrush': '๐ชฅ',
+ 'tornado': '๐ช๏ธ',
+ 'train2': '๐',
+ 'triangular_flag_on_post': '๐ฉ',
+ 'triangular_ruler': '๐',
+ 'trident': '๐ฑ',
+ 'triumph': '๐ค',
+ 'trophy': '๐',
+ 'tropical_drink': '๐น',
+ 'tropical_fish': '๐ ',
+ 'truck': '๐',
+ 'trumpet': '๐บ',
+ 'tulip': '๐ท',
+ 'tumbler_glass': '๐ฅ',
+ 'turkey': '๐ฆ',
+ 'turtle': '๐ข',
+ 'tv': '๐บ',
+ 'two_hearts': '๐',
+ 'uk': '๐ฌ๐ง',
+ 'umbrella': 'โ',
+ 'unamused': '๐',
+ 'underage': '๐',
+ 'unicorn': '๐ฆ',
+ 'unlock': '๐',
+ 'up': '๐',
+ 'upside_down_face': '๐',
+ 'us': '๐บ๐ธ',
+ 'v': 'โ๏ธ',
+ 'vertical_traffic_light': '๐ฆ',
+ 'video_camera': '๐น',
+ 'video_game': '๐ฎ',
+ 'violin': '๐ป',
+ 'volcano': '๐',
+ 'volleyball': '๐',
+ 'vomiting_face': '๐คฎ',
+ 'vulcan_salute': '๐',
+ 'waffle': '๐ง',
+ 'waning_crescent_moon': '๐',
+ 'waning_gibbous_moon': '๐',
+ 'wastebasket': '๐๏ธ',
+ 'watch': 'โ',
+ 'water_buffalo': '๐',
+ 'watermelon': '๐',
+ 'wave': '๐',
+ 'wavy_dash': 'ใฐ๏ธ',
+ 'waxing_crescent_moon': '๐',
+ 'waxing_gibbous_moon': '๐',
+ 'weary': '๐ฉ',
+ 'wedding': '๐',
+ 'weight_lifting': '๐๏ธ',
+ 'whale': '๐ณ',
+ 'whale2': '๐',
+ 'white_check_mark': 'โ
',
+ 'white_circle': 'โช',
+ 'white_flag': '๐ณ๏ธ',
+ 'white_heart': '๐ค',
+ 'white_large_square': 'โฌ',
+ 'white_medium_square': 'โป๏ธ',
+ 'wilted_flower': '๐ฅ',
+ 'window': '๐ช',
+ 'wine_glass': '๐ท',
+ 'wink': '๐',
+ 'wolf': '๐บ',
+ 'woman': '๐ฉ',
+ 'woozy_face': '๐ฅด',
+ 'world_map': '๐บ๏ธ',
+ 'worried': '๐',
+ 'wrench': '๐ง',
+ 'wrestling': '๐คผ',
+ 'writing_hand': 'โ๏ธ',
+ 'x': 'โ',
+ 'yawning_face': '๐ฅฑ',
+ 'yellow_circle': '๐ก',
+ 'yellow_heart': '๐',
+ 'yellow_square': '๐จ',
+ 'yen': '๐ด',
+ 'yo_yo': '๐ช',
+ 'yum': '๐',
+ 'zany_face': '๐คช',
+ 'zap': 'โก',
+ 'zebra': '๐ฆ',
+ 'zipper_mouth_face': '๐ค',
+}