Last active
June 2, 2017 21:26
-
-
Save jjaffeux/f56236a0858471a58c643aa1a3dc3e3d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# add dancing_woman | |
require "active_support/core_ext/object/blank" | |
require "active_support/core_ext/hash/deep_merge" | |
require "base64" | |
require "fileutils" | |
require "image_optim" | |
require "json" | |
require "nokogiri" | |
require "open-uri" | |
require "pathname" | |
EMOJI_GROUPS_PATH ||= "app/assets/javascripts/discourse/lib/emoji/groups.js.es6" | |
EMOJI_DB_PATH ||= "lib/emoji/db.json" | |
EMOJI_IMAGES_PATH ||= "public/images/emoji" | |
EMOJI_LIST_URL ||= "http://unicode.org/emoji/charts/full-emoji-list.html" | |
EMOJI_KEYWORDS_URL ||= "https://raw.githubusercontent.com/muan/emojilib/master/emojis.json" | |
EMOJI_ALIASES ||= { | |
"right_anger_bubble" => [ "anger_right" ], | |
"ballot_box" => [ "ballot_box_with_ballot" ], | |
"basketball_man" => [ "basketball_player", "person_with_ball" ], | |
"beach_umbrella" => [ "umbrella_on_ground", "beach", "beach_with_umbrella" ], | |
"parasol_on_ground" => [ "umbrella_on_ground" ], | |
"bellhop_bell" => [ "bellhop" ], | |
"biohazard" => [ "biohazard_sign" ], | |
"bow_and_arrow" => [ "archery" ], | |
"spiral_calendar" => [ "calendar_spiral", "spiral_calendar_pad" ], | |
"card_file_box" => [ "card_box" ], | |
"champagne" => [ "bottle_with_popping_cork" ], | |
"cheese" => [ "cheese_wedge" ], | |
"city_sunset" => [ "city_dusk" ], | |
"clock" => [ "mantlepiece_clock" ], | |
"couch_and_lamp" => [ "couch" ], | |
"crayon" => [ "lower_left_crayon" ], | |
"cricket" => [ "cricket_bat_ball" ], | |
"latin_cross" => [ "cross" ], | |
"dagger" => [ "dagger_knife" ], | |
"desktop_computer" => [ "desktop" ], | |
"card_index_dividers" => [ "dividers" ], | |
"dove" => [ "dove_of_peace" ], | |
"footprints" => [ "feet" ], | |
"fire" => [ "flame" ], | |
"black_flag" => [ "flag_black", "waving_black_flag" ], | |
"cn" => [ "flag_cn" ], | |
"de" => [ "flag_de" ], | |
"es" => [ "flag_es" ], | |
"fr" => [ "flag_fr" ], | |
"uk" => [ "gb", "flag_gb" ], | |
"it" => [ "flag_it" ], | |
"jp" => [ "flag_jp" ], | |
"kr" => [ "flag_kr" ], | |
"ru" => [ "flag_ru" ], | |
"us" => [ "flag_us" ], | |
"white_flag" => [ "white_flag", "waving_white_flag" ], | |
"plate_with_cutlery" => [ "fork_knife_plate", "fork_and_knife_with_plate" ], | |
"framed_picture" => [ "frame_photo", "frame_with_picture" ], | |
"hammer_and_pick" => [ "hammer_pick" ], | |
"heavy_heart_exclamation" => [ "heart_exclamation", "heavy_heart_exclamation_mark_ornament" ], | |
"houses" => [ "homes", "house_buildings" ], | |
"hotdog" => [ "hot_dog" ], | |
"derelict_house" => [ "house_abandoned", "derelict_house_building" ], | |
"desert_island" => [ "island" ], | |
"old_key" => [ "key2" ], | |
"laughing" => [ "satisfied" ], | |
"business_suit_levitating" => [ "levitate", "man_in_business_suit_levitating" ], | |
"weight_lifting_man" => [ "lifter", "weight_lifter" ], | |
"medal_sports" => [ "medal", "sports_medal" ], | |
"metal" => [ "sign_of_the_horns" ], | |
"fu" => [ "middle_finger", "reversed_hand_with_middle_finger_extended" ], | |
"motorcycle" => [ "racing_motorcycle" ], | |
"mountain_snow" => [ "snow_capped_mountain" ], | |
"newspaper_roll" => [ "newspaper2", "rolled_up_newspaper" ], | |
"spiral_notepad" => [ "notepad_spiral", "spiral_note_pad" ], | |
"oil_drum" => [ "oil" ], | |
"older_woman" => [ "grandma" ], | |
"paintbrush" => [ "lower_left_paintbrush" ], | |
"paperclips" => [ "linked_paperclips" ], | |
"pause_button" => [ "double_vertical_bar" ], | |
"peace_symbol" => [ "peace" ], | |
"pen_ballpoint" => [ "lower_left_ballpoint_pen" ], | |
"fountain_pen" => [ "pen_fountain", "lower_left_fountain_pen" ], | |
"ping_pong" => [ "table_tennis" ], | |
"place_of_worship" => [ "worship_symbol" ], | |
"poop" => [ "shit", "hankey", "poo" ], | |
"radioactive" => [ "radioactive_sign" ], | |
"railway_track" => [ "railroad_track" ], | |
"robot" => [ "robot_face" ], | |
"skull" => [ "skeleton" ], | |
"skull_and_crossbones" => [ "skull_crossbones" ], | |
"speaking_head" => [ "speaking_head_in_silhouette" ], | |
"male_detective" => [ "spy", "sleuth_or_spy" ], | |
"thinking" => [ "thinking_face" ], | |
"-1" => [ "thumbsdown" ], | |
"+1" => [ "thumbsup" ], | |
"cloud_with_lightning_and_rain" => [ "thunder_cloud_rain", "thunder_cloud_and_rain" ], | |
"tickets" => [ "admission_tickets" ], | |
"next_track_button" => [ "track_next", "next_track" ], | |
"previous_track_button" => [ "track_previous", "previous_track" ], | |
"unicorn" => [ "unicorn_face" ], | |
"funeral_urn" => [ "urn" ], | |
"sun_behind_large_cloud" => [ "white_sun_cloud", "white_sun_behind_cloud" ], | |
"sun_behind_rain_cloud" => [ "white_sun_rain_cloud", "white_sun_behind_cloud_with_rain" ], | |
"white_sun_small_cloud" => [ "white_sun_small_cloud", "white_sun_with_small_cloud" ], | |
"open_umbrella" => [ "umbrella2" ], | |
"hammer_and_wrench" => [ "tools" ], | |
"face_with_thermometer" => [ "thermometer_face" ], | |
"timer_clock" => [ "timer" ], | |
"keycap_ten" => [ "ten" ], | |
"memo" => [ "pencil" ], | |
"rescue_worker_helmet" => [ "helmet_with_cross", "helmet_with_white_cross" ], | |
"slightly_smiling_face" => [ "slight_smile" ], | |
"construction_worker_man" => [ "construction_worker" ], | |
"upside_down_face" => [ "upside_down" ], | |
"money_mouth_face" => [ "money_mouth" ], | |
"nerd_face" => [ "nerd" ], | |
"hugs" => [ "hugging", "hugging_face" ], | |
"roll_eyes" => [ "rolling_eyes", "face_with_rolling_eyes" ], | |
"slightly_frowning_face" => [ "slight_frown" ], | |
"frowning_face" => [ "frowning2", "white_frowning_face" ], | |
"zipper_mouth_face" => [ "zipper_mouth" ], | |
"face_with_head_bandage" => [ "head_bandage" ], | |
"raised_hand_with_fingers_splayed" => [ "hand_splayed" ], | |
"vulcan_salute" => [ "vulcan", "raised_hand_with_part_between_middle_and_ring_fingers" ], | |
"policeman" => [ "cop" ], | |
"running_man" => [ "runner" ], | |
"walking_man" => [ "walking" ], | |
"bowing_man" => [ "bow" ], | |
"no_good_woman" => [ "no_good" ], | |
"raising_hand_woman" => [ "raising_hand" ], | |
"pouting_woman" => [ "person_with_pouting_face" ], | |
"frowning_woman" => [ "person_frowning" ], | |
"haircut_woman" => [ "haircut" ], | |
"massage_woman" => [ "massage" ], | |
"tshirt" => [ "shirt" ], | |
"biking_man" => [ "bicyclist" ], | |
"mountain_biking_man" => [ "mountain_bicyclist" ], | |
"passenger_ship" => [ "cruise_ship" ], | |
"motor_boat" => [ "motorboat" ], | |
"flight_arrival" => [ "airplane_arriving" ], | |
"flight_departure" => [ "airplane_departure" ], | |
"small_airplane" => [ "airplane_small" ], | |
"racing_car" => [ "race_car" ], | |
"family_man_woman_boy_boy" => [ "family_man_woman_boys" ], | |
"family_man_woman_girl_girl" => [ "family_man_woman_girls" ], | |
"family_woman_woman_boy" => [ "family_women_boy" ], | |
"family_woman_woman_girl" => [ "family_women_girl" ], | |
"family_woman_woman_girl_boy" => [ "family_women_girl_boy" ], | |
"family_woman_woman_boy_boy" => [ "family_women_boys" ], | |
"family_woman_woman_girl_girl" => [ "family_women_girls" ], | |
"family_man_man_boy" => [ "family_men_boy" ], | |
"family_man_man_girl" => [ "family_men_girl" ], | |
"family_man_man_girl_boy" => [ "family_men_girl_boy" ], | |
"family_man_man_boy_boy" => [ "family_men_boys" ], | |
"family_man_man_girl_girl" => [ "family_men_girls" ], | |
"cloud_with_lightning" => [ "cloud_lightning" ], | |
"tornado" => [ "cloud_tornado", "cloud_with_tornado" ], | |
"cloud_with_rain" => [ "cloud_rain" ], | |
"cloud_with_snow" => [ "cloud_snow" ], | |
"asterisk" => [ "keycap_star" ], | |
"studio_microphone" => [ "microphone2" ], | |
"medal_military" => [ "military_medal" ], | |
"couple_with_heart_woman_woman" => [ "female_couple_with_heart" ], | |
"couple_with_heart_man_man" => [ "male_couple_with_heart" ], | |
"couplekiss_woman_woman" => [ "female_couplekiss" ], | |
"couplekiss_man_man" => [ "male_couplekiss" ], | |
"honeybee" => [ "bee" ], | |
"lion" => [ "lion_face" ], | |
"artificial_satellite" => [ "satellite_orbital" ], | |
"three_button_mouse" => [ "mouse_three_button" ], | |
"hocho" => [ "knife" ], | |
"swimming_man" => [ "swimmer" ], | |
"wind_face" => [ "wind_blowing_face" ], | |
"golfing_man" => [ "golfer" ], | |
"facepunch" => [ "punch" ], | |
"building_construction" => [ "construction_site" ], | |
"family_man_woman_girl_boy" => [ "family" ], | |
"ice_hockey" => [ "hockey" ], | |
"snowman_with_snow" => [ "snowman2" ], | |
"play_or_pause_button" => [ "play_pause" ], | |
"film_projector" => [ "projector" ], | |
"shopping" => [ "shopping_bags" ], | |
"open_book" => [ "book" ], | |
"national_park" => [ "park" ], | |
"world_map" => [ "map" ], | |
"pen" => [ "pen_ballpoint" ], | |
"email" => [ "envelope", "e-mail" ], | |
"phone" => [ "telephone" ], | |
"atom_symbol" => [ "atom" ], | |
"mantelpiece_clock" => [ "clock" ], | |
"camera_flash" => [ "camera_with_flash" ], | |
"film_strip" => [ "film_frames" ], | |
"balance_scale" => [ "scales" ], | |
"surfing_man" => [ "surfer" ], | |
"couplekiss_man_woman" => [ "couplekiss" ], | |
"couple_with_heart_woman_man" => [ "couple_with_heart" ], | |
"clamp" => [ "compression" ], | |
"dancing_women" => [ "dancers" ], | |
"blonde_man" => [ "person_with_blond_hair" ], | |
"sleeping_bed" => [ "sleeping_accommodation" ], | |
"om" => [ "om_symbol" ], | |
"tipping_hand_woman" => [ "information_desk_person" ], | |
"rowing_man" => [ "rowboat" ] | |
} | |
EMOJI_GROUPS = [ | |
{ | |
"name" => "people", | |
"fullname" => "People", | |
"tabicon" => "grinning", | |
"icons" => [ | |
"slightly_smiling_face", | |
"grinning", | |
"grin", | |
"joy", | |
"rofl", | |
"smiley", | |
"smile", | |
"sweat_smile", | |
"laughing", | |
"innocent", | |
"smiling_imp", | |
"imp", | |
"wink", | |
"blush", | |
"relaxed", | |
"yum", | |
"relieved", | |
"heart_eyes", | |
"sunglasses", | |
"smirk", | |
"neutral_face", | |
"expressionless", | |
"unamused", | |
"sweat", | |
"pensive", | |
"confused", | |
"confounded", | |
"kissing", | |
"kissing_heart", | |
"kissing_smiling_eyes", | |
"kissing_closed_eyes", | |
"stuck_out_tongue", | |
"stuck_out_tongue_winking_eye", | |
"stuck_out_tongue_closed_eyes", | |
"disappointed", | |
"worried", | |
"angry", | |
"rage", | |
"cry", | |
"persevere", | |
"triumph", | |
"disappointed_relieved", | |
"frowning", | |
"anguished", | |
"fearful", | |
"weary", | |
"sleepy", | |
"tired_face", | |
"grimacing", | |
"sob", | |
"open_mouth", | |
"hushed", | |
"cold_sweat", | |
"nauseated_face", | |
"sneezing_face", | |
"scream", | |
"astonished", | |
"flushed", | |
"sleeping", | |
"dizzy_face", | |
"no_mouth", | |
"mask", | |
"smile_cat", | |
"joy_cat", | |
"smiley_cat", | |
"heart_eyes_cat", | |
"smirk_cat", | |
"kissing_cat", | |
"pouting_cat", | |
"crying_cat_face", | |
"scream_cat", | |
"footprints", | |
"bust_in_silhouette", | |
"busts_in_silhouette", | |
"baby", | |
"boy", | |
"girl", | |
"man", | |
"woman", | |
"couple", | |
"two_men_holding_hands", | |
"two_women_holding_hands", | |
"dancing_women", | |
"dancing_men", | |
"man_dancing", | |
"woman_dancing", | |
"bride_with_veil", | |
"blonde_woman", | |
"blonde_man", | |
"man_with_gua_pi_mao", | |
"woman_with_turban", | |
"man_with_turban", | |
"older_woman", | |
"older_man", | |
"policewoman", | |
"policeman", | |
"female_detective", | |
"male_detective", | |
"woman_farmer", | |
"man_farmer", | |
"woman_cook", | |
"man_cook", | |
"woman_student", | |
"man_student", | |
"woman_singer", | |
"man_singer", | |
"woman_teacher", | |
"man_teacher", | |
"woman_factory_worker", | |
"man_factory_worker", | |
"woman_health_worker", | |
"man_health_worker", | |
"woman_pilot", | |
"man_pilot", | |
"woman_judge", | |
"man_judge", | |
"woman_technologist", | |
"man_technologist", | |
"woman_office_worker", | |
"man_office_worker", | |
"woman_mechanic", | |
"man_mechanic", | |
"woman_scientist", | |
"man_scientist", | |
"woman_artist", | |
"man_artist", | |
"woman_firefighter", | |
"man_firefighter", | |
"woman_astronaut", | |
"man_astronaut", | |
"construction_worker_woman", | |
"construction_worker_man", | |
"princess", | |
"prince", | |
"guardswoman", | |
"guardsman", | |
"clown_face", | |
"cowboy_hat_face", | |
"angel", | |
"santa", | |
"mrs_claus", | |
"ghost", | |
"japanese_ogre", | |
"japanese_goblin", | |
"hankey", | |
"skull", | |
"alien", | |
"space_invader", | |
"bowing_woman", | |
"bowing_man", | |
"woman_facepalming", | |
"man_facepalming", | |
"woman_shrugging", | |
"man_shrugging", | |
"tipping_hand_woman", | |
"tipping_hand_man", | |
"no_good_woman", | |
"no_good_man", | |
"ok_woman", | |
"ok_man", | |
"raising_hand_woman", | |
"raising_hand_man", | |
"pouting_woman", | |
"pouting_man", | |
"frowning_woman", | |
"frowning_man", | |
"massage_woman", | |
"massage_man", | |
"haircut_woman", | |
"haircut_man", | |
"couple_with_heart_woman_woman", | |
"couple_with_heart_woman_man", | |
"couple_with_heart_man_man", | |
"raised_hands", | |
"clap", | |
"ear", | |
"eyes", | |
"nose", | |
"lips", | |
"kiss", | |
"tongue", | |
"nail_care", | |
"wave", | |
"+1", | |
"-1", | |
"point_up", | |
"point_up_2", | |
"point_down", | |
"point_left", | |
"point_right", | |
"ok_hand", | |
"handshake", | |
"v", | |
"crossed_fingers", | |
"call_me_hand", | |
"fist", | |
"fist_left", | |
"fist_right", | |
"raised_hand", | |
"raised_back_of_hand", | |
"muscle", | |
"open_hands", | |
"pray", | |
"right_anger_bubble", | |
"eye", | |
"frowning_face", | |
"raised_hand_with_fingers_splayed", | |
"face_with_head_bandage", | |
"hugs", | |
"fu", | |
"money_mouth_face", | |
"nerd_face", | |
"drooling_face", | |
"poop", | |
"facepunch", | |
"robot", | |
"roll_eyes", | |
"skull_and_crossbones", | |
"slightly_frowning_face", | |
"speaking_head", | |
"spy", | |
"thinking", | |
"upside_down_face", | |
"lying_face", | |
"funeral_urn", | |
"vulcan_salute", | |
"metal", | |
"wind_face", | |
"writing_hand", | |
"zipper_mouth_face", | |
"male_couple_with_heart", | |
"couplekiss_man_woman", | |
"couplekiss_woman_woman", | |
"couplekiss_man_man", | |
"family_man_woman_girl", | |
"family_man_woman_boy", | |
"family_man_woman_girl_boy", | |
"family_man_woman_girl_girl", | |
"family_man_woman_boy_boy", | |
"family_woman_woman_girl", | |
"family_woman_woman_boy", | |
"family_woman_woman_girl_boy", | |
"family_woman_woman_girl_girl", | |
"family_woman_woman_boy_boy", | |
"family_man_man_girl", | |
"family_man_man_boy", | |
"family_man_man_girl_boy", | |
"family_man_man_girl_girl", | |
"family_man_man_boy_boy", | |
"family_woman_girl", | |
"family_woman_boy", | |
"family_woman_girl_boy", | |
"family_woman_girl_girl", | |
"family_woman_boy_boy", | |
"family_man_girl", | |
"family_man_boy", | |
"family_man_girl_boy", | |
"family_man_girl_girl", | |
"family_man_boy_boy", | |
"selfie", | |
"man_in_tuxedo", | |
"pregnant_woman" | |
] | |
}, | |
{ | |
"name" => "nature", | |
"fullname" => "Nature", | |
"tabicon" => "evergreen_tree", | |
"icons" => [ | |
"seedling", | |
"evergreen_tree", | |
"deciduous_tree", | |
"palm_tree", | |
"cactus", | |
"tulip", | |
"cherry_blossom", | |
"rose", | |
"hibiscus", | |
"sunflower", | |
"fleur_de_lis", | |
"blossom", | |
"bouquet", | |
"ear_of_rice", | |
"herb", | |
"four_leaf_clover", | |
"maple_leaf", | |
"fallen_leaf", | |
"leaves", | |
"mushroom", | |
"chestnut", | |
"rat", | |
"mouse2", | |
"mouse", | |
"hamster", | |
"ox", | |
"water_buffalo", | |
"cow2", | |
"cow", | |
"tiger2", | |
"leopard", | |
"tiger", | |
"rabbit2", | |
"rabbit", | |
"cat2", | |
"cat", | |
"racehorse", | |
"horse", | |
"ram", | |
"sheep", | |
"goat", | |
"rooster", | |
"chicken", | |
"baby_chick", | |
"hatching_chick", | |
"hatched_chick", | |
"bird", | |
"penguin", | |
"elephant", | |
"dromedary_camel", | |
"camel", | |
"boar", | |
"pig2", | |
"pig", | |
"pig_nose", | |
"dog2", | |
"poodle", | |
"dog", | |
"wolf", | |
"bear", | |
"koala", | |
"panda_face", | |
"monkey_face", | |
"see_no_evil", | |
"hear_no_evil", | |
"speak_no_evil", | |
"monkey", | |
"dragon", | |
"dragon_face", | |
"crocodile", | |
"snake", | |
"turtle", | |
"frog", | |
"fox_face", | |
"lion", | |
"gorilla", | |
"duck", | |
"eagle", | |
"owl", | |
"bat", | |
"lizard", | |
"shark", | |
"deer", | |
"rhinoceros", | |
"paw_prints", | |
"whale2", | |
"whale", | |
"dolphin", | |
"octopus", | |
"fish", | |
"squid", | |
"shrimp", | |
"tropical_fish", | |
"blowfish", | |
"shell", | |
"snail", | |
"bug", | |
"ant", | |
"bee", | |
"beetle", | |
"honeybee", | |
"butterfly", | |
"feet", | |
"zap", | |
"fire", | |
"crescent_moon", | |
"sunny", | |
"partly_sunny", | |
"sun_behind_small_cloud", | |
"cloud", | |
"droplet", | |
"sweat_drops", | |
"umbrella", | |
"dash", | |
"snowflake", | |
"star2", | |
"star", | |
"stars", | |
"sunrise_over_mountains", | |
"sunrise", | |
"rainbow", | |
"ocean", | |
"volcano", | |
"milky_way", | |
"mount_fuji", | |
"japan", | |
"globe_with_meridians", | |
"earth_africa", | |
"earth_americas", | |
"earth_asia", | |
"new_moon", | |
"waxing_crescent_moon", | |
"first_quarter_moon", | |
"full_moon", | |
"waning_gibbous_moon", | |
"waxing_gibbous_moon", | |
"last_quarter_moon", | |
"waning_crescent_moon", | |
"new_moon_with_face", | |
"full_moon_with_face", | |
"first_quarter_moon_with_face", | |
"last_quarter_moon_with_face", | |
"sun_with_face", | |
"chipmunk", | |
"cloud_with_lightning", | |
"cloud_with_lightning_and_rain", | |
"cloud_with_rain", | |
"cloud_with_snow", | |
"tornado", | |
"sun_behind_large_cloud", | |
"sun_behind_rain_cloud", | |
"white_sun_small_cloud", | |
"comet", | |
"crab", | |
"dove", | |
"fog", | |
"lion_face", | |
"scorpion", | |
"spider", | |
"spider_web", | |
"turkey", | |
"unicorn", | |
] | |
}, | |
{ | |
"name" => "food", | |
"fullname" => "Food & Drink", | |
"tabicon" => "hamburger", | |
"icons" => [ | |
"tomato", | |
"eggplant", | |
"corn", | |
"sweet_potato", | |
"grapes", | |
"melon", | |
"watermelon", | |
"tangerine", | |
"lemon", | |
"banana", | |
"pineapple", | |
"apple", | |
"green_apple", | |
"pear", | |
"peach", | |
"cherries", | |
"strawberry", | |
"kiwi_fruit", | |
"avocado", | |
"cucumber", | |
"carrot", | |
"potato", | |
"hamburger", | |
"pizza", | |
"meat_on_bone", | |
"poultry_leg", | |
"rice_cracker", | |
"rice_ball", | |
"rice", | |
"curry", | |
"ramen", | |
"spaghetti", | |
"bread", | |
"fries", | |
"dango", | |
"oden", | |
"sushi", | |
"fried_shrimp", | |
"fish_cake", | |
"icecream", | |
"shaved_ice", | |
"ice_cream", | |
"doughnut", | |
"cookie", | |
"chocolate_bar", | |
"candy", | |
"lollipop", | |
"custard", | |
"honey_pot", | |
"cake", | |
"bento", | |
"stew", | |
"egg", | |
"fork_and_knife", | |
"tea", | |
"coffee", | |
"milk_glass", | |
"sake", | |
"wine_glass", | |
"clinking_glasses", | |
"tumbler_glass", | |
"cocktail", | |
"tropical_drink", | |
"beer", | |
"beers", | |
"baby_bottle", | |
"burrito", | |
"champagne", | |
"cheese", | |
"hot_pepper", | |
"hotdog", | |
"taco", | |
"peanuts", | |
"croissant", | |
"baguette_bread", | |
"bacon", | |
"pancakes", | |
"fried_egg", | |
"stuffed_flatbread", | |
"green_salad", | |
"shallow_pan_of_food", | |
] | |
}, | |
{ | |
"name" => "celebration", | |
"fullname" => "Celebration", | |
"tabicon" => "gift", | |
"icons" => [ | |
"ribbon", | |
"gift", | |
"birthday", | |
"jack_o_lantern", | |
"christmas_tree", | |
"tanabata_tree", | |
"bamboo", | |
"rice_scene", | |
"fireworks", | |
"sparkler", | |
"tada", | |
"confetti_ball", | |
"balloon", | |
"dizzy", | |
"sparkles", | |
"boom", | |
"mortar_board", | |
"crown", | |
"dolls", | |
"flags", | |
"wind_chime", | |
"crossed_flags", | |
"izakaya_lantern", | |
"ring", | |
"heart", | |
"broken_heart", | |
"love_letter", | |
"two_hearts", | |
"revolving_hearts", | |
"heartbeat", | |
"heartpulse", | |
"sparkling_heart", | |
"cupid", | |
"gift_heart", | |
"heart_decoration", | |
"purple_heart", | |
"yellow_heart", | |
"green_heart", | |
"blue_heart", | |
"heavy_heart_exclamation", | |
"black_heart" | |
] | |
}, | |
{ | |
"name" => "activity", | |
"fullname" => "Activities", | |
"tabicon" => "soccer", | |
"icons" => [ | |
"running_woman", | |
"running_man", | |
"walking_woman", | |
"walking_man", | |
"dancer", | |
"rowing_woman", | |
"rowing_man", | |
"swimming_woman", | |
"swimming_man", | |
"surfing_woman", | |
"surfing_man", | |
"bath", | |
"snowboarder", | |
"ski", | |
"snowman", | |
"snowman_with_snow", | |
"biking_woman", | |
"biking_man", | |
"mountain_biking_woman", | |
"mountain_biking_man", | |
"horse_racing", | |
"tent", | |
"fishing_pole_and_fish", | |
"soccer", | |
"basketball", | |
"football", | |
"baseball", | |
"tennis", | |
"rugby_football", | |
"golf", | |
"trophy", | |
"running_shirt_with_sash", | |
"checkered_flag", | |
"musical_keyboard", | |
"guitar", | |
"violin", | |
"saxophone", | |
"trumpet", | |
"drum", | |
"musical_note", | |
"notes", | |
"musical_score", | |
"headphones", | |
"microphone", | |
"performing_arts", | |
"ticket", | |
"tophat", | |
"circus_tent", | |
"clapper", | |
"art", | |
"dart", | |
"8ball", | |
"bowling", | |
"slot_machine", | |
"game_die", | |
"video_game", | |
"flower_playing_cards", | |
"black_joker", | |
"mahjong", | |
"carousel_horse", | |
"ferris_wheel", | |
"roller_coaster", | |
"badminton", | |
"ballot_box", | |
"basketball_woman", | |
"basketball_man", | |
"bow_and_arrow", | |
"crossed_swords", | |
"cricket", | |
"ice_hockey", | |
"field_hockey", | |
"golfing_woman", | |
"golfing_man", | |
"ice_skate", | |
"paintbrush", | |
"skier", | |
"stadium", | |
"volleyball", | |
"person_fencing", | |
"goal_net", | |
"boxing_glove", | |
"martial_arts_uniform", | |
"women_wrestling", | |
"men_wrestling", | |
"woman_cartwheeling", | |
"man_cartwheeling", | |
"woman_playing_handball", | |
"man_playing_handball", | |
"woman_playing_water_polo", | |
"man_playing_water_polo", | |
"woman_juggling", | |
"man_juggling", | |
] | |
}, | |
{ | |
"name" => "travel", | |
"fullname" => "Travel & Places", | |
"tabicon" => "airplane", | |
"icons" => [ | |
"train", | |
"mountain_railway", | |
"railway_car", | |
"steam_locomotive", | |
"monorail", | |
"bullettrain_side", | |
"bullettrain_front", | |
"train2", | |
"metro", | |
"light_rail", | |
"station", | |
"tram", | |
"bus", | |
"oncoming_bus", | |
"trolleybus", | |
"minibus", | |
"ambulance", | |
"fire_engine", | |
"police_car", | |
"oncoming_police_car", | |
"rotating_light", | |
"taxi", | |
"oncoming_taxi", | |
"oncoming_automobile", | |
"blue_car", | |
"truck", | |
"articulated_lorry", | |
"tractor", | |
"bike", | |
"kick_scooter", | |
"motor_scooter", | |
"busstop", | |
"fuelpump", | |
"construction", | |
"vertical_traffic_light", | |
"traffic_light", | |
"rocket", | |
"helicopter", | |
"airplane", | |
"seat", | |
"anchor", | |
"ship", | |
"speedboat", | |
"canoe", | |
"aerial_tramway", | |
"mountain_cableway", | |
"suspension_railway", | |
"passport_control", | |
"customs", | |
"baggage_claim", | |
"left_luggage", | |
"yen", | |
"euro", | |
"pound", | |
"dollar", | |
"statue_of_liberty", | |
"moyai", | |
"foggy", | |
"tokyo_tower", | |
"fountain", | |
"european_castle", | |
"japanese_castle", | |
"city_sunrise", | |
"city_sunset", | |
"night_with_stars", | |
"bridge_at_night", | |
"house", | |
"house_with_garden", | |
"office", | |
"department_store", | |
"factory", | |
"post_office", | |
"european_post_office", | |
"hospital", | |
"bank", | |
"hotel", | |
"love_hotel", | |
"wedding", | |
"church", | |
"convenience_store", | |
"school", | |
"cn", | |
"de", | |
"es", | |
"fr", | |
"gb", | |
"it", | |
"jp", | |
"kr", | |
"ru", | |
"us", | |
"flight_arrival", | |
"flight_departure", | |
"small_airplane", | |
"beach", | |
"beach_umbrella", | |
"parasol_on_ground", | |
"camping", | |
"city_dusk", | |
"cityscape", | |
"classical_building", | |
"building_construction", | |
"passenger_ship", | |
"desert", | |
"ferry", | |
"hole", | |
"houses", | |
"derelict_house", | |
"desert_island", | |
"kaaba", | |
"world_map", | |
"mosque", | |
"motor_boat", | |
"motorcycle", | |
"motorway", | |
"mountain", | |
"mountain_snow", | |
"national_park", | |
"place_of_worship", | |
"racing_car", | |
"railway_track", | |
"red_car", | |
"sailboat", | |
"shinto_shrine", | |
"sleeping_accommodation", | |
"synagogue", | |
"rainbow_flag", | |
"white_flag", | |
"black_flag", | |
"flag_cn", | |
"flag_de", | |
"flag_es", | |
"flag_fr", | |
"flag_gb", | |
"flag_it", | |
"flag_jp", | |
"flag_kr", | |
"flag_ru", | |
"flag_us", | |
"afghanistan", | |
"aland_islands", | |
"albania", | |
"algeria", | |
"american_samoa", | |
"andorra", | |
"angola", | |
"anguilla", | |
"antarctica", | |
"antigua_barbuda", | |
"argentina", | |
"armenia", | |
"aruba", | |
"australia", | |
"austria", | |
"azerbaijan", | |
"bahamas", | |
"bahrain", | |
"bangladesh", | |
"barbados", | |
"belarus", | |
"belgium", | |
"belize", | |
"benin", | |
"bermuda", | |
"bhutan", | |
"bolivia", | |
"caribbean_netherlands", | |
"bosnia_herzegovina", | |
"botswana", | |
"brazil", | |
"british_indian_ocean_territory", | |
"british_virgin_islands", | |
"brunei", | |
"bulgaria", | |
"burkina_faso", | |
"burundi", | |
"cape_verde", | |
"cambodia", | |
"cameroon", | |
"canada", | |
"canary_islands", | |
"cayman_islands", | |
"central_african_republic", | |
"chad", | |
"chile", | |
"christmas_island", | |
"cocos_islands", | |
"colombia", | |
"comoros", | |
"congo_brazzaville", | |
"congo_kinshasa", | |
"cook_islands", | |
"costa_rica", | |
"croatia", | |
"cuba", | |
"curacao", | |
"cyprus", | |
"czech_republic", | |
"denmark", | |
"djibouti", | |
"dominica", | |
"dominican_republic", | |
"ecuador", | |
"egypt", | |
"el_salvador", | |
"equatorial_guinea", | |
"eritrea", | |
"estonia", | |
"ethiopia", | |
"eu", | |
"falkland_islands", | |
"faroe_islands", | |
"fiji", | |
"finland", | |
"french_guiana", | |
"french_polynesia", | |
"french_southern_territories", | |
"gabon", | |
"gambia", | |
"georgia", | |
"ghana", | |
"gibraltar", | |
"greece", | |
"greenland", | |
"grenada", | |
"guadeloupe", | |
"guam", | |
"guatemala", | |
"guernsey", | |
"guinea", | |
"guinea_bissau", | |
"guyana", | |
"haiti", | |
"honduras", | |
"hong_kong", | |
"hungary", | |
"iceland", | |
"india", | |
"indonesia", | |
"iran", | |
"iraq", | |
"ireland", | |
"isle_of_man", | |
"israel", | |
"cote_divoire", | |
"jamaica", | |
"jersey", | |
"jordan", | |
"kazakhstan", | |
"kenya", | |
"kiribati", | |
"kosovo", | |
"kuwait", | |
"kyrgyzstan", | |
"laos", | |
"latvia", | |
"lebanon", | |
"lesotho", | |
"liberia", | |
"libya", | |
"liechtenstein", | |
"lithuania", | |
"luxembourg", | |
"macau", | |
"macedonia", | |
"madagascar", | |
"malawi", | |
"malaysia", | |
"maldives", | |
"mali", | |
"malta", | |
"marshall_islands", | |
"martinique", | |
"mauritania", | |
"mauritius", | |
"mayotte", | |
"mexico", | |
"micronesia", | |
"moldova", | |
"monaco", | |
"mongolia", | |
"montenegro", | |
"montserrat", | |
"morocco", | |
"mozambique", | |
"myanmar", | |
"namibia", | |
"nauru", | |
"nepal", | |
"netherlands", | |
"new_caledonia", | |
"new_zealand", | |
"nicaragua", | |
"niger", | |
"nigeria", | |
"niue", | |
"norfolk_island", | |
"northern_mariana_islands", | |
"north_korea", | |
"norway", | |
"oman", | |
"pakistan", | |
"palau", | |
"palestinian_territories", | |
"panama", | |
"papua_new_guinea", | |
"paraguay", | |
"peru", | |
"philippines", | |
"pitcairn_islands", | |
"poland", | |
"portugal", | |
"puerto_rico", | |
"qatar", | |
"reunion", | |
"romania", | |
"rwanda", | |
"st_barthelemy", | |
"st_helena", | |
"st_kitts_nevis", | |
"st_lucia", | |
"st_pierre_miquelon", | |
"st_vincent_grenadines", | |
"samoa", | |
"san_marino", | |
"sao_tome_principe", | |
"saudi_arabia", | |
"senegal", | |
"serbia", | |
"seychelles", | |
"sierra_leone", | |
"singapore", | |
"sint_maarten", | |
"slovakia", | |
"slovenia", | |
"solomon_islands", | |
"somalia", | |
"south_africa", | |
"south_georgia_south_sandwich_islands", | |
"south_sudan", | |
"sri_lanka", | |
"sudan", | |
"suriname", | |
"swaziland", | |
"sweden", | |
"switzerland", | |
"syria", | |
"taiwan", | |
"tajikistan", | |
"tanzania", | |
"thailand", | |
"timor_leste", | |
"togo", | |
"tokelau", | |
"tonga", | |
"trinidad_tobago", | |
"tunisia", | |
"tr", | |
"turkmenistan", | |
"turks_caicos_islands", | |
"tuvalu", | |
"uganda", | |
"ukraine", | |
"united_arab_emirates", | |
"uk", | |
"us_virgin_islands", | |
"uruguay", | |
"uzbekistan", | |
"vanuatu", | |
"vatican_city", | |
"venezuela", | |
"vietnam", | |
"wallis_futuna", | |
"western_sahara", | |
"yemen", | |
"zambia", | |
"zimbabwe", | |
] | |
}, | |
{ | |
"name" => "objects", | |
"fullname" => "Objects & Symbols", | |
"tabicon" => "eyeglasses", | |
"icons" => [ | |
"watch", | |
"iphone", | |
"calling", | |
"computer", | |
"alarm_clock", | |
"hourglass_flowing_sand", | |
"hourglass", | |
"camera", | |
"video_camera", | |
"movie_camera", | |
"tv", | |
"radio", | |
"pager", | |
"telephone_receiver", | |
"phone", | |
"fax", | |
"minidisc", | |
"floppy_disk", | |
"cd", | |
"dvd", | |
"vhs", | |
"battery", | |
"electric_plug", | |
"bulb", | |
"flashlight", | |
"satellite", | |
"credit_card", | |
"money_with_wings", | |
"moneybag", | |
"gem", | |
"closed_umbrella", | |
"pouch", | |
"purse", | |
"handbag", | |
"briefcase", | |
"school_satchel", | |
"lipstick", | |
"eyeglasses", | |
"womans_hat", | |
"sandal", | |
"high_heel", | |
"boot", | |
"mans_shoe", | |
"athletic_shoe", | |
"bikini", | |
"dress", | |
"kimono", | |
"womans_clothes", | |
"tshirt", | |
"necktie", | |
"jeans", | |
"door", | |
"shower", | |
"bathtub", | |
"toilet", | |
"barber", | |
"syringe", | |
"pill", | |
"microscope", | |
"telescope", | |
"crystal_ball", | |
"wrench", | |
"hocho", | |
"nut_and_bolt", | |
"hammer", | |
"bomb", | |
"smoking", | |
"gun", | |
"bookmark", | |
"newspaper", | |
"key", | |
"email", | |
"envelope_with_arrow", | |
"incoming_envelope", | |
"e-mail", | |
"inbox_tray", | |
"outbox_tray", | |
"package", | |
"postal_horn", | |
"postbox", | |
"mailbox_closed", | |
"mailbox", | |
"mailbox_with_mail", | |
"mailbox_with_no_mail", | |
"page_facing_up", | |
"page_with_curl", | |
"bookmark_tabs", | |
"chart_with_upwards_trend", | |
"chart_with_downwards_trend", | |
"bar_chart", | |
"date", | |
"calendar", | |
"low_brightness", | |
"high_brightness", | |
"scroll", | |
"clipboard", | |
"open_book", | |
"notebook", | |
"notebook_with_decorative_cover", | |
"ledger", | |
"closed_book", | |
"green_book", | |
"blue_book", | |
"orange_book", | |
"books", | |
"card_index", | |
"link", | |
"paperclip", | |
"pushpin", | |
"scissors", | |
"triangular_ruler", | |
"round_pushpin", | |
"straight_ruler", | |
"triangular_flag_on_post", | |
"file_folder", | |
"open_file_folder", | |
"black_nib", | |
"pencil2", | |
"lock_with_ink_pen", | |
"closed_lock_with_key", | |
"lock", | |
"unlock", | |
"mega", | |
"loudspeaker", | |
"sound", | |
"loud_sound", | |
"speaker", | |
"mute", | |
"zzz", | |
"bell", | |
"no_bell", | |
"thought_balloon", | |
"speech_balloon", | |
"children_crossing", | |
"mag", | |
"mag_right", | |
"no_entry_sign", | |
"no_entry", | |
"stop_sign", | |
"name_badge", | |
"no_pedestrians", | |
"do_not_litter", | |
"no_bicycles", | |
"non-potable_water", | |
"no_mobile_phones", | |
"underage", | |
"accept", | |
"ideograph_advantage", | |
"white_flower", | |
"wilted_flower", | |
"secret", | |
"congratulations", | |
"u5408", | |
"u6e80", | |
"u7981", | |
"u6709", | |
"u7121", | |
"u7533", | |
"u55b6", | |
"u6708", | |
"u5272", | |
"u7a7a", | |
"sa", | |
"koko", | |
"u6307", | |
"chart", | |
"sparkle", | |
"eight_spoked_asterisk", | |
"negative_squared_cross_mark", | |
"white_check_mark", | |
"eight_pointed_black_star", | |
"vibration_mode", | |
"mobile_phone_off", | |
"vs", | |
"a", | |
"b", | |
"ab", | |
"cl", | |
"o2", | |
"sos", | |
"parking", | |
"wc", | |
"cool", | |
"free", | |
"new", | |
"ng", | |
"ok", | |
"up", | |
"atm", | |
"id", | |
"aries", | |
"taurus", | |
"gemini", | |
"cancer", | |
"leo", | |
"virgo", | |
"libra", | |
"scorpius", | |
"sagittarius", | |
"capricorn", | |
"aquarius", | |
"pisces", | |
"ophiuchus", | |
"six_pointed_star", | |
"atom_symbol", | |
"latin_cross", | |
"orthodox_cross", | |
"star_and_crescent", | |
"om", | |
"star_of_david", | |
"wheel_of_dharma", | |
"yin_yang", | |
"menorah", | |
"peace_symbol", | |
"restroom", | |
"mens", | |
"womens", | |
"baby_symbol", | |
"wheelchair", | |
"potable_water", | |
"no_smoking", | |
"put_litter_in_its_place", | |
"arrow_forward", | |
"arrow_backward", | |
"arrow_up_small", | |
"arrow_down_small", | |
"fast_forward", | |
"rewind", | |
"arrow_double_up", | |
"arrow_double_down", | |
"arrow_right", | |
"arrow_left", | |
"arrow_up", | |
"arrow_down", | |
"arrow_upper_right", | |
"arrow_lower_right", | |
"arrow_lower_left", | |
"arrow_upper_left", | |
"arrow_up_down", | |
"left_right_arrow", | |
"arrows_counterclockwise", | |
"arrow_right_hook", | |
"leftwards_arrow_with_hook", | |
"arrow_heading_up", | |
"arrow_heading_down", | |
"twisted_rightwards_arrows", | |
"repeat", | |
"repeat_one", | |
"zero", | |
"one", | |
"two", | |
"three", | |
"four", | |
"five", | |
"six", | |
"seven", | |
"eight", | |
"nine", | |
"keycap_ten", | |
"asterisk", | |
"1234", | |
"hash", | |
"abc", | |
"abcd", | |
"capital_abcd", | |
"information_source", | |
"signal_strength", | |
"cinema", | |
"symbols", | |
"heavy_plus_sign", | |
"heavy_minus_sign", | |
"wavy_dash", | |
"heavy_division_sign", | |
"heavy_multiplication_x", | |
"heavy_check_mark", | |
"arrows_clockwise", | |
"tm", | |
"copyright", | |
"registered", | |
"currency_exchange", | |
"heavy_dollar_sign", | |
"curly_loop", | |
"loop", | |
"part_alternation_mark", | |
"exclamation", | |
"bangbang", | |
"question", | |
"grey_exclamation", | |
"grey_question", | |
"interrobang", | |
"x", | |
"o", | |
"100", | |
"end", | |
"back", | |
"on", | |
"top", | |
"soon", | |
"cyclone", | |
"m", | |
"beginner", | |
"trident", | |
"warning", | |
"hotsprings", | |
"recycle", | |
"anger", | |
"diamond_shape_with_a_dot_inside", | |
"spades", | |
"clubs", | |
"hearts", | |
"diamonds", | |
"ballot_box_with_check", | |
"white_circle", | |
"black_circle", | |
"radio_button", | |
"red_circle", | |
"large_blue_circle", | |
"small_red_triangle", | |
"small_red_triangle_down", | |
"small_orange_diamond", | |
"small_blue_diamond", | |
"large_orange_diamond", | |
"large_blue_diamond", | |
"black_small_square", | |
"white_small_square", | |
"black_large_square", | |
"white_large_square", | |
"black_medium_square", | |
"white_medium_square", | |
"black_medium_small_square", | |
"white_medium_small_square", | |
"black_square_button", | |
"white_square_button", | |
"clock1", | |
"clock2", | |
"clock3", | |
"clock4", | |
"clock5", | |
"clock6", | |
"clock7", | |
"clock8", | |
"clock9", | |
"clock10", | |
"clock11", | |
"clock12", | |
"clock130", | |
"clock230", | |
"clock330", | |
"clock430", | |
"clock530", | |
"clock630", | |
"clock730", | |
"clock830", | |
"clock930", | |
"clock1030", | |
"clock1130", | |
"clock1230", | |
"alembic", | |
"amphora", | |
"biohazard", | |
"bed", | |
"sleeping_bed", | |
"bellhop_bell", | |
"spiral_calendar", | |
"camera_flash", | |
"candle", | |
"card_file_box", | |
"chains", | |
"mantelpiece_clock", | |
"coffin", | |
"clamp", | |
"control_knobs", | |
"couch_and_lamp", | |
"crayon", | |
"dagger", | |
"dark_sunglasses", | |
"desktop_computer", | |
"card_index_dividers", | |
"envelope", | |
"file_cabinet", | |
"film_strip", | |
"plate_with_cutlery", | |
"framed_picture", | |
"gear", | |
"hammer_and_pick", | |
"rescue_worker_helmet", | |
"joystick", | |
"old_key", | |
"keyboard", | |
"knife", | |
"spoon", | |
"label", | |
"level_slider", | |
"business_suit_levitating", | |
"weight_lifting_woman", | |
"weight_lifting_man", | |
"medal_sports", | |
"1st_place_medal", | |
"2nd_place_medal", | |
"3rd_place_medal", | |
"studio_microphone", | |
"medal_military", | |
"computer_mouse", | |
"mouse_three_button", | |
"newspaper_roll", | |
"spiral_notepad", | |
"oil_drum", | |
"paperclips", | |
"pause_button", | |
"record_button", | |
"stop_button", | |
"play_or_pause_button", | |
"next_track_button", | |
"previous_track_button", | |
"pen", | |
"fountain_pen", | |
"memo", | |
"pick", | |
"ping_pong", | |
"popcorn", | |
"prayer_beads", | |
"printer", | |
"film_projector", | |
"radioactive", | |
"reminder_ribbon", | |
"rosette", | |
"artificial_satellite", | |
"balance_scale", | |
"shamrock", | |
"shield", | |
"shopping", | |
"shopping_cart", | |
"stopwatch", | |
"telephone", | |
"thermometer", | |
"face_with_thermometer", | |
"tickets", | |
"timer_clock", | |
"hammer_and_wrench", | |
"trackball", | |
"open_umbrella", | |
"wastebasket", | |
"left_speech_bubble", | |
] | |
} | |
] | |
FITZPATRICK_SCALE ||= [ "1f3fb", "1f3fc", "1f3fd", "1f3fe", "1f3ff" ] | |
VARIATION_SELECTOR ||= "fe0f" | |
EMOJI_KEYWORDS_PATCH ||= { | |
# The emoji lists we use have char differences on these emojis | |
"asterisk" => { "char" => "*️⃣" }, | |
"dancing_men" => { "char" => "👯♂️️" }, | |
"woman_dancing" => { "char" => "💃", "fitzpatrick_scale" => false }, | |
"women_wrestling" => { "char" => "🤼♀️️", "fitzpatrick_scale" => false }, | |
"men_wrestling" => { "char" => "🤼♂️️", "fitzpatrick_scale" => false }, | |
"female_detective" => { "char" => "🕵️♀️", "fitzpatrick_scale" => true }, | |
"blonde_woman" => { "fitzpatrick_scale" => true }, | |
"woman_with_turban" => { "fitzpatrick_scale" => true }, | |
"policewoman" => { "fitzpatrick_scale" => true }, | |
"construction_worker_woman" => { "fitzpatrick_scale" => true }, | |
"guardswoman" => { "fitzpatrick_scale" => true }, | |
"woman_health_worker" => { "fitzpatrick_scale" => true }, | |
"man_health_worker" => { "fitzpatrick_scale" => true }, | |
"woman_pilot" => { "fitzpatrick_scale" => true }, | |
"man_pilot" => { "fitzpatrick_scale" => true }, | |
"woman_judge" => { "fitzpatrick_scale" => true }, | |
"man_judge" => { "fitzpatrick_scale" => true }, | |
"running_woman" => { "fitzpatrick_scale" => true }, | |
"walking_woman" => { "fitzpatrick_scale" => true }, | |
"woman_facepalming" => { "fitzpatrick_scale" => true }, | |
"bowing_woman" => { "fitzpatrick_scale" => true }, | |
"man_shrugging" => { "fitzpatrick_scale" => true }, | |
"tipping_hand_man" => { "fitzpatrick_scale" => true }, | |
"no_good_man" => { "fitzpatrick_scale" => true }, | |
"ok_man" => { "fitzpatrick_scale" => true }, | |
"raising_hand_man" => { "fitzpatrick_scale" => true }, | |
"pouting_man" => { "fitzpatrick_scale" => true }, | |
"frowning_man" => { "fitzpatrick_scale" => true }, | |
"haircut_man" => { "fitzpatrick_scale" => true }, | |
"massage_man" => { "fitzpatrick_scale" => true }, | |
"golfing_woman" => { "fitzpatrick_scale" => true }, | |
"rowing_woman" => { "fitzpatrick_scale" => true }, | |
"swimming_woman" => { "fitzpatrick_scale" => true }, | |
"surfing_woman" => { "fitzpatrick_scale" => true }, | |
"basketball_woman" => { "fitzpatrick_scale" => true }, | |
"weight_lifting_woman" => { "fitzpatrick_scale" => true }, | |
"biking_woman" => { "fitzpatrick_scale" => true }, | |
"mountain_biking_woman" => { "fitzpatrick_scale" => true }, | |
"handshake" => { "fitzpatrick_scale" => false }, | |
"dancing_women" => { "fitzpatrick_scale" => false }, | |
"couple" => { "fitzpatrick_scale" => false }, | |
"two_men_holding_hands" => { "fitzpatrick_scale" => false }, | |
"two_women_holding_hands" => { "fitzpatrick_scale" => false }, | |
"couple_with_heart_woman_man" => { "fitzpatrick_scale" => false }, | |
"couplekiss_man_woman" => { "fitzpatrick_scale" => false }, | |
"family_man_woman_boy" => { "fitzpatrick_scale" => false }, | |
"rescue_worker_helmet" => { "fitzpatrick_scale" => false }, | |
"skier" => { "fitzpatrick_scale" => false } | |
} | |
EICI ||= EMOJI_IMAGES_CELLS_INDEX ||= { | |
:windows => 10, | |
:apple => 3, | |
:google => 4, | |
:twitter => 5, | |
:one => 6 | |
} | |
EMOJI_IMAGES_CELLS_INDEX_PATCH ||= { | |
:apple => { | |
"snowboarder" => EICI[:twitter], | |
"snowboarder/2" => EICI[:twitter], | |
"snowboarder/3" => EICI[:twitter], | |
"snowboarder/4" => EICI[:twitter], | |
"snowboarder/5" => EICI[:twitter], | |
"snowboarder/6" => EICI[:twitter], | |
"sleeping_bed" => EICI[:twitter], | |
"sleeping_bed/2" => EICI[:twitter], | |
"sleeping_bed/3" => EICI[:twitter], | |
"sleeping_bed/4" => EICI[:twitter], | |
"sleeping_bed/5" => EICI[:twitter], | |
"sleeping_bed/6" => EICI[:twitter], | |
}, | |
:one => { | |
"afghanistan" => EICI[:twitter], | |
"aland_islands" => EICI[:twitter], | |
"albania" => EICI[:twitter], | |
"algeria" => EICI[:twitter], | |
"american_samoa" => EICI[:twitter], | |
"andorra" => EICI[:twitter], | |
"angola" => EICI[:twitter], | |
"anguilla" => EICI[:twitter], | |
"antarctica" => EICI[:twitter], | |
"antigua_barbuda" => EICI[:twitter], | |
"argentina" => EICI[:twitter], | |
"armenia" => EICI[:twitter], | |
"aruba" => EICI[:twitter], | |
"australia" => EICI[:twitter], | |
"austria" => EICI[:twitter], | |
"azerbaijan" => EICI[:twitter], | |
"bahamas" => EICI[:twitter], | |
"bahrain" => EICI[:twitter], | |
"bangladesh" => EICI[:twitter], | |
"barbados" => EICI[:twitter], | |
"belarus" => EICI[:twitter], | |
"belgium" => EICI[:twitter], | |
"belize" => EICI[:twitter], | |
"benin" => EICI[:twitter], | |
"bermuda" => EICI[:twitter], | |
"bhutan" => EICI[:twitter], | |
"bolivia" => EICI[:twitter], | |
"caribbean_netherlands" => EICI[:twitter], | |
"bosnia_herzegovina" => EICI[:twitter], | |
"botswana" => EICI[:twitter], | |
"brazil" => EICI[:twitter], | |
"british_indian_ocean_territory" => EICI[:twitter], | |
"british_virgin_islands" => EICI[:twitter], | |
"brunei" => EICI[:twitter], | |
"bulgaria" => EICI[:twitter], | |
"burkina_faso" => EICI[:twitter], | |
"burundi" => EICI[:twitter], | |
"cape_verde" => EICI[:twitter], | |
"cambodia" => EICI[:twitter], | |
"cameroon" => EICI[:twitter], | |
"canada" => EICI[:twitter], | |
"canary_islands" => EICI[:twitter], | |
"cayman_islands" => EICI[:twitter], | |
"central_african_republic" => EICI[:twitter], | |
"chad" => EICI[:twitter], | |
"chile" => EICI[:twitter], | |
"cn" => EICI[:twitter], | |
"christmas_island" => EICI[:twitter], | |
"cocos_islands" => EICI[:twitter], | |
"colombia" => EICI[:twitter], | |
"comoros" => EICI[:twitter], | |
"congo_brazzaville" => EICI[:twitter], | |
"congo_kinshasa" => EICI[:twitter], | |
"cook_islands" => EICI[:twitter], | |
"costa_rica" => EICI[:twitter], | |
"croatia" => EICI[:twitter], | |
"cuba" => EICI[:twitter], | |
"curacao" => EICI[:twitter], | |
"cyprus" => EICI[:twitter], | |
"czech_republic" => EICI[:twitter], | |
"denmark" => EICI[:twitter], | |
"djibouti" => EICI[:twitter], | |
"dominica" => EICI[:twitter], | |
"dominican_republic" => EICI[:twitter], | |
"ecuador" => EICI[:twitter], | |
"egypt" => EICI[:twitter], | |
"el_salvador" => EICI[:twitter], | |
"equatorial_guinea" => EICI[:twitter], | |
"eritrea" => EICI[:twitter], | |
"estonia" => EICI[:twitter], | |
"ethiopia" => EICI[:twitter], | |
"eu" => EICI[:twitter], | |
"falkland_islands" => EICI[:twitter], | |
"faroe_islands" => EICI[:twitter], | |
"fiji" => EICI[:twitter], | |
"finland" => EICI[:twitter], | |
"fr" => EICI[:twitter], | |
"french_guiana" => EICI[:twitter], | |
"french_polynesia" => EICI[:twitter], | |
"french_southern_territories" => EICI[:twitter], | |
"gabon" => EICI[:twitter], | |
"gambia" => EICI[:twitter], | |
"georgia" => EICI[:twitter], | |
"de" => EICI[:twitter], | |
"ghana" => EICI[:twitter], | |
"gibraltar" => EICI[:twitter], | |
"greece" => EICI[:twitter], | |
"greenland" => EICI[:twitter], | |
"grenada" => EICI[:twitter], | |
"guadeloupe" => EICI[:twitter], | |
"guam" => EICI[:twitter], | |
"guatemala" => EICI[:twitter], | |
"guernsey" => EICI[:twitter], | |
"guinea" => EICI[:twitter], | |
"guinea_bissau" => EICI[:twitter], | |
"guyana" => EICI[:twitter], | |
"haiti" => EICI[:twitter], | |
"honduras" => EICI[:twitter], | |
"hong_kong" => EICI[:twitter], | |
"hungary" => EICI[:twitter], | |
"iceland" => EICI[:twitter], | |
"india" => EICI[:twitter], | |
"indonesia" => EICI[:twitter], | |
"iran" => EICI[:twitter], | |
"iraq" => EICI[:twitter], | |
"ireland" => EICI[:twitter], | |
"isle_of_man" => EICI[:twitter], | |
"israel" => EICI[:twitter], | |
"it" => EICI[:twitter], | |
"cote_divoire" => EICI[:twitter], | |
"jamaica" => EICI[:twitter], | |
"jp" => EICI[:twitter], | |
"jersey" => EICI[:twitter], | |
"jordan" => EICI[:twitter], | |
"kazakhstan" => EICI[:twitter], | |
"kenya" => EICI[:twitter], | |
"kiribati" => EICI[:twitter], | |
"kosovo" => EICI[:twitter], | |
"kuwait" => EICI[:twitter], | |
"kyrgyzstan" => EICI[:twitter], | |
"laos" => EICI[:twitter], | |
"latvia" => EICI[:twitter], | |
"lebanon" => EICI[:twitter], | |
"lesotho" => EICI[:twitter], | |
"liberia" => EICI[:twitter], | |
"libya" => EICI[:twitter], | |
"liechtenstein" => EICI[:twitter], | |
"lithuania" => EICI[:twitter], | |
"luxembourg" => EICI[:twitter], | |
"macau" => EICI[:twitter], | |
"macedonia" => EICI[:twitter], | |
"madagascar" => EICI[:twitter], | |
"malawi" => EICI[:twitter], | |
"malaysia" => EICI[:twitter], | |
"maldives" => EICI[:twitter], | |
"mali" => EICI[:twitter], | |
"malta" => EICI[:twitter], | |
"marshall_islands" => EICI[:twitter], | |
"martinique" => EICI[:twitter], | |
"mauritania" => EICI[:twitter], | |
"mauritius" => EICI[:twitter], | |
"mayotte" => EICI[:twitter], | |
"mexico" => EICI[:twitter], | |
"micronesia" => EICI[:twitter], | |
"moldova" => EICI[:twitter], | |
"monaco" => EICI[:twitter], | |
"mongolia" => EICI[:twitter], | |
"montenegro" => EICI[:twitter], | |
"montserrat" => EICI[:twitter], | |
"morocco" => EICI[:twitter], | |
"mozambique" => EICI[:twitter], | |
"myanmar" => EICI[:twitter], | |
"namibia" => EICI[:twitter], | |
"nauru" => EICI[:twitter], | |
"nepal" => EICI[:twitter], | |
"netherlands" => EICI[:twitter], | |
"new_caledonia" => EICI[:twitter], | |
"new_zealand" => EICI[:twitter], | |
"nicaragua" => EICI[:twitter], | |
"niger" => EICI[:twitter], | |
"nigeria" => EICI[:twitter], | |
"niue" => EICI[:twitter], | |
"norfolk_island" => EICI[:twitter], | |
"northern_mariana_islands" => EICI[:twitter], | |
"north_korea" => EICI[:twitter], | |
"norway" => EICI[:twitter], | |
"oman" => EICI[:twitter], | |
"pakistan" => EICI[:twitter], | |
"palau" => EICI[:twitter], | |
"palestinian_territories" => EICI[:twitter], | |
"panama" => EICI[:twitter], | |
"papua_new_guinea" => EICI[:twitter], | |
"paraguay" => EICI[:twitter], | |
"peru" => EICI[:twitter], | |
"philippines" => EICI[:twitter], | |
"pitcairn_islands" => EICI[:twitter], | |
"poland" => EICI[:twitter], | |
"portugal" => EICI[:twitter], | |
"puerto_rico" => EICI[:twitter], | |
"qatar" => EICI[:twitter], | |
"reunion" => EICI[:twitter], | |
"romania" => EICI[:twitter], | |
"ru" => EICI[:twitter], | |
"rwanda" => EICI[:twitter], | |
"st_barthelemy" => EICI[:twitter], | |
"st_helena" => EICI[:twitter], | |
"st_kitts_nevis" => EICI[:twitter], | |
"st_lucia" => EICI[:twitter], | |
"st_pierre_miquelon" => EICI[:twitter], | |
"st_vincent_grenadines" => EICI[:twitter], | |
"samoa" => EICI[:twitter], | |
"san_marino" => EICI[:twitter], | |
"sao_tome_principe" => EICI[:twitter], | |
"saudi_arabia" => EICI[:twitter], | |
"senegal" => EICI[:twitter], | |
"serbia" => EICI[:twitter], | |
"seychelles" => EICI[:twitter], | |
"sierra_leone" => EICI[:twitter], | |
"singapore" => EICI[:twitter], | |
"sint_maarten" => EICI[:twitter], | |
"slovakia" => EICI[:twitter], | |
"slovenia" => EICI[:twitter], | |
"solomon_islands" => EICI[:twitter], | |
"somalia" => EICI[:twitter], | |
"south_africa" => EICI[:twitter], | |
"south_georgia_south_sandwich_islands" => EICI[:twitter], | |
"kr" => EICI[:twitter], | |
"south_sudan" => EICI[:twitter], | |
"es" => EICI[:twitter], | |
"sri_lanka" => EICI[:twitter], | |
"sudan" => EICI[:twitter], | |
"suriname" => EICI[:twitter], | |
"swaziland" => EICI[:twitter], | |
"sweden" => EICI[:twitter], | |
"switzerland" => EICI[:twitter], | |
"syria" => EICI[:twitter], | |
"taiwan" => EICI[:twitter], | |
"tajikistan" => EICI[:twitter], | |
"tanzania" => EICI[:twitter], | |
"thailand" => EICI[:twitter], | |
"timor_leste" => EICI[:twitter], | |
"togo" => EICI[:twitter], | |
"tokelau" => EICI[:twitter], | |
"tonga" => EICI[:twitter], | |
"trinidad_tobago" => EICI[:twitter], | |
"tunisia" => EICI[:twitter], | |
"tr" => EICI[:twitter], | |
"turkmenistan" => EICI[:twitter], | |
"turks_caicos_islands" => EICI[:twitter], | |
"tuvalu" => EICI[:twitter], | |
"uganda" => EICI[:twitter], | |
"ukraine" => EICI[:twitter], | |
"united_arab_emirates" => EICI[:twitter], | |
"uk" => EICI[:twitter], | |
"us" => EICI[:twitter], | |
"us_virgin_islands" => EICI[:twitter], | |
"uruguay" => EICI[:twitter], | |
"uzbekistan" => EICI[:twitter], | |
"vanuatu" => EICI[:twitter], | |
"vatican_city" => EICI[:twitter], | |
"venezuela" => EICI[:twitter], | |
"vietnam" => EICI[:twitter], | |
"wallis_futuna" => EICI[:twitter], | |
"western_sahara" => EICI[:twitter], | |
"yemen" => EICI[:twitter], | |
"zambia" => EICI[:twitter], | |
"zimbabwe" => EICI[:twitter], | |
}, | |
:windows => { | |
"hash" => EICI[:apple], | |
"zero" => EICI[:apple], | |
"one" => EICI[:apple], | |
"two" => EICI[:apple], | |
"three" => EICI[:apple], | |
"four" => EICI[:apple], | |
"five" => EICI[:apple], | |
"six" => EICI[:apple], | |
"seven" => EICI[:apple], | |
"eight" => EICI[:apple], | |
"nine" => EICI[:apple], | |
"asterisk" => EICI[:apple], | |
"afghanistan" => EICI[:twitter], | |
"aland_islands" => EICI[:twitter], | |
"albania" => EICI[:twitter], | |
"algeria" => EICI[:twitter], | |
"american_samoa" => EICI[:twitter], | |
"andorra" => EICI[:twitter], | |
"angola" => EICI[:twitter], | |
"anguilla" => EICI[:twitter], | |
"antarctica" => EICI[:twitter], | |
"antigua_barbuda" => EICI[:twitter], | |
"argentina" => EICI[:twitter], | |
"armenia" => EICI[:twitter], | |
"aruba" => EICI[:twitter], | |
"australia" => EICI[:twitter], | |
"austria" => EICI[:twitter], | |
"azerbaijan" => EICI[:twitter], | |
"bahamas" => EICI[:twitter], | |
"bahrain" => EICI[:twitter], | |
"bangladesh" => EICI[:twitter], | |
"barbados" => EICI[:twitter], | |
"belarus" => EICI[:twitter], | |
"belgium" => EICI[:twitter], | |
"belize" => EICI[:twitter], | |
"benin" => EICI[:twitter], | |
"bermuda" => EICI[:twitter], | |
"bhutan" => EICI[:twitter], | |
"bolivia" => EICI[:twitter], | |
"caribbean_netherlands" => EICI[:twitter], | |
"bosnia_herzegovina" => EICI[:twitter], | |
"botswana" => EICI[:twitter], | |
"brazil" => EICI[:twitter], | |
"british_indian_ocean_territory" => EICI[:twitter], | |
"british_virgin_islands" => EICI[:twitter], | |
"brunei" => EICI[:twitter], | |
"bulgaria" => EICI[:twitter], | |
"burkina_faso" => EICI[:twitter], | |
"burundi" => EICI[:twitter], | |
"cape_verde" => EICI[:twitter], | |
"cambodia" => EICI[:twitter], | |
"cameroon" => EICI[:twitter], | |
"canada" => EICI[:twitter], | |
"canary_islands" => EICI[:twitter], | |
"cayman_islands" => EICI[:twitter], | |
"central_african_republic" => EICI[:twitter], | |
"chad" => EICI[:twitter], | |
"chile" => EICI[:twitter], | |
"cn" => EICI[:twitter], | |
"christmas_island" => EICI[:twitter], | |
"cocos_islands" => EICI[:twitter], | |
"colombia" => EICI[:twitter], | |
"comoros" => EICI[:twitter], | |
"congo_brazzaville" => EICI[:twitter], | |
"congo_kinshasa" => EICI[:twitter], | |
"cook_islands" => EICI[:twitter], | |
"costa_rica" => EICI[:twitter], | |
"croatia" => EICI[:twitter], | |
"cuba" => EICI[:twitter], | |
"curacao" => EICI[:twitter], | |
"cyprus" => EICI[:twitter], | |
"czech_republic" => EICI[:twitter], | |
"denmark" => EICI[:twitter], | |
"djibouti" => EICI[:twitter], | |
"dominica" => EICI[:twitter], | |
"dominican_republic" => EICI[:twitter], | |
"ecuador" => EICI[:twitter], | |
"egypt" => EICI[:twitter], | |
"el_salvador" => EICI[:twitter], | |
"equatorial_guinea" => EICI[:twitter], | |
"eritrea" => EICI[:twitter], | |
"estonia" => EICI[:twitter], | |
"ethiopia" => EICI[:twitter], | |
"eu" => EICI[:twitter], | |
"falkland_islands" => EICI[:twitter], | |
"faroe_islands" => EICI[:twitter], | |
"fiji" => EICI[:twitter], | |
"finland" => EICI[:twitter], | |
"fr" => EICI[:twitter], | |
"french_guiana" => EICI[:twitter], | |
"french_polynesia" => EICI[:twitter], | |
"french_southern_territories" => EICI[:twitter], | |
"gabon" => EICI[:twitter], | |
"gambia" => EICI[:twitter], | |
"georgia" => EICI[:twitter], | |
"de" => EICI[:twitter], | |
"ghana" => EICI[:twitter], | |
"gibraltar" => EICI[:twitter], | |
"greece" => EICI[:twitter], | |
"greenland" => EICI[:twitter], | |
"grenada" => EICI[:twitter], | |
"guadeloupe" => EICI[:twitter], | |
"guam" => EICI[:twitter], | |
"guatemala" => EICI[:twitter], | |
"guernsey" => EICI[:twitter], | |
"guinea" => EICI[:twitter], | |
"guinea_bissau" => EICI[:twitter], | |
"guyana" => EICI[:twitter], | |
"haiti" => EICI[:twitter], | |
"honduras" => EICI[:twitter], | |
"hong_kong" => EICI[:twitter], | |
"hungary" => EICI[:twitter], | |
"iceland" => EICI[:twitter], | |
"india" => EICI[:twitter], | |
"indonesia" => EICI[:twitter], | |
"iran" => EICI[:twitter], | |
"iraq" => EICI[:twitter], | |
"ireland" => EICI[:twitter], | |
"isle_of_man" => EICI[:twitter], | |
"israel" => EICI[:twitter], | |
"it" => EICI[:twitter], | |
"cote_divoire" => EICI[:twitter], | |
"jamaica" => EICI[:twitter], | |
"jp" => EICI[:twitter], | |
"jersey" => EICI[:twitter], | |
"jordan" => EICI[:twitter], | |
"kazakhstan" => EICI[:twitter], | |
"kenya" => EICI[:twitter], | |
"kiribati" => EICI[:twitter], | |
"kosovo" => EICI[:twitter], | |
"kuwait" => EICI[:twitter], | |
"kyrgyzstan" => EICI[:twitter], | |
"laos" => EICI[:twitter], | |
"latvia" => EICI[:twitter], | |
"lebanon" => EICI[:twitter], | |
"lesotho" => EICI[:twitter], | |
"liberia" => EICI[:twitter], | |
"libya" => EICI[:twitter], | |
"liechtenstein" => EICI[:twitter], | |
"lithuania" => EICI[:twitter], | |
"luxembourg" => EICI[:twitter], | |
"macau" => EICI[:twitter], | |
"macedonia" => EICI[:twitter], | |
"madagascar" => EICI[:twitter], | |
"malawi" => EICI[:twitter], | |
"malaysia" => EICI[:twitter], | |
"maldives" => EICI[:twitter], | |
"mali" => EICI[:twitter], | |
"malta" => EICI[:twitter], | |
"marshall_islands" => EICI[:twitter], | |
"martinique" => EICI[:twitter], | |
"mauritania" => EICI[:twitter], | |
"mauritius" => EICI[:twitter], | |
"mayotte" => EICI[:twitter], | |
"mexico" => EICI[:twitter], | |
"micronesia" => EICI[:twitter], | |
"moldova" => EICI[:twitter], | |
"monaco" => EICI[:twitter], | |
"mongolia" => EICI[:twitter], | |
"montenegro" => EICI[:twitter], | |
"montserrat" => EICI[:twitter], | |
"morocco" => EICI[:twitter], | |
"mozambique" => EICI[:twitter], | |
"myanmar" => EICI[:twitter], | |
"namibia" => EICI[:twitter], | |
"nauru" => EICI[:twitter], | |
"nepal" => EICI[:twitter], | |
"netherlands" => EICI[:twitter], | |
"new_caledonia" => EICI[:twitter], | |
"new_zealand" => EICI[:twitter], | |
"nicaragua" => EICI[:twitter], | |
"niger" => EICI[:twitter], | |
"nigeria" => EICI[:twitter], | |
"niue" => EICI[:twitter], | |
"norfolk_island" => EICI[:twitter], | |
"northern_mariana_islands" => EICI[:twitter], | |
"north_korea" => EICI[:twitter], | |
"norway" => EICI[:twitter], | |
"oman" => EICI[:twitter], | |
"pakistan" => EICI[:twitter], | |
"palau" => EICI[:twitter], | |
"palestinian_territories" => EICI[:twitter], | |
"panama" => EICI[:twitter], | |
"papua_new_guinea" => EICI[:twitter], | |
"paraguay" => EICI[:twitter], | |
"peru" => EICI[:twitter], | |
"philippines" => EICI[:twitter], | |
"pitcairn_islands" => EICI[:twitter], | |
"poland" => EICI[:twitter], | |
"portugal" => EICI[:twitter], | |
"puerto_rico" => EICI[:twitter], | |
"qatar" => EICI[:twitter], | |
"reunion" => EICI[:twitter], | |
"romania" => EICI[:twitter], | |
"ru" => EICI[:twitter], | |
"rwanda" => EICI[:twitter], | |
"st_barthelemy" => EICI[:twitter], | |
"st_helena" => EICI[:twitter], | |
"st_kitts_nevis" => EICI[:twitter], | |
"st_lucia" => EICI[:twitter], | |
"st_pierre_miquelon" => EICI[:twitter], | |
"st_vincent_grenadines" => EICI[:twitter], | |
"samoa" => EICI[:twitter], | |
"san_marino" => EICI[:twitter], | |
"sao_tome_principe" => EICI[:twitter], | |
"saudi_arabia" => EICI[:twitter], | |
"senegal" => EICI[:twitter], | |
"serbia" => EICI[:twitter], | |
"seychelles" => EICI[:twitter], | |
"sierra_leone" => EICI[:twitter], | |
"singapore" => EICI[:twitter], | |
"sint_maarten" => EICI[:twitter], | |
"slovakia" => EICI[:twitter], | |
"slovenia" => EICI[:twitter], | |
"solomon_islands" => EICI[:twitter], | |
"somalia" => EICI[:twitter], | |
"south_africa" => EICI[:twitter], | |
"south_georgia_south_sandwich_islands" => EICI[:twitter], | |
"kr" => EICI[:twitter], | |
"south_sudan" => EICI[:twitter], | |
"es" => EICI[:twitter], | |
"sri_lanka" => EICI[:twitter], | |
"sudan" => EICI[:twitter], | |
"suriname" => EICI[:twitter], | |
"swaziland" => EICI[:twitter], | |
"sweden" => EICI[:twitter], | |
"switzerland" => EICI[:twitter], | |
"syria" => EICI[:twitter], | |
"taiwan" => EICI[:twitter], | |
"tajikistan" => EICI[:twitter], | |
"tanzania" => EICI[:twitter], | |
"thailand" => EICI[:twitter], | |
"timor_leste" => EICI[:twitter], | |
"togo" => EICI[:twitter], | |
"tokelau" => EICI[:twitter], | |
"tonga" => EICI[:twitter], | |
"trinidad_tobago" => EICI[:twitter], | |
"tunisia" => EICI[:twitter], | |
"tr" => EICI[:twitter], | |
"turkmenistan" => EICI[:twitter], | |
"turks_caicos_islands" => EICI[:twitter], | |
"tuvalu" => EICI[:twitter], | |
"uganda" => EICI[:twitter], | |
"ukraine" => EICI[:twitter], | |
"united_arab_emirates" => EICI[:twitter], | |
"uk" => EICI[:twitter], | |
"us" => EICI[:twitter], | |
"us_virgin_islands" => EICI[:twitter], | |
"uruguay" => EICI[:twitter], | |
"uzbekistan" => EICI[:twitter], | |
"vanuatu" => EICI[:twitter], | |
"vatican_city" => EICI[:twitter], | |
"venezuela" => EICI[:twitter], | |
"vietnam" => EICI[:twitter], | |
"wallis_futuna" => EICI[:twitter], | |
"western_sahara" => EICI[:twitter], | |
"yemen" => EICI[:twitter], | |
"zambia" => EICI[:twitter], | |
"zimbabwe" => EICI[:twitter], | |
} | |
} | |
PLATFORM_STYLES ||= { | |
:apple => "apple", | |
:google => "google", | |
:twitter => "twitter", | |
:one => "emoji_one", | |
:windows => "win10" | |
} | |
desc "update emoji images" | |
task "emoji:update" do | |
emojis = build_emojis_list(EMOJI_KEYWORDS_URL) | |
images = build_images_list(EMOJI_LIST_URL, emojis) | |
emojis.each { |code, emoji| emoji[:images] = ( images[code] || {} ) } | |
write_emojis(emojis) | |
write_db_json(emojis) | |
write_groups_js_es6(emojis) | |
end | |
desc "tests script" | |
task "emoji:test" do | |
ENV['EMOJI_TEST'] = "1" | |
require "active_support/test_case" | |
class TestEmoji < MiniTest::Test | |
def setup | |
Rake::Task["emoji:update"].invoke | |
end | |
def image_path(style, name) | |
File.join("public", "images", "emoji", style, "#{name}.png") | |
end | |
def test_code_to_emoji | |
assert_equal "😎", code_to_emoji("1f60e") | |
end | |
def test_codepoints_to_code | |
assert_equal "1f6b5_200d_2640", codepoints_to_code([128693, 8205, 9792, 65039], false) | |
end | |
def test_codepoints_to_code_with_scale | |
assert_equal "1f6b5_200d_2640_fe0f", codepoints_to_code([128693, 8205, 9792, 65039], true) | |
end | |
def test_groups_js_es6_creation | |
assert File.exists?(EMOJI_GROUPS_PATH) | |
assert File.size?(EMOJI_GROUPS_PATH) | |
end | |
def test_db_json_creation | |
assert File.exists?(EMOJI_DB_PATH) | |
assert File.size?(EMOJI_DB_PATH) | |
end | |
def test_alias_creation | |
original_image = image_path("apple", "right_anger_bubble") | |
alias_image = image_path("apple", "anger_right") | |
assert_equal File.size(original_image), File.size(alias_image) | |
end | |
def test_cell_index_patch | |
original_image = image_path("apple", "snowboarder") | |
alias_image = image_path("twitter", "snowboarder") | |
assert_equal File.size(original_image), File.size(alias_image) | |
end | |
def test_scales | |
original_image = image_path("apple", "blonde_woman") | |
assert File.exists?(original_image) | |
assert File.size?(original_image) | |
(2..6).each do |scale| | |
image = image_path("apple", "blonde_woman/#{scale}") | |
assert File.exists?(image) | |
assert File.size?(image) | |
end | |
end | |
def test_generate_emoji_scales | |
actual = generate_emoji_scales("sleeping_bed", "1f6cc") | |
expected = { | |
"1f6cc_1f3fb" => { :name => "sleeping_bed/2", :fitzpatrick_scale => false }, | |
"1f6cc_1f3fc" => { :name => "sleeping_bed/3", :fitzpatrick_scale => false }, | |
"1f6cc_1f3fd" => { :name => "sleeping_bed/4", :fitzpatrick_scale => false }, | |
"1f6cc_1f3fe" => { :name => "sleeping_bed/5", :fitzpatrick_scale => false }, | |
"1f6cc_1f3ff" => { :name => "sleeping_bed/6", :fitzpatrick_scale => false } | |
} | |
assert_equal expected, actual | |
end | |
end | |
reporter = Minitest::SummaryReporter.new | |
TestEmoji.run(reporter) | |
puts reporter.to_s | |
end | |
def write_emojis(emojis) | |
check_pngout | |
path = "#{EMOJI_IMAGES_PATH}/**/*" | |
confirm_overwrite(path) | |
puts "Cleaning emoji folder..." | |
FileUtils.rm_rf(Dir.glob(path)) | |
puts "\r\nWriting emojis to disk..." | |
skipped_emojis = [] | |
emojis.each do |code, emoji| | |
images = emoji[:images] | |
if images.values.all? { |image| !image.nil? } | |
PLATFORM_STYLES.each do |platform, style| | |
style_path = File.join(EMOJI_IMAGES_PATH, style) | |
image_path = File.join(style_path, "#{emoji[:name]}.png") | |
FileUtils.mkdir_p(File.expand_path("..", image_path)) | |
image = images[platform] | |
write_emoji(image_path, image) | |
if aliases = EMOJI_ALIASES[emoji[:name]] | |
aliases.each do |alias_name| | |
alias_image_path = File.join(style_path, "#{alias_name}.png") | |
write_emoji(alias_image_path, image) | |
end | |
end | |
end | |
else | |
platforms = images.select { |k, v| v.nil? }.keys.join(',') | |
skipped_emojis << [emoji[:name], code_to_emoji(code), platforms] | |
end | |
end | |
puts "\r\n" | |
skipped_emojis.each do |x| | |
puts "[!] Skipping `#{x[0]} #{x[1]}`, undefined platforms: #{x[2]}" | |
end | |
end | |
def build_emojis_list(url) | |
puts "Downloading remote emoji list..." | |
list = open(url).read | |
emojis = {} | |
keywords = JSON.parse(list).deep_merge(EMOJI_KEYWORDS_PATCH) | |
keywords.keys.each do |name| | |
keyword = keywords[name] | |
next unless char = keyword["char"].presence | |
code = codepoints_to_code(char.codepoints, keyword["fitzpatrick_scale"]) | |
emojis[code] ||= { | |
:name => name, | |
:fitzpatrick_scale => keyword["fitzpatrick_scale"] | |
} | |
if keyword["fitzpatrick_scale"] | |
emojis.merge!(generate_emoji_scales(name, code)) | |
end | |
end | |
emojis | |
end | |
def build_images_list(url, emojis) | |
puts "Downloading remote emoji images list..." | |
list = open(url).read | |
puts "Parsing remote emoji images list..." | |
images = {} | |
overwritten_emojis = [] | |
doc = Nokogiri::HTML(list) | |
table = doc.css("table")[0] | |
table.css("tr").each do |row| | |
cells = row.css("td") | |
# skip header and section rows | |
next if cells.size != 16 | |
code = cells[1].at_css("a")["name"] | |
cell_to_img = lambda { |cell| | |
return unless img = cell.at_css("img") | |
Base64.decode64(img["src"][/base64,(.+)$/, 1]) | |
} | |
images[code] = {} | |
PLATFORM_STYLES.keys.each do |platform| | |
default_cell_index = EMOJI_IMAGES_CELLS_INDEX[platform] | |
if emoji = emojis[code] | |
name = emoji[:name] | |
patch_index = EMOJI_IMAGES_CELLS_INDEX_PATCH.fetch(platform, {})[name] | |
if patch_index && cell_to_img.call(cells[default_cell_index]) | |
overwritten_emojis << [name, platform] | |
end | |
end | |
index = patch_index || default_cell_index | |
images[code][platform] = cell_to_img.call(cells[index]) | |
end | |
putc "." | |
end | |
puts "\r\n" | |
overwritten_emojis.each do |x| | |
puts "[!] Found existing image `#{x[0]}` for platform: #{x[1]}, might want to remove the patch." | |
end | |
images | |
end | |
def write_db_json(emojis) | |
puts "Writing #{EMOJI_DB_PATH}..." | |
confirm_overwrite(EMOJI_DB_PATH) | |
FileUtils.mkdir_p(File.expand_path("..", EMOJI_DB_PATH)) | |
# skin tones emojis shouldn’t appear in autocomplete | |
emojis_without_tones = emojis | |
.select { |code, _| !FITZPATRICK_SCALE.any? {|scale| code[scale] } } | |
.keys | |
.map { |code| | |
{ | |
"code" => code.tr("_", "-"), | |
"name" => emojis[code][:name] | |
} | |
} | |
emoji_with_tones = emojis | |
.select { |code, emoji| emoji[:fitzpatrick_scale] } | |
.keys | |
.map { |code| emojis[code][:name] } | |
db = { | |
"emojis" => emojis_without_tones, | |
"emojisWithTones" => emoji_with_tones, | |
"aliases" => EMOJI_ALIASES | |
} | |
File.write(EMOJI_DB_PATH, JSON.pretty_generate(db)) | |
end | |
def write_groups_js_es6(emojis) | |
puts "Writing #{EMOJI_GROUPS_PATH}..." | |
confirm_overwrite(EMOJI_GROUPS_PATH) | |
check_groups(emojis) | |
template = <<TEMPLATE | |
// This file is generated by emoji.rake do not modify directly | |
import { emojiExists } from 'pretty-text/emoji'; | |
// note that these categories are copied from Slack | |
// be careful, there are ~20 differences in synonyms, e.g. :boom: vs. :collision: | |
// a few Emoji are actually missing from the Slack categories as well (?), and were added | |
const groups = #{JSON.pretty_generate(EMOJI_GROUPS)}; | |
// scrub groups | |
groups.forEach(group => { | |
group.icons = group.icons.reject(obj => !emojiExists(obj)); | |
}); | |
export default groups; | |
TEMPLATE | |
FileUtils.mkdir_p(File.expand_path("..", EMOJI_GROUPS_PATH)) | |
File.write(EMOJI_GROUPS_PATH, template) | |
end | |
def check_groups(emojis) | |
grouped_emojis_names = EMOJI_GROUPS.map { |group| group["icons"] }.flatten | |
emojis.each do |code, emoji| | |
# we don’t group aliases | |
next if EMOJI_ALIASES.values.flatten.include?(emoji[:name]) | |
# we don’t want skined toned emojis to appear in groups | |
next if FITZPATRICK_SCALE.include?(code.split("_")[1]) | |
# we don’t need to categorize an already categorized aliased emoji | |
aliases = EMOJI_ALIASES[emoji[:name]] | |
next if aliases && grouped_emojis_names.any? { |name| aliases.include?(name) } | |
if !grouped_emojis_names.include?(emoji[:name]) | |
puts "[!] `#{emoji[:name]}` not found in any group, add it." | |
end | |
end | |
emojis_names = emojis | |
.map { |_, emoji| emoji[:name] } | |
.concat(EMOJI_ALIASES.values).flatten | |
grouped_emojis_names.each do |emoji_name| | |
PLATFORM_STYLES.each do |_, style| | |
path = File.join("public", "images", "emoji", style, "#{emoji_name}.png") | |
if File.exists?(path) && !File.size?(path) | |
puts "[!] `#{emoji_name}` is in a group but we didn't create it. Possible fix: remove it,add an alias or patch keywords list." | |
end | |
end | |
end | |
end | |
def write_emoji(path, image) | |
open(path, "wb") { |file| file << image } | |
`pngout #{path} -s0` if !ENV['EMOJI_TEST'] | |
putc "." | |
ensure | |
if File.exists?(path) && !File.size?(path) | |
raise "Failed to write emoji: #{path}" | |
end | |
end | |
def code_to_emoji(code) | |
code | |
.split("_") | |
.map { |e| e.to_i(16) } | |
.pack "U*" | |
end | |
def codepoints_to_code(codepoints, fitzpatrick_scale) | |
codepoints = codepoints | |
.map { |c| c.to_s(16).rjust(4, "0") } | |
.join("_") | |
.downcase | |
if !fitzpatrick_scale | |
codepoints.gsub!(/_#{VARIATION_SELECTOR}$/, "") | |
end | |
codepoints | |
end | |
def inject_scale_to_codes(codes, scale) | |
# some emojis were male only and got a male and woman variant while | |
# keeping the original, for those the rule is different (eg: golfing_woman) | |
if codes[1] == VARIATION_SELECTOR | |
codes[1] = scale | |
else | |
codes.insert(1, scale) | |
end | |
codes.join("_") | |
end | |
def generate_emoji_scales(name, code) | |
scaled_keywords = {} | |
FITZPATRICK_SCALE.each.with_index do |scale, index| | |
codes = code.split("_") | |
code_with_scale = inject_scale_to_codes(codes, scale) | |
scaled_keywords[code_with_scale] ||= { | |
:name => "#{name}/#{index + 2}", | |
:fitzpatrick_scale => false | |
} | |
end | |
scaled_keywords | |
end | |
def check_pngout | |
return if ENV['EMOJI_TEST'] | |
unless command?("pngout") | |
raise "Please make sure `pngout` is installed" | |
end | |
end | |
def command?(command) | |
system("which \"#{command}\" > /dev/null 2>&1") | |
end | |
def confirm_overwrite(path) | |
return if ENV['EMOJI_TEST'] | |
STDOUT.puts("[!] You are about to overwrite #{path}, are you sure? [CTRL+c] to cancel, [ENTER] to continue") | |
STDIN.gets.chomp | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment