Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce emoji plugin #2006

Merged
merged 43 commits into from
Jun 21, 2018
Merged

Introduce emoji plugin #2006

merged 43 commits into from
Jun 21, 2018

Conversation

msamsel
Copy link
Contributor

@msamsel msamsel commented May 23, 2018

What is the purpose of this pull request?

New feature

Does your PR contain necessary tests?

All patches which change the editor code must include tests. You can always read more
on PR testing,
how to set the testing environment and
how to create tests
in the official CKEditor documentation.

This PR contains

  • Unit tests
  • Manual tests

What changes did you make?

  • Add emoji plugin based on autocomplete.

Close #1746

@mlewand
Copy link
Contributor

mlewand commented May 25, 2018

Rebased the PR after latest changes in autocomplete branch.

@mlewand mlewand self-requested a review May 25, 2018 10:37
Copy link
Contributor

@mlewand mlewand left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea with the matching, I like how it feels from the end user perspective.

However there are issues with docs, and I can see that some tests are failing. Please make sure all tests are passing.


Test: http://tests.ckeditor.test:1030/tests/plugins/emoji/manual/preventtransformation fails.

  1. Open the test.
  2. Focus the first editor.
  3. Use format dropdown to convert paragraph into the "Heading 1".
  4. Put the caret after "Hello" word (Hello^ world.).
  5. Type :.

Expected

No autocomplete dropdown is visible.

Actual

Autocomplete dropdown appears.

Failing test

var defaultEmojiList = [{id:':grinning_face:',symbol:'😀'},{id:':beaming_face_with_smiling_eyes:',symbol:'😁'},{id:':face_with_tears_of_joy:',symbol:'😂'},{id:':rolling_on_the_floor_laughing:',symbol:'🤣'},{id:':grinning_face_with_big_eyes:',symbol:'😃'},{id:':grinning_face_with_smiling_eyes:',symbol:'😄'},{id:':grinning_face_with_sweat:',symbol:'😅'},{id:':grinning_squinting_face:',symbol:'😆'},{id:':winking_face:',symbol:'😉'},{id:':smiling_face_with_smiling_eyes:',symbol:'😊'},{id:':face_savoring_food:',symbol:'😋'},{id:':smiling_face_with_sunglasses:',symbol:'😎'},{id:':smiling_face_with_heart-eyes:',symbol:'😍'},{id:':face_blowing_a_kiss:',symbol:'😘'},{id:':kissing_face:',symbol:'😗'},{id:':kissing_face_with_smiling_eyes:',symbol:'😙'},{id:':kissing_face_with_closed_eyes:',symbol:'😚'},{id:':smiling_face:',symbol:'☺'},{id:':slightly_smiling_face:',symbol:'🙂'},{id:':hugging_face:',symbol:'🤗'},{id:':star-struck:',symbol:'🤩'},{id:':thinking_face:',symbol:'🤔'},{id:':face_with_raised_eyebrow:',symbol:'🤨'},{id:':neutral_face:',symbol:'😐'},{id:':expressionless_face:',symbol:'😑'},{id:':face_without_mouth:',symbol:'😶'},{id:':face_with_rolling_eyes:',symbol:'🙄'},{id:':smirking_face:',symbol:'😏'},{id:':persevering_face:',symbol:'😣'},{id:':sad_but_relieved_face:',symbol:'😥'},{id:':face_with_open_mouth:',symbol:'😮'},{id:':zipper-mouth_face:',symbol:'🤐'},{id:':hushed_face:',symbol:'😯'},{id:':sleepy_face:',symbol:'😪'},{id:':tired_face:',symbol:'😫'},{id:':sleeping_face:',symbol:'😴'},{id:':relieved_face:',symbol:'😌'},{id:':face_with_tongue:',symbol:'😛'},{id:':winking_face_with_tongue:',symbol:'😜'},{id:':squinting_face_with_tongue:',symbol:'😝'},{id:':drooling_face:',symbol:'🤤'},{id:':unamused_face:',symbol:'😒'},{id:':downcast_face_with_sweat:',symbol:'😓'},{id:':pensive_face:',symbol:'😔'},{id:':confused_face:',symbol:'😕'},{id:':upside-down_face:',symbol:'🙃'},{id:':money-mouth_face:',symbol:'🤑'},{id:':astonished_face:',symbol:'😲'},{id:':frowning_face:',symbol:'☹'},{id:':slightly_frowning_face:',symbol:'🙁'},{id:':confounded_face:',symbol:'😖'},{id:':disappointed_face:',symbol:'😞'},{id:':worried_face:',symbol:'😟'},{id:':face_with_steam_from_nose:',symbol:'😤'},{id:':crying_face:',symbol:'😢'},{id:':loudly_crying_face:',symbol:'😭'},{id:':frowning_face_with_open_mouth:',symbol:'😦'},{id:':anguished_face:',symbol:'😧'},{id:':fearful_face:',symbol:'😨'},{id:':weary_face:',symbol:'😩'},{id:':exploding_head:',symbol:'🤯'},{id:':grimacing_face:',symbol:'😬'},{id:':anxious_face_with_sweat:',symbol:'😰'},{id:':face_screaming_in_fear:',symbol:'😱'},{id:':flushed_face:',symbol:'😳'},{id:':zany_face:',symbol:'🤪'},{id:':dizzy_face:',symbol:'😵'},{id:':pouting_face:',symbol:'😡'},{id:':angry_face:',symbol:'😠'},{id:':face_with_symbols_on_mouth:',symbol:'🤬'},{id:':face_with_medical_mask:',symbol:'😷'},{id:':face_with_thermometer:',symbol:'🤒'},{id:':face_with_head-bandage:',symbol:'🤕'},{id:':nauseated_face:',symbol:'🤢'},{id:':face_vomiting:',symbol:'🤮'},{id:':sneezing_face:',symbol:'🤧'},{id:':smiling_face_with_halo:',symbol:'😇'},{id:':cowboy_hat_face:',symbol:'🤠'},{id:':lying_face:',symbol:'🤥'},{id:':shushing_face:',symbol:'🤫'},{id:':face_with_hand_over_mouth:',symbol:'🤭'},{id:':face_with_monocle:',symbol:'🧐'},{id:':nerd_face:',symbol:'🤓'},{id:':smiling_face_with_horns:',symbol:'😈'},{id:':angry_face_with_horns:',symbol:'👿'},{id:':clown_face:',symbol:'🤡'},{id:':ogre:',symbol:'👹'},{id:':goblin:',symbol:'👺'},{id:':skull:',symbol:'💀'},{id:':skull_and_crossbones:',symbol:'☠'},{id:':ghost:',symbol:'👻'},{id:':alien:',symbol:'👽'},{id:':alien_monster:',symbol:'👾'},{id:':robot_face:',symbol:'🤖'},{id:':pile_of_poo:',symbol:'💩'},{id:':grinning_cat_face:',symbol:'😺'},{id:':grinning_cat_face_with_smiling_eyes:',symbol:'😸'},{id:':cat_face_with_tears_of_joy:',symbol:'😹'},{id:':smiling_cat_face_with_heart-eyes:',symbol:'😻'},{id:':cat_face_with_wry_smile:',symbol:'😼'},{id:':kissing_cat_face:',symbol:'😽'},{id:':weary_cat_face:',symbol:'🙀'},{id:':crying_cat_face:',symbol:'😿'},{id:':pouting_cat_face:',symbol:'😾'},{id:':see-no-evil_monkey:',symbol:'🙈'},{id:':hear-no-evil_monkey:',symbol:'🙉'},{id:':speak-no-evil_monkey:',symbol:'🙊'},{id:':baby:',symbol:'👶'},{id:':child:',symbol:'🧒'},{id:':boy:',symbol:'👦'},{id:':girl:',symbol:'👧'},{id:':adult:',symbol:'🧑'},{id:':man:',symbol:'👨'},{id:':woman:',symbol:'👩'},{id:':older_adult:',symbol:'🧓'},{id:':old_man:',symbol:'👴'},{id:':old_woman:',symbol:'👵'},{id:':man_health_worker:',symbol:'👨‍⚕️'},{id:':woman_health_worker:',symbol:'👩‍⚕️'},{id:':man_student:',symbol:'👨‍🎓'},{id:':woman_student:',symbol:'👩‍🎓'},{id:':man_teacher:',symbol:'👨‍🏫'},{id:':woman_teacher:',symbol:'👩‍🏫'},{id:':man_judge:',symbol:'👨‍⚖️'},{id:':woman_judge:',symbol:'👩‍⚖️'},{id:':man_farmer:',symbol:'👨‍🌾'},{id:':woman_farmer:',symbol:'👩‍🌾'},{id:':man_cook:',symbol:'👨‍🍳'},{id:':woman_cook:',symbol:'👩‍🍳'},{id:':man_mechanic:',symbol:'👨‍🔧'},{id:':woman_mechanic:',symbol:'👩‍🔧'},{id:':man_factory_worker:',symbol:'👨‍🏭'},{id:':woman_factory_worker:',symbol:'👩‍🏭'},{id:':man_office_worker:',symbol:'👨‍💼'},{id:':woman_office_worker:',symbol:'👩‍💼'},{id:':man_scientist:',symbol:'👨‍🔬'},{id:':woman_scientist:',symbol:'👩‍🔬'},{id:':man_technologist:',symbol:'👨‍💻'},{id:':woman_technologist:',symbol:'👩‍💻'},{id:':man_singer:',symbol:'👨‍🎤'},{id:':woman_singer:',symbol:'👩‍🎤'},{id:':man_artist:',symbol:'👨‍🎨'},{id:':woman_artist:',symbol:'👩‍🎨'},{id:':man_pilot:',symbol:'👨‍✈️'},{id:':woman_pilot:',symbol:'👩‍✈️'},{id:':man_astronaut:',symbol:'👨‍🚀'},{id:':woman_astronaut:',symbol:'👩‍🚀'},{id:':man_firefighter:',symbol:'👨‍🚒'},{id:':woman_firefighter:',symbol:'👩‍🚒'},{id:':police_officer:',symbol:'👮'},{id:':man_police_officer:',symbol:'👮‍♂️'},{id:':woman_police_officer:',symbol:'👮‍♀️'},{id:':detective:',symbol:'🕵'},{id:':man_detective:',symbol:'🕵️‍♂️'},{id:':woman_detective:',symbol:'🕵️‍♀️'},{id:':guard:',symbol:'💂'},{id:':man_guard:',symbol:'💂‍♂️'},{id:':woman_guard:',symbol:'💂‍♀️'},{id:':construction_worker:',symbol:'👷'},{id:':man_construction_worker:',symbol:'👷‍♂️'},{id:':woman_construction_worker:',symbol:'👷‍♀️'},{id:':prince:',symbol:'🤴'},{id:':princess:',symbol:'👸'},{id:':person_wearing_turban:',symbol:'👳'},{id:':man_wearing_turban:',symbol:'👳‍♂️'},{id:':woman_wearing_turban:',symbol:'👳‍♀️'},{id:':man_with_Chinese_cap:',symbol:'👲'},{id:':woman_with_headscarf:',symbol:'🧕'},{id:':bearded_person:',symbol:'🧔'},{id:':blond-haired_person:',symbol:'👱'},{id:':blond-haired_man:',symbol:'👱‍♂️'},{id:':blond-haired_woman:',symbol:'👱‍♀️'},{id:':man_in_tuxedo:',symbol:'🤵'},{id:':bride_with_veil:',symbol:'👰'},{id:':pregnant_woman:',symbol:'🤰'},{id:':breast-feeding:',symbol:'🤱'},{id:':baby_angel:',symbol:'👼'},{id:':Santa_Claus:',symbol:'🎅'},{id:':Mrs._Claus:',symbol:'🤶'},{id:':mage:',symbol:'🧙'},{id:':woman_mage:',symbol:'🧙‍♀️'},{id:':man_mage:',symbol:'🧙‍♂️'},{id:':fairy:',symbol:'🧚'},{id:':woman_fairy:',symbol:'🧚‍♀️'},{id:':man_fairy:',symbol:'🧚‍♂️'},{id:':vampire:',symbol:'🧛'},{id:':woman_vampire:',symbol:'🧛‍♀️'},{id:':man_vampire:',symbol:'🧛‍♂️'},{id:':merperson:',symbol:'🧜'},{id:':mermaid:',symbol:'🧜‍♀️'},{id:':merman:',symbol:'🧜‍♂️'},{id:':elf:',symbol:'🧝'},{id:':woman_elf:',symbol:'🧝‍♀️'},{id:':man_elf:',symbol:'🧝‍♂️'},{id:':genie:',symbol:'🧞'},{id:':woman_genie:',symbol:'🧞‍♀️'},{id:':man_genie:',symbol:'🧞‍♂️'},{id:':zombie:',symbol:'🧟'},{id:':woman_zombie:',symbol:'🧟‍♀️'},{id:':man_zombie:',symbol:'🧟‍♂️'},{id:':person_frowning:',symbol:'🙍'},{id:':man_frowning:',symbol:'🙍‍♂️'},{id:':woman_frowning:',symbol:'🙍‍♀️'},{id:':person_pouting:',symbol:'🙎'},{id:':man_pouting:',symbol:'🙎‍♂️'},{id:':woman_pouting:',symbol:'🙎‍♀️'},{id:':person_gesturing_NO:',symbol:'🙅'},{id:':man_gesturing_NO:',symbol:'🙅‍♂️'},{id:':woman_gesturing_NO:',symbol:'🙅‍♀️'},{id:':person_gesturing_OK:',symbol:'🙆'},{id:':man_gesturing_OK:',symbol:'🙆‍♂️'},{id:':woman_gesturing_OK:',symbol:'🙆‍♀️'},{id:':person_tipping_hand:',symbol:'💁'},{id:':man_tipping_hand:',symbol:'💁‍♂️'},{id:':woman_tipping_hand:',symbol:'💁‍♀️'},{id:':person_raising_hand:',symbol:'🙋'},{id:':man_raising_hand:',symbol:'🙋‍♂️'},{id:':woman_raising_hand:',symbol:'🙋‍♀️'},{id:':person_bowing:',symbol:'🙇'},{id:':man_bowing:',symbol:'🙇‍♂️'},{id:':woman_bowing:',symbol:'🙇‍♀️'},{id:':person_facepalming:',symbol:'🤦'},{id:':man_facepalming:',symbol:'🤦‍♂️'},{id:':woman_facepalming:',symbol:'🤦‍♀️'},{id:':person_shrugging:',symbol:'🤷'},{id:':man_shrugging:',symbol:'🤷‍♂️'},{id:':woman_shrugging:',symbol:'🤷‍♀️'},{id:':person_getting_massage:',symbol:'💆'},{id:':man_getting_massage:',symbol:'💆‍♂️'},{id:':woman_getting_massage:',symbol:'💆‍♀️'},{id:':person_getting_haircut:',symbol:'💇'},{id:':man_getting_haircut:',symbol:'💇‍♂️'},{id:':woman_getting_haircut:',symbol:'💇‍♀️'},{id:':person_walking:',symbol:'🚶'},{id:':man_walking:',symbol:'🚶‍♂️'},{id:':woman_walking:',symbol:'🚶‍♀️'},{id:':person_running:',symbol:'🏃'},{id:':man_running:',symbol:'🏃‍♂️'},{id:':woman_running:',symbol:'🏃‍♀️'},{id:':woman_dancing:',symbol:'💃'},{id:':man_dancing:',symbol:'🕺'},{id:':people_with_bunny_ears:',symbol:'👯'},{id:':men_with_bunny_ears:',symbol:'👯‍♂️'},{id:':women_with_bunny_ears:',symbol:'👯‍♀️'},{id:':person_in_steamy_room:',symbol:'🧖'},{id:':woman_in_steamy_room:',symbol:'🧖‍♀️'},{id:':man_in_steamy_room:',symbol:'🧖‍♂️'},{id:':person_climbing:',symbol:'🧗'},{id:':woman_climbing:',symbol:'🧗‍♀️'},{id:':man_climbing:',symbol:'🧗‍♂️'},{id:':person_in_lotus_position:',symbol:'🧘'},{id:':woman_in_lotus_position:',symbol:'🧘‍♀️'},{id:':man_in_lotus_position:',symbol:'🧘‍♂️'},{id:':person_taking_bath:',symbol:'🛀'},{id:':person_in_bed:',symbol:'🛌'},{id:':man_in_suit_levitating:',symbol:'🕴'},{id:':speaking_head:',symbol:'🗣'},{id:':bust_in_silhouette:',symbol:'👤'},{id:':busts_in_silhouette:',symbol:'👥'},{id:':person_fencing:',symbol:'🤺'},{id:':horse_racing:',symbol:'🏇'},{id:':skier:',symbol:'⛷'},{id:':snowboarder:',symbol:'🏂'},{id:':person_golfing:',symbol:'🏌'},{id:':man_golfing:',symbol:'🏌️‍♂️'},{id:':woman_golfing:',symbol:'🏌️‍♀️'},{id:':person_surfing:',symbol:'🏄'},{id:':man_surfing:',symbol:'🏄‍♂️'},{id:':woman_surfing:',symbol:'🏄‍♀️'},{id:':person_rowing_boat:',symbol:'🚣'},{id:':man_rowing_boat:',symbol:'🚣‍♂️'},{id:':woman_rowing_boat:',symbol:'🚣‍♀️'},{id:':person_swimming:',symbol:'🏊'},{id:':man_swimming:',symbol:'🏊‍♂️'},{id:':woman_swimming:',symbol:'🏊‍♀️'},{id:':person_bouncing_ball:',symbol:'⛹'},{id:':man_bouncing_ball:',symbol:'⛹️‍♂️'},{id:':woman_bouncing_ball:',symbol:'⛹️‍♀️'},{id:':person_lifting_weights:',symbol:'🏋'},{id:':man_lifting_weights:',symbol:'🏋️‍♂️'},{id:':woman_lifting_weights:',symbol:'🏋️‍♀️'},{id:':person_biking:',symbol:'🚴'},{id:':man_biking:',symbol:'🚴‍♂️'},{id:':woman_biking:',symbol:'🚴‍♀️'},{id:':person_mountain_biking:',symbol:'🚵'},{id:':man_mountain_biking:',symbol:'🚵‍♂️'},{id:':woman_mountain_biking:',symbol:'🚵‍♀️'},{id:':racing_car:',symbol:'🏎'},{id:':motorcycle:',symbol:'🏍'},{id:':person_cartwheeling:',symbol:'🤸'},{id:':man_cartwheeling:',symbol:'🤸‍♂️'},{id:':woman_cartwheeling:',symbol:'🤸‍♀️'},{id:':people_wrestling:',symbol:'🤼'},{id:':men_wrestling:',symbol:'🤼‍♂️'},{id:':women_wrestling:',symbol:'🤼‍♀️'},{id:':person_playing_water_polo:',symbol:'🤽'},{id:':man_playing_water_polo:',symbol:'🤽‍♂️'},{id:':woman_playing_water_polo:',symbol:'🤽‍♀️'},{id:':person_playing_handball:',symbol:'🤾'},{id:':man_playing_handball:',symbol:'🤾‍♂️'},{id:':woman_playing_handball:',symbol:'🤾‍♀️'},{id:':person_juggling:',symbol:'🤹'},{id:':man_juggling:',symbol:'🤹‍♂️'},{id:':woman_juggling:',symbol:'🤹‍♀️'},{id:':man_and_woman_holding_hands:',symbol:'👫'},{id:':two_men_holding_hands:',symbol:'👬'},{id:':two_women_holding_hands:',symbol:'👭'},{id:':kiss:',symbol:'💏'},{id:':kiss:_woman,_man:',symbol:'👩‍❤️‍💋‍👨'},{id:':kiss:_man,_man:',symbol:'👨‍❤️‍💋‍👨'},{id:':kiss:_woman,_woman:',symbol:'👩‍❤️‍💋‍👩'},{id:':couple_with_heart:',symbol:'💑'},{id:':couple_with_heart:_woman,_man:',symbol:'👩‍❤️‍👨'},{id:':couple_with_heart:_man,_man:',symbol:'👨‍❤️‍👨'},{id:':couple_with_heart:_woman,_woman:',symbol:'👩‍❤️‍👩'},{id:':family:',symbol:'👪'},{id:':family:_man,_woman,_boy:',symbol:'👨‍👩‍👦'},{id:':family:_man,_woman,_girl:',symbol:'👨‍👩‍👧'},{id:':family:_man,_woman,_girl,_boy:',symbol:'👨‍👩‍👧‍👦'},{id:':family:_man,_woman,_boy,_boy:',symbol:'👨‍👩‍👦‍👦'},{id:':family:_man,_woman,_girl,_girl:',symbol:'👨‍👩‍👧‍👧'},{id:':family:_man,_man,_boy:',symbol:'👨‍👨‍👦'},{id:':family:_man,_man,_girl:',symbol:'👨‍👨‍👧'},{id:':family:_man,_man,_girl,_boy:',symbol:'👨‍👨‍👧‍👦'},{id:':family:_man,_man,_boy,_boy:',symbol:'👨‍👨‍👦‍👦'},{id:':family:_man,_man,_girl,_girl:',symbol:'👨‍👨‍👧‍👧'},{id:':family:_woman,_woman,_boy:',symbol:'👩‍👩‍👦'},{id:':family:_woman,_woman,_girl:',symbol:'👩‍👩‍👧'},{id:':family:_woman,_woman,_girl,_boy:',symbol:'👩‍👩‍👧‍👦'},{id:':family:_woman,_woman,_boy,_boy:',symbol:'👩‍👩‍👦‍👦'},{id:':family:_woman,_woman,_girl,_girl:',symbol:'👩‍👩‍👧‍👧'},{id:':family:_man,_boy:',symbol:'👨‍👦'},{id:':family:_man,_boy,_boy:',symbol:'👨‍👦‍👦'},{id:':family:_man,_girl:',symbol:'👨‍👧'},{id:':family:_man,_girl,_boy:',symbol:'👨‍👧‍👦'},{id:':family:_man,_girl,_girl:',symbol:'👨‍👧‍👧'},{id:':family:_woman,_boy:',symbol:'👩‍👦'},{id:':family:_woman,_boy,_boy:',symbol:'👩‍👦‍👦'},{id:':family:_woman,_girl:',symbol:'👩‍👧'},{id:':family:_woman,_girl,_boy:',symbol:'👩‍👧‍👦'},{id:':family:_woman,_girl,_girl:',symbol:'👩‍👧‍👧'},{id:':selfie:',symbol:'🤳'},{id:':flexed_biceps:',symbol:'💪'},{id:':backhand_index_pointing_left:',symbol:'👈'},{id:':backhand_index_pointing_right:',symbol:'👉'},{id:':index_pointing_up:',symbol:'☝'},{id:':backhand_index_pointing_up:',symbol:'👆'},{id:':middle_finger:',symbol:'🖕'},{id:':backhand_index_pointing_down:',symbol:'👇'},{id:':victory_hand:',symbol:'✌'},{id:':crossed_fingers:',symbol:'🤞'},{id:':vulcan_salute:',symbol:'🖖'},{id:':sign_of_the_horns:',symbol:'🤘'},{id:':call_me_hand:',symbol:'🤙'},{id:':hand_with_fingers_splayed:',symbol:'🖐'},{id:':raised_hand:',symbol:'✋'},{id:':OK_hand:',symbol:'👌'},{id:':thumbs_up:',symbol:'👍'},{id:':thumbs_down:',symbol:'👎'},{id:':raised_fist:',symbol:'✊'},{id:':oncoming_fist:',symbol:'👊'},{id:':left-facing_fist:',symbol:'🤛'},{id:':right-facing_fist:',symbol:'🤜'},{id:':raised_back_of_hand:',symbol:'🤚'},{id:':waving_hand:',symbol:'👋'},{id:':love-you_gesture:',symbol:'🤟'},{id:':writing_hand:',symbol:'✍'},{id:':clapping_hands:',symbol:'👏'},{id:':open_hands:',symbol:'👐'},{id:':raising_hands:',symbol:'🙌'},{id:':palms_up_together:',symbol:'🤲'},{id:':folded_hands:',symbol:'🙏'},{id:':handshake:',symbol:'🤝'},{id:':nail_polish:',symbol:'💅'},{id:':ear:',symbol:'👂'},{id:':nose:',symbol:'👃'},{id:':footprints:',symbol:'👣'},{id:':eyes:',symbol:'👀'},{id:':eye:',symbol:'👁'},{id:':eye_in_speech_bubble:',symbol:'👁️‍🗨️'},{id:':brain:',symbol:'🧠'},{id:':tongue:',symbol:'👅'},{id:':mouth:',symbol:'👄'},{id:':kiss_mark:',symbol:'💋'},{id:':heart_with_arrow:',symbol:'💘'},{id:':heart_with_ribbon:',symbol:'💝'},{id:':sparkling_heart:',symbol:'💖'},{id:':growing_heart:',symbol:'💗'},{id:':beating_heart:',symbol:'💓'},{id:':revolving_hearts:',symbol:'💞'},{id:':two_hearts:',symbol:'💕'},{id:':love_letter:',symbol:'💌'},{id:':heavy_heart_exclamation:',symbol:'❣'},{id:':broken_heart:',symbol:'💔'},{id:':red_heart:',symbol:'❤'},{id:':orange_heart:',symbol:'🧡'},{id:':yellow_heart:',symbol:'💛'},{id:':green_heart:',symbol:'💚'},{id:':blue_heart:',symbol:'💙'},{id:':purple_heart:',symbol:'💜'},{id:':black_heart:',symbol:'🖤'},{id:':heart_decoration:',symbol:'💟'},{id:':zzz:',symbol:'💤'},{id:':anger_symbol:',symbol:'💢'},{id:':bomb:',symbol:'💣'},{id:':collision:',symbol:'💥'},{id:':sweat_droplets:',symbol:'💦'},{id:':dashing_away:',symbol:'💨'},{id:':dizzy:',symbol:'💫'},{id:':speech_balloon:',symbol:'💬'},{id:':left_speech_bubble:',symbol:'🗨'},{id:':right_anger_bubble:',symbol:'🗯'},{id:':thought_balloon:',symbol:'💭'},{id:':hole:',symbol:'🕳'},{id:':glasses:',symbol:'👓'},{id:':sunglasses:',symbol:'🕶'},{id:':necktie:',symbol:'👔'},{id:':t-shirt:',symbol:'👕'},{id:':jeans:',symbol:'👖'},{id:':scarf:',symbol:'🧣'},{id:':gloves:',symbol:'🧤'},{id:':coat:',symbol:'🧥'},{id:':socks:',symbol:'🧦'},{id:':dress:',symbol:'👗'},{id:':kimono:',symbol:'👘'},{id:':bikini:',symbol:'👙'},{id:':woman’s_clothes:',symbol:'👚'},{id:':purse:',symbol:'👛'},{id:':handbag:',symbol:'👜'},{id:':clutch_bag:',symbol:'👝'},{id:':shopping_bags:',symbol:'🛍'},{id:':backpack:',symbol:'🎒'},{id:':man’s_shoe:',symbol:'👞'},{id:':running_shoe:',symbol:'👟'},{id:':high-heeled_shoe:',symbol:'👠'},{id:':woman’s_sandal:',symbol:'👡'},{id:':woman’s_boot:',symbol:'👢'},{id:':crown:',symbol:'👑'},{id:':woman’s_hat:',symbol:'👒'},{id:':top_hat:',symbol:'🎩'},{id:':graduation_cap:',symbol:'🎓'},{id:':billed_cap:',symbol:'🧢'},{id:':rescue_worker’s_helmet:',symbol:'⛑'},{id:':prayer_beads:',symbol:'📿'},{id:':lipstick:',symbol:'💄'},{id:':ring:',symbol:'💍'},{id:':gem_stone:',symbol:'💎'},{id:':monkey_face:',symbol:'🐵'},{id:':monkey:',symbol:'🐒'},{id:':gorilla:',symbol:'🦍'},{id:':dog_face:',symbol:'🐶'},{id:':dog:',symbol:'🐕'},{id:':poodle:',symbol:'🐩'},{id:':wolf_face:',symbol:'🐺'},{id:':fox_face:',symbol:'🦊'},{id:':cat_face:',symbol:'🐱'},{id:':cat:',symbol:'🐈'},{id:':lion_face:',symbol:'🦁'},{id:':tiger_face:',symbol:'🐯'},{id:':tiger:',symbol:'🐅'},{id:':leopard:',symbol:'🐆'},{id:':horse_face:',symbol:'🐴'},{id:':horse:',symbol:'🐎'},{id:':unicorn_face:',symbol:'🦄'},{id:':zebra:',symbol:'🦓'},{id:':deer:',symbol:'🦌'},{id:':cow_face:',symbol:'🐮'},{id:':ox:',symbol:'🐂'},{id:':water_buffalo:',symbol:'🐃'},{id:':cow:',symbol:'🐄'},{id:':pig_face:',symbol:'🐷'},{id:':pig:',symbol:'🐖'},{id:':boar:',symbol:'🐗'},{id:':pig_nose:',symbol:'🐽'},{id:':ram:',symbol:'🐏'},{id:':ewe:',symbol:'🐑'},{id:':goat:',symbol:'🐐'},{id:':camel:',symbol:'🐪'},{id:':two-hump_camel:',symbol:'🐫'},{id:':giraffe:',symbol:'🦒'},{id:':elephant:',symbol:'🐘'},{id:':rhinoceros:',symbol:'🦏'},{id:':mouse_face:',symbol:'🐭'},{id:':mouse:',symbol:'🐁'},{id:':rat:',symbol:'🐀'},{id:':hamster_face:',symbol:'🐹'},{id:':rabbit_face:',symbol:'🐰'},{id:':rabbit:',symbol:'🐇'},{id:':chipmunk:',symbol:'🐿'},{id:':hedgehog:',symbol:'🦔'},{id:':bat:',symbol:'🦇'},{id:':bear_face:',symbol:'🐻'},{id:':koala:',symbol:'🐨'},{id:':panda_face:',symbol:'🐼'},{id:':paw_prints:',symbol:'🐾'},{id:':turkey:',symbol:'🦃'},{id:':chicken:',symbol:'🐔'},{id:':rooster:',symbol:'🐓'},{id:':hatching_chick:',symbol:'🐣'},{id:':baby_chick:',symbol:'🐤'},{id:':front-facing_baby_chick:',symbol:'🐥'},{id:':bird:',symbol:'🐦'},{id:':penguin:',symbol:'🐧'},{id:':dove:',symbol:'🕊'},{id:':eagle:',symbol:'🦅'},{id:':duck:',symbol:'🦆'},{id:':owl:',symbol:'🦉'},{id:':frog_face:',symbol:'🐸'},{id:':crocodile:',symbol:'🐊'},{id:':turtle:',symbol:'🐢'},{id:':lizard:',symbol:'🦎'},{id:':snake:',symbol:'🐍'},{id:':dragon_face:',symbol:'🐲'},{id:':dragon:',symbol:'🐉'},{id:':sauropod:',symbol:'🦕'},{id:':T-Rex:',symbol:'🦖'},{id:':spouting_whale:',symbol:'🐳'},{id:':whale:',symbol:'🐋'},{id:':dolphin:',symbol:'🐬'},{id:':fish:',symbol:'🐟'},{id:':tropical_fish:',symbol:'🐠'},{id:':blowfish:',symbol:'🐡'},{id:':shark:',symbol:'🦈'},{id:':octopus:',symbol:'🐙'},{id:':spiral_shell:',symbol:'🐚'},{id:':crab:',symbol:'🦀'},{id:':shrimp:',symbol:'🦐'},{id:':squid:',symbol:'🦑'},{id:':snail:',symbol:'🐌'},{id:':butterfly:',symbol:'🦋'},{id:':bug:',symbol:'🐛'},{id:':ant:',symbol:'🐜'},{id:':honeybee:',symbol:'🐝'},{id:':lady_beetle:',symbol:'🐞'},{id:':cricket:',symbol:'🦗'},{id:':spider:',symbol:'🕷'},{id:':spider_web:',symbol:'🕸'},{id:':scorpion:',symbol:'🦂'},{id:':bouquet:',symbol:'💐'},{id:':cherry_blossom:',symbol:'🌸'},{id:':white_flower:',symbol:'💮'},{id:':rosette:',symbol:'🏵'},{id:':rose:',symbol:'🌹'},{id:':wilted_flower:',symbol:'🥀'},{id:':hibiscus:',symbol:'🌺'},{id:':sunflower:',symbol:'🌻'},{id:':blossom:',symbol:'🌼'},{id:':tulip:',symbol:'🌷'},{id:':seedling:',symbol:'🌱'},{id:':evergreen_tree:',symbol:'🌲'},{id:':deciduous_tree:',symbol:'🌳'},{id:':palm_tree:',symbol:'🌴'},{id:':cactus:',symbol:'🌵'},{id:':sheaf_of_rice:',symbol:'🌾'},{id:':herb:',symbol:'🌿'},{id:':shamrock:',symbol:'☘'},{id:':four_leaf_clover:',symbol:'🍀'},{id:':maple_leaf:',symbol:'🍁'},{id:':fallen_leaf:',symbol:'🍂'},{id:':leaf_fluttering_in_wind:',symbol:'🍃'},{id:':grapes:',symbol:'🍇'},{id:':melon:',symbol:'🍈'},{id:':watermelon:',symbol:'🍉'},{id:':tangerine:',symbol:'🍊'},{id:':lemon:',symbol:'🍋'},{id:':banana:',symbol:'🍌'},{id:':pineapple:',symbol:'🍍'},{id:':red_apple:',symbol:'🍎'},{id:':green_apple:',symbol:'🍏'},{id:':pear:',symbol:'🍐'},{id:':peach:',symbol:'🍑'},{id:':cherries:',symbol:'🍒'},{id:':strawberry:',symbol:'🍓'},{id:':kiwi_fruit:',symbol:'🥝'},{id:':tomato:',symbol:'🍅'},{id:':coconut:',symbol:'🥥'},{id:':avocado:',symbol:'🥑'},{id:':eggplant:',symbol:'🍆'},{id:':potato:',symbol:'🥔'},{id:':carrot:',symbol:'🥕'},{id:':ear_of_corn:',symbol:'🌽'},{id:':hot_pepper:',symbol:'🌶'},{id:':cucumber:',symbol:'🥒'},{id:':broccoli:',symbol:'🥦'},{id:':mushroom:',symbol:'🍄'},{id:':peanuts:',symbol:'🥜'},{id:':chestnut:',symbol:'🌰'},{id:':bread:',symbol:'🍞'},{id:':croissant:',symbol:'🥐'},{id:':baguette_bread:',symbol:'🥖'},{id:':pretzel:',symbol:'🥨'},{id:':pancakes:',symbol:'🥞'},{id:':cheese_wedge:',symbol:'🧀'},{id:':meat_on_bone:',symbol:'🍖'},{id:':poultry_leg:',symbol:'🍗'},{id:':cut_of_meat:',symbol:'🥩'},{id:':bacon:',symbol:'🥓'},{id:':hamburger:',symbol:'🍔'},{id:':french_fries:',symbol:'🍟'},{id:':pizza:',symbol:'🍕'},{id:':hot_dog:',symbol:'🌭'},{id:':sandwich:',symbol:'🥪'},{id:':taco:',symbol:'🌮'},{id:':burrito:',symbol:'🌯'},{id:':stuffed_flatbread:',symbol:'🥙'},{id:':egg:',symbol:'🥚'},{id:':cooking:',symbol:'🍳'},{id:':shallow_pan_of_food:',symbol:'🥘'},{id:':pot_of_food:',symbol:'🍲'},{id:':bowl_with_spoon:',symbol:'🥣'},{id:':green_salad:',symbol:'🥗'},{id:':popcorn:',symbol:'🍿'},{id:':canned_food:',symbol:'🥫'},{id:':bento_box:',symbol:'🍱'},{id:':rice_cracker:',symbol:'🍘'},{id:':rice_ball:',symbol:'🍙'},{id:':cooked_rice:',symbol:'🍚'},{id:':curry_rice:',symbol:'🍛'},{id:':steaming_bowl:',symbol:'🍜'},{id:':spaghetti:',symbol:'🍝'},{id:':roasted_sweet_potato:',symbol:'🍠'},{id:':oden:',symbol:'🍢'},{id:':sushi:',symbol:'🍣'},{id:':fried_shrimp:',symbol:'🍤'},{id:':fish_cake_with_swirl:',symbol:'🍥'},{id:':dango:',symbol:'🍡'},{id:':dumpling:',symbol:'🥟'},{id:':fortune_cookie:',symbol:'🥠'},{id:':takeout_box:',symbol:'🥡'},{id:':soft_ice_cream:',symbol:'🍦'},{id:':shaved_ice:',symbol:'🍧'},{id:':ice_cream:',symbol:'🍨'},{id:':doughnut:',symbol:'🍩'},{id:':cookie:',symbol:'🍪'},{id:':birthday_cake:',symbol:'🎂'},{id:':shortcake:',symbol:'🍰'},{id:':pie:',symbol:'🥧'},{id:':chocolate_bar:',symbol:'🍫'},{id:':candy:',symbol:'🍬'},{id:':lollipop:',symbol:'🍭'},{id:':custard:',symbol:'🍮'},{id:':honey_pot:',symbol:'🍯'},{id:':baby_bottle:',symbol:'🍼'},{id:':glass_of_milk:',symbol:'🥛'},{id:':hot_beverage:',symbol:'☕'},{id:':teacup_without_handle:',symbol:'🍵'},{id:':sake:',symbol:'🍶'},{id:':bottle_with_popping_cork:',symbol:'🍾'},{id:':wine_glass:',symbol:'🍷'},{id:':cocktail_glass:',symbol:'🍸'},{id:':tropical_drink:',symbol:'🍹'},{id:':beer_mug:',symbol:'🍺'},{id:':clinking_beer_mugs:',symbol:'🍻'},{id:':clinking_glasses:',symbol:'🥂'},{id:':tumbler_glass:',symbol:'🥃'},{id:':cup_with_straw:',symbol:'🥤'},{id:':chopsticks:',symbol:'🥢'},{id:':fork_and_knife_with_plate:',symbol:'🍽'},{id:':fork_and_knife:',symbol:'🍴'},{id:':spoon:',symbol:'🥄'},{id:':kitchen_knife:',symbol:'🔪'},{id:':amphora:',symbol:'🏺'},{id:':globe_showing_Europe-Africa:',symbol:'🌍'},{id:':globe_showing_Americas:',symbol:'🌎'},{id:':globe_showing_Asia-Australia:',symbol:'🌏'},{id:':globe_with_meridians:',symbol:'🌐'},{id:':world_map:',symbol:'🗺'},{id:':map_of_Japan:',symbol:'🗾'},{id:':snow-capped_mountain:',symbol:'🏔'},{id:':mountain:',symbol:'⛰'},{id:':volcano:',symbol:'🌋'},{id:':mount_fuji:',symbol:'🗻'},{id:':camping:',symbol:'🏕'},{id:':beach_with_umbrella:',symbol:'🏖'},{id:':desert:',symbol:'🏜'},{id:':desert_island:',symbol:'🏝'},{id:':national_park:',symbol:'🏞'},{id:':stadium:',symbol:'🏟'},{id:':classical_building:',symbol:'🏛'},{id:':building_construction:',symbol:'🏗'},{id:':houses:',symbol:'🏘'},{id:':derelict_house:',symbol:'🏚'},{id:':house:',symbol:'🏠'},{id:':house_with_garden:',symbol:'🏡'},{id:':office_building:',symbol:'🏢'},{id:':Japanese_post_office:',symbol:'🏣'},{id:':post_office:',symbol:'🏤'},{id:':hospital:',symbol:'🏥'},{id:':bank:',symbol:'🏦'},{id:':hotel:',symbol:'🏨'},{id:':love_hotel:',symbol:'🏩'},{id:':convenience_store:',symbol:'🏪'},{id:':school:',symbol:'🏫'},{id:':department_store:',symbol:'🏬'},{id:':factory:',symbol:'🏭'},{id:':Japanese_castle:',symbol:'🏯'},{id:':castle:',symbol:'🏰'},{id:':wedding:',symbol:'💒'},{id:':Tokyo_tower:',symbol:'🗼'},{id:':Statue_of_Liberty:',symbol:'🗽'},{id:':church:',symbol:'⛪'},{id:':mosque:',symbol:'🕌'},{id:':synagogue:',symbol:'🕍'},{id:':shinto_shrine:',symbol:'⛩'},{id:':kaaba:',symbol:'🕋'},{id:':fountain:',symbol:'⛲'},{id:':tent:',symbol:'⛺'},{id:':foggy:',symbol:'🌁'},{id:':night_with_stars:',symbol:'🌃'},{id:':cityscape:',symbol:'🏙'},{id:':sunrise_over_mountains:',symbol:'🌄'},{id:':sunrise:',symbol:'🌅'},{id:':cityscape_at_dusk:',symbol:'🌆'},{id:':sunset:',symbol:'🌇'},{id:':bridge_at_night:',symbol:'🌉'},{id:':hot_springs:',symbol:'♨'},{id:':milky_way:',symbol:'🌌'},{id:':carousel_horse:',symbol:'🎠'},{id:':ferris_wheel:',symbol:'🎡'},{id:':roller_coaster:',symbol:'🎢'},{id:':barber_pole:',symbol:'💈'},{id:':circus_tent:',symbol:'🎪'},{id:':locomotive:',symbol:'🚂'},{id:':railway_car:',symbol:'🚃'},{id:':high-speed_train:',symbol:'🚄'},{id:':bullet_train:',symbol:'🚅'},{id:':train:',symbol:'🚆'},{id:':metro:',symbol:'🚇'},{id:':light_rail:',symbol:'🚈'},{id:':station:',symbol:'🚉'},{id:':tram:',symbol:'🚊'},{id:':monorail:',symbol:'🚝'},{id:':mountain_railway:',symbol:'🚞'},{id:':tram_car:',symbol:'🚋'},{id:':bus:',symbol:'🚌'},{id:':oncoming_bus:',symbol:'🚍'},{id:':trolleybus:',symbol:'🚎'},{id:':minibus:',symbol:'🚐'},{id:':ambulance:',symbol:'🚑'},{id:':fire_engine:',symbol:'🚒'},{id:':police_car:',symbol:'🚓'},{id:':oncoming_police_car:',symbol:'🚔'},{id:':taxi:',symbol:'🚕'},{id:':oncoming_taxi:',symbol:'🚖'},{id:':automobile:',symbol:'🚗'},{id:':oncoming_automobile:',symbol:'🚘'},{id:':sport_utility_vehicle:',symbol:'🚙'},{id:':delivery_truck:',symbol:'🚚'},{id:':articulated_lorry:',symbol:'🚛'},{id:':tractor:',symbol:'🚜'},{id:':bicycle:',symbol:'🚲'},{id:':kick_scooter:',symbol:'🛴'},{id:':motor_scooter:',symbol:'🛵'},{id:':bus_stop:',symbol:'🚏'},{id:':motorway:',symbol:'🛣'},{id:':railway_track:',symbol:'🛤'},{id:':oil_drum:',symbol:'🛢'},{id:':fuel_pump:',symbol:'⛽'},{id:':police_car_light:',symbol:'🚨'},{id:':horizontal_traffic_light:',symbol:'🚥'},{id:':vertical_traffic_light:',symbol:'🚦'},{id:':stop_sign:',symbol:'🛑'},{id:':construction:',symbol:'🚧'},{id:':anchor:',symbol:'⚓'},{id:':sailboat:',symbol:'⛵'},{id:':canoe:',symbol:'🛶'},{id:':speedboat:',symbol:'🚤'},{id:':passenger_ship:',symbol:'🛳'},{id:':ferry:',symbol:'⛴'},{id:':motor_boat:',symbol:'🛥'},{id:':ship:',symbol:'🚢'},{id:':airplane:',symbol:'✈'},{id:':small_airplane:',symbol:'🛩'},{id:':airplane_departure:',symbol:'🛫'},{id:':airplane_arrival:',symbol:'🛬'},{id:':seat:',symbol:'💺'},{id:':helicopter:',symbol:'🚁'},{id:':suspension_railway:',symbol:'🚟'},{id:':mountain_cableway:',symbol:'🚠'},{id:':aerial_tramway:',symbol:'🚡'},{id:':satellite:',symbol:'🛰'},{id:':rocket:',symbol:'🚀'},{id:':flying_saucer:',symbol:'🛸'},{id:':bellhop_bell:',symbol:'🛎'},{id:':hourglass_done:',symbol:'⌛'},{id:':hourglass_not_done:',symbol:'⏳'},{id:':watch:',symbol:'⌚'},{id:':alarm_clock:',symbol:'⏰'},{id:':stopwatch:',symbol:'⏱'},{id:':timer_clock:',symbol:'⏲'},{id:':mantelpiece_clock:',symbol:'🕰'},{id:':twelve_o’clock:',symbol:'🕛'},{id:':twelve-thirty:',symbol:'🕧'},{id:':one_o’clock:',symbol:'🕐'},{id:':one-thirty:',symbol:'🕜'},{id:':two_o’clock:',symbol:'🕑'},{id:':two-thirty:',symbol:'🕝'},{id:':three_o’clock:',symbol:'🕒'},{id:':three-thirty:',symbol:'🕞'},{id:':four_o’clock:',symbol:'🕓'},{id:':four-thirty:',symbol:'🕟'},{id:':five_o’clock:',symbol:'🕔'},{id:':five-thirty:',symbol:'🕠'},{id:':six_o’clock:',symbol:'🕕'},{id:':six-thirty:',symbol:'🕡'},{id:':seven_o’clock:',symbol:'🕖'},{id:':seven-thirty:',symbol:'🕢'},{id:':eight_o’clock:',symbol:'🕗'},{id:':eight-thirty:',symbol:'🕣'},{id:':nine_o’clock:',symbol:'🕘'},{id:':nine-thirty:',symbol:'🕤'},{id:':ten_o’clock:',symbol:'🕙'},{id:':ten-thirty:',symbol:'🕥'},{id:':eleven_o’clock:',symbol:'🕚'},{id:':eleven-thirty:',symbol:'🕦'},{id:':new_moon:',symbol:'🌑'},{id:':waxing_crescent_moon:',symbol:'🌒'},{id:':first_quarter_moon:',symbol:'🌓'},{id:':waxing_gibbous_moon:',symbol:'🌔'},{id:':full_moon:',symbol:'🌕'},{id:':waning_gibbous_moon:',symbol:'🌖'},{id:':last_quarter_moon:',symbol:'🌗'},{id:':waning_crescent_moon:',symbol:'🌘'},{id:':crescent_moon:',symbol:'🌙'},{id:':new_moon_face:',symbol:'🌚'},{id:':first_quarter_moon_face:',symbol:'🌛'},{id:':last_quarter_moon_face:',symbol:'🌜'},{id:':thermometer:',symbol:'🌡'},{id:':sun:',symbol:'☀'},{id:':full_moon_face:',symbol:'🌝'},{id:':sun_with_face:',symbol:'🌞'},{id:':star:',symbol:'⭐'},{id:':glowing_star:',symbol:'🌟'},{id:':shooting_star:',symbol:'🌠'},{id:':cloud:',symbol:'☁'},{id:':sun_behind_cloud:',symbol:'⛅'},{id:':cloud_with_lightning_and_rain:',symbol:'⛈'},{id:':sun_behind_small_cloud:',symbol:'🌤'},{id:':sun_behind_large_cloud:',symbol:'🌥'},{id:':sun_behind_rain_cloud:',symbol:'🌦'},{id:':cloud_with_rain:',symbol:'🌧'},{id:':cloud_with_snow:',symbol:'🌨'},{id:':cloud_with_lightning:',symbol:'🌩'},{id:':tornado:',symbol:'🌪'},{id:':fog:',symbol:'🌫'},{id:':wind_face:',symbol:'🌬'},{id:':cyclone:',symbol:'🌀'},{id:':rainbow:',symbol:'🌈'},{id:':closed_umbrella:',symbol:'🌂'},{id:':umbrella:',symbol:'☂'},{id:':umbrella_with_rain_drops:',symbol:'☔'},{id:':umbrella_on_ground:',symbol:'⛱'},{id:':high_voltage:',symbol:'⚡'},{id:':snowflake:',symbol:'❄'},{id:':snowman:',symbol:'☃'},{id:':snowman_without_snow:',symbol:'⛄'},{id:':comet:',symbol:'☄'},{id:':fire:',symbol:'🔥'},{id:':droplet:',symbol:'💧'},{id:':water_wave:',symbol:'🌊'},{id:':jack-o-lantern:',symbol:'🎃'},{id:':Christmas_tree:',symbol:'🎄'},{id:':fireworks:',symbol:'🎆'},{id:':sparkler:',symbol:'🎇'},{id:':sparkles:',symbol:'✨'},{id:':balloon:',symbol:'🎈'},{id:':party_popper:',symbol:'🎉'},{id:':confetti_ball:',symbol:'🎊'},{id:':tanabata_tree:',symbol:'🎋'},{id:':pine_decoration:',symbol:'🎍'},{id:':Japanese_dolls:',symbol:'🎎'},{id:':carp_streamer:',symbol:'🎏'},{id:':wind_chime:',symbol:'🎐'},{id:':moon_viewing_ceremony:',symbol:'🎑'},{id:':ribbon:',symbol:'🎀'},{id:':wrapped_gift:',symbol:'🎁'},{id:':reminder_ribbon:',symbol:'🎗'},{id:':admission_tickets:',symbol:'🎟'},{id:':ticket:',symbol:'🎫'},{id:':military_medal:',symbol:'🎖'},{id:':trophy:',symbol:'🏆'},{id:':sports_medal:',symbol:'🏅'},{id:':1st_place_medal:',symbol:'🥇'},{id:':2nd_place_medal:',symbol:'🥈'},{id:':3rd_place_medal:',symbol:'🥉'},{id:':soccer_ball:',symbol:'⚽'},{id:':baseball:',symbol:'⚾'},{id:':basketball:',symbol:'🏀'},{id:':volleyball:',symbol:'🏐'},{id:':american_football:',symbol:'🏈'},{id:':rugby_football:',symbol:'🏉'},{id:':tennis:',symbol:'🎾'},{id:':bowling:',symbol:'🎳'},{id:':cricket_game:',symbol:'🏏'},{id:':field_hockey:',symbol:'🏑'},{id:':ice_hockey:',symbol:'🏒'},{id:':ping_pong:',symbol:'🏓'},{id:':badminton:',symbol:'🏸'},{id:':boxing_glove:',symbol:'🥊'},{id:':martial_arts_uniform:',symbol:'🥋'},{id:':goal_net:',symbol:'🥅'},{id:':flag_in_hole:',symbol:'⛳'},{id:':ice_skate:',symbol:'⛸'},{id:':fishing_pole:',symbol:'🎣'},{id:':running_shirt:',symbol:'🎽'},{id:':skis:',symbol:'🎿'},{id:':sled:',symbol:'🛷'},{id:':curling_stone:',symbol:'🥌'},{id:':direct_hit:',symbol:'🎯'},{id:':pool_8_ball:',symbol:'🎱'},{id:':crystal_ball:',symbol:'🔮'},{id:':video_game:',symbol:'🎮'},{id:':joystick:',symbol:'🕹'},{id:':slot_machine:',symbol:'🎰'},{id:':game_die:',symbol:'🎲'},{id:':spade_suit:',symbol:'♠'},{id:':heart_suit:',symbol:'♥'},{id:':diamond_suit:',symbol:'♦'},{id:':club_suit:',symbol:'♣'},{id:':joker:',symbol:'🃏'},{id:':mahjong_red_dragon:',symbol:'🀄'},{id:':flower_playing_cards:',symbol:'🎴'},{id:':performing_arts:',symbol:'🎭'},{id:':framed_picture:',symbol:'🖼'},{id:':artist_palette:',symbol:'🎨'},{id:':muted_speaker:',symbol:'🔇'},{id:':speaker_low_volume:',symbol:'🔈'},{id:':speaker_medium_volume:',symbol:'🔉'},{id:':speaker_high_volume:',symbol:'🔊'},{id:':loudspeaker:',symbol:'📢'},{id:':megaphone:',symbol:'📣'},{id:':postal_horn:',symbol:'📯'},{id:':bell:',symbol:'🔔'},{id:':bell_with_slash:',symbol:'🔕'},{id:':musical_score:',symbol:'🎼'},{id:':musical_note:',symbol:'🎵'},{id:':musical_notes:',symbol:'🎶'},{id:':studio_microphone:',symbol:'🎙'},{id:':level_slider:',symbol:'🎚'},{id:':control_knobs:',symbol:'🎛'},{id:':microphone:',symbol:'🎤'},{id:':headphone:',symbol:'🎧'},{id:':radio:',symbol:'📻'},{id:':saxophone:',symbol:'🎷'},{id:':guitar:',symbol:'🎸'},{id:':musical_keyboard:',symbol:'🎹'},{id:':trumpet:',symbol:'🎺'},{id:':violin:',symbol:'🎻'},{id:':drum:',symbol:'🥁'},{id:':mobile_phone:',symbol:'📱'},{id:':mobile_phone_with_arrow:',symbol:'📲'},{id:':telephone:',symbol:'☎'},{id:':telephone_receiver:',symbol:'📞'},{id:':pager:',symbol:'📟'},{id:':fax_machine:',symbol:'📠'},{id:':battery:',symbol:'🔋'},{id:':electric_plug:',symbol:'🔌'},{id:':laptop_computer:',symbol:'💻'},{id:':desktop_computer:',symbol:'🖥'},{id:':printer:',symbol:'🖨'},{id:':keyboard:',symbol:'⌨'},{id:':computer_mouse:',symbol:'🖱'},{id:':trackball:',symbol:'🖲'},{id:':computer_disk:',symbol:'💽'},{id:':floppy_disk:',symbol:'💾'},{id:':optical_disk:',symbol:'💿'},{id:':dvd:',symbol:'📀'},{id:':movie_camera:',symbol:'🎥'},{id:':film_frames:',symbol:'🎞'},{id:':film_projector:',symbol:'📽'},{id:':clapper_board:',symbol:'🎬'},{id:':television:',symbol:'📺'},{id:':camera:',symbol:'📷'},{id:':camera_with_flash:',symbol:'📸'},{id:':video_camera:',symbol:'📹'},{id:':videocassette:',symbol:'📼'},{id:':magnifying_glass_tilted_left:',symbol:'🔍'},{id:':magnifying_glass_tilted_right:',symbol:'🔎'},{id:':candle:',symbol:'🕯'},{id:':light_bulb:',symbol:'💡'},{id:':flashlight:',symbol:'🔦'},{id:':red_paper_lantern:',symbol:'🏮'},{id:':notebook_with_decorative_cover:',symbol:'📔'},{id:':closed_book:',symbol:'📕'},{id:':open_book:',symbol:'📖'},{id:':green_book:',symbol:'📗'},{id:':blue_book:',symbol:'📘'},{id:':orange_book:',symbol:'📙'},{id:':books:',symbol:'📚'},{id:':notebook:',symbol:'📓'},{id:':ledger:',symbol:'📒'},{id:':page_with_curl:',symbol:'📃'},{id:':scroll:',symbol:'📜'},{id:':page_facing_up:',symbol:'📄'},{id:':newspaper:',symbol:'📰'},{id:':rolled-up_newspaper:',symbol:'🗞'},{id:':bookmark_tabs:',symbol:'📑'},{id:':bookmark:',symbol:'🔖'},{id:':label:',symbol:'🏷'},{id:':money_bag:',symbol:'💰'},{id:':yen_banknote:',symbol:'💴'},{id:':dollar_banknote:',symbol:'💵'},{id:':euro_banknote:',symbol:'💶'},{id:':pound_banknote:',symbol:'💷'},{id:':money_with_wings:',symbol:'💸'},{id:':credit_card:',symbol:'💳'},{id:':chart_increasing_with_yen:',symbol:'💹'},{id:':currency_exchange:',symbol:'💱'},{id:':heavy_dollar_sign:',symbol:'💲'},{id:':envelope:',symbol:'✉'},{id:':e-mail:',symbol:'📧'},{id:':incoming_envelope:',symbol:'📨'},{id:':envelope_with_arrow:',symbol:'📩'},{id:':outbox_tray:',symbol:'📤'},{id:':inbox_tray:',symbol:'📥'},{id:':package:',symbol:'📦'},{id:':closed_mailbox_with_raised_flag:',symbol:'📫'},{id:':closed_mailbox_with_lowered_flag:',symbol:'📪'},{id:':open_mailbox_with_raised_flag:',symbol:'📬'},{id:':open_mailbox_with_lowered_flag:',symbol:'📭'},{id:':postbox:',symbol:'📮'},{id:':ballot_box_with_ballot:',symbol:'🗳'},{id:':pencil:',symbol:'✏'},{id:':black_nib:',symbol:'✒'},{id:':fountain_pen:',symbol:'🖋'},{id:':pen:',symbol:'🖊'},{id:':paintbrush:',symbol:'🖌'},{id:':crayon:',symbol:'🖍'},{id:':memo:',symbol:'📝'},{id:':briefcase:',symbol:'💼'},{id:':file_folder:',symbol:'📁'},{id:':open_file_folder:',symbol:'📂'},{id:':card_index_dividers:',symbol:'🗂'},{id:':calendar:',symbol:'📅'},{id:':tear-off_calendar:',symbol:'📆'},{id:':spiral_notepad:',symbol:'🗒'},{id:':spiral_calendar:',symbol:'🗓'},{id:':card_index:',symbol:'📇'},{id:':chart_increasing:',symbol:'📈'},{id:':chart_decreasing:',symbol:'📉'},{id:':bar_chart:',symbol:'📊'},{id:':clipboard:',symbol:'📋'},{id:':pushpin:',symbol:'📌'},{id:':round_pushpin:',symbol:'📍'},{id:':paperclip:',symbol:'📎'},{id:':linked_paperclips:',symbol:'🖇'},{id:':straight_ruler:',symbol:'📏'},{id:':triangular_ruler:',symbol:'📐'},{id:':scissors:',symbol:'✂'},{id:':card_file_box:',symbol:'🗃'},{id:':file_cabinet:',symbol:'🗄'},{id:':wastebasket:',symbol:'🗑'},{id:':locked:',symbol:'🔒'},{id:':unlocked:',symbol:'🔓'},{id:':locked_with_pen:',symbol:'🔏'},{id:':locked_with_key:',symbol:'🔐'},{id:':key:',symbol:'🔑'},{id:':old_key:',symbol:'🗝'},{id:':hammer:',symbol:'🔨'},{id:':pick:',symbol:'⛏'},{id:':hammer_and_pick:',symbol:'⚒'},{id:':hammer_and_wrench:',symbol:'🛠'},{id:':dagger:',symbol:'🗡'},{id:':crossed_swords:',symbol:'⚔'},{id:':pistol:',symbol:'🔫'},{id:':bow_and_arrow:',symbol:'🏹'},{id:':shield:',symbol:'🛡'},{id:':wrench:',symbol:'🔧'},{id:':nut_and_bolt:',symbol:'🔩'},{id:':gear:',symbol:'⚙'},{id:':clamp:',symbol:'🗜'},{id:':balance_scale:',symbol:'⚖'},{id:':link:',symbol:'🔗'},{id:':chains:',symbol:'⛓'},{id:':alembic:',symbol:'⚗'},{id:':microscope:',symbol:'🔬'},{id:':telescope:',symbol:'🔭'},{id:':satellite_antenna:',symbol:'📡'},{id:':syringe:',symbol:'💉'},{id:':pill:',symbol:'💊'},{id:':door:',symbol:'🚪'},{id:':bed:',symbol:'🛏'},{id:':couch_and_lamp:',symbol:'🛋'},{id:':toilet:',symbol:'🚽'},{id:':shower:',symbol:'🚿'},{id:':bathtub:',symbol:'🛁'},{id:':shopping_cart:',symbol:'🛒'},{id:':cigarette:',symbol:'🚬'},{id:':coffin:',symbol:'⚰'},{id:':funeral_urn:',symbol:'⚱'},{id:':moai:',symbol:'🗿'},{id:':ATM_sign:',symbol:'🏧'},{id:':litter_in_bin_sign:',symbol:'🚮'},{id:':potable_water:',symbol:'🚰'},{id:':wheelchair_symbol:',symbol:'♿'},{id:':men’s_room:',symbol:'🚹'},{id:':women’s_room:',symbol:'🚺'},{id:':restroom:',symbol:'🚻'},{id:':baby_symbol:',symbol:'🚼'},{id:':water_closet:',symbol:'🚾'},{id:':passport_control:',symbol:'🛂'},{id:':customs:',symbol:'🛃'},{id:':baggage_claim:',symbol:'🛄'},{id:':left_luggage:',symbol:'🛅'},{id:':warning:',symbol:'⚠'},{id:':children_crossing:',symbol:'🚸'},{id:':no_entry:',symbol:'⛔'},{id:':prohibited:',symbol:'🚫'},{id:':no_bicycles:',symbol:'🚳'},{id:':no_smoking:',symbol:'🚭'},{id:':no_littering:',symbol:'🚯'},{id:':non-potable_water:',symbol:'🚱'},{id:':no_pedestrians:',symbol:'🚷'},{id:':no_mobile_phones:',symbol:'📵'},{id:':no_one_under_eighteen:',symbol:'🔞'},{id:':radioactive:',symbol:'☢'},{id:':biohazard:',symbol:'☣'},{id:':up_arrow:',symbol:'⬆'},{id:':up-right_arrow:',symbol:'↗'},{id:':right_arrow:',symbol:'➡'},{id:':down-right_arrow:',symbol:'↘'},{id:':down_arrow:',symbol:'⬇'},{id:':down-left_arrow:',symbol:'↙'},{id:':left_arrow:',symbol:'⬅'},{id:':up-left_arrow:',symbol:'↖'},{id:':up-down_arrow:',symbol:'↕'},{id:':left-right_arrow:',symbol:'↔'},{id:':right_arrow_curving_left:',symbol:'↩'},{id:':left_arrow_curving_right:',symbol:'↪'},{id:':right_arrow_curving_up:',symbol:'⤴'},{id:':right_arrow_curving_down:',symbol:'⤵'},{id:':clockwise_vertical_arrows:',symbol:'🔃'},{id:':counterclockwise_arrows_button:',symbol:'🔄'},{id:':BACK_arrow:',symbol:'🔙'},{id:':END_arrow:',symbol:'🔚'},{id:':ON!_arrow:',symbol:'🔛'},{id:':SOON_arrow:',symbol:'🔜'},{id:':TOP_arrow:',symbol:'🔝'},{id:':place_of_worship:',symbol:'🛐'},{id:':atom_symbol:',symbol:'⚛'},{id:':om:',symbol:'🕉'},{id:':star_of_David:',symbol:'✡'},{id:':wheel_of_dharma:',symbol:'☸'},{id:':yin_yang:',symbol:'☯'},{id:':latin_cross:',symbol:'✝'},{id:':orthodox_cross:',symbol:'☦'},{id:':star_and_crescent:',symbol:'☪'},{id:':peace_symbol:',symbol:'☮'},{id:':menorah:',symbol:'🕎'},{id:':dotted_six-pointed_star:',symbol:'🔯'},{id:':Aries:',symbol:'♈'},{id:':Taurus:',symbol:'♉'},{id:':Gemini:',symbol:'♊'},{id:':Cancer:',symbol:'♋'},{id:':Leo:',symbol:'♌'},{id:':Virgo:',symbol:'♍'},{id:':Libra:',symbol:'♎'},{id:':Scorpio:',symbol:'♏'},{id:':Sagittarius:',symbol:'♐'},{id:':Capricorn:',symbol:'♑'},{id:':Aquarius:',symbol:'♒'},{id:':Pisces:',symbol:'♓'},{id:':Ophiuchus:',symbol:'⛎'},{id:':shuffle_tracks_button:',symbol:'🔀'},{id:':repeat_button:',symbol:'🔁'},{id:':repeat_single_button:',symbol:'🔂'},{id:':play_button:',symbol:'▶'},{id:':fast-forward_button:',symbol:'⏩'},{id:':next_track_button:',symbol:'⏭'},{id:':play_or_pause_button:',symbol:'⏯'},{id:':reverse_button:',symbol:'◀'},{id:':fast_reverse_button:',symbol:'⏪'},{id:':last_track_button:',symbol:'⏮'},{id:':upwards_button:',symbol:'🔼'},{id:':fast_up_button:',symbol:'⏫'},{id:':downwards_button:',symbol:'🔽'},{id:':fast_down_button:',symbol:'⏬'},{id:':pause_button:',symbol:'⏸'},{id:':stop_button:',symbol:'⏹'},{id:':record_button:',symbol:'⏺'},{id:':eject_button:',symbol:'⏏'},{id:':cinema:',symbol:'🎦'},{id:':dim_button:',symbol:'🔅'},{id:':bright_button:',symbol:'🔆'},{id:':antenna_bars:',symbol:'📶'},{id:':vibration_mode:',symbol:'📳'},{id:':mobile_phone_off:',symbol:'📴'},{id:':female_sign:',symbol:'♀'},{id:':male_sign:',symbol:'♂'},{id:':medical_symbol:',symbol:'⚕'},{id:':recycling_symbol:',symbol:'♻'},{id:':fleur-de-lis:',symbol:'⚜'},{id:':trident_emblem:',symbol:'🔱'},{id:':name_badge:',symbol:'📛'},{id:':Japanese_symbol_for_beginner:',symbol:'🔰'},{id:':heavy_large_circle:',symbol:'⭕'},{id:':white_heavy_check_mark:',symbol:'✅'},{id:':ballot_box_with_check:',symbol:'☑'},{id:':heavy_check_mark:',symbol:'✔'},{id:':heavy_multiplication_x:',symbol:'✖'},{id:':cross_mark:',symbol:'❌'},{id:':cross_mark_button:',symbol:'❎'},{id:':heavy_plus_sign:',symbol:'➕'},{id:':heavy_minus_sign:',symbol:'➖'},{id:':heavy_division_sign:',symbol:'➗'},{id:':curly_loop:',symbol:'➰'},{id:':double_curly_loop:',symbol:'➿'},{id:':part_alternation_mark:',symbol:'〽'},{id:':eight-spoked_asterisk:',symbol:'✳'},{id:':eight-pointed_star:',symbol:'✴'},{id:':sparkle:',symbol:'❇'},{id:':double_exclamation_mark:',symbol:'‼'},{id:':exclamation_question_mark:',symbol:'⁉'},{id:':question_mark:',symbol:'❓'},{id:':white_question_mark:',symbol:'❔'},{id:':white_exclamation_mark:',symbol:'❕'},{id:':exclamation_mark:',symbol:'❗'},{id:':wavy_dash:',symbol:'〰'},{id:':copyright:',symbol:'©'},{id:':registered:',symbol:'®'},{id:':trade_mark:',symbol:'™'},{id:':keycap:_#:',symbol:'#️⃣'},{id:':keycap:_*:',symbol:'*️⃣'},{id:':keycap:_0:',symbol:'0️⃣'},{id:':keycap:_1:',symbol:'1️⃣'},{id:':keycap:_2:',symbol:'2️⃣'},{id:':keycap:_3:',symbol:'3️⃣'},{id:':keycap:_4:',symbol:'4️⃣'},{id:':keycap:_5:',symbol:'5️⃣'},{id:':keycap:_6:',symbol:'6️⃣'},{id:':keycap:_7:',symbol:'7️⃣'},{id:':keycap:_8:',symbol:'8️⃣'},{id:':keycap:_9:',symbol:'9️⃣'},{id:':keycap:_10:',symbol:'🔟'},{id:':hundred_points:',symbol:'💯'},{id:':input_latin_uppercase:',symbol:'🔠'},{id:':input_latin_lowercase:',symbol:'🔡'},{id:':input_numbers:',symbol:'🔢'},{id:':input_symbols:',symbol:'🔣'},{id:':input_latin_letters:',symbol:'🔤'},{id:':A_button_(blood_type):',symbol:'🅰'},{id:':AB_button_(blood_type):',symbol:'🆎'},{id:':B_button_(blood_type):',symbol:'🅱'},{id:':CL_button:',symbol:'🆑'},{id:':COOL_button:',symbol:'🆒'},{id:':FREE_button:',symbol:'🆓'},{id:':information:',symbol:'ℹ'},{id:':ID_button:',symbol:'🆔'},{id:':circled_M:',symbol:'Ⓜ'},{id:':NEW_button:',symbol:'🆕'},{id:':NG_button:',symbol:'🆖'},{id:':O_button_(blood_type):',symbol:'🅾'},{id:':OK_button:',symbol:'🆗'},{id:':P_button:',symbol:'🅿'},{id:':SOS_button:',symbol:'🆘'},{id:':UP!_button:',symbol:'🆙'},{id:':VS_button:',symbol:'🆚'},{id:':Japanese_“here”_button:',symbol:'🈁'},{id:':Japanese_“service_charge”_button:',symbol:'🈂'},{id:':Japanese_“monthly_amount”_button:',symbol:'🈷'},{id:':Japanese_“not_free_of_charge”_button:',symbol:'🈶'},{id:':Japanese_“reserved”_button:',symbol:'🈯'},{id:':Japanese_“bargain”_button:',symbol:'🉐'},{id:':Japanese_“discount”_button:',symbol:'🈹'},{id:':Japanese_“free_of_charge”_button:',symbol:'🈚'},{id:':Japanese_“prohibited”_button:',symbol:'🈲'},{id:':Japanese_“acceptable”_button:',symbol:'🉑'},{id:':Japanese_“application”_button:',symbol:'🈸'},{id:':Japanese_“passing_grade”_button:',symbol:'🈴'},{id:':Japanese_“vacancy”_button:',symbol:'🈳'},{id:':Japanese_“congratulations”_button:',symbol:'㊗'},{id:':Japanese_“secret”_button:',symbol:'㊙'},{id:':Japanese_“open_for_business”_button:',symbol:'🈺'},{id:':Japanese_“no_vacancy”_button:',symbol:'🈵'},{id:':red_circle:',symbol:'🔴'},{id:':blue_circle:',symbol:'🔵'},{id:':white_circle:',symbol:'⚪'},{id:':black_circle:',symbol:'⚫'},{id:':white_large_square:',symbol:'⬜'},{id:':black_large_square:',symbol:'⬛'},{id:':black_medium_square:',symbol:'◼'},{id:':white_medium_square:',symbol:'◻'},{id:':white_medium-small_square:',symbol:'◽'},{id:':black_medium-small_square:',symbol:'◾'},{id:':white_small_square:',symbol:'▫'},{id:':black_small_square:',symbol:'▪'},{id:':large_orange_diamond:',symbol:'🔶'},{id:':large_blue_diamond:',symbol:'🔷'},{id:':small_orange_diamond:',symbol:'🔸'},{id:':small_blue_diamond:',symbol:'🔹'},{id:':red_triangle_pointed_up:',symbol:'🔺'},{id:':red_triangle_pointed_down:',symbol:'🔻'},{id:':diamond_with_a_dot:',symbol:'💠'},{id:':radio_button:',symbol:'🔘'},{id:':black_square_button:',symbol:'🔲'},{id:':white_square_button:',symbol:'🔳'},{id:':chequered_flag:',symbol:'🏁'},{id:':triangular_flag:',symbol:'🚩'},{id:':crossed_flags:',symbol:'🎌'},{id:':black_flag:',symbol:'🏴'},{id:':white_flag:',symbol:'🏳'},{id:':rainbow_flag:',symbol:'🏳️‍🌈'},{id:':Ascension_Island:',symbol:'🇦🇨'},{id:':Andorra:',symbol:'🇦🇩'},{id:':United_Arab_Emirates:',symbol:'🇦🇪'},{id:':Afghanistan:',symbol:'🇦🇫'},{id:':Antigua_&_Barbuda:',symbol:'🇦🇬'},{id:':Anguilla:',symbol:'🇦🇮'},{id:':Albania:',symbol:'🇦🇱'},{id:':Armenia:',symbol:'🇦🇲'},{id:':Angola:',symbol:'🇦🇴'},{id:':Antarctica:',symbol:'🇦🇶'},{id:':Argentina:',symbol:'🇦🇷'},{id:':American_Samoa:',symbol:'🇦🇸'},{id:':Austria:',symbol:'🇦🇹'},{id:':Australia:',symbol:'🇦🇺'},{id:':Aruba:',symbol:'🇦🇼'},{id:':Åland_Islands:',symbol:'🇦🇽'},{id:':Azerbaijan:',symbol:'🇦🇿'},{id:':Bosnia_&_Herzegovina:',symbol:'🇧🇦'},{id:':Barbados:',symbol:'🇧🇧'},{id:':Bangladesh:',symbol:'🇧🇩'},{id:':Belgium:',symbol:'🇧🇪'},{id:':Burkina_Faso:',symbol:'🇧🇫'},{id:':Bulgaria:',symbol:'🇧🇬'},{id:':Bahrain:',symbol:'🇧🇭'},{id:':Burundi:',symbol:'🇧🇮'},{id:':Benin:',symbol:'🇧🇯'},{id:':St._Barthélemy:',symbol:'🇧🇱'},{id:':Bermuda:',symbol:'🇧🇲'},{id:':Brunei:',symbol:'🇧🇳'},{id:':Bolivia:',symbol:'🇧🇴'},{id:':Caribbean_Netherlands:',symbol:'🇧🇶'},{id:':Brazil:',symbol:'🇧🇷'},{id:':Bahamas:',symbol:'🇧🇸'},{id:':Bhutan:',symbol:'🇧🇹'},{id:':Bouvet_Island:',symbol:'🇧🇻'},{id:':Botswana:',symbol:'🇧🇼'},{id:':Belarus:',symbol:'🇧🇾'},{id:':Belize:',symbol:'🇧🇿'},{id:':Canada:',symbol:'🇨🇦'},{id:':Cocos_(Keeling)_Islands:',symbol:'🇨🇨'},{id:':Congo_-_Kinshasa:',symbol:'🇨🇩'},{id:':Central_African_Republic:',symbol:'🇨🇫'},{id:':Congo_-_Brazzaville:',symbol:'🇨🇬'},{id:':Switzerland:',symbol:'🇨🇭'},{id:':Côte_d’Ivoire:',symbol:'🇨🇮'},{id:':Cook_Islands:',symbol:'🇨🇰'},{id:':Chile:',symbol:'🇨🇱'},{id:':Cameroon:',symbol:'🇨🇲'},{id:':China:',symbol:'🇨🇳'},{id:':Colombia:',symbol:'🇨🇴'},{id:':Clipperton_Island:',symbol:'🇨🇵'},{id:':Costa_Rica:',symbol:'🇨🇷'},{id:':Cuba:',symbol:'🇨🇺'},{id:':Cape_Verde:',symbol:'🇨🇻'},{id:':Curaçao:',symbol:'🇨🇼'},{id:':Christmas_Island:',symbol:'🇨🇽'},{id:':Cyprus:',symbol:'🇨🇾'},{id:':Czechia:',symbol:'🇨🇿'},{id:':Germany:',symbol:'🇩🇪'},{id:':Diego_Garcia:',symbol:'🇩🇬'},{id:':Djibouti:',symbol:'🇩🇯'},{id:':Denmark:',symbol:'🇩🇰'},{id:':Dominica:',symbol:'🇩🇲'},{id:':Dominican_Republic:',symbol:'🇩🇴'},{id:':Algeria:',symbol:'🇩🇿'},{id:':Ceuta_&_Melilla:',symbol:'🇪🇦'},{id:':Ecuador:',symbol:'🇪🇨'},{id:':Estonia:',symbol:'🇪🇪'},{id:':Egypt:',symbol:'🇪🇬'},{id:':Western_Sahara:',symbol:'🇪🇭'},{id:':Eritrea:',symbol:'🇪🇷'},{id:':Spain:',symbol:'🇪🇸'},{id:':Ethiopia:',symbol:'🇪🇹'},{id:':European_Union:',symbol:'🇪🇺'},{id:':Finland:',symbol:'🇫🇮'},{id:':Fiji:',symbol:'🇫🇯'},{id:':Falkland_Islands:',symbol:'🇫🇰'},{id:':Micronesia:',symbol:'🇫🇲'},{id:':Faroe_Islands:',symbol:'🇫🇴'},{id:':France:',symbol:'🇫🇷'},{id:':Gabon:',symbol:'🇬🇦'},{id:':United_Kingdom:',symbol:'🇬🇧'},{id:':Grenada:',symbol:'🇬🇩'},{id:':Georgia:',symbol:'🇬🇪'},{id:':French_Guiana:',symbol:'🇬🇫'},{id:':Guernsey:',symbol:'🇬🇬'},{id:':Ghana:',symbol:'🇬🇭'},{id:':Gibraltar:',symbol:'🇬🇮'},{id:':Greenland:',symbol:'🇬🇱'},{id:':Gambia:',symbol:'🇬🇲'},{id:':Guinea:',symbol:'🇬🇳'},{id:':Guadeloupe:',symbol:'🇬🇵'},{id:':Equatorial_Guinea:',symbol:'🇬🇶'},{id:':Greece:',symbol:'🇬🇷'},{id:':South_Georgia_&_South_Sandwich_Islands:',symbol:'🇬🇸'},{id:':Guatemala:',symbol:'🇬🇹'},{id:':Guam:',symbol:'🇬🇺'},{id:':Guinea-Bissau:',symbol:'🇬🇼'},{id:':Guyana:',symbol:'🇬🇾'},{id:':Hong_Kong_SAR_China:',symbol:'🇭🇰'},{id:':Heard_&_McDonald_Islands:',symbol:'🇭🇲'},{id:':Honduras:',symbol:'🇭🇳'},{id:':Croatia:',symbol:'🇭🇷'},{id:':Haiti:',symbol:'🇭🇹'},{id:':Hungary:',symbol:'🇭🇺'},{id:':Canary_Islands:',symbol:'🇮🇨'},{id:':Indonesia:',symbol:'🇮🇩'},{id:':Ireland:',symbol:'🇮🇪'},{id:':Israel:',symbol:'🇮🇱'},{id:':Isle_of_Man:',symbol:'🇮🇲'},{id:':India:',symbol:'🇮🇳'},{id:':British_Indian_Ocean_Territory:',symbol:'🇮🇴'},{id:':Iraq:',symbol:'🇮🇶'},{id:':Iran:',symbol:'🇮🇷'},{id:':Iceland:',symbol:'🇮🇸'},{id:':Italy:',symbol:'🇮🇹'},{id:':Jersey:',symbol:'🇯🇪'},{id:':Jamaica:',symbol:'🇯🇲'},{id:':Jordan:',symbol:'🇯🇴'},{id:':Japan:',symbol:'🇯🇵'},{id:':Kenya:',symbol:'🇰🇪'},{id:':Kyrgyzstan:',symbol:'🇰🇬'},{id:':Cambodia:',symbol:'🇰🇭'},{id:':Kiribati:',symbol:'🇰🇮'},{id:':Comoros:',symbol:'🇰🇲'},{id:':St._Kitts_&_Nevis:',symbol:'🇰🇳'},{id:':North_Korea:',symbol:'🇰🇵'},{id:':South_Korea:',symbol:'🇰🇷'},{id:':Kuwait:',symbol:'🇰🇼'},{id:':Cayman_Islands:',symbol:'🇰🇾'},{id:':Kazakhstan:',symbol:'🇰🇿'},{id:':Laos:',symbol:'🇱🇦'},{id:':Lebanon:',symbol:'🇱🇧'},{id:':St._Lucia:',symbol:'🇱🇨'},{id:':Liechtenstein:',symbol:'🇱🇮'},{id:':Sri_Lanka:',symbol:'🇱🇰'},{id:':Liberia:',symbol:'🇱🇷'},{id:':Lesotho:',symbol:'🇱🇸'},{id:':Lithuania:',symbol:'🇱🇹'},{id:':Luxembourg:',symbol:'🇱🇺'},{id:':Latvia:',symbol:'🇱🇻'},{id:':Libya:',symbol:'🇱🇾'},{id:':Morocco:',symbol:'🇲🇦'},{id:':Monaco:',symbol:'🇲🇨'},{id:':Moldova:',symbol:'🇲🇩'},{id:':Montenegro:',symbol:'🇲🇪'},{id:':St._Martin:',symbol:'🇲🇫'},{id:':Madagascar:',symbol:'🇲🇬'},{id:':Marshall_Islands:',symbol:'🇲🇭'},{id:':Macedonia:',symbol:'🇲🇰'},{id:':Mali:',symbol:'🇲🇱'},{id:':Myanmar_(Burma):',symbol:'🇲🇲'},{id:':Mongolia:',symbol:'🇲🇳'},{id:':Macau_SAR_China:',symbol:'🇲🇴'},{id:':Northern_Mariana_Islands:',symbol:'🇲🇵'},{id:':Martinique:',symbol:'🇲🇶'},{id:':Mauritania:',symbol:'🇲🇷'},{id:':Montserrat:',symbol:'🇲🇸'},{id:':Malta:',symbol:'🇲🇹'},{id:':Mauritius:',symbol:'🇲🇺'},{id:':Maldives:',symbol:'🇲🇻'},{id:':Malawi:',symbol:'🇲🇼'},{id:':Mexico:',symbol:'🇲🇽'},{id:':Malaysia:',symbol:'🇲🇾'},{id:':Mozambique:',symbol:'🇲🇿'},{id:':Namibia:',symbol:'🇳🇦'},{id:':New_Caledonia:',symbol:'🇳🇨'},{id:':Niger:',symbol:'🇳🇪'},{id:':Norfolk_Island:',symbol:'🇳🇫'},{id:':Nigeria:',symbol:'🇳🇬'},{id:':Nicaragua:',symbol:'🇳🇮'},{id:':Netherlands:',symbol:'🇳🇱'},{id:':Norway:',symbol:'🇳🇴'},{id:':Nepal:',symbol:'🇳🇵'},{id:':Nauru:',symbol:'🇳🇷'},{id:':Niue:',symbol:'🇳🇺'},{id:':New_Zealand:',symbol:'🇳🇿'},{id:':Oman:',symbol:'🇴🇲'},{id:':Panama:',symbol:'🇵🇦'},{id:':Peru:',symbol:'🇵🇪'},{id:':French_Polynesia:',symbol:'🇵🇫'},{id:':Papua_New_Guinea:',symbol:'🇵🇬'},{id:':Philippines:',symbol:'🇵🇭'},{id:':Pakistan:',symbol:'🇵🇰'},{id:':Poland:',symbol:'🇵🇱'},{id:':St._Pierre_&_Miquelon:',symbol:'🇵🇲'},{id:':Pitcairn_Islands:',symbol:'🇵🇳'},{id:':Puerto_Rico:',symbol:'🇵🇷'},{id:':Palestinian_Territories:',symbol:'🇵🇸'},{id:':Portugal:',symbol:'🇵🇹'},{id:':Palau:',symbol:'🇵🇼'},{id:':Paraguay:',symbol:'🇵🇾'},{id:':Qatar:',symbol:'🇶🇦'},{id:':Réunion:',symbol:'🇷🇪'},{id:':Romania:',symbol:'🇷🇴'},{id:':Serbia:',symbol:'🇷🇸'},{id:':Russia:',symbol:'🇷🇺'},{id:':Rwanda:',symbol:'🇷🇼'},{id:':Saudi_Arabia:',symbol:'🇸🇦'},{id:':Solomon_Islands:',symbol:'🇸🇧'},{id:':Seychelles:',symbol:'🇸🇨'},{id:':Sudan:',symbol:'🇸🇩'},{id:':Sweden:',symbol:'🇸🇪'},{id:':Singapore:',symbol:'🇸🇬'},{id:':St._Helena:',symbol:'🇸🇭'},{id:':Slovenia:',symbol:'🇸🇮'},{id:':Svalbard_&_Jan_Mayen:',symbol:'🇸🇯'},{id:':Slovakia:',symbol:'🇸🇰'},{id:':Sierra_Leone:',symbol:'🇸🇱'},{id:':San_Marino:',symbol:'🇸🇲'},{id:':Senegal:',symbol:'🇸🇳'},{id:':Somalia:',symbol:'🇸🇴'},{id:':Suriname:',symbol:'🇸🇷'},{id:':South_Sudan:',symbol:'🇸🇸'},{id:':São_Tomé_&_Príncipe:',symbol:'🇸🇹'},{id:':El_Salvador:',symbol:'🇸🇻'},{id:':Sint_Maarten:',symbol:'🇸🇽'},{id:':Syria:',symbol:'🇸🇾'},{id:':Swaziland:',symbol:'🇸🇿'},{id:':Tristan_da_Cunha:',symbol:'🇹🇦'},{id:':Turks_&_Caicos_Islands:',symbol:'🇹🇨'},{id:':Chad:',symbol:'🇹🇩'},{id:':French_Southern_Territories:',symbol:'🇹🇫'},{id:':Togo:',symbol:'🇹🇬'},{id:':Thailand:',symbol:'🇹🇭'},{id:':Tajikistan:',symbol:'🇹🇯'},{id:':Tokelau:',symbol:'🇹🇰'},{id:':Timor-Leste:',symbol:'🇹🇱'},{id:':Turkmenistan:',symbol:'🇹🇲'},{id:':Tunisia:',symbol:'🇹🇳'},{id:':Tonga:',symbol:'🇹🇴'},{id:':Turkey:',symbol:'🇹🇷'},{id:':Trinidad_&_Tobago:',symbol:'🇹🇹'},{id:':Tuvalu:',symbol:'🇹🇻'},{id:':Taiwan:',symbol:'🇹🇼'},{id:':Tanzania:',symbol:'🇹🇿'},{id:':Ukraine:',symbol:'🇺🇦'},{id:':Uganda:',symbol:'🇺🇬'},{id:':U.S._Outlying_Islands:',symbol:'🇺🇲'},{id:':United_Nations:',symbol:'🇺🇳'},{id:':United_States:',symbol:'🇺🇸'},{id:':Uruguay:',symbol:'🇺🇾'},{id:':Uzbekistan:',symbol:'🇺🇿'},{id:':Vatican_City:',symbol:'🇻🇦'},{id:':St._Vincent_&_Grenadines:',symbol:'🇻🇨'},{id:':Venezuela:',symbol:'🇻🇪'},{id:':British_Virgin_Islands:',symbol:'🇻🇬'},{id:':U.S._Virgin_Islands:',symbol:'🇻🇮'},{id:':Vietnam:',symbol:'🇻🇳'},{id:':Vanuatu:',symbol:'🇻🇺'},{id:':Wallis_&_Futuna:',symbol:'🇼🇫'},{id:':Samoa:',symbol:'🇼🇸'},{id:':Kosovo:',symbol:'🇽🇰'},{id:':Yemen:',symbol:'🇾🇪'},{id:':Mayotte:',symbol:'🇾🇹'},{id:':South_Africa:',symbol:'🇿🇦'},{id:':Zambia:',symbol:'🇿🇲'},{id:':Zimbabwe:',symbol:'🇿🇼'},{id:':England:',symbol:'🏴󠁧󠁢󠁥󠁮󠁧󠁿'},{id:':Scotland:',symbol:'🏴󠁧󠁢󠁳󠁣󠁴󠁿'},{id:':Wales:',symbol:'🏴󠁧󠁢󠁷󠁬󠁳󠁿'}];
// jscs:enable

if ( !editor._ ) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Creating protected namespace in the editor object is not a concern of this plugin.

Editor type is responsible for that, and it's doing it.

/~https://github.com/ckeditor/ckeditor-dev/blob/3cde97a/core/editor.js#L73-L74



/**
* Array with names of tags where emoji plugin remin inactive. By default emoji are not transformed inside `<pre>` and `<code>` tags
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo remin -> remains

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By default emoji are not transformed inside <pre> and <code> tags

Missing dot, and this information is redundant. You have it well documented below: emoji_preventTransformation = [ 'pre', 'code' ].

/**
* Array with names of tags where emoji plugin remin inactive. By default emoji are not transformed inside `<pre>` and `<code>` tags
*
* ```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent spacing. Look at opening and closing triple backticks.

* ```
* editor.emoji_preventTransformation = [ 'h1', 'h2' ];
* ```
* @cfg {Array} [ emoji_preventTransformation = [ 'pre', 'code' ] ]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This issue appears in other places.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also there's a more precise notation of defining the type of array. Since it's array of strings, you should mark it as {String[]}.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Name does not mention "elements" which is important here. Let's make it emoji_blacklistedElements.

*
* ```
* editor.emoji_preventTransformation = [ 'h1', 'h2' ];
* ```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leave at least a single line of spacing between the description, and API docs tags.


( function() {
'use strict';
CKEDITOR.plugins.add( 'emoji', {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Give it one line of space here for improved readability.

callback( data );
}

function getConfigForNotConvertedTags() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Name getConfigForNotConvertedTags is unnecesarily confusing.

Instead just make a function isEmojiAllowed( elem ) that will tel whether the emoji can appear in a given element.

It will also greatly simplify places where this function is used, e.g. this bit:

/~https://github.com/ckeditor/ckeditor-dev/blob/3cde97a/plugins/emoji/plugin.js#L45-L48

Copy link
Contributor Author

@msamsel msamsel May 25, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've used name hasForbiddenParent as it is more appropriate to this solution :)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think that it's helping much.

In fact the oposite, you're bounding function name with the implementation of it. Now what will you do if there will be a requirement to disable mentioning for classic editors?

  1. You add an editor instance as an argument (because you need to use info from the editor inside the function).
  2. Your proposed function name no longer matches the purpose (is misleading). So are you going to rename it into hasForbiddenParentAndIsInNonClassicalEditor?

isAllowed or isEmojiAllowed does not have this issue.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've made improvement on different scope of a problem. Removing emoji in classic will be easily to extend. Take a look:

var preventEmojiConversion = element.getAscendant( hasForbiddenParent );
if ( preventEmojiConversion ) {
	return value;
}

I can rename preventEmojiConversion to isEmojiAllowed if you think this will be more suitable here.
Also it is easy to extend this with classical editor like:

var preventEmojiConversion = element.getAscendant( hasForbiddenParent ) || isNonClassicalEditor();

Unfortunately getAscendantmethod break after first true match. So in case like p > strong > em > a. And configuration where someone prevent emoji in strong, but current selection is in anchor. Anchor would be detected as allowed parent (it is not on forbidden list), loop will break and emoji would appear.
I need to search all ascendants for forbidden elements and break loop on forbidden element and in such case don't activate emoji conversion.

<p>Hello world.</p>
</textarea>

<p>Empty editor</p>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is it called "Empty editor" when it's not empty? 🙂 It's a divarea editor. First one should be named too for consistency.

Also use headers for that.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This issue might occur in other places too.

@@ -0,0 +1,17 @@
@bender-tags: 4.10.0, feature, emoji
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing ticket reference, this issue probably reoccurs in other cases too.

* ```
* editor.emoji_numberOfCharactersToStart = 2;
* ```
* @cfg {Number} [ emoji_numberOfCharactersToStart = 0 ]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a too complex name. Keep it simple. I think it is good idea to reuse the name from mentions minChars, so it would be emoji_minChars.

It is important to put information whether or not it accounts : delimiter.

@mlewand
Copy link
Contributor

mlewand commented May 25, 2018

Also please reduce the amount of overload in the Emoji sample. Take mentions as a good example.

@msamsel msamsel requested a review from mlewand May 25, 2018 14:13
Copy link
Contributor

@mlewand mlewand left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Additionally I have found two issues, but both are not crucial and can be extracted into separate issues.

emoji_blacklistedElements clipboard integration

config.emoji_blacklistedElements is not integrated with the clipboard.

  1. Open http://tests.ckeditor.test:1030/tests/plugins/emoji/manual/blockedelements manual test.
  2. Copy | :bug: | 🐛 | into your keyboard.
  3. Paste into header 1 element.

Expected

Only one emoji character is inserted.

Actual

Two emojis are visible.

emoji_blacklistedElements should not look beyond editbale

config.emoji_blacklistedElements should not check elements outside of the editable.

  1. Edit http://tests.ckeditor.test:1030/tests/plugins/emoji/manual/blockedelements manual test in a following way:
    • Wrap both editors with a <section> element, like so:
<section>

	<h1>Classic editor</h1>

	<textarea id="editor1" cols="10" rows="10">
		<p>Hello world.</p>
	</textarea>

	<h1>Divarea editor</h1>

	<div id="editor2" cols="10" rows="10">
		<p>Hello world.</p>
	</div>

</section>
* Change editor configs to: `emoji_blacklistedElements: [ 'h1', 'h2', 'h3', 'section' ]`.
  1. Open http://tests.ckeditor.test:1030/tests/plugins/emoji/manual/blockedelements manual test.
  2. Put a selection in a divarea editor.
  3. Start type any emoji.

Expected

Emoji autocomplete works (there is no section element in editor content).

Actual

Autocomplete does not appear. Reason is that inline editor has a section in the parent chain.

* ```
*
* @cfg {Number} [emoji_minChar = 0]
* @member CKEDITOR.config
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing @since tag. Same applies to other config vars.

* Delimiter `:`, which activates emoji's suggestion box, is not included into this value.
*
* ```
* editor.emoji_minChar = 2;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was supposed to be emoji_minChars.

* editor.emoji_minChar = 2;
* ```
*
* @cfg {Number} [emoji_minChar = 0]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's make the default value 2. That would mean the code snippet in this property docs should be changed to something else, I think 0 would be good.

/**
* Array with names of tags where emoji plugin remain inactive.
*
* ```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please hint a language in code listings.

CHANGES.md Outdated
@@ -7,6 +7,7 @@ New Features:

* [#1761](/~https://github.com/ckeditor/ckeditor-dev/issues/1761): [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin supports email links.
* [#1703](/~https://github.com/ckeditor/ckeditor-dev/issues/1703): Introduced Mentions plugin providing autocompletion feature for usernames.
* [#1746](/~https://github.com/ckeditor/ckeditor-dev/issues/1703): Introduce Emoji plugin providing easy way to insert emoji in editor.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Plugin names should always be linked in the changelog entry. I know that there's no Emoji plugin published on addons repo yet, but you can already hand craft the link based on plugin name 🙂 And don't look at Mentions pluginit has the same issue :P


# Test case #3:
1. Set up format: `Formatted`.
2. Try to type emoji as formatted text.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It will be more precise to write:

to type emoji in a formatted text element

Similar for computer code.

3. Set up style `Computer code`.
4. Try to type emoji as computer code.

**Expected TC#3:** In both cases emoji should remain not transformed. Autocomplete menu shouldn't be visible.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, use semantic content markup.

@bender-ui: collapsed

1. Type emoji name in input box.
2. Press transparent button in toolbar (they have labels). There are 2 buttons like that:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no info for expected results for the following steps.

@@ -0,0 +1,18 @@
@bender-tags: 4.10.0, feature, emoji, 1746
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The name this file is too long, please simplify it.

'use strict';

CKEDITOR.plugins.add( 'emoji', {
requires: 'autocomplete,textmatch,ajax',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This plugin requires ajax plugin, without using it.

@Comandeer
Copy link
Member

Changing PR base to major as t/1751 is already merged.

@Comandeer Comandeer changed the base branch from t/1751 to major June 21, 2018 08:56
Copy link
Member

@Comandeer Comandeer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Copy link
Contributor

@mlewand mlewand left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Handing over the review to @Comandeer

Copy link
Member

@Comandeer Comandeer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh, celebrated too early… There are some unstable tests in http://tests.ckeditor.test:1030/tests/plugins/emoji/basic#tests%2Fplugins%2Femoji%2Fbasic%20test%20emoji%20are%20not%20actived%20when%20too%20few%20letters%20are%20written%20(inline)

It seems that there is a race condition somewehere and sometimes model is cleared by our test tools (and is set to undefined as expected), sometimes – by onTextUnmatched from autocomplete plugin (and is set to null, causing test to fail).

Mateusz Samsel and others added 26 commits June 21, 2018 12:29
… graceful shutdown in case of emoji loading error.
…us but not convert emoji during paste data to editor.
…ading to support emoji in IE, correct test to run on supported environments only.
Copy link
Member

@Comandeer Comandeer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@Comandeer Comandeer merged commit 77eff7a into major Jun 21, 2018
@Comandeer Comandeer deleted the t/1746 branch June 21, 2018 10:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants