tanuki_emoji 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TanukiEmoji
4
+ module Db
5
+ autoload :Gemojione, './lib/tanuki_emoji/db/gemojione'
6
+ end
7
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module TanukiEmoji
6
+ module Db
7
+ # Gemojione Emoji database
8
+ class Gemojione
9
+ DATA_FILE = 'vendor/gemojione/index-3.3.0.json'
10
+
11
+ def self.data_file
12
+ File.expand_path(File.join(__dir__, '../../../', DATA_FILE))
13
+ end
14
+
15
+ attr_reader :data_file
16
+
17
+ def initialize(index:, data_file: self.class.data_file)
18
+ @data_file = data_file
19
+ @index = index
20
+ end
21
+
22
+ def load!
23
+ db = File.open(data_file, 'r:UTF-8') do |file|
24
+ JSON.parse(file.read, symbolize_names: true)
25
+ end
26
+
27
+ db.each do |emoji_name, emoji_data|
28
+ emoji = Character.new(emoji_name.to_s,
29
+ codepoints: emoji_data[:moji],
30
+ alpha_code: emoji_data[:shortname],
31
+ description: emoji_data[:name])
32
+
33
+ emoji_data[:unicode_alternates].each do |unicode_alternates|
34
+ codepoints = unicode_hex_to_codepoint(unicode_alternates)
35
+
36
+ emoji.add_codepoints(codepoints)
37
+ end
38
+
39
+ emoji_data[:aliases].each do |alpha_code|
40
+ emoji.add_alias(alpha_code)
41
+ end
42
+
43
+ @index.add(emoji)
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def unicode_hex_to_codepoint(unicode)
50
+ unicode.split('-').map { |i| i.to_i(16) }.pack('U*')
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TanukiEmoji
4
+ class Error < StandardError; end
5
+
6
+ # Error: An Emoji with the same alpha code has been previously indexed
7
+ class AlphaCodeAlreadyIndexedError < Error
8
+ attr_reader :name, :alpha_code
9
+
10
+ # @param [String] name
11
+ # @param [String] alpha_code
12
+ def initialize(name, alpha_code)
13
+ @name = name
14
+ @alpha_code = alpha_code
15
+
16
+ message = "Cannot index Emoji '#{name}' with alpha code '#{alpha_code}'. " \
17
+ "An Emoji with that alpha code has already been indexed."
18
+
19
+ super(message)
20
+ end
21
+ end
22
+
23
+ # Error: An Emoji with the same codepoints has been previously indexed
24
+ class CodepointAlreadyIndexedError < Error
25
+ attr_reader :name, :codepoints
26
+
27
+ # @param [String] name
28
+ # @param [String] codepoint
29
+ def initialize(name, codepoint)
30
+ @name = name
31
+ @codepoint = codepoint
32
+
33
+ message = "Cannot index '#{name}' Emoji with codepoint: '#{codepoint}'. " \
34
+ "An Emoji with that codepoint has already been indexed."
35
+
36
+ super(message)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'singleton'
4
+
5
+ module TanukiEmoji
6
+ # Index of known Emoji Characters
7
+ class Index
8
+ include Singleton
9
+ include Enumerable
10
+
11
+ attr_reader :all
12
+
13
+ # Add a new Emoji to the index
14
+ #
15
+ # @param [TanukiEmoji::Character] emoji
16
+ def add(emoji)
17
+ @name_index ||= {}
18
+ @alpha_code_index ||= {}
19
+ @codepoints_index ||= {}
20
+
21
+ # Check if exists and index otherwise
22
+ insertion_mutex.synchronize do
23
+ raise ::TanukiEmoji::AlphaCodeAlreadyIndexedError.new emoji.name, emoji.alpha_code if @alpha_code_index.key? emoji.alpha_code
24
+ raise ::TanukiEmoji::CodepointAlreadyIndexedError.new emoji.name, emoji.codepoints if @codepoints_index.key? emoji.codepoints
25
+
26
+ emoji.codepoints_alternates.each do |codepoints|
27
+ raise ::TanukiEmoji::CodepointAlreadyIndexedError.new emoji.name, codepoints if @codepoints_index.key? codepoints
28
+ end
29
+
30
+ @name_index[emoji.name] = emoji
31
+ @alpha_code_index[emoji.alpha_code] = emoji
32
+ @codepoints_index[emoji.codepoints] = emoji
33
+
34
+ emoji.codepoints_alternates.each do |codepoints|
35
+ @codepoints_index[codepoints] = emoji
36
+ end
37
+
38
+ emoji.aliases.each do |alpha_code|
39
+ @alpha_code_index[alpha_code] = emoji
40
+ end
41
+ end
42
+
43
+ all << emoji
44
+
45
+ emoji
46
+ end
47
+
48
+ # Find an Emoji by its :alpha_code:
49
+ #
50
+ # @param [String] alpha_code
51
+ # @return [TanukiEmoji::Character]
52
+ def find_by_alpha_code(alpha_code)
53
+ @alpha_code_index[Character.format_alpha_code(alpha_code)]
54
+ end
55
+
56
+ # Find an Emoji by its Unicode representation
57
+ #
58
+ # @param [String] unicode_codepoints
59
+ # @return [TanukiEmoji::Character]
60
+ def find_by_codepoints(unicode_codepoints)
61
+ @codepoints_index[unicode_codepoints]
62
+ end
63
+
64
+ # Clears the index to start from scratch
65
+ #
66
+ # @note This is intended to be used in test and development only
67
+ # @param [Boolean] reload whether to reload emoji database or leave it empty
68
+ def reset!(reload: true)
69
+ @all = []
70
+
71
+ load_data_files if reload
72
+
73
+ remove_instance_variable :@name_index if defined? @name_index
74
+ remove_instance_variable :@alpha_code_index if defined? @alpha_code_index
75
+ remove_instance_variable :@codepoints_index if defined? @codepoints_index
76
+ end
77
+
78
+ private
79
+
80
+ def initialize
81
+ @all = []
82
+
83
+ load_data_files
84
+ end
85
+
86
+ def insertion_mutex
87
+ @insertion_mutex ||= Mutex.new
88
+ end
89
+
90
+ def load_data_files
91
+ Db::Gemojione.new(index: self).load!
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TanukiEmoji
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/tanuki_emoji/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'tanuki_emoji'
7
+ spec.version = TanukiEmoji::VERSION
8
+ spec.authors = ['Gabriel Mazetto']
9
+ spec.email = ['brodock@gmail.com']
10
+
11
+ spec.summary = %q{Tanuki Emoji}
12
+ spec.description = %q{Tanuki Emoji provides Emoji character information and metadata with support for Noto Emoji resources as fallback}
13
+ spec.homepage = 'https://gitlab.com/brodock/tanuki_emoji'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'https://gitlab.com/brodock/tanuki_emoji'
19
+ spec.metadata['changelog_uri'] = "https://gitlab.com/brodock/tanuki_emoji/-/blob/main/CHANGELOG.md"
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
25
+ end
26
+ spec.bindir = 'exe'
27
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ['lib']
29
+ end
@@ -0,0 +1,55 @@
1
+ changelog
2
+ ---------
3
+
4
+ ####UPDATE 2019-07-22
5
+ * additions
6
+ * Unicode 12 charcters
7
+
8
+
9
+ ####UPDATE 2017-06-30
10
+ * additions
11
+ * Unicode 10 charcters
12
+
13
+ * changes
14
+ * inclusion of output code point attribute, used to generate native Unicode
15
+
16
+
17
+ ####UPDATE 2017-04-15
18
+ * additions
19
+ * gender based roles
20
+ * aliases for diversity naming convention (e.g. tone1 = light_skin_tone)
21
+
22
+ * changes
23
+ * in a previous version, csv columns were renamed to more closely match the json attribute labels. now we've updated "alpha code" to "alpha_code" for closer alignment
24
+ * we've removed the versioning from this data set now that it's part of the JoyPixels repo
25
+
26
+
27
+ ####1.1 / 2016-07-19
28
+
29
+ * additions
30
+ * all of unicode 9
31
+ * :gay_pride_flag:
32
+
33
+ * important note
34
+ * because aliases are pipe-delimited strings, we have removed square bracket encapsulation and replaced with double-quote encapsulation
35
+
36
+ ####0.9 / 2016-04-05
37
+
38
+ * additions
39
+ * :paw_prints: alias to paw prints
40
+ * :thumbup: alias to thumbs up sign
41
+ * :thumbup_tone1: alias to thumbs up sign tone 1
42
+ * :thumbup_tone2: alias to thumbs up sign tone 2
43
+ * :thumbup_tone3: alias to thumbs up sign tone 3
44
+ * :thumbup_tone4: alias to thumbs up sign tone 4
45
+ * :thumbup_tone5: alias to thumbs up sign tone 5
46
+ * :thumbdown: alias to thumbs down sign
47
+ * :thumbdown_tone1: alias to thumbs down sign tone 1
48
+ * :thumbdown_tone2: alias to thumbs down sign tone 2
49
+ * :thumbdown_tone3: alias to thumbs down sign tone 3
50
+ * :thumbdown_tone4: alias to thumbs down sign tone 4
51
+ * :thumbdown_tone5: alias to thumbs down sign tone 5
52
+
53
+ ####0.8 / 2015-12-17
54
+
55
+ * Initial commit
@@ -0,0 +1,4 @@
1
+ #### License
2
+
3
+ * License: MIT
4
+ * Complete Legal Terms: http://opensource.org/licenses/MIT
@@ -0,0 +1,416 @@
1
+ # Emoji Alpha Codes
2
+
3
+ ### WHAT ARE EMOJI ALPHA CODES?
4
+
5
+ An EAC (some know them as cheat codes, shortnames, or short codes) are emoji keywords wrapped in colons such as :emoji: as an alternative/convenient method to inserting emoij graphics directly into message forms without having to use a separate emoji picker or pasting the emoji unicode.
6
+
7
+ ### PURPOSE OF THIS DATA
8
+
9
+ The purpose is to unify various alpha code lists into a single table developers could contribute to and share. With a few different tables floating around, we've done our best to organize and de-fragment the tables. To do this, we've divided the codes into a primary and secondary category. The single "primary" EAC code is the main identifier and the "secondary" EAC code(s) are alternatives. This gives the site developer the option to allow either a primary or secondary code to be entered to call a single emoji.
10
+
11
+ Our goal here is to help everyone involved and we appreciate contributions to this list. Please know we don't recommend the primary EAC's change unless there's a major reason for it.
12
+
13
+ ### THE FILES
14
+
15
+ We've included the current list of emoji alpha codes in two formats, json and csv. In each file the data is primarily arranged by unicode code point. The files are structured as such.
16
+
17
+ ##### JSON
18
+
19
+ ```
20
+ {
21
+ "1f600": {
22
+ "output": "1f601",
23
+ "name": "grinning face",
24
+ "alpha_code": ":grinning:",
25
+ "aliases": ""
26
+ },
27
+ "1f642": {
28
+ "output": "1f642",
29
+ "name": "slightly smiling face",
30
+ "alpha_code": ":slight_smile:",
31
+ "aliases": ":slightly_smiling_face:"
32
+ },
33
+ "1f36e": {
34
+ "output": "1f46e",
35
+ "name": "custard",
36
+ "alpha_code": ":custard:",
37
+ "aliases": ":pudding:|:flan:"
38
+ }
39
+ }
40
+ ```
41
+
42
+ ##### CSV
43
+
44
+ ```
45
+ “unicode”, "output", “name”, "alpha_code”, “aliases”
46
+ ```
47
+
48
+ ### LICENSE
49
+
50
+ * License: MIT
51
+ * Complete Legal Terms: http://opensource.org/licenses/MIT
52
+
53
+ ### PRIMARY SHORTNAME CHANGES
54
+ The following is a list of shortnames that have been moved into the ":aliases:" column and replaced by a new primary shortname (alpha code), as of the JoyPixels 3.0 update (April 2017).
55
+
56
+ ```
57
+ Previous Shortname,New Shortname
58
+
59
+ :golfer:,:person_golfing:
60
+
61
+ :man_with_turban:,:person_wearing_turban:
62
+
63
+ :man_with_turban_tone1:,:person_wearing_turban_tone1:
64
+
65
+ :man_with_turban_tone2:,:person_wearing_turban_tone2:
66
+
67
+ :man_with_turban_tone3:,:person_wearing_turban_tone3:
68
+
69
+ :man_with_turban_tone4:,:person_wearing_turban_tone4:
70
+
71
+ :man_with_turban_tone5:,:person_wearing_turban_tone5:
72
+
73
+ :man_with_gua_pi_mao:,:man_with_chinese_cap:
74
+
75
+ :man_with_gua_pi_mao_tone1:,:man_with_chinese_cap_tone1:
76
+
77
+ :man_with_gua_pi_mao_tone2:,:man_with_chinese_cap_tone2:
78
+
79
+ :man_with_gua_pi_mao_tone3:,:man_with_chinese_cap_tone3:
80
+
81
+ :man_with_gua_pi_mao_tone4:,:man_with_chinese_cap_tone4:
82
+
83
+ :man_with_gua_pi_mao_tone5:,:man_with_chinese_cap_tone5:
84
+
85
+ :dancers:,:people_with_bunny_ears_partying:
86
+
87
+ :runner:,:person_running:
88
+
89
+ :runner_tone1:,:person_running_tone1:
90
+
91
+ :runner_tone2:,:person_running_tone2:
92
+
93
+ :runner_tone3:,:person_running_tone3:
94
+
95
+ :runner_tone4:,:person_running_tone4:
96
+
97
+ :runner_tone5:,:person_running_tone5:
98
+
99
+ :walking:,:person_walking:
100
+
101
+ :walking_tone1:,:person_walking_tone1:
102
+
103
+ :walking_tone2:,:person_walking_tone2:
104
+
105
+ :walking_tone3:,:person_walking_tone3:
106
+
107
+ :walking_tone4:,:person_walking_tone4:
108
+
109
+ :walking_tone5:,:person_walking_tone5:
110
+
111
+ :haircut:,:person_getting_haircut:
112
+
113
+ :haircut_tone1:,:person_getting_haircut_tone1:
114
+
115
+ :haircut_tone2:,:person_getting_haircut_tone2:
116
+
117
+ :haircut_tone3:,:person_getting_haircut_tone3:
118
+
119
+ :haircut_tone4:,:person_getting_haircut_tone4:
120
+
121
+ :haircut_tone5:,:person_getting_haircut_tone5:
122
+
123
+ :massage:,:person_getting_massage:
124
+
125
+ :massage_tone1:,:person_getting_massage_tone1:
126
+
127
+ :massage_tone2:,:person_getting_massage_tone2:
128
+
129
+ :massage_tone3:,:person_getting_massage_tone3:
130
+
131
+ :massage_tone4:,:person_getting_massage_tone4:
132
+
133
+ :massage_tone5:,:person_getting_massage_tone5:
134
+
135
+ :shrug:,:person_shrugging:
136
+
137
+ :shrug_tone1:,:person_shrugging_tone1:
138
+
139
+ :shrug_tone2:,:person_shrugging_tone2:
140
+
141
+ :shrug_tone3:,:person_shrugging_tone3:
142
+
143
+ :shrug_tone4:,:person_shrugging_tone4:
144
+
145
+ :shrug_tone5:,:person_shrugging_tone5:
146
+
147
+ :face_palm:,:person_facepalming:
148
+
149
+ :face_palm_tone1:,:person_facepalming_tone1:
150
+
151
+ :face_palm_tone2:,:person_facepalming_tone2:
152
+
153
+ :face_palm_tone3:,:person_facepalming_tone3:
154
+
155
+ :face_palm_tone4:,:person_facepalming_tone4:
156
+
157
+ :face_palm_tone5:,:person_facepalming_tone5:
158
+
159
+ :wrestlers:,:people_wrestling:
160
+
161
+ :cop:,:police_officer:
162
+
163
+ :cop_tone1:,:police_officer_tone1:
164
+
165
+ :cop_tone2:,:police_officer_tone2:
166
+
167
+ :cop_tone3:,:police_officer_tone3:
168
+
169
+ :cop_tone4:,:police_officer_tone4:
170
+
171
+ :cop_tone5:,:police_officer_tone5:
172
+
173
+ :spy:,:detective:
174
+
175
+ :spy_tone1:,:detective_tone1:
176
+
177
+ :spy_tone2:,:detective_tone2:
178
+
179
+ :spy_tone3:,:detective_tone3:
180
+
181
+ :spy_tone4:,:detective_tone4:
182
+
183
+ :spy_tone5:,:detective_tone5:
184
+
185
+ :guardsman:,:guard:
186
+
187
+ :guardsman_tone1:,:guard_tone1:
188
+
189
+ :guardsman_tone2:,:guard_tone2:
190
+
191
+ :guardsman_tone3:,:guard_tone3:
192
+
193
+ :guardsman_tone4:,:guard_tone4:
194
+
195
+ :guardsman_tone5:,:guard_tone5:
196
+
197
+ :person_with_blond_hair:,:blond_haired_person:
198
+
199
+ :person_with_blond_hair_tone1:,:blond_haired_person_tone1:
200
+
201
+ :person_with_blond_hair_tone2:,:blond_haired_person_tone2:
202
+
203
+ :person_with_blond_hair_tone3:,:blond_haired_person_tone3:
204
+
205
+ :person_with_blond_hair_tone4:,:blond_haired_person_tone4:
206
+
207
+ :person_with_blond_hair_tone5:,:blond_haired_person_tone5:
208
+
209
+ :person_with_pouting_face:,:person_pouting:
210
+
211
+ :person_with_pouting_face_tone1:,:person_pouting_tone1:
212
+
213
+ :person_with_pouting_face_tone2:,:person_pouting_tone2:
214
+
215
+ :person_with_pouting_face_tone3:,:person_pouting_tone3:
216
+
217
+ :person_with_pouting_face_tone4:,:person_pouting_tone4:
218
+
219
+ :person_with_pouting_face_tone5:,:person_pouting_tone5:
220
+
221
+ :no_good:,:person_gesturing_no:
222
+
223
+ :no_good_tone1:,:person_gesturing_no_tone1:
224
+
225
+ :no_good_tone2:,:person_gesturing_no_tone2:
226
+
227
+ :no_good_tone3:,:person_gesturing_no_tone3:
228
+
229
+ :no_good_tone4:,:person_gesturing_no_tone4:
230
+
231
+ :no_good_tone5:,:person_gesturing_no_tone5:
232
+
233
+ :ok_woman:,:person_gesturing_ok:
234
+
235
+ :ok_woman_tone1:,:person_gesturing_ok_tone1:
236
+
237
+ :ok_woman_tone2:,:person_gesturing_ok_tone2:
238
+
239
+ :ok_woman_tone3:,:person_gesturing_ok_tone3:
240
+
241
+ :ok_woman_tone4:,:person_gesturing_ok_tone4:
242
+
243
+ :ok_woman_tone5:,:person_gesturing_ok_tone5:
244
+
245
+ :information_desk_person:,:person_tipping_hand:
246
+
247
+ :information_desk_person_tone1:,:person_tipping_hand_tone1:
248
+
249
+ :information_desk_person_tone2:,:person_tipping_hand_tone2:
250
+
251
+ :information_desk_person_tone3:,:person_tipping_hand_tone3:
252
+
253
+ :information_desk_person_tone4:,:person_tipping_hand_tone4:
254
+
255
+ :information_desk_person_tone5:,:person_tipping_hand_tone5:
256
+
257
+ :raising_hand:,:person_raising_hand:
258
+
259
+ :raising_hand_tone1:,:person_raising_hand_tone1:
260
+
261
+ :raising_hand_tone2:,:person_raising_hand_tone2:
262
+
263
+ :raising_hand_tone3:,:person_raising_hand_tone3:
264
+
265
+ :raising_hand_tone4:,:person_raising_hand_tone4:
266
+
267
+ :raising_hand_tone5:,:person_raising_hand_tone5:
268
+
269
+ :bow:,:person_bowing:
270
+
271
+ :bow_tone1:,:person_bowing_tone1:
272
+
273
+ :bow_tone2:,:person_bowing_tone2:
274
+
275
+ :bow_tone3:,:person_bowing_tone3:
276
+
277
+ :bow_tone4:,:person_bowing_tone4:
278
+
279
+ :bow_tone5:,:person_bowing_tone5:
280
+
281
+ :fencer:,:person_fencing:
282
+
283
+ :surfer:,:person_surfing:
284
+
285
+ :surfer_tone1:,:person_surfing_tone1:
286
+
287
+ :surfer_tone2:,:person_surfing_tone2:
288
+
289
+ :surfer_tone3:,:person_surfing_tone3:
290
+
291
+ :surfer_tone4:,:person_surfing_tone4:
292
+
293
+ :surfer_tone5:,:person_surfing_tone5:
294
+
295
+ :rowboat:,:person_rowing_boat:
296
+
297
+ :rowboat_tone1:,:person_rowing_boat_tone1:
298
+
299
+ :rowboat_tone2:,:person_rowing_boat_tone2:
300
+
301
+ :rowboat_tone3:,:person_rowing_boat_tone3:
302
+
303
+ :rowboat_tone4:,:person_rowing_boat_tone4:
304
+
305
+ :rowboat_tone5:,:person_rowing_boat_tone5:
306
+
307
+ :swimmer:,:person_swimming:
308
+
309
+ :swimmer_tone1:,:person_swimming_tone1:
310
+
311
+ :swimmer_tone2:,:person_swimming_tone2:
312
+
313
+ :swimmer_tone3:,:person_swimming_tone3:
314
+
315
+ :swimmer_tone4:,:person_swimming_tone4:
316
+
317
+ :swimmer_tone5:,:person_swimming_tone5:
318
+
319
+ :basketball_player:,:person_bouncing_ball:
320
+
321
+ :basketball_player_tone1:,:person_bouncing_ball_tone1:
322
+
323
+ :basketball_player_tone2:,:person_bouncing_ball_tone2:
324
+
325
+ :basketball_player_tone3:,:person_bouncing_ball_tone3:
326
+
327
+ :basketball_player_tone4:,:person_bouncing_ball_tone4:
328
+
329
+ :basketball_player_tone5:,:person_bouncing_ball_tone5:
330
+
331
+ :lifter:,:person_lifting_weights:
332
+
333
+ :lifter_tone1:,:person_lifting_weights_tone1:
334
+
335
+ :lifter_tone2:,:person_lifting_weights_tone2:
336
+
337
+ :lifter_tone3:,:person_lifting_weights_tone3:
338
+
339
+ :lifter_tone4:,:person_lifting_weights_tone4:
340
+
341
+ :lifter_tone5:,:person_lifting_weights_tone5:
342
+
343
+ :bicyclist:,:person_biking:
344
+
345
+ :bicyclist_tone1:,:person_biking_tone1:
346
+
347
+ :bicyclist_tone2:,:person_biking_tone2:
348
+
349
+ :bicyclist_tone3:,:person_biking_tone3:
350
+
351
+ :bicyclist_tone4:,:person_biking_tone4:
352
+
353
+ :bicyclist_tone5:,:person_biking_tone5:
354
+
355
+ :mountain_bicyclist:,:person_mountain_biking:
356
+
357
+ :mountain_bicyclist_tone1:,:person_mountain_biking_tone1:
358
+
359
+ :mountain_bicyclist_tone2:,:person_mountain_biking_tone2:
360
+
361
+ :mountain_bicyclist_tone3:,:person_mountain_biking_tone3:
362
+
363
+ :mountain_bicyclist_tone4:,:person_mountain_biking_tone4:
364
+
365
+ :mountain_bicyclist_tone5:,:person_mountain_biking_tone5:
366
+
367
+ :water_polo:,:person_playing_water_polo:
368
+
369
+ :water_polo_tone1:,:person_playing_water_polo_tone1:
370
+
371
+ :water_polo_tone2:,:person_playing_water_polo_tone2:
372
+
373
+ :water_polo_tone3:,:person_playing_water_polo_tone3:
374
+
375
+ :water_polo_tone4:,:person_playing_water_polo_tone4:
376
+
377
+ :water_polo_tone5:,:person_playing_water_polo_tone5:
378
+
379
+ :handball:,:person_playing_handball:
380
+
381
+ :handball_tone1:,:person_playing_handball_tone1:
382
+
383
+ :handball_tone2:,:person_playing_handball_tone2:
384
+
385
+ :handball_tone3:,:person_playing_handball_tone3:
386
+
387
+ :handball_tone4:,:person_playing_handball_tone4:
388
+
389
+ :handball_tone5:,:person_playing_handball_tone5:
390
+
391
+ :juggling:,:person_juggling:
392
+
393
+ :juggling_tone1:,:person_juggling_tone1:
394
+
395
+ :juggling_tone2:,:person_juggling_tone2:
396
+
397
+ :juggling_tone3:,:person_juggling_tone3:
398
+
399
+ :juggling_tone4:,:person_juggling_tone4:
400
+
401
+ :juggling_tone5:,:person_juggling_tone5:
402
+
403
+ :levitating:,:man_in_business_suit_levitating:
404
+
405
+ :cartwheel:,:person_doing_cartwheel:
406
+
407
+ :cartwheel_tone1:,:person_doing_cartwheel_tone1:
408
+
409
+ :cartwheel_tone2:,:person_doing_cartwheel_tone2:
410
+
411
+ :cartwheel_tone3:,:person_doing_cartwheel_tone3:
412
+
413
+ :cartwheel_tone4:,:person_doing_cartwheel_tone4:
414
+
415
+ :cartwheel_tone5:,:person_doing_cartwheel_tone5:
416
+ ```