From cb5c514d472daf9b312c963987f4d7ee865c28fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Wed, 29 Mar 2023 12:14:38 +0200 Subject: [PATCH 1/3] Import Emoji 15.0 characters --- Rakefile | 2 +- db/dump.rb | 4 +- db/emoji.json | 402 ++++++++++++++++++++++++++++------ vendor/unicode-emoji-test.txt | 125 +++++++---- 4 files changed, 415 insertions(+), 118 deletions(-) diff --git a/Rakefile b/Rakefile index 1d9f6424..2e6ee090 100644 --- a/Rakefile +++ b/Rakefile @@ -20,5 +20,5 @@ namespace :db do end file 'vendor/unicode-emoji-test.txt' do |t| - system 'curl', '-fsSL', 'http://unicode.org/Public/emoji/14.0/emoji-test.txt', '-o', t.name + system 'curl', '-fsSL', 'http://unicode.org/Public/emoji/15.0/emoji-test.txt', '-o', t.name end diff --git a/db/dump.rb b/db/dump.rb index dd81c246..e3735e4a 100644 --- a/db/dump.rb +++ b/db/dump.rb @@ -38,8 +38,8 @@ output_item.update( aliases: [I18n.transliterate(description).gsub(/\W+/, '_').downcase], tags: [], - unicode_version: "14.0", - ios_version: "15.4", + unicode_version: "15.0", + ios_version: "16.4", ) end output_item[:skin_tones] = true if emoji_item[:skin_tones] diff --git a/db/emoji.json b/db/emoji.json index 5cd0d266..ef224baa 100644 --- a/db/emoji.json +++ b/db/emoji.json @@ -640,6 +640,19 @@ , "unicode_version": "9.0" , "ios_version": "10.2" } +, { + "emoji": "๐Ÿซจ" + , "description": "shaking face" + , "category": "Smileys & Emotion" + , "aliases": [ + "shaking_face" + ] + , "tags": [ + "shock" + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐Ÿ˜Œ" , "description": "relieved face" @@ -1302,7 +1315,7 @@ } , { "emoji": "๐Ÿ˜ก" - , "description": "pouting face" + , "description": "enraged face" , "category": "Smileys & Emotion" , "aliases": [ "rage" @@ -1660,19 +1673,6 @@ , "unicode_version": "6.0" , "ios_version": "6.0" } -, { - "emoji": "๐Ÿ’‹" - , "description": "kiss mark" - , "category": "Smileys & Emotion" - , "aliases": [ - "kiss" - ] - , "tags": [ - "lipstick" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } , { "emoji": "๐Ÿ’Œ" , "description": "love letter" @@ -1847,6 +1847,18 @@ , "unicode_version": "" , "ios_version": "6.0" } +, { + "emoji": "๐Ÿฉท" + , "description": "pink heart" + , "category": "Smileys & Emotion" + , "aliases": [ + "pink_heart" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐Ÿงก" , "description": "orange heart" @@ -1895,6 +1907,18 @@ , "unicode_version": "6.0" , "ios_version": "6.0" } +, { + "emoji": "๐Ÿฉต" + , "description": "light blue heart" + , "category": "Smileys & Emotion" + , "aliases": [ + "light_blue_heart" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐Ÿ’œ" , "description": "purple heart" @@ -1931,6 +1955,18 @@ , "unicode_version": "9.0" , "ios_version": "10.2" } +, { + "emoji": "๐Ÿฉถ" + , "description": "grey heart" + , "category": "Smileys & Emotion" + , "aliases": [ + "grey_heart" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐Ÿค" , "description": "white heart" @@ -1943,6 +1979,19 @@ , "unicode_version": "12.0" , "ios_version": "13.0" } +, { + "emoji": "๐Ÿ’‹" + , "description": "kiss mark" + , "category": "Smileys & Emotion" + , "aliases": [ + "kiss" + ] + , "tags": [ + "lipstick" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } , { "emoji": "๐Ÿ’ฏ" , "description": "hundred points" @@ -2038,19 +2087,6 @@ , "unicode_version": "7.0" , "ios_version": "9.1" } -, { - "emoji": "๐Ÿ’ฃ" - , "description": "bomb" - , "category": "Smileys & Emotion" - , "aliases": [ - "bomb" - ] - , "tags": [ - "boom" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } , { "emoji": "๐Ÿ’ฌ" , "description": "speech balloon" @@ -2115,7 +2151,7 @@ } , { "emoji": "๐Ÿ’ค" - , "description": "zzz" + , "description": "ZZZ" , "category": "Smileys & Emotion" , "aliases": [ "zzz" @@ -2249,6 +2285,32 @@ , "ios_version": "15.4" , "skin_tones": true } +, { + "emoji": "๐Ÿซท" + , "description": "leftwards pushing hand" + , "category": "People & Body" + , "aliases": [ + "leftwards_pushing_hand" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + , "skin_tones": true + } +, { + "emoji": "๐Ÿซธ" + , "description": "rightwards pushing hand" + , "category": "People & Body" + , "aliases": [ + "rightwards_pushing_hand" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + , "skin_tones": true + } , { "emoji": "๐Ÿ‘Œ" , "description": "OK hand" @@ -7190,6 +7252,32 @@ , "unicode_version": "6.0" , "ios_version": "6.0" } +, { + "emoji": "๐ŸซŽ" + , "description": "moose" + , "category": "Animals & Nature" + , "aliases": [ + "moose" + ] + , "tags": [ + "canada" + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } +, { + "emoji": "๐Ÿซ" + , "description": "donkey" + , "category": "Animals & Nature" + , "aliases": [ + "donkey" + ] + , "tags": [ + "mule" + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐ŸŽ" , "description": "horse" @@ -7941,6 +8029,44 @@ , "unicode_version": "11.0" , "ios_version": "12.1" } +, { + "emoji": "๐Ÿชฝ" + , "description": "wing" + , "category": "Animals & Nature" + , "aliases": [ + "wing" + ] + , "tags": [ + "fly" + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } +, { + "emoji": "๐Ÿฆโ€โฌ›" + , "description": "black bird" + , "category": "Animals & Nature" + , "aliases": [ + "black_bird" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } +, { + "emoji": "๐Ÿชฟ" + , "description": "goose" + , "category": "Animals & Nature" + , "aliases": [ + "goose" + ] + , "tags": [ + "honk" + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐Ÿธ" , "description": "frog" @@ -8188,6 +8314,18 @@ , "unicode_version": "14.0" , "ios_version": "15.4" } +, { + "emoji": "๐Ÿชผ" + , "description": "jellyfish" + , "category": "Animals & Nature" + , "aliases": [ + "jellyfish" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐ŸŒ" , "description": "snail" @@ -8521,6 +8659,18 @@ , "unicode_version": "6.0" , "ios_version": "6.0" } +, { + "emoji": "๐Ÿชป" + , "description": "hyacinth" + , "category": "Animals & Nature" + , "aliases": [ + "hyacinth" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐ŸŒฑ" , "description": "seedling" @@ -8708,6 +8858,19 @@ , "unicode_version": "14.0" , "ios_version": "15.4" } +, { + "emoji": "๐Ÿ„" + , "description": "mushroom" + , "category": "Animals & Nature" + , "aliases": [ + "mushroom" + ] + , "tags": [ + "fungus" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } , { "emoji": "๐Ÿ‡" , "description": "grapes" @@ -9088,18 +9251,6 @@ , "unicode_version": "12.0" , "ios_version": "13.0" } -, { - "emoji": "๐Ÿ„" - , "description": "mushroom" - , "category": "Food & Drink" - , "aliases": [ - "mushroom" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } , { "emoji": "๐Ÿฅœ" , "description": "peanuts" @@ -9136,6 +9287,30 @@ , "unicode_version": "6.0" , "ios_version": "6.0" } +, { + "emoji": "๐Ÿซš" + , "description": "ginger root" + , "category": "Food & Drink" + , "aliases": [ + "ginger_root" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } +, { + "emoji": "๐Ÿซ›" + , "description": "pea pod" + , "category": "Food & Drink" + , "aliases": [ + "pea_pod" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐Ÿž" , "description": "bread" @@ -13727,6 +13902,20 @@ , "unicode_version": "12.0" , "ios_version": "13.0" } +, { + "emoji": "๐Ÿ”ซ" + , "description": "water pistol" + , "category": "Activities" + , "aliases": [ + "gun" + ] + , "tags": [ + "shoot" + , "weapon" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } , { "emoji": "๐ŸŽฑ" , "description": "pool 8 ball" @@ -13766,30 +13955,6 @@ , "unicode_version": "13.0" , "ios_version": "14.0" } -, { - "emoji": "๐Ÿงฟ" - , "description": "nazar amulet" - , "category": "Activities" - , "aliases": [ - "nazar_amulet" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "๐Ÿชฌ" - , "description": "hamsa" - , "category": "Activities" - , "aliases": [ - "hamsa" - ] - , "tags": [ - ] - , "unicode_version": "14.0" - , "ios_version": "15.4" - } , { "emoji": "๐ŸŽฎ" , "description": "video game" @@ -14335,6 +14500,19 @@ , "unicode_version": "6.0" , "ios_version": "6.0" } +, { + "emoji": "๐Ÿชญ" + , "description": "folding hand fan" + , "category": "Objects" + , "aliases": [ + "folding_hand_fan" + ] + , "tags": [ + "sensu" + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐Ÿ‘›" , "description": "purse" @@ -14512,6 +14690,18 @@ , "unicode_version": "6.0" , "ios_version": "6.0" } +, { + "emoji": "๐Ÿชฎ" + , "description": "hair pick" + , "category": "Objects" + , "aliases": [ + "hair_pick" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐Ÿ‘‘" , "description": "crown" @@ -14999,6 +15189,32 @@ , "unicode_version": "13.0" , "ios_version": "14.0" } +, { + "emoji": "๐Ÿช‡" + , "description": "maracas" + , "category": "Objects" + , "aliases": [ + "maracas" + ] + , "tags": [ + "shaker" + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } +, { + "emoji": "๐Ÿชˆ" + , "description": "flute" + , "category": "Objects" + , "aliases": [ + "flute" + ] + , "tags": [ + "recorder" + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐Ÿ“ฑ" , "description": "mobile phone" @@ -16490,15 +16706,14 @@ , "ios_version": "9.1" } , { - "emoji": "๐Ÿ”ซ" - , "description": "water pistol" + "emoji": "๐Ÿ’ฃ" + , "description": "bomb" , "category": "Objects" , "aliases": [ - "gun" + "bomb" ] , "tags": [ - "shoot" - , "weapon" + "boom" ] , "unicode_version": "6.0" , "ios_version": "6.0" @@ -17239,6 +17454,30 @@ , "unicode_version": "4.1" , "ios_version": "9.1" } +, { + "emoji": "๐Ÿงฟ" + , "description": "nazar amulet" + , "category": "Objects" + , "aliases": [ + "nazar_amulet" + ] + , "tags": [ + ] + , "unicode_version": "11.0" + , "ios_version": "12.1" + } +, { + "emoji": "๐Ÿชฌ" + , "description": "hamsa" + , "category": "Objects" + , "aliases": [ + "hamsa" + ] + , "tags": [ + ] + , "unicode_version": "14.0" + , "ios_version": "15.4" + } , { "emoji": "๐Ÿ—ฟ" , "description": "moai" @@ -17995,6 +18234,18 @@ , "unicode_version": "6.0" , "ios_version": "6.0" } +, { + "emoji": "๐Ÿชฏ" + , "description": "khanda" + , "category": "Symbols" + , "aliases": [ + "khanda" + ] + , "tags": [ + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "โ™ˆ" , "description": "Aries" @@ -18420,6 +18671,19 @@ , "unicode_version": "6.0" , "ios_version": "6.0" } +, { + "emoji": "๐Ÿ›œ" + , "description": "wireless" + , "category": "Symbols" + , "aliases": [ + "wireless" + ] + , "tags": [ + "wifi" + ] + , "unicode_version": "15.0" + , "ios_version": "16.4" + } , { "emoji": "๐Ÿ“ณ" , "description": "vibration mode" diff --git a/vendor/unicode-emoji-test.txt b/vendor/unicode-emoji-test.txt index dd549336..87d093d6 100644 --- a/vendor/unicode-emoji-test.txt +++ b/vendor/unicode-emoji-test.txt @@ -1,13 +1,13 @@ # emoji-test.txt -# Date: 2021-08-26, 17:22:23 GMT -# ยฉ 2021 Unicodeยฎ, Inc. +# Date: 2022-08-12, 20:24:39 GMT +# ยฉ 2022 Unicodeยฎ, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Emoji Keyboard/Display Test Data for UTS #51 -# Version: 14.0 +# Version: 15.0 # -# For documentation and usage, see http://www.unicode.org/reports/tr51 +# For documentation and usage, see https://www.unicode.org/reports/tr51 # # This file provides data for testing which emoji forms should be in keyboards and which should also be displayed/processed. # Format: code points; status # emoji name @@ -92,6 +92,7 @@ 1F62C ; fully-qualified # ๐Ÿ˜ฌ E1.0 grimacing face 1F62E 200D 1F4A8 ; fully-qualified # ๐Ÿ˜ฎโ€๐Ÿ’จ E13.1 face exhaling 1F925 ; fully-qualified # ๐Ÿคฅ E3.0 lying face +1FAE8 ; fully-qualified # ๐Ÿซจ E15.0 shaking face # subgroup: face-sleepy 1F60C ; fully-qualified # ๐Ÿ˜Œ E0.6 relieved face @@ -155,7 +156,7 @@ # subgroup: face-negative 1F624 ; fully-qualified # ๐Ÿ˜ค E0.6 face with steam from nose -1F621 ; fully-qualified # ๐Ÿ˜ก E0.6 pouting face +1F621 ; fully-qualified # ๐Ÿ˜ก E0.6 enraged face 1F620 ; fully-qualified # ๐Ÿ˜  E0.6 angry face 1F92C ; fully-qualified # ๐Ÿคฌ E5.0 face with symbols on mouth 1F608 ; fully-qualified # ๐Ÿ˜ˆ E1.0 smiling face with horns @@ -190,8 +191,7 @@ 1F649 ; fully-qualified # ๐Ÿ™‰ E0.6 hear-no-evil monkey 1F64A ; fully-qualified # ๐Ÿ™Š E0.6 speak-no-evil monkey -# subgroup: emotion -1F48B ; fully-qualified # ๐Ÿ’‹ E0.6 kiss mark +# subgroup: heart 1F48C ; fully-qualified # ๐Ÿ’Œ E0.6 love letter 1F498 ; fully-qualified # ๐Ÿ’˜ E0.6 heart with arrow 1F49D ; fully-qualified # ๐Ÿ’ E0.6 heart with ribbon @@ -210,14 +210,20 @@ 2764 200D 1FA79 ; unqualified # โคโ€๐Ÿฉน E13.1 mending heart 2764 FE0F ; fully-qualified # โค๏ธ E0.6 red heart 2764 ; unqualified # โค E0.6 red heart +1FA77 ; fully-qualified # ๐Ÿฉท E15.0 pink heart 1F9E1 ; fully-qualified # ๐Ÿงก E5.0 orange heart 1F49B ; fully-qualified # ๐Ÿ’› E0.6 yellow heart 1F49A ; fully-qualified # ๐Ÿ’š E0.6 green heart 1F499 ; fully-qualified # ๐Ÿ’™ E0.6 blue heart +1FA75 ; fully-qualified # ๐Ÿฉต E15.0 light blue heart 1F49C ; fully-qualified # ๐Ÿ’œ E0.6 purple heart 1F90E ; fully-qualified # ๐ŸคŽ E12.0 brown heart 1F5A4 ; fully-qualified # ๐Ÿ–ค E3.0 black heart +1FA76 ; fully-qualified # ๐Ÿฉถ E15.0 grey heart 1F90D ; fully-qualified # ๐Ÿค E12.0 white heart + +# subgroup: emotion +1F48B ; fully-qualified # ๐Ÿ’‹ E0.6 kiss mark 1F4AF ; fully-qualified # ๐Ÿ’ฏ E0.6 hundred points 1F4A2 ; fully-qualified # ๐Ÿ’ข E0.6 anger symbol 1F4A5 ; fully-qualified # ๐Ÿ’ฅ E0.6 collision @@ -226,21 +232,20 @@ 1F4A8 ; fully-qualified # ๐Ÿ’จ E0.6 dashing away 1F573 FE0F ; fully-qualified # ๐Ÿ•ณ๏ธ E0.7 hole 1F573 ; unqualified # ๐Ÿ•ณ E0.7 hole -1F4A3 ; fully-qualified # ๐Ÿ’ฃ E0.6 bomb 1F4AC ; fully-qualified # ๐Ÿ’ฌ E0.6 speech balloon 1F441 FE0F 200D 1F5E8 FE0F ; fully-qualified # ๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ E2.0 eye in speech bubble 1F441 200D 1F5E8 FE0F ; unqualified # ๐Ÿ‘โ€๐Ÿ—จ๏ธ E2.0 eye in speech bubble -1F441 FE0F 200D 1F5E8 ; unqualified # ๐Ÿ‘๏ธโ€๐Ÿ—จ E2.0 eye in speech bubble +1F441 FE0F 200D 1F5E8 ; minimally-qualified # ๐Ÿ‘๏ธโ€๐Ÿ—จ E2.0 eye in speech bubble 1F441 200D 1F5E8 ; unqualified # ๐Ÿ‘โ€๐Ÿ—จ E2.0 eye in speech bubble 1F5E8 FE0F ; fully-qualified # ๐Ÿ—จ๏ธ E2.0 left speech bubble 1F5E8 ; unqualified # ๐Ÿ—จ E2.0 left speech bubble 1F5EF FE0F ; fully-qualified # ๐Ÿ—ฏ๏ธ E0.7 right anger bubble 1F5EF ; unqualified # ๐Ÿ—ฏ E0.7 right anger bubble 1F4AD ; fully-qualified # ๐Ÿ’ญ E1.0 thought balloon -1F4A4 ; fully-qualified # ๐Ÿ’ค E0.6 zzz +1F4A4 ; fully-qualified # ๐Ÿ’ค E0.6 ZZZ -# Smileys & Emotion subtotal: 177 -# Smileys & Emotion subtotal: 177 w/o modifiers +# Smileys & Emotion subtotal: 180 +# Smileys & Emotion subtotal: 180 w/o modifiers # group: People & Body @@ -300,6 +305,18 @@ 1FAF4 1F3FD ; fully-qualified # ๐Ÿซด๐Ÿฝ E14.0 palm up hand: medium skin tone 1FAF4 1F3FE ; fully-qualified # ๐Ÿซด๐Ÿพ E14.0 palm up hand: medium-dark skin tone 1FAF4 1F3FF ; fully-qualified # ๐Ÿซด๐Ÿฟ E14.0 palm up hand: dark skin tone +1FAF7 ; fully-qualified # ๐Ÿซท E15.0 leftwards pushing hand +1FAF7 1F3FB ; fully-qualified # ๐Ÿซท๐Ÿป E15.0 leftwards pushing hand: light skin tone +1FAF7 1F3FC ; fully-qualified # ๐Ÿซท๐Ÿผ E15.0 leftwards pushing hand: medium-light skin tone +1FAF7 1F3FD ; fully-qualified # ๐Ÿซท๐Ÿฝ E15.0 leftwards pushing hand: medium skin tone +1FAF7 1F3FE ; fully-qualified # ๐Ÿซท๐Ÿพ E15.0 leftwards pushing hand: medium-dark skin tone +1FAF7 1F3FF ; fully-qualified # ๐Ÿซท๐Ÿฟ E15.0 leftwards pushing hand: dark skin tone +1FAF8 ; fully-qualified # ๐Ÿซธ E15.0 rightwards pushing hand +1FAF8 1F3FB ; fully-qualified # ๐Ÿซธ๐Ÿป E15.0 rightwards pushing hand: light skin tone +1FAF8 1F3FC ; fully-qualified # ๐Ÿซธ๐Ÿผ E15.0 rightwards pushing hand: medium-light skin tone +1FAF8 1F3FD ; fully-qualified # ๐Ÿซธ๐Ÿฝ E15.0 rightwards pushing hand: medium skin tone +1FAF8 1F3FE ; fully-qualified # ๐Ÿซธ๐Ÿพ E15.0 rightwards pushing hand: medium-dark skin tone +1FAF8 1F3FF ; fully-qualified # ๐Ÿซธ๐Ÿฟ E15.0 rightwards pushing hand: dark skin tone # subgroup: hand-fingers-partial 1F44C ; fully-qualified # ๐Ÿ‘Œ E0.6 OK hand @@ -473,11 +490,11 @@ 1F932 1F3FE ; fully-qualified # ๐Ÿคฒ๐Ÿพ E5.0 palms up together: medium-dark skin tone 1F932 1F3FF ; fully-qualified # ๐Ÿคฒ๐Ÿฟ E5.0 palms up together: dark skin tone 1F91D ; fully-qualified # ๐Ÿค E3.0 handshake -1F91D 1F3FB ; fully-qualified # ๐Ÿค๐Ÿป E3.0 handshake: light skin tone -1F91D 1F3FC ; fully-qualified # ๐Ÿค๐Ÿผ E3.0 handshake: medium-light skin tone -1F91D 1F3FD ; fully-qualified # ๐Ÿค๐Ÿฝ E3.0 handshake: medium skin tone -1F91D 1F3FE ; fully-qualified # ๐Ÿค๐Ÿพ E3.0 handshake: medium-dark skin tone -1F91D 1F3FF ; fully-qualified # ๐Ÿค๐Ÿฟ E3.0 handshake: dark skin tone +1F91D 1F3FB ; fully-qualified # ๐Ÿค๐Ÿป E14.0 handshake: light skin tone +1F91D 1F3FC ; fully-qualified # ๐Ÿค๐Ÿผ E14.0 handshake: medium-light skin tone +1F91D 1F3FD ; fully-qualified # ๐Ÿค๐Ÿฝ E14.0 handshake: medium skin tone +1F91D 1F3FE ; fully-qualified # ๐Ÿค๐Ÿพ E14.0 handshake: medium-dark skin tone +1F91D 1F3FF ; fully-qualified # ๐Ÿค๐Ÿฟ E14.0 handshake: dark skin tone 1FAF1 1F3FB 200D 1FAF2 1F3FC ; fully-qualified # ๐Ÿซฑ๐Ÿปโ€๐Ÿซฒ๐Ÿผ E14.0 handshake: light skin tone, medium-light skin tone 1FAF1 1F3FB 200D 1FAF2 1F3FD ; fully-qualified # ๐Ÿซฑ๐Ÿปโ€๐Ÿซฒ๐Ÿฝ E14.0 handshake: light skin tone, medium skin tone 1FAF1 1F3FB 200D 1FAF2 1F3FE ; fully-qualified # ๐Ÿซฑ๐Ÿปโ€๐Ÿซฒ๐Ÿพ E14.0 handshake: light skin tone, medium-dark skin tone @@ -1455,7 +1472,7 @@ 1F575 1F3FF ; fully-qualified # ๐Ÿ•ต๐Ÿฟ E2.0 detective: dark skin tone 1F575 FE0F 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๏ธโ€โ™‚๏ธ E4.0 man detective 1F575 200D 2642 FE0F ; unqualified # ๐Ÿ•ตโ€โ™‚๏ธ E4.0 man detective -1F575 FE0F 200D 2642 ; unqualified # ๐Ÿ•ต๏ธโ€โ™‚ E4.0 man detective +1F575 FE0F 200D 2642 ; minimally-qualified # ๐Ÿ•ต๏ธโ€โ™‚ E4.0 man detective 1F575 200D 2642 ; unqualified # ๐Ÿ•ตโ€โ™‚ E4.0 man detective 1F575 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿปโ€โ™‚๏ธ E4.0 man detective: light skin tone 1F575 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ•ต๐Ÿปโ€โ™‚ E4.0 man detective: light skin tone @@ -1469,7 +1486,7 @@ 1F575 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ•ต๐Ÿฟโ€โ™‚ E4.0 man detective: dark skin tone 1F575 FE0F 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๏ธโ€โ™€๏ธ E4.0 woman detective 1F575 200D 2640 FE0F ; unqualified # ๐Ÿ•ตโ€โ™€๏ธ E4.0 woman detective -1F575 FE0F 200D 2640 ; unqualified # ๐Ÿ•ต๏ธโ€โ™€ E4.0 woman detective +1F575 FE0F 200D 2640 ; minimally-qualified # ๐Ÿ•ต๏ธโ€โ™€ E4.0 woman detective 1F575 200D 2640 ; unqualified # ๐Ÿ•ตโ€โ™€ E4.0 woman detective 1F575 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿปโ€โ™€๏ธ E4.0 woman detective: light skin tone 1F575 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ•ต๐Ÿปโ€โ™€ E4.0 woman detective: light skin tone @@ -2302,7 +2319,7 @@ 1F3CC 1F3FF ; fully-qualified # ๐ŸŒ๐Ÿฟ E4.0 person golfing: dark skin tone 1F3CC FE0F 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๏ธโ€โ™‚๏ธ E4.0 man golfing 1F3CC 200D 2642 FE0F ; unqualified # ๐ŸŒโ€โ™‚๏ธ E4.0 man golfing -1F3CC FE0F 200D 2642 ; unqualified # ๐ŸŒ๏ธโ€โ™‚ E4.0 man golfing +1F3CC FE0F 200D 2642 ; minimally-qualified # ๐ŸŒ๏ธโ€โ™‚ E4.0 man golfing 1F3CC 200D 2642 ; unqualified # ๐ŸŒโ€โ™‚ E4.0 man golfing 1F3CC 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๐Ÿปโ€โ™‚๏ธ E4.0 man golfing: light skin tone 1F3CC 1F3FB 200D 2642 ; minimally-qualified # ๐ŸŒ๐Ÿปโ€โ™‚ E4.0 man golfing: light skin tone @@ -2316,7 +2333,7 @@ 1F3CC 1F3FF 200D 2642 ; minimally-qualified # ๐ŸŒ๐Ÿฟโ€โ™‚ E4.0 man golfing: dark skin tone 1F3CC FE0F 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๏ธโ€โ™€๏ธ E4.0 woman golfing 1F3CC 200D 2640 FE0F ; unqualified # ๐ŸŒโ€โ™€๏ธ E4.0 woman golfing -1F3CC FE0F 200D 2640 ; unqualified # ๐ŸŒ๏ธโ€โ™€ E4.0 woman golfing +1F3CC FE0F 200D 2640 ; minimally-qualified # ๐ŸŒ๏ธโ€โ™€ E4.0 woman golfing 1F3CC 200D 2640 ; unqualified # ๐ŸŒโ€โ™€ E4.0 woman golfing 1F3CC 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๐Ÿปโ€โ™€๏ธ E4.0 woman golfing: light skin tone 1F3CC 1F3FB 200D 2640 ; minimally-qualified # ๐ŸŒ๐Ÿปโ€โ™€ E4.0 woman golfing: light skin tone @@ -2427,7 +2444,7 @@ 26F9 1F3FF ; fully-qualified # โ›น๐Ÿฟ E2.0 person bouncing ball: dark skin tone 26F9 FE0F 200D 2642 FE0F ; fully-qualified # โ›น๏ธโ€โ™‚๏ธ E4.0 man bouncing ball 26F9 200D 2642 FE0F ; unqualified # โ›นโ€โ™‚๏ธ E4.0 man bouncing ball -26F9 FE0F 200D 2642 ; unqualified # โ›น๏ธโ€โ™‚ E4.0 man bouncing ball +26F9 FE0F 200D 2642 ; minimally-qualified # โ›น๏ธโ€โ™‚ E4.0 man bouncing ball 26F9 200D 2642 ; unqualified # โ›นโ€โ™‚ E4.0 man bouncing ball 26F9 1F3FB 200D 2642 FE0F ; fully-qualified # โ›น๐Ÿปโ€โ™‚๏ธ E4.0 man bouncing ball: light skin tone 26F9 1F3FB 200D 2642 ; minimally-qualified # โ›น๐Ÿปโ€โ™‚ E4.0 man bouncing ball: light skin tone @@ -2441,7 +2458,7 @@ 26F9 1F3FF 200D 2642 ; minimally-qualified # โ›น๐Ÿฟโ€โ™‚ E4.0 man bouncing ball: dark skin tone 26F9 FE0F 200D 2640 FE0F ; fully-qualified # โ›น๏ธโ€โ™€๏ธ E4.0 woman bouncing ball 26F9 200D 2640 FE0F ; unqualified # โ›นโ€โ™€๏ธ E4.0 woman bouncing ball -26F9 FE0F 200D 2640 ; unqualified # โ›น๏ธโ€โ™€ E4.0 woman bouncing ball +26F9 FE0F 200D 2640 ; minimally-qualified # โ›น๏ธโ€โ™€ E4.0 woman bouncing ball 26F9 200D 2640 ; unqualified # โ›นโ€โ™€ E4.0 woman bouncing ball 26F9 1F3FB 200D 2640 FE0F ; fully-qualified # โ›น๐Ÿปโ€โ™€๏ธ E4.0 woman bouncing ball: light skin tone 26F9 1F3FB 200D 2640 ; minimally-qualified # โ›น๐Ÿปโ€โ™€ E4.0 woman bouncing ball: light skin tone @@ -2462,7 +2479,7 @@ 1F3CB 1F3FF ; fully-qualified # ๐Ÿ‹๐Ÿฟ E2.0 person lifting weights: dark skin tone 1F3CB FE0F 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๏ธโ€โ™‚๏ธ E4.0 man lifting weights 1F3CB 200D 2642 FE0F ; unqualified # ๐Ÿ‹โ€โ™‚๏ธ E4.0 man lifting weights -1F3CB FE0F 200D 2642 ; unqualified # ๐Ÿ‹๏ธโ€โ™‚ E4.0 man lifting weights +1F3CB FE0F 200D 2642 ; minimally-qualified # ๐Ÿ‹๏ธโ€โ™‚ E4.0 man lifting weights 1F3CB 200D 2642 ; unqualified # ๐Ÿ‹โ€โ™‚ E4.0 man lifting weights 1F3CB 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿปโ€โ™‚๏ธ E4.0 man lifting weights: light skin tone 1F3CB 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ‹๐Ÿปโ€โ™‚ E4.0 man lifting weights: light skin tone @@ -2476,7 +2493,7 @@ 1F3CB 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ‹๐Ÿฟโ€โ™‚ E4.0 man lifting weights: dark skin tone 1F3CB FE0F 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๏ธโ€โ™€๏ธ E4.0 woman lifting weights 1F3CB 200D 2640 FE0F ; unqualified # ๐Ÿ‹โ€โ™€๏ธ E4.0 woman lifting weights -1F3CB FE0F 200D 2640 ; unqualified # ๐Ÿ‹๏ธโ€โ™€ E4.0 woman lifting weights +1F3CB FE0F 200D 2640 ; minimally-qualified # ๐Ÿ‹๏ธโ€โ™€ E4.0 woman lifting weights 1F3CB 200D 2640 ; unqualified # ๐Ÿ‹โ€โ™€ E4.0 woman lifting weights 1F3CB 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿปโ€โ™€๏ธ E4.0 woman lifting weights: light skin tone 1F3CB 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ‹๐Ÿปโ€โ™€ E4.0 woman lifting weights: light skin tone @@ -3262,8 +3279,8 @@ 1FAC2 ; fully-qualified # ๐Ÿซ‚ E13.0 people hugging 1F463 ; fully-qualified # ๐Ÿ‘ฃ E0.6 footprints -# People & Body subtotal: 2986 -# People & Body subtotal: 506 w/o modifiers +# People & Body subtotal: 2998 +# People & Body subtotal: 508 w/o modifiers # group: Component @@ -3306,6 +3323,8 @@ 1F405 ; fully-qualified # ๐Ÿ… E1.0 tiger 1F406 ; fully-qualified # ๐Ÿ† E1.0 leopard 1F434 ; fully-qualified # ๐Ÿด E0.6 horse face +1FACE ; fully-qualified # ๐ŸซŽ E15.0 moose +1FACF ; fully-qualified # ๐Ÿซ E15.0 donkey 1F40E ; fully-qualified # ๐ŸŽ E0.6 horse 1F984 ; fully-qualified # ๐Ÿฆ„ E1.0 unicorn 1F993 ; fully-qualified # ๐Ÿฆ“ E5.0 zebra @@ -3373,6 +3392,9 @@ 1F9A9 ; fully-qualified # ๐Ÿฆฉ E12.0 flamingo 1F99A ; fully-qualified # ๐Ÿฆš E11.0 peacock 1F99C ; fully-qualified # ๐Ÿฆœ E11.0 parrot +1FABD ; fully-qualified # ๐Ÿชฝ E15.0 wing +1F426 200D 2B1B ; fully-qualified # ๐Ÿฆโ€โฌ› E15.0 black bird +1FABF ; fully-qualified # ๐Ÿชฟ E15.0 goose # subgroup: animal-amphibian 1F438 ; fully-qualified # ๐Ÿธ E0.6 frog @@ -3399,6 +3421,7 @@ 1F419 ; fully-qualified # ๐Ÿ™ E0.6 octopus 1F41A ; fully-qualified # ๐Ÿš E0.6 spiral shell 1FAB8 ; fully-qualified # ๐Ÿชธ E14.0 coral +1FABC ; fully-qualified # ๐Ÿชผ E15.0 jellyfish # subgroup: animal-bug 1F40C ; fully-qualified # ๐ŸŒ E0.6 snail @@ -3433,6 +3456,7 @@ 1F33B ; fully-qualified # ๐ŸŒป E0.6 sunflower 1F33C ; fully-qualified # ๐ŸŒผ E0.6 blossom 1F337 ; fully-qualified # ๐ŸŒท E0.6 tulip +1FABB ; fully-qualified # ๐Ÿชป E15.0 hyacinth # subgroup: plant-other 1F331 ; fully-qualified # ๐ŸŒฑ E0.6 seedling @@ -3451,9 +3475,10 @@ 1F343 ; fully-qualified # ๐Ÿƒ E0.6 leaf fluttering in wind 1FAB9 ; fully-qualified # ๐Ÿชน E14.0 empty nest 1FABA ; fully-qualified # ๐Ÿชบ E14.0 nest with eggs +1F344 ; fully-qualified # ๐Ÿ„ E0.6 mushroom -# Animals & Nature subtotal: 151 -# Animals & Nature subtotal: 151 w/o modifiers +# Animals & Nature subtotal: 159 +# Animals & Nature subtotal: 159 w/o modifiers # group: Food & Drink @@ -3492,10 +3517,11 @@ 1F966 ; fully-qualified # ๐Ÿฅฆ E5.0 broccoli 1F9C4 ; fully-qualified # ๐Ÿง„ E12.0 garlic 1F9C5 ; fully-qualified # ๐Ÿง… E12.0 onion -1F344 ; fully-qualified # ๐Ÿ„ E0.6 mushroom 1F95C ; fully-qualified # ๐Ÿฅœ E3.0 peanuts 1FAD8 ; fully-qualified # ๐Ÿซ˜ E14.0 beans 1F330 ; fully-qualified # ๐ŸŒฐ E0.6 chestnut +1FADA ; fully-qualified # ๐Ÿซš E15.0 ginger root +1FADB ; fully-qualified # ๐Ÿซ› E15.0 pea pod # subgroup: food-prepared 1F35E ; fully-qualified # ๐Ÿž E0.6 bread @@ -3607,8 +3633,8 @@ 1FAD9 ; fully-qualified # ๐Ÿซ™ E14.0 jar 1F3FA ; fully-qualified # ๐Ÿบ E1.0 amphora -# Food & Drink subtotal: 134 -# Food & Drink subtotal: 134 w/o modifiers +# Food & Drink subtotal: 135 +# Food & Drink subtotal: 135 w/o modifiers # group: Travel & Places @@ -3974,11 +4000,10 @@ 1F3AF ; fully-qualified # ๐ŸŽฏ E0.6 bullseye 1FA80 ; fully-qualified # ๐Ÿช€ E12.0 yo-yo 1FA81 ; fully-qualified # ๐Ÿช E12.0 kite +1F52B ; fully-qualified # ๐Ÿ”ซ E0.6 water pistol 1F3B1 ; fully-qualified # ๐ŸŽฑ E0.6 pool 8 ball 1F52E ; fully-qualified # ๐Ÿ”ฎ E0.6 crystal ball 1FA84 ; fully-qualified # ๐Ÿช„ E13.0 magic wand -1F9FF ; fully-qualified # ๐Ÿงฟ E11.0 nazar amulet -1FAAC ; fully-qualified # ๐Ÿชฌ E14.0 hamsa 1F3AE ; fully-qualified # ๐ŸŽฎ E0.6 video game 1F579 FE0F ; fully-qualified # ๐Ÿ•น๏ธ E0.7 joystick 1F579 ; unqualified # ๐Ÿ•น E0.7 joystick @@ -4013,8 +4038,8 @@ 1F9F6 ; fully-qualified # ๐Ÿงถ E11.0 yarn 1FAA2 ; fully-qualified # ๐Ÿชข E13.0 knot -# Activities subtotal: 97 -# Activities subtotal: 97 w/o modifiers +# Activities subtotal: 96 +# Activities subtotal: 96 w/o modifiers # group: Objects @@ -4040,6 +4065,7 @@ 1FA73 ; fully-qualified # ๐Ÿฉณ E12.0 shorts 1F459 ; fully-qualified # ๐Ÿ‘™ E0.6 bikini 1F45A ; fully-qualified # ๐Ÿ‘š E0.6 womanโ€™s clothes +1FAAD ; fully-qualified # ๐Ÿชญ E15.0 folding hand fan 1F45B ; fully-qualified # ๐Ÿ‘› E0.6 purse 1F45C ; fully-qualified # ๐Ÿ‘œ E0.6 handbag 1F45D ; fully-qualified # ๐Ÿ‘ E0.6 clutch bag @@ -4055,6 +4081,7 @@ 1F461 ; fully-qualified # ๐Ÿ‘ก E0.6 womanโ€™s sandal 1FA70 ; fully-qualified # ๐Ÿฉฐ E12.0 ballet shoes 1F462 ; fully-qualified # ๐Ÿ‘ข E0.6 womanโ€™s boot +1FAAE ; fully-qualified # ๐Ÿชฎ E15.0 hair pick 1F451 ; fully-qualified # ๐Ÿ‘‘ E0.6 crown 1F452 ; fully-qualified # ๐Ÿ‘’ E0.6 womanโ€™s hat 1F3A9 ; fully-qualified # ๐ŸŽฉ E0.6 top hat @@ -4103,6 +4130,8 @@ 1FA95 ; fully-qualified # ๐Ÿช• E12.0 banjo 1F941 ; fully-qualified # ๐Ÿฅ E3.0 drum 1FA98 ; fully-qualified # ๐Ÿช˜ E13.0 long drum +1FA87 ; fully-qualified # ๐Ÿช‡ E15.0 maracas +1FA88 ; fully-qualified # ๐Ÿชˆ E15.0 flute # subgroup: phone 1F4F1 ; fully-qualified # ๐Ÿ“ฑ E0.6 mobile phone @@ -4275,7 +4304,7 @@ 1F5E1 ; unqualified # ๐Ÿ—ก E0.7 dagger 2694 FE0F ; fully-qualified # โš”๏ธ E1.0 crossed swords 2694 ; unqualified # โš” E1.0 crossed swords -1F52B ; fully-qualified # ๐Ÿ”ซ E0.6 water pistol +1F4A3 ; fully-qualified # ๐Ÿ’ฃ E0.6 bomb 1FA83 ; fully-qualified # ๐Ÿชƒ E13.0 boomerang 1F3F9 ; fully-qualified # ๐Ÿน E1.0 bow and arrow 1F6E1 FE0F ; fully-qualified # ๐Ÿ›ก๏ธ E0.7 shield @@ -4354,12 +4383,14 @@ 1FAA6 ; fully-qualified # ๐Ÿชฆ E13.0 headstone 26B1 FE0F ; fully-qualified # โšฑ๏ธ E1.0 funeral urn 26B1 ; unqualified # โšฑ E1.0 funeral urn +1F9FF ; fully-qualified # ๐Ÿงฟ E11.0 nazar amulet +1FAAC ; fully-qualified # ๐Ÿชฌ E14.0 hamsa 1F5FF ; fully-qualified # ๐Ÿ—ฟ E0.6 moai 1FAA7 ; fully-qualified # ๐Ÿชง E13.0 placard 1FAAA ; fully-qualified # ๐Ÿชช E14.0 identification card -# Objects subtotal: 304 -# Objects subtotal: 304 w/o modifiers +# Objects subtotal: 310 +# Objects subtotal: 310 w/o modifiers # group: Symbols @@ -4455,6 +4486,7 @@ 262E ; unqualified # โ˜ฎ E1.0 peace symbol 1F54E ; fully-qualified # ๐Ÿ•Ž E1.0 menorah 1F52F ; fully-qualified # ๐Ÿ”ฏ E0.6 dotted six-pointed star +1FAAF ; fully-qualified # ๐Ÿชฏ E15.0 khanda # subgroup: zodiac 2648 ; fully-qualified # โ™ˆ E0.6 Aries @@ -4503,6 +4535,7 @@ 1F505 ; fully-qualified # ๐Ÿ”… E1.0 dim button 1F506 ; fully-qualified # ๐Ÿ”† E1.0 bright button 1F4F6 ; fully-qualified # ๐Ÿ“ถ E0.6 antenna bars +1F6DC ; fully-qualified # ๐Ÿ›œ E15.0 wireless 1F4F3 ; fully-qualified # ๐Ÿ“ณ E0.6 vibration mode 1F4F4 ; fully-qualified # ๐Ÿ“ด E0.6 mobile phone off @@ -4693,8 +4726,8 @@ 1F533 ; fully-qualified # ๐Ÿ”ณ E0.6 white square button 1F532 ; fully-qualified # ๐Ÿ”ฒ E0.6 black square button -# Symbols subtotal: 302 -# Symbols subtotal: 302 w/o modifiers +# Symbols subtotal: 304 +# Symbols subtotal: 304 w/o modifiers # group: Flags @@ -4709,7 +4742,7 @@ 1F3F3 200D 1F308 ; unqualified # ๐Ÿณโ€๐ŸŒˆ E4.0 rainbow flag 1F3F3 FE0F 200D 26A7 FE0F ; fully-qualified # ๐Ÿณ๏ธโ€โšง๏ธ E13.0 transgender flag 1F3F3 200D 26A7 FE0F ; unqualified # ๐Ÿณโ€โšง๏ธ E13.0 transgender flag -1F3F3 FE0F 200D 26A7 ; unqualified # ๐Ÿณ๏ธโ€โšง E13.0 transgender flag +1F3F3 FE0F 200D 26A7 ; minimally-qualified # ๐Ÿณ๏ธโ€โšง E13.0 transgender flag 1F3F3 200D 26A7 ; unqualified # ๐Ÿณโ€โšง E13.0 transgender flag 1F3F4 200D 2620 FE0F ; fully-qualified # ๐Ÿดโ€โ˜ ๏ธ E11.0 pirate flag 1F3F4 200D 2620 ; minimally-qualified # ๐Ÿดโ€โ˜  E11.0 pirate flag @@ -4983,9 +5016,9 @@ # Flags subtotal: 275 w/o modifiers # Status Counts -# fully-qualified : 3624 -# minimally-qualified : 817 -# unqualified : 252 +# fully-qualified : 3655 +# minimally-qualified : 827 +# unqualified : 242 # component : 9 #EOF From da33f740a3b434286d8e5e723289db8c73c9ff0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Wed, 29 Mar 2023 14:47:00 +0200 Subject: [PATCH 2/3] Support skin tones for :people_holding_hands: emoji --- db/emoji.json | 2 +- lib/emoji/character.rb | 23 +++++++++++++++++------ test/emoji_test.rb | 9 +++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/db/emoji.json b/db/emoji.json index 5cd0d266..6e425ca6 100644 --- a/db/emoji.json +++ b/db/emoji.json @@ -6416,7 +6416,7 @@ ] , "unicode_version": "12.0" , "ios_version": "13.0" - , "skin_tones": false + , "skin_tones": true } , { "emoji": "๐Ÿ‘ญ" diff --git a/lib/emoji/character.rb b/lib/emoji/character.rb index 661673ce..1f5a37a5 100644 --- a/lib/emoji/character.rb +++ b/lib/emoji/character.rb @@ -43,13 +43,20 @@ def add_alias(name) # Raw Unicode string for an emoji. Nil if emoji is non-standard. def raw() unicode_aliases.first end - # Raw Unicode strings for each skin tone variant of this emoji. + # Raw Unicode strings for each skin tone variant of this emoji. The result is an empty array + # unless the emoji supports skin tones. + # + # Note: for emojis that depict multiple people (e.g. couples or families), this will not produce + # every possible permutation of skin tone per person. def raw_skin_tone_variants return [] if custom? || !skin_tones? - raw_normalized = raw.sub("\u{fe0f}", "") # strip VARIATION_SELECTOR_16 - idx = raw_normalized.index("\u{200d}") # detect zero-width joiner + raw_normalized = raw.sub(VARIATION_SELECTOR_16, "") + idx = raw_normalized.index(ZERO_WIDTH_JOINER) SKIN_TONES.map do |modifier| - if idx + if raw_normalized == PEOPLE_HOLDING_HANDS + # special case to apply the modifier to both persons + raw_normalized[0...idx] + modifier + raw_normalized[idx..nil] + modifier + elsif idx # insert modifier before zero-width joiner raw_normalized[0...idx] + modifier + raw_normalized[idx..nil] else @@ -97,7 +104,11 @@ def image_filename end private - + + VARIATION_SELECTOR_16 = "\u{fe0f}".freeze + ZERO_WIDTH_JOINER = "\u{200d}".freeze + PEOPLE_HOLDING_HANDS = "\u{1f9d1}\u{200d}\u{1f91d}\u{200d}\u{1f9d1}".freeze + SKIN_TONES = [ "\u{1F3FB}", # light skin tone "\u{1F3FC}", # medium-light skin tone @@ -106,7 +117,7 @@ def image_filename "\u{1F3FF}", # dark skin tone ] - private_constant :SKIN_TONES + private_constant :VARIATION_SELECTOR_16, :ZERO_WIDTH_JOINER, :PEOPLE_HOLDING_HANDS, :SKIN_TONES def default_image_filename if custom? diff --git a/test/emoji_test.rb b/test/emoji_test.rb index 64818d68..c3bd891e 100644 --- a/test/emoji_test.rb +++ b/test/emoji_test.rb @@ -176,6 +176,15 @@ class EmojiTest < TestCase "1f9d4-1f3fe-200d-2640", "1f9d4-1f3ff-200d-2640", ], woman_with_beard.raw_skin_tone_variants.map { |u| Emoji::Character.hex_inspect(u) } + + people_holding_hands = Emoji.find_by_alias("people_holding_hands") + assert_equal [ + "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb", + "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc", + "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd", + "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe", + "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff", + ], people_holding_hands.raw_skin_tone_variants.map { |u| Emoji::Character.hex_inspect(u) } end test "no custom emojis" do From 5476a66d2794e0d1551b1f96e449afc72e9f7bec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Wed, 29 Mar 2023 14:56:48 +0200 Subject: [PATCH 3/3] gemoji 4.1.0 --- Gemfile.lock | 4 ++-- gemoji.gemspec | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d949f225..1131493c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - gemoji (4.0.1) + gemoji (4.1.0) GEM remote: https://rubygems.org/ @@ -22,4 +22,4 @@ DEPENDENCIES rake (~> 10.3.2) BUNDLED WITH - 2.0.2 + 2.4.10 diff --git a/gemoji.gemspec b/gemoji.gemspec index 6c899614..9a6403db 100644 --- a/gemoji.gemspec +++ b/gemoji.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |s| s.name = "gemoji" - s.version = "4.0.1" + s.version = "4.1.0" s.summary = "Unicode emoji library" s.description = "Character information and metadata for Unicode emoji."