twemoji 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 30d5595bf4c341a2f7b960d79941a08571184fb3
4
+ data.tar.gz: 1ba40ad4ea3c925acbca7a7cdd7e3ba1bf3fa9b0
5
+ SHA512:
6
+ metadata.gz: e3d2628da8e26b765f96944e8a93328cfebb747fae0c13fb88db09cf72c1fab1f0d36cb9e4a05c8e3c4f31ff56ee88bb05b0690f77a10da2b7c00ee8963b5e40
7
+ data.tar.gz: 9bd3620246f497178f7f6f13997ee83834ee90b005a130a1a787e25cf4726be049700976c1588789d3efe1378fb87412f227a68d5b72f48246d9b035c345dfa4
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in twemoji.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem "rake"
8
+ gem "bundler"
9
+ end
10
+
11
+ group :test do
12
+ gem "minitest", ">= 5.5"
13
+ end
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Juanito Fatas
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,100 @@
1
+ # Twemoji
2
+
3
+ Get imoji img by text.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'twemoji'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install twemoji
20
+
21
+ ## Usage
22
+
23
+ ### API
24
+
25
+ #### `.find_by_text`
26
+
27
+ ```ruby
28
+ > Twemoji.find_by_text(":heart_eyes:")
29
+ => "1f60d"
30
+ ```
31
+
32
+ #### `.find_by_code`
33
+
34
+ ```ruby
35
+ > Twemoji.find_by_code("1f60d")
36
+ => "1f60d"
37
+ ```
38
+
39
+ #### `.find_by` text or code
40
+
41
+ ```ruby
42
+ > Twemoji.find_by(text: ':heart_eyes:')
43
+ => 1f60d
44
+
45
+ > Twemoji.find_by(code: '1f60d')
46
+ => :heart_eyes:
47
+ ```
48
+
49
+ #### `.parse`
50
+
51
+ ```ruby
52
+ > Twemoji.parse 'I like chocolate :heart_eyes:!'
53
+ => 'I like chololate <img class="emoji" draggable="false" alt=":heart_eyes:" src="https://twemoji.maxcdn.com/36x36/1f60d.png">'
54
+ ```
55
+
56
+ ##### asset_root
57
+
58
+ Default assets root url, by default will be `https://twemoji.maxcdn.com/`:
59
+
60
+ ```ruby
61
+ > Twemoji.parse 'I like chocolate :heart_eyes:!', base: 'foocdn.com'
62
+ => 'I like chololate <img class="emoji" draggable="false" alt=":heart_eyes:" src="https://foocdn.com/36x36/1f60d.png">'
63
+ ```
64
+
65
+ ##### file_ext
66
+
67
+ Default assets file extensions, by default '.svg'.
68
+
69
+ ```ruby
70
+ > Twemoji.parse 'I like chocolate :heart_eyes:!', ext: '.png'
71
+ => 'I like chololate <img class="emoji" draggable="false" alt=":heart_eyes:" src="https://twemoji.maxcdn.com/16x16/1f60d.png">'
72
+ ```
73
+
74
+ ##### image_size
75
+
76
+ Default assets/folder size, by default "36x36". Available via Twitter CDN: 16, 36, 72
77
+
78
+ Only applicable when file_ext is .png.
79
+
80
+ ```ruby
81
+ > Twemoji.parse 'I like chocolate :heart_eyes:!', size: "72x72"
82
+ => 'I like chololate <img class="emoji" draggable="false" alt=":heart_eyes:" src="https://foocdn.com/72x72/1f60d.png">'
83
+ ```
84
+
85
+ ##### class_name
86
+
87
+ Default img css class name, by default "emoji".
88
+
89
+ ```ruby
90
+ > Twemoji.parse 'I like chocolate :heart_eyes:!', class_name: 'superemoji'
91
+ => 'I like chololate <img class="superemoji" draggable="false" alt=":heart_eyes:" src="https://foocdn.com/72x72/1f60d.png">'
92
+ ```
93
+
94
+ ## Contributing
95
+
96
+ 1. Fork it ( https://github.com/[my-github-username]/twemoji/fork )
97
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
98
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
99
+ 4. Push to the branch (`git push origin my-new-feature`)
100
+ 5. Create a new Pull Request
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require "rake/testtask"
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << "test"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ t.verbose = true
9
+ end
10
+
11
+ task :default => :test
@@ -0,0 +1,149 @@
1
+ require "nokogiri"
2
+
3
+ require "twemoji/version"
4
+ require "twemoji/map"
5
+
6
+ module Twemoji
7
+ # Find code by text and find text by code.
8
+ #
9
+ # @example Usage
10
+ #
11
+ # Twemoji.find_by(text: :heart_eyes:) # => "1f60d"
12
+ # Twemoji.find_by(code: :1f60d:) # => "heart_eyes"
13
+ #
14
+ # @option options [String] (optional) :text
15
+ # @option options [String] (optional) :code
16
+ #
17
+ # @return [String] Text or Code
18
+ def self.find_by(*args, text: nil, code: nil)
19
+ raise "Can only specify text or code one at a time" if text && code
20
+
21
+ if text
22
+ find_by_text text
23
+ else
24
+ find_by_code code
25
+ end
26
+ end
27
+
28
+ # Find emoji code by text
29
+ #
30
+ # @example Usage
31
+ #
32
+ # Twemoji.find_by_text ":heart_eyes:"
33
+ # => "1f60d"
34
+ #
35
+ # @param text [String] Text to find emoji code
36
+ #
37
+ # @return [String] Emoji Code
38
+ def self.find_by_text(text)
39
+ CODES[must_str(text)]
40
+ end
41
+
42
+ # Find text by emoji code
43
+ #
44
+ # @example Usage
45
+ #
46
+ # Twemoji.find_by_code "1f60d"
47
+ # => ":heart_eyes:"
48
+ #
49
+ # @param code [String] Emoji code to find text
50
+ #
51
+ # @return [String] Text
52
+ def self.find_by_code(code)
53
+ ICODES[must_str(code)]
54
+ end
55
+
56
+ # Parse text, replace emoji text with image.
57
+ #
58
+ # @example Usage
59
+ #
60
+ # Twemoji.parse("I like chocolate :heart_eyes:!")
61
+ # => => 'I like chololate <img class="emoji" draggable="false" alt=":heart_eyes:" src="https://twemoji.maxcdn.com/svg/1f60d.svg">'
62
+ #
63
+ # @param text [String] source text to parse.
64
+ #
65
+ # @option options [String] (optional) asset_root Asset root url to serve emoji.
66
+ # @option options [String] (optional) asset_path Folder where you store your emoji images.
67
+ # @option options [String] (optional) file_ext File extension.
68
+ # @option options [String] (optional) image_size Emoji image's size 16, 36, 72 applicable if specify .png.
69
+ # @option options [String] (optional) class_name Emoji image's css class name.
70
+ #
71
+ # @return [String]
72
+ def self.parse(text, asset_root: "https://twemoji.maxcdn.com/",
73
+ asset_path: "",
74
+ file_ext: ".svg",
75
+ image_size: "16x16",
76
+ class_name: "emoji")
77
+
78
+ options[:asset_root] = asset_root
79
+ options[:asset_path] = asset_path
80
+ options[:file_ext] = file_ext
81
+ options[:image_size] = image_size
82
+ options[:class_name] = class_name
83
+
84
+ if text.kind_of?(String)
85
+ parse_html(text)
86
+ else
87
+ parse_document(text)
88
+ end
89
+ end
90
+
91
+ # Return all emoji patterns' regexp
92
+ def self.emoji_pattern
93
+ @emoji_pattern ||= /(#{CODES.keys.each { |name| Regexp.escape(name) }.join("|") })/
94
+ end
95
+
96
+ private
97
+ # Ensure text is string
98
+ #
99
+ # @param text [String]
100
+ #
101
+ # @return [String]
102
+ def self.must_str(text)
103
+ text = text.respond_to?(:to_str) ? text.to_str : text.to_s
104
+ end
105
+
106
+ def self.options
107
+ @options ||= {}
108
+ end
109
+
110
+ def self.parse_html(text)
111
+ return text if !text.include?(":")
112
+
113
+ filter_emojis(text)
114
+ end
115
+
116
+ def self.parse_document(doc)
117
+ doc.search('text()').each do |node|
118
+ content = node.to_html
119
+ next if !content.include?(":")
120
+ next if has_ancestor?(node, %w(pre code tt))
121
+ html = filter_emojis(content)
122
+ next if html == content
123
+ node.replace(html)
124
+ end
125
+ doc
126
+ end
127
+
128
+ def self.filter_emojis(content)
129
+ content.gsub(emoji_pattern) { |match| img_tag(match) }
130
+ end
131
+
132
+ def self.img_tag(name)
133
+ "<img class='#{options[:class_name]}' draggable='false' title='#{name}' alt='#{name}' src='#{emoji_url(name)}'>"
134
+ end
135
+
136
+ def self.emoji_url(name)
137
+ code = find_by_text(name)
138
+
139
+ if options[:file_ext] == ".svg"
140
+ File.join(options[:asset_root], "svg", "#{code}.svg")
141
+ elsif !options[:asset_path].empty?
142
+ File.join(options[:asset_root], options[:asset_path], "#{code}.#{options[:file_ext]}")
143
+ elsif options[:file_ext] == ".png"
144
+ File.join(options[:asset_root], options[:image_size], "#{code}.png")
145
+ else
146
+ File.join(options[:asset_root], options[:image_size], "#{code}.#{options[:file_ext]}")
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,853 @@
1
+ module Twemoji
2
+ # String to hex map
3
+ #
4
+ # This hash is frozen.
5
+ #
6
+ # @example Usage
7
+ #
8
+ # CODES[:smile:] # => "1f604"
9
+ # CODES[:notebook_with_decorative_cover:] # => "1f4d4"
10
+ #
11
+ # @return [Hash<String => String>]
12
+ CODES = {
13
+ ":smile:" => "1f604",
14
+ ":laughing:" => "1f606",
15
+ ":blush:" => "1f60a",
16
+ ":smiley:" => "1f603",
17
+ ":relaxed:" => "263a",
18
+ ":smirk:" => "1f60f",
19
+ ":heart_eyes:" => "1f60d",
20
+ ":kissing_heart:" => "1f618",
21
+ ":kissing_closed_eyes:" => "1f61a",
22
+ ":flushed:" => "1f633",
23
+ ":relieved:" => "1f625",
24
+ ":satisfied:" => "1f60c",
25
+ ":grin:" => "1f601",
26
+ ":wink:" => "1f609",
27
+ ":stuck_out_tongue_winking_eye:" => "1f61c",
28
+ ":stuck_out_tongue_closed_eyes:" => "1f61d",
29
+ ":grinning:" => "1f600",
30
+ ":kissing:" => "1f617",
31
+ ":kissing_smiling_eyes:" => "1f619",
32
+ ":stuck_out_tongue:" => "1f61b",
33
+ ":sleeping:" => "1f634",
34
+ ":worried:" => "1f61f",
35
+ ":frowning:" => "1f626",
36
+ ":anguished:" => "1f627",
37
+ ":open_mouth:" => "1f62e",
38
+ ":grimacing:" => "1f62c",
39
+ ":confused:" => "1f615",
40
+ ":hushed:" => "1f62f",
41
+ ":expressionless:" => "1f611",
42
+ ":unamused:" => "1f612",
43
+ ":sweat_smile:" => "1f605",
44
+ ":sweat:" => "1f613",
45
+ ":weary:" => "1f629",
46
+ ":pensive:" => "1f614",
47
+ ":disappointed:" => "1f61e",
48
+ ":confounded:" => "1f616",
49
+ ":fearful:" => "1f628",
50
+ ":cold_sweat:" => "1f630",
51
+ ":persevere:" => "1f623",
52
+ ":cry:" => "1f622",
53
+ ":sob:" => "1f62d",
54
+ ":joy:" => "1f602",
55
+ ":astonished:" => "1f632",
56
+ ":scream:" => "1f631",
57
+ ":tired_face:" => "1f62b",
58
+ ":angry:" => "1f620",
59
+ ":rage:" => "1f621",
60
+ ":triumph:" => "1f624",
61
+ ":sleepy:" => "1f62a",
62
+ ":yum:" => "1f60b",
63
+ ":mask:" => "1f637",
64
+ ":sunglasses:" => "1f60e",
65
+ ":dizzy_face:" => "1f635",
66
+ ":imp:" => "1f47f",
67
+ ":smiling_imp:" => "1f608",
68
+ ":neutral_face:" => "1f610",
69
+ ":no_mouth:" => "1f636",
70
+ ":innocent:" => "1f607",
71
+ ":alien:" => "1f47d",
72
+ ":yellow_heart:" => "1f49b",
73
+ ":blue_heart:" => "1f499",
74
+ ":purple_heart:" => "1f49c",
75
+ ":heart:" => "2764",
76
+ ":green_heart:" => "1f49a",
77
+ ":broken_heart:" => "1f494",
78
+ ":heartbeat:" => "1f493",
79
+ ":heartpulse:" => "1f497",
80
+ ":two_hearts:" => "1f495",
81
+ ":revolving_hearts:" => "1f49e",
82
+ ":cupid:" => "1f498",
83
+ ":sparkling_heart:" => "1f496",
84
+ ":sparkles:" => "2728",
85
+ ":star:" => "2b50",
86
+ ":star2:" => "1f31f",
87
+ ":dizzy:" => "1f4ab",
88
+ ":boom:" => "1f4a5",
89
+ ":anger:" => "1f4a2",
90
+ ":exclamation:" => "2757",
91
+ ":question:" => "2753",
92
+ ":grey_exclamation:" => "2755",
93
+ ":grey_question:" => "2754",
94
+ ":zzz:" => "1f4a4",
95
+ ":dash:" => "1f4a8",
96
+ ":sweat_drops:" => "1f4a6",
97
+ ":notes:" => "1f3b6",
98
+ ":musical_note:" => "1f3b5",
99
+ ":fire:" => "1f525",
100
+ ":poop:" => "1f4a9",
101
+ ":thumbsup:" => "1f44d",
102
+ ":thumbsdown:" => "1f44e",
103
+ ":ok_hand:" => "1f44c",
104
+ ":punch:" => "1f44a",
105
+ ":fist:" => "270a",
106
+ ":v:" => "270c",
107
+ ":wave:" => "1f44b",
108
+ ":hand:" => "270b",
109
+ ":open_hands:" => "1f450",
110
+ ":point_up:" => "261d",
111
+ ":point_down:" => "1f447",
112
+ ":point_left:" => "1f448",
113
+ ":point_right:" => "1f449",
114
+ ":raised_hands:" => "1f64c",
115
+ ":pray:" => "1f64f",
116
+ ":point_up_2:" => "1f446",
117
+ ":clap:" => "1f44f",
118
+ ":muscle:" => "1f4aa",
119
+ ":walking:" => "1f6b6",
120
+ ":runner:" => "1f3c3",
121
+ ":couple:" => "1f46b",
122
+ ":family:" => "1f46a",
123
+ ":two_men_holding_hands:" => "1f46c",
124
+ ":two_women_holding_hands:" => "1f46d",
125
+ ":dancer:" => "1f483",
126
+ ":dancers:" => "1f46f",
127
+ ":ok_woman:" => "1f646",
128
+ ":no_good:" => "1f645",
129
+ ":information_desk_person:" => "1f481",
130
+ ":raised_hand:" => "1f64b",
131
+ ":bride_with_veil:" => "1f470",
132
+ ":person_with_pouting_face:" => "1f64e",
133
+ ":person_frowning:" => "1f64d",
134
+ ":bow:" => "1f647",
135
+ ":couplekiss:" => "1f48f",
136
+ ":couple_with_heart:" => "1f491",
137
+ ":massage:" => "1f486",
138
+ ":haircut:" => "1f487",
139
+ ":nail_care:" => "1f485",
140
+ ":boy:" => "1f466",
141
+ ":girl:" => "1f467",
142
+ ":woman:" => "1f469",
143
+ ":man:" => "1f468",
144
+ ":baby:" => "1f476",
145
+ ":older_woman:" => "1f475",
146
+ ":older_man:" => "1f474",
147
+ ":person_with_blond_hair:" => "1f471",
148
+ ":man_with_gua_pi_mao:" => "1f472",
149
+ ":man_with_turban:" => "1f473",
150
+ ":construction_worker:" => "1f477",
151
+ ":cop:" => "1f46e",
152
+ ":angel:" => "1f47c",
153
+ ":princess:" => "1f478",
154
+ ":smiley_cat:" => "1f63a",
155
+ ":smile_cat:" => "1f638",
156
+ ":heart_eyes_cat:" => "1f63b",
157
+ ":kissing_cat:" => "1f63d",
158
+ ":smirk_cat:" => "1f63c",
159
+ ":scream_cat:" => "1f640",
160
+ ":crying_cat_face:" => "1f63f",
161
+ ":joy_cat:" => "1f639",
162
+ ":pouting_cat:" => "1f63e",
163
+ ":japanese_ogre:" => "1f479",
164
+ ":japanese_goblin:" => "1f47a",
165
+ ":see_no_evil:" => "1f648",
166
+ ":hear_no_evil:" => "1f649",
167
+ ":speak_no_evil:" => "1f64a",
168
+ ":guardsman:" => "1f482",
169
+ ":skull:" => "1f480",
170
+ ":feet:" => "1f463",
171
+ ":lips:" => "1f444",
172
+ ":kiss:" => "1f48b",
173
+ ":droplet:" => "1f4a7",
174
+ ":ear:" => "1f442",
175
+ ":eyes:" => "1f440",
176
+ ":nose:" => "1f443",
177
+ ":tongue:" => "1f445",
178
+ ":love_letter:" => "1f48c",
179
+ ":bust_in_silhouette:" => "1f464",
180
+ ":busts_in_silhouette:" => "1f465",
181
+ ":speech_balloon:" => "1f4ac",
182
+ ":thought_balloon:" => "1f4ad",
183
+ ":sunny:" => "2600",
184
+ ":umbrella:" => "2614",
185
+ ":cloud:" => "2601",
186
+ ":snowflake:" => "2744",
187
+ ":snowman:" => "26c4",
188
+ ":zap:" => "26a1",
189
+ ":cyclone:" => "1f300",
190
+ ":foggy:" => "1f301",
191
+ ":ocean:" => "1f30a",
192
+ ":cat:" => "1f431",
193
+ ":dog:" => "1f436",
194
+ ":mouse:" => "1f42d",
195
+ ":hamster:" => "1f439",
196
+ ":rabbit:" => "1f430",
197
+ ":wolf:" => "1f43a",
198
+ ":frog:" => "1f438",
199
+ ":tiger:" => "1f42f",
200
+ ":koala:" => "1f428",
201
+ ":bear:" => "1f43b",
202
+ ":pig:" => "1f437",
203
+ ":pig_nose:" => "1f43d",
204
+ ":cow:" => "1f42e",
205
+ ":boar:" => "1f417",
206
+ ":monkey_face:" => "1f435",
207
+ ":monkey:" => "1f412",
208
+ ":horse:" => "1f434",
209
+ ":racehorse:" => "1f40e",
210
+ ":camel:" => "1f42b",
211
+ ":sheep:" => "1f411",
212
+ ":elephant:" => "1f418",
213
+ ":panda_face:" => "1f43c",
214
+ ":snake:" => "1f40d",
215
+ ":bird:" => "1f426",
216
+ ":baby_chick:" => "1f424",
217
+ ":hatched_chick:" => "1f425",
218
+ ":hatching_chick:" => "1f423",
219
+ ":chicken:" => "1f414",
220
+ ":penguin:" => "1f427",
221
+ ":turtle:" => "1f422",
222
+ ":bug:" => "1f41b",
223
+ ":honeybee:" => "1f41d",
224
+ ":ant:" => "1f41c",
225
+ ":beetle:" => "1f41e",
226
+ ":snail:" => "1f40c",
227
+ ":octopus:" => "1f419",
228
+ ":tropical_fish:" => "1f420",
229
+ ":fish:" => "1f41f",
230
+ ":whale:" => "1f433",
231
+ ":whale2:" => "1f40b",
232
+ ":dolphin:" => "1f42c",
233
+ ":cow2:" => "1f404",
234
+ ":ram:" => "1f40f",
235
+ ":rat:" => "1f400",
236
+ ":water_buffalo:" => "1f403",
237
+ ":tiger2:" => "1f405",
238
+ ":rabbit2:" => "1f407",
239
+ ":dragon:" => "1f409",
240
+ ":goat:" => "1f410",
241
+ ":rooster:" => "1f413",
242
+ ":dog2:" => "1f415",
243
+ ":pig2:" => "1f416",
244
+ ":mouse2:" => "1f401",
245
+ ":ox:" => "1f402",
246
+ ":dragon_face:" => "1f432",
247
+ ":blowfish:" => "1f421",
248
+ ":crocodile:" => "1f40a",
249
+ ":dromedary_camel:" => "1f42a",
250
+ ":leopard:" => "1f406",
251
+ ":cat2:" => "1f408",
252
+ ":poodle:" => "1f429",
253
+ ":paw_prints:" => "1f43e",
254
+ ":bouquet:" => "1f490",
255
+ ":cherry_blossom:" => "1f338",
256
+ ":tulip:" => "1f337",
257
+ ":four_leaf_clover:" => "1f340",
258
+ ":rose:" => "1f339",
259
+ ":sunflower:" => "1f33b",
260
+ ":hibiscus:" => "1f33a",
261
+ ":maple_leaf:" => "1f341",
262
+ ":leaves:" => "1f343",
263
+ ":fallen_leaf:" => "1f342",
264
+ ":herb:" => "1f33f",
265
+ ":mushroom:" => "1f344",
266
+ ":cactus:" => "1f335",
267
+ ":palm_tree:" => "1f334",
268
+ ":evergreen_tree:" => "1f332",
269
+ ":deciduous_tree:" => "1f333",
270
+ ":chestnut:" => "1f330",
271
+ ":seedling:" => "1f331",
272
+ ":blossom:" => "1f33c",
273
+ ":ear_of_rice:" => "1f33e",
274
+ ":shell:" => "1f41a",
275
+ ":globe_with_meridians:" => "1f310",
276
+ ":sun_with_face:" => "1f31e",
277
+ ":full_moon_with_face:" => "1f31d",
278
+ ":new_moon_with_face:" => "1f31a",
279
+ ":new_moon:" => "1f311",
280
+ ":waxing_crescent_moon:" => "1f312",
281
+ ":first_quarter_moon:" => "1f313",
282
+ ":waxing_gibbous_moon:" => "1f314",
283
+ ":full_moon:" => "1f315",
284
+ ":waning_gibbous_moon:" => "1f316",
285
+ ":last_quarter_moon:" => "1f317",
286
+ ":waning_crescent_moon:" => "1f318",
287
+ ":last_quarter_moon_with_face:" => "1f31c",
288
+ ":first_quarter_moon_with_face:" => "1f31b",
289
+ ":moon:" => "1f319",
290
+ ":earth_africa:" => "1f30d",
291
+ ":earth_americas:" => "1f30e",
292
+ ":earth_asia:" => "1f30f",
293
+ ":volcano:" => "1f30b",
294
+ ":milky_way:" => "1f30c",
295
+ ":partly_sunny:" => "26c5",
296
+ ":bamboo:" => "1f38d",
297
+ ":gift_heart:" => "1f49d",
298
+ ":dolls:" => "1f38e",
299
+ ":school_satchel:" => "1f392",
300
+ ":mortar_board:" => "1f393",
301
+ ":flags:" => "1f38f",
302
+ ":fireworks:" => "1f386",
303
+ ":sparkler:" => "1f387",
304
+ ":wind_chime:" => "1f390",
305
+ ":rice_scene:" => "1f391",
306
+ ":jack_o_lantern:" => "1f383",
307
+ ":ghost:" => "1f47b",
308
+ ":santa:" => "1f385",
309
+ ":8ball:" => "1f3b1",
310
+ ":alarm_clock:" => "23f0",
311
+ ":apple:" => "1f34e",
312
+ ":art:" => "1f3a8",
313
+ ":baby_bottle:" => "1f37c",
314
+ ":balloon:" => "1f388",
315
+ ":banana:" => "1f34c",
316
+ ":bar_chart:" => "1f4ca",
317
+ ":baseball:" => "26be",
318
+ ":basketball:" => "1f3c0",
319
+ ":bath:" => "1f6c0",
320
+ ":bathtub:" => "1f6c1",
321
+ ":battery:" => "1f50b",
322
+ ":beer:" => "1f37a",
323
+ ":beers:" => "1f37b",
324
+ ":bell:" => "1f514",
325
+ ":bento:" => "1f371",
326
+ ":bicyclist:" => "1f6b4",
327
+ ":bikini:" => "1f459",
328
+ ":birthday:" => "1f382",
329
+ ":black_joker:" => "1f0cf",
330
+ ":black_nib:" => "2712",
331
+ ":blue_book:" => "1f4d8",
332
+ ":bomb:" => "1f4a3",
333
+ ":bookmark:" => "1f516",
334
+ ":bookmark_tabs:" => "1f4d1",
335
+ ":books:" => "1f4da",
336
+ ":boot:" => "1f462",
337
+ ":bowling:" => "1f3b3",
338
+ ":bread:" => "1f35e",
339
+ ":briefcase:" => "1f4bc",
340
+ ":bulb:" => "1f4a1",
341
+ ":cake:" => "1f370",
342
+ ":calendar:" => "1f4c6",
343
+ ":calling:" => "1f4f2",
344
+ ":camera:" => "1f4f7",
345
+ ":candy:" => "1f36c",
346
+ ":card_index:" => "1f4c7",
347
+ ":cd:" => "1f4bf",
348
+ ":chart_with_downwards_trend:" => "1f4c9",
349
+ ":chart_with_upwards_trend:" => "1f4c8",
350
+ ":cherries:" => "1f352",
351
+ ":chocolate_bar:" => "1f36b",
352
+ ":christmas_tree:" => "1f384",
353
+ ":clapper:" => "1f3ac",
354
+ ":clipboard:" => "1f4cb",
355
+ ":closed_book:" => "1f4d5",
356
+ ":closed_lock_with_key:" => "1f510",
357
+ ":closed_umbrella:" => "1f302",
358
+ ":clubs:" => "2663",
359
+ ":cocktail:" => "1f378",
360
+ ":coffee:" => "2615",
361
+ ":computer:" => "1f4bb",
362
+ ":confetti_ball:" => "1f38a",
363
+ ":cookie:" => "1f36a",
364
+ ":corn:" => "1f33d",
365
+ ":credit_card:" => "1f4b3",
366
+ ":crown:" => "1f451",
367
+ ":crystal_ball:" => "1f52e",
368
+ ":curry:" => "1f35b",
369
+ ":custard:" => "1f36e",
370
+ ":dango:" => "1f361",
371
+ ":dart:" => "1f3af",
372
+ ":date:" => "1f4c5",
373
+ ":diamonds:" => "2666",
374
+ ":dollar:" => "1f4b5",
375
+ ":door:" => "1f6aa",
376
+ ":doughnut:" => "1f369",
377
+ ":dress:" => "1f457",
378
+ ":dvd:" => "1f4c0",
379
+ ":e_mail:" => "1f4e7",
380
+ ":egg:" => "1f373",
381
+ ":eggplant:" => "1f346",
382
+ ":electric_plug:" => "1f50c",
383
+ ":email:" => "2709",
384
+ ":euro:" => "1f4b6",
385
+ ":eyeglasses:" => "1f453",
386
+ ":fax:" => "1f4e0",
387
+ ":file_folder:" => "1f4c1",
388
+ ":fish_cake:" => "1f365",
389
+ ":fishing_pole_and_fish:" => "1f3a3",
390
+ ":flashlight:" => "1f526",
391
+ ":floppy_disk:" => "1f4be",
392
+ ":flower_playing_cards:" => "1f3b4",
393
+ ":football:" => "1f3c8",
394
+ ":fork_and_knife:" => "1f374",
395
+ ":fried_shrimp:" => "1f364",
396
+ ":fries:" => "1f35f",
397
+ ":game_die:" => "1f3b2",
398
+ ":gem:" => "1f48e",
399
+ ":gift:" => "1f381",
400
+ ":golf:" => "26f3",
401
+ ":grapes:" => "1f347",
402
+ ":green_apple:" => "1f34f",
403
+ ":green_book:" => "1f4d7",
404
+ ":guitar:" => "1f3b8",
405
+ ":gun:" => "1f52b",
406
+ ":hamburger:" => "1f354",
407
+ ":hammer:" => "1f528",
408
+ ":handbag:" => "1f45c",
409
+ ":headphones:" => "1f3a7",
410
+ ":hearts:" => "2665",
411
+ ":high_brightness:" => "1f506",
412
+ ":high_heel:" => "1f460",
413
+ ":hocho:" => "1f52a",
414
+ ":honey_pot:" => "1f36f",
415
+ ":horse_racing:" => "1f3c7",
416
+ ":hourglass:" => "231b",
417
+ ":hourglass_flowing_sand:" => "23f3",
418
+ ":ice_cream:" => "1f368",
419
+ ":icecream:" => "1f366",
420
+ ":inbox_tray:" => "1f4e5",
421
+ ":incoming_envelope:" => "1f4e8",
422
+ ":iphone:" => "1f4f1",
423
+ ":jeans:" => "1f456",
424
+ ":key:" => "1f511",
425
+ ":kimono:" => "1f458",
426
+ ":ledger:" => "1f4d2",
427
+ ":lemon:" => "1f34b",
428
+ ":lipstick:" => "1f484",
429
+ ":lock:" => "1f512",
430
+ ":lock_with_ink_pen:" => "1f50f",
431
+ ":lollipop:" => "1f36d",
432
+ ":loop:" => "27bf",
433
+ ":loudspeaker:" => "1f4e2",
434
+ ":low_brightness:" => "1f505",
435
+ ":mag:" => "1f50d",
436
+ ":mag_right:" => "1f50e",
437
+ ":mahjong:" => "1f004",
438
+ ":mailbox:" => "1f4eb",
439
+ ":mailbox_closed:" => "1f4ea",
440
+ ":mailbox_with_mail:" => "1f4ec",
441
+ ":mailbox_with_no_mail:" => "1f4ed",
442
+ ":mans_shoe:" => "1f45e",
443
+ ":meat_on_bone:" => "1f356",
444
+ ":mega:" => "1f4e3",
445
+ ":melon:" => "1f348",
446
+ ":memo:" => "1f4dd",
447
+ ":microphone:" => "1f3a4",
448
+ ":microscope:" => "1f52c",
449
+ ":minidisc:" => "1f4bd",
450
+ ":money_with_wings:" => "1f4b8",
451
+ ":moneybag:" => "1f4b0",
452
+ ":mountain_bicyclist:" => "1f6b5",
453
+ ":movie_camera:" => "1f3a5",
454
+ ":musical_keyboard:" => "1f3b9",
455
+ ":musical_score:" => "1f3bc",
456
+ ":mute:" => "1f507",
457
+ ":name_badge:" => "1f4db",
458
+ ":necktie:" => "1f454",
459
+ ":newspaper:" => "1f4f0",
460
+ ":no_bell:" => "1f515",
461
+ ":notebook:" => "1f4d3",
462
+ ":notebook_with_decorative_cover:" => "1f4d4",
463
+ ":nut_and_bolt:" => "1f529",
464
+ ":oden:" => "1f362",
465
+ ":open_file_folder:" => "1f4c2",
466
+ ":orange_book:" => "1f4d9",
467
+ ":outbox_tray:" => "1f4e4",
468
+ ":page_facing_up:" => "1f4c4",
469
+ ":page_with_curl:" => "1f4c3",
470
+ ":pager:" => "1f4df",
471
+ ":paperclip:" => "1f4ce",
472
+ ":peach:" => "1f351",
473
+ ":pear:" => "1f350",
474
+ ":pencil2:" => "270f",
475
+ ":phone:" => "260e",
476
+ ":pill:" => "1f48a",
477
+ ":pineapple:" => "1f34d",
478
+ ":pizza:" => "1f355",
479
+ ":postal_horn:" => "1f4ef",
480
+ ":postbox:" => "1f4ee",
481
+ ":pouch:" => "1f45d",
482
+ ":poultry_leg:" => "1f357",
483
+ ":pound:" => "1f4b7",
484
+ ":purse:" => "1f45b",
485
+ ":pushpin:" => "1f4cc",
486
+ ":radio:" => "1f4fb",
487
+ ":ramen:" => "1f35c",
488
+ ":ribbon:" => "1f380",
489
+ ":rice:" => "1f35a",
490
+ ":rice_ball:" => "1f359",
491
+ ":rice_cracker:" => "1f358",
492
+ ":ring:" => "1f48d",
493
+ ":rugby_football:" => "1f3c9",
494
+ ":running_shirt_with_sash:" => "1f3bd",
495
+ ":sake:" => "1f376",
496
+ ":sandal:" => "1f461",
497
+ ":satellite:" => "1f4e1",
498
+ ":saxophone:" => "1f3b7",
499
+ ":scissors:" => "2702",
500
+ ":scroll:" => "1f4dc",
501
+ ":seat:" => "1f4ba",
502
+ ":shaved_ice:" => "1f367",
503
+ ":shirt:" => "1f455",
504
+ ":shower:" => "1f6bf",
505
+ ":ski:" => "1f3bf",
506
+ ":smoking:" => "1f6ac",
507
+ ":snowboarder:" => "1f3c2",
508
+ ":soccer:" => "26bd",
509
+ ":sound:" => "1f509",
510
+ ":space_invader:" => "1f47e",
511
+ ":spades:" => "2660",
512
+ ":spaghetti:" => "1f35d",
513
+ ":speaker:" => "1f50a",
514
+ ":stew:" => "1f372",
515
+ ":straight_ruler:" => "1f4cf",
516
+ ":strawberry:" => "1f353",
517
+ ":surfer:" => "1f3c4",
518
+ ":sushi:" => "1f363",
519
+ ":sweet_potato:" => "1f360",
520
+ ":swimmer:" => "1f3ca",
521
+ ":syringe:" => "1f489",
522
+ ":tada:" => "1f389",
523
+ ":tanabata_tree:" => "1f38b",
524
+ ":tangerine:" => "1f34a",
525
+ ":tea:" => "1f375",
526
+ ":telephone_receiver:" => "1f4de",
527
+ ":telescope:" => "1f52d",
528
+ ":tennis:" => "1f3be",
529
+ ":toilet:" => "1f6bd",
530
+ ":tomato:" => "1f345",
531
+ ":tophat:" => "1f3a9",
532
+ ":triangular_ruler:" => "1f4d0",
533
+ ":trophy:" => "1f3c6",
534
+ ":tropical_drink:" => "1f379",
535
+ ":trumpet:" => "1f3ba",
536
+ ":tv:" => "1f4fa",
537
+ ":unlock:" => "1f513",
538
+ ":vhs:" => "1f4fc",
539
+ ":video_camera:" => "1f4f9",
540
+ ":video_game:" => "1f3ae",
541
+ ":violin:" => "1f3bb",
542
+ ":watch:" => "231a",
543
+ ":watermelon:" => "1f349",
544
+ ":wine_glass:" => "1f377",
545
+ ":womans_clothes:" => "1f45a",
546
+ ":womans_hat:" => "1f452",
547
+ ":wrench:" => "1f527",
548
+ ":yen:" => "1f4b4",
549
+ ":aerial_tramway:" => "1f6a1",
550
+ ":airplane:" => "2708",
551
+ ":ambulance:" => "1f691",
552
+ ":anchor:" => "2693",
553
+ ":articulated_lorry:" => "1f69b",
554
+ ":atm:" => "1f3e7",
555
+ ":bank:" => "1f3e6",
556
+ ":barber:" => "1f488",
557
+ ":beginner:" => "1f530",
558
+ ":bike:" => "1f6b2",
559
+ ":blue_car:" => "1f699",
560
+ ":boat:" => "26f5",
561
+ ":bridge_at_night:" => "1f309",
562
+ ":bullettrain_front:" => "1f685",
563
+ ":bullettrain_side:" => "1f684",
564
+ ":bus:" => "1f68c",
565
+ ":busstop:" => "1f68f",
566
+ ":car:" => "1f697",
567
+ ":carousel_horse:" => "1f3a0",
568
+ ":checkered_flag:" => "1f3c1",
569
+ ":church:" => "26ea",
570
+ ":circus_tent:" => "1f3aa",
571
+ ":city_sunrise:" => "1f307",
572
+ ":city_sunset:" => "1f306",
573
+ ":construction:" => "1f6a7",
574
+ ":convenience_store:" => "1f3ea",
575
+ ":crossed_flags:" => "1f38c",
576
+ ":department_store:" => "1f3ec",
577
+ ":european_castle:" => "1f3f0",
578
+ ":european_post_office:" => "1f3e4",
579
+ ":factory:" => "1f3ed",
580
+ ":ferris_wheel:" => "1f3a1",
581
+ ":fire_engine:" => "1f692",
582
+ ":fountain:" => "26f2",
583
+ ":fuelpump:" => "26fd",
584
+ ":helicopter:" => "1f681",
585
+ ":hospital:" => "1f3e5",
586
+ ":hotel:" => "1f3e8",
587
+ ":hotsprings:" => "2668",
588
+ ":house:" => "1f3e0",
589
+ ":house_with_garden:" => "1f3e1",
590
+ ":japan:" => "1f5fe",
591
+ ":japanese_castle:" => "1f3ef",
592
+ ":light_rail:" => "1f688",
593
+ ":love_hotel:" => "1f3e9",
594
+ ":minibus:" => "1f690",
595
+ ":monorail:" => "1f69d",
596
+ ":mount_fuji:" => "1f5fb",
597
+ ":mountain_cableway:" => "1f6a0",
598
+ ":mountain_railway:" => "1f69e",
599
+ ":moyai:" => "1f5ff",
600
+ ":office:" => "1f3e2",
601
+ ":oncoming_automobile:" => "1f698",
602
+ ":oncoming_bus:" => "1f68d",
603
+ ":oncoming_police_car:" => "1f694",
604
+ ":oncoming_taxi:" => "1f696",
605
+ ":performing_arts:" => "1f3ad",
606
+ ":police_car:" => "1f693",
607
+ ":post_office:" => "1f3e3",
608
+ ":railway_car:" => "1f683",
609
+ ":rainbow:" => "1f308",
610
+ ":rocket:" => "1f680",
611
+ ":roller_coaster:" => "1f3a2",
612
+ ":rotating_light:" => "1f6a8",
613
+ ":round_pushpin:" => "1f4cd",
614
+ ":rowboat:" => "1f6a3",
615
+ ":school:" => "1f3eb",
616
+ ":ship:" => "1f6a2",
617
+ ":slot_machine:" => "1f3b0",
618
+ ":speedboat:" => "1f6a4",
619
+ ":stars:" => "1f303",
620
+ ":station:" => "1f689",
621
+ ":statue_of_liberty:" => "1f5fd",
622
+ ":steam_locomotive:" => "1f682",
623
+ ":sunrise:" => "1f305",
624
+ ":sunrise_over_mountains:" => "1f304",
625
+ ":suspension_railway:" => "1f69f",
626
+ ":taxi:" => "1f695",
627
+ ":tent:" => "26fa",
628
+ ":ticket:" => "1f3ab",
629
+ ":tokyo_tower:" => "1f5fc",
630
+ ":tractor:" => "1f69c",
631
+ ":traffic_light:" => "1f6a5",
632
+ ":train2:" => "1f686",
633
+ ":tram:" => "1f68a",
634
+ ":triangular_flag_on_post:" => "1f6a9",
635
+ ":trolleybus:" => "1f68e",
636
+ ":truck:" => "1f69a",
637
+ ":vertical_traffic_light:" => "1f6a6",
638
+ ":warning:" => "26a0",
639
+ ":wedding:" => "1f492",
640
+ ":jp:" => "1f1ef-1f1f5",
641
+ ":kr:" => "1f1f0-1f1f7",
642
+ ":cn:" => "1f1e8-1f1f3",
643
+ ":us:" => "1f1fa-1f1f8",
644
+ ":fr:" => "1f1eb-1f1f7",
645
+ ":es:" => "1f1ea-1f1f8",
646
+ ":it:" => "1f1ee-1f1f9",
647
+ ":ru:" => "1f1f7-1f1fa",
648
+ ":gb:" => "1f1ec-1f1e7",
649
+ ":de:" => "1f1e9-1f1ea",
650
+ ":100:" => "1f4af",
651
+ ":1234:" => "1f522",
652
+ ":a:" => "1f170",
653
+ ":ab:" => "1f18e",
654
+ ":abc:" => "1f524",
655
+ ":abcd:" => "1f521",
656
+ ":accept:" => "1f251",
657
+ ":aquarius:" => "2652",
658
+ ":aries:" => "2648",
659
+ ":arrow_backward:" => "25c0",
660
+ ":arrow_double_down:" => "23ec",
661
+ ":arrow_double_up:" => "23eb",
662
+ ":arrow_down:" => "2b07",
663
+ ":arrow_down_small:" => "1f53d",
664
+ ":arrow_forward:" => "25b6",
665
+ ":arrow_heading_down:" => "2935",
666
+ ":arrow_heading_up:" => "2934",
667
+ ":arrow_left:" => "2b05",
668
+ ":arrow_lower_left:" => "2199",
669
+ ":arrow_lower_right:" => "2198",
670
+ ":arrow_right:" => "27a1",
671
+ ":arrow_right_hook:" => "21aa",
672
+ ":arrow_up:" => "2b06",
673
+ ":arrow_up_down:" => "2195",
674
+ ":arrow_up_small:" => "1f53c",
675
+ ":arrow_upper_left:" => "2196",
676
+ ":arrow_upper_right:" => "2197",
677
+ ":arrows_clockwise:" => "1f503",
678
+ ":arrows_counterclockwise:" => "1f504",
679
+ ":b:" => "1f171",
680
+ ":baby_symbol:" => "1f6bc",
681
+ ":baggage_claim:" => "1f6c4",
682
+ ":ballot_box_with_check:" => "2611",
683
+ ":bangbang:" => "203c",
684
+ ":black_circle:" => "26ab",
685
+ ":black_square_button:" => "1f532",
686
+ ":cancer:" => "264b",
687
+ ":capital_abcd:" => "1f520",
688
+ ":capricorn:" => "2651",
689
+ ":chart:" => "1f4b9",
690
+ ":children_crossing:" => "1f6b8",
691
+ ":cinema:" => "1f3a6",
692
+ ":cl:" => "1f191",
693
+ ":clock1:" => "1f550",
694
+ ":clock10:" => "1f559",
695
+ ":clock1030:" => "1f565",
696
+ ":clock11:" => "1f55a",
697
+ ":clock1130:" => "1f566",
698
+ ":clock12:" => "1f55b",
699
+ ":clock1230:" => "1f567",
700
+ ":clock130:" => "1f55c",
701
+ ":clock2:" => "1f551",
702
+ ":clock230:" => "1f55d",
703
+ ":clock3:" => "1f552",
704
+ ":clock330:" => "1f55e",
705
+ ":clock4:" => "1f553",
706
+ ":clock430:" => "1f55f",
707
+ ":clock5:" => "1f554",
708
+ ":clock530:" => "1f560",
709
+ ":clock6:" => "1f555",
710
+ ":clock630:" => "1f561",
711
+ ":clock7:" => "1f556",
712
+ ":clock730:" => "1f562",
713
+ ":clock8:" => "1f557",
714
+ ":clock830:" => "1f563",
715
+ ":clock9:" => "1f558",
716
+ ":clock930:" => "1f564",
717
+ ":congratulations:" => "3297",
718
+ ":cool:" => "1f192",
719
+ ":copyright:" => "a9",
720
+ ":curly_loop:" => "27b0",
721
+ ":currency_exchange:" => "1f4b1",
722
+ ":customs:" => "1f6c3",
723
+ ":diamond_shape_with_a_dot_inside:" => "1f4a0",
724
+ ":do_not_litter:" => "1f6af",
725
+ ":eight:" => "38-20e3",
726
+ ":eight_pointed_black_star:" => "2734",
727
+ ":eight_spoked_asterisk:" => "2733",
728
+ ":end:" => "1f51a",
729
+ ":fast_forward:" => "23e9",
730
+ ":five:" => "35-20e3",
731
+ ":four:" => "34-20e3",
732
+ ":free:" => "1f193",
733
+ ":gemini:" => "264a",
734
+ ":hash:" => "23-20e3",
735
+ ":heart_decoration:" => "1f49f",
736
+ ":heavy_check_mark:" => "2714",
737
+ ":heavy_division_sign:" => "2797",
738
+ ":heavy_dollar_sign:" => "1f4b2",
739
+ ":heavy_minus_sign:" => "2796",
740
+ ":heavy_multiplication_x:" => "2716",
741
+ ":heavy_plus_sign:" => "2795",
742
+ ":id:" => "1f194",
743
+ ":ideograph_advantage:" => "1f250",
744
+ ":information_source:" => "2139",
745
+ ":interrobang:" => "2049",
746
+ ":keycap_ten:" => "1f51f",
747
+ ":koko:" => "1f201",
748
+ ":large_blue_circle:" => "1f535",
749
+ ":large_blue_diamond:" => "1f537",
750
+ ":large_orange_diamond:" => "1f536",
751
+ ":left_luggage:" => "1f6c5",
752
+ ":left_right_arrow:" => "2194",
753
+ ":leftwards_arrow_with_hook:" => "21a9",
754
+ ":leo:" => "264c",
755
+ ":libra:" => "264e",
756
+ ":link:" => "1f517",
757
+ ":m:" => "24c2",
758
+ ":mens:" => "1f6b9",
759
+ ":metro:" => "1f687",
760
+ ":mobile_phone_off:" => "1f4f4",
761
+ ":negative_squared_cross_mark:" => "274e",
762
+ ":new:" => "1f195",
763
+ ":ng:" => "1f196",
764
+ ":nine:" => "39-20e3",
765
+ ":no_bicycles:" => "1f6b3",
766
+ ":no_entry:" => "26d4",
767
+ ":no_entry_sign:" => "1f6ab",
768
+ ":no_mobile_phones:" => "1f4f5",
769
+ ":no_pedestrians:" => "1f6b7",
770
+ ":no_smoking:" => "1f6ad",
771
+ ":non_potable_water:" => "1f6b1",
772
+ ":o:" => "2b55",
773
+ ":o2:" => "1f17e",
774
+ ":ok:" => "1f197",
775
+ ":on:" => "1f51b",
776
+ ":one:" => "31-20e3",
777
+ ":ophiuchus:" => "26ce",
778
+ ":parking:" => "1f17f",
779
+ ":part_alternation_mark:" => "303d",
780
+ ":passport_control:" => "1f6c2",
781
+ ":pisces:" => "2653",
782
+ ":potable_water:" => "1f6b0",
783
+ ":put_litter_in_its_place:" => "1f6ae",
784
+ ":radio_button:" => "1f518",
785
+ ":recycle:" => "267b",
786
+ ":red_circle:" => "1f534",
787
+ ":registered:" => "ae",
788
+ ":repeat:" => "1f501",
789
+ ":repeat_one:" => "1f502",
790
+ ":restroom:" => "1f6bb",
791
+ ":rewind:" => "23ea",
792
+ ":sa:" => "1f202",
793
+ ":sagittarius:" => "2650",
794
+ ":scorpius:" => "264f",
795
+ ":secret:" => "3299",
796
+ ":seven:" => "37-20e3",
797
+ ":signal_strength:" => "1f4f6",
798
+ ":six:" => "36-20e3",
799
+ ":six_pointed_star:" => "1f52f",
800
+ ":small_blue_diamond:" => "1f539",
801
+ ":small_orange_diamond:" => "1f538",
802
+ ":small_red_triangle:" => "1f53a",
803
+ ":small_red_triangle_down:" => "1f53b",
804
+ ":soon:" => "1f51c",
805
+ ":sos:" => "1f198",
806
+ ":symbols:" => "1f523",
807
+ ":taurus:" => "2649",
808
+ ":three:" => "33-20e3",
809
+ ":tm:" => "2122",
810
+ ":top:" => "1f51d",
811
+ ":trident:" => "1f531",
812
+ ":twisted_rightwards_arrows:" => "1f500",
813
+ ":two:" => "32-20e3",
814
+ ":u5272:" => "1f239",
815
+ ":u5408:" => "1f234",
816
+ ":u55b6:" => "1f23a",
817
+ ":u6307:" => "1f22f",
818
+ ":u6708:" => "1f237",
819
+ ":u6709:" => "1f236",
820
+ ":u6e80:" => "1f235",
821
+ ":u7121:" => "1f21a",
822
+ ":u7533:" => "1f238",
823
+ ":u7981:" => "1f232",
824
+ ":u7a7a:" => "1f233",
825
+ ":underage:" => "1f51e",
826
+ ":up:" => "1f199",
827
+ ":vibration_mode:" => "1f4f3",
828
+ ":virgo:" => "264d",
829
+ ":vs:" => "1f19a",
830
+ ":wavy_dash:" => "3030",
831
+ ":wc:" => "1f6be",
832
+ ":wheelchair:" => "267f",
833
+ ":white_check_mark:" => "2705",
834
+ ":white_circle:" => "26aa",
835
+ ":white_flower:" => "1f4ae",
836
+ ":white_square_button:" => "1f533",
837
+ ":womens:" => "1f6ba",
838
+ ":x:" => "274c",
839
+ ":zero:" => "30-20e3"
840
+ }.each { | k, v| k.freeze; v.freeze }.freeze
841
+
842
+ # Hex to string map
843
+ #
844
+ # This hash is frozen.
845
+ #
846
+ # @example Usage
847
+ #
848
+ # ICODES["1f60d"] # => ":heart_eyes:"
849
+ # ICODES["1f4d4"] # => ":notebook_with_decorative_cover:"
850
+ #
851
+ # @return [Hash<String => String>]
852
+ ICODES = CODES.invert.freeze
853
+ end