Compare commits

...

7 Commits

Author SHA1 Message Date
Zack Koppert
0eca75db93 Merge pull request #273 from github/dependabot-c67993ba-56b8-4f4e-a911-22640b185a14
Enable Dependabot
2024-04-02 10:52:47 -07:00
Zack Koppert
4e8e6b07eb Create dependabot.yaml 2024-01-09 21:17:56 -08:00
Mislav Marohnić
5476a66d27 gemoji 4.1.0 2023-03-29 14:56:48 +02:00
Mislav Marohnić
ee6e06c648 Merge pull request #262 from github/skin-tones-couple
Support skin tones for 🧑‍🤝‍🧑 emoji
2023-03-29 14:50:39 +02:00
Mislav Marohnić
da33f740a3 Support skin tones for 🧑‍🤝‍🧑 emoji 2023-03-29 14:47:00 +02:00
Mislav Marohnić
07b49d7de7 Merge pull request #261 from github/unicode-15
Import Emoji 15.0 characters
2023-03-29 12:17:44 +02:00
Mislav Marohnić
cb5c514d47 Import Emoji 15.0 characters 2023-03-29 12:14:38 +02:00
9 changed files with 456 additions and 128 deletions

11
.github/dependabot.yaml vendored Normal file
View File

@@ -0,0 +1,11 @@
---
version: 2
updates:
- package-ecosystem: 'bundler'
directory: '/'
schedule:
interval: 'weekly'
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
interval: 'weekly'

View File

@@ -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

View File

@@ -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

View File

@@ -38,8 +38,8 @@ for category in categories
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]

View File

@@ -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"
@@ -6416,7 +6478,7 @@
]
, "unicode_version": "12.0"
, "ios_version": "13.0"
, "skin_tones": false
, "skin_tones": true
}
, {
"emoji": "👭"
@@ -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"

View File

@@ -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."

View File

@@ -43,13 +43,20 @@ module Emoji
# 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 @@ module Emoji
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 @@ module Emoji
"\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?

View File

@@ -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

View File

@@ -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 womans 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 womans sandal
1FA70 ; fully-qualified # 🩰 E12.0 ballet shoes
1F462 ; fully-qualified # 👢 E0.6 womans boot
1FAAE ; fully-qualified # 🪮 E15.0 hair pick
1F451 ; fully-qualified # 👑 E0.6 crown
1F452 ; fully-qualified # 👒 E0.6 womans 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