Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e85635643 | ||
|
|
df1b6fac6e | ||
|
|
eda537e1a9 | ||
|
|
9967b2ef28 | ||
|
|
d41a53d459 | ||
|
|
06a2df3427 | ||
|
|
757584d2b9 | ||
|
|
f5092b7aa4 | ||
|
|
8a9a8572aa | ||
|
|
3d35b9f862 | ||
|
|
5dea160045 | ||
|
|
6984758915 | ||
|
|
29c25127d0 | ||
|
|
701f434b60 | ||
|
|
112cc8fb8b | ||
|
|
5162959546 | ||
|
|
75ada7cc89 | ||
|
|
0bb789e3e6 | ||
|
|
9beb9c0172 | ||
|
|
ea70c98946 | ||
|
|
7d416739ba | ||
|
|
96295d7871 | ||
|
|
584939127e | ||
|
|
680d1bc59b | ||
|
|
2c58377420 | ||
|
|
3bb3cea8d3 | ||
|
|
5e6dcae949 | ||
|
|
2aaf9693a9 | ||
|
|
0d1a82dc6a | ||
|
|
6b9cdd6eb5 | ||
|
|
75f837e6b5 | ||
|
|
c2286e7c5b | ||
|
|
3e21d95409 | ||
|
|
a86999a7f1 | ||
|
|
b7c2b8e4d8 | ||
|
|
1212951bc6 | ||
|
|
b1736a387c | ||
|
|
f9aba615af | ||
|
|
2741be5eb6 |
@@ -1,5 +1,7 @@
|
||||
script: script/test
|
||||
rvm:
|
||||
- 1.9.3
|
||||
- 2.1.2
|
||||
- 2.2
|
||||
notifications:
|
||||
email: false
|
||||
|
||||
49
CONTRIBUTING.md
Normal file
@@ -0,0 +1,49 @@
|
||||
Our emoji set is based off Apple's emoji character palette, plus some custom
|
||||
emoji such as :octocat: :shipit: :metal:.
|
||||
|
||||
Some useful tools in development are:
|
||||
|
||||
```
|
||||
script/bootstrap
|
||||
```
|
||||
|
||||
Sets up the development environment. The prerequisites are:
|
||||
|
||||
* Ruby 1.9+
|
||||
* Bundler
|
||||
|
||||
```
|
||||
rake db:generate
|
||||
```
|
||||
|
||||
On OS X, this will rebuild the `db/Category-Emoji.json` file from the system
|
||||
one, pulling in any new emoji that Apple may have added in the meantime.
|
||||
|
||||
```
|
||||
script/test
|
||||
```
|
||||
|
||||
Runs the test suite, including the integrity test where we assert that we have
|
||||
covered each of Apple's emoji.
|
||||
|
||||
```
|
||||
script/regenerate
|
||||
```
|
||||
|
||||
Rebuilds the `db/emoji.json` file which is our main list of emoji: their
|
||||
canonical representations, descriptions, aliases, and tags. This requires OS X
|
||||
because Safari is used in the process to verify which character render as emoji
|
||||
and which render as ordinary Unicode glyphs from the current font.
|
||||
|
||||
```
|
||||
script/console
|
||||
```
|
||||
|
||||
Opens `irb` console with gemoji library preloded for experimentation.
|
||||
|
||||
```
|
||||
script/release
|
||||
```
|
||||
|
||||
For maintainers only: after the gemspec has been edited, this commits the
|
||||
change, tags a release, and pushes it to both GitHub and RubyGems.org.
|
||||
1
Gemfile
@@ -1,5 +1,6 @@
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "ttfunk", "~> 1.4.0"
|
||||
gem "rake"
|
||||
gem "minitest"
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
PATH
|
||||
remote: .
|
||||
specs:
|
||||
gemoji (2.0.1)
|
||||
gemoji (2.1.0)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
minitest (5.3.5)
|
||||
rake (10.3.2)
|
||||
ttfunk (1.4.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
@@ -16,3 +17,4 @@ DEPENDENCIES
|
||||
gemoji!
|
||||
minitest
|
||||
rake
|
||||
ttfunk (~> 1.4.0)
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
# Maintainers
|
||||
|
||||
## Releasing a new gem
|
||||
|
||||
If you are just adding new emoji or making a small fix, only increment the patch level "1.0.x". If you need to rename a ton of emojis or making any other radical (but still mostly backwards compatible changes), bump the minor version "1.x.x".
|
||||
|
||||
### Make a release commit
|
||||
|
||||
To prepare the release commit, edit the [gemoji.gemspec](https://github.com/github/gemoji/blob/master/gemoji.gemspec) `version` value. Then make a single commit with the description as "Gemoji 1.x.x". Finally, tag the commit with `v1.x.x`.
|
||||
|
||||
Example commit https://github.com/github/gemoji/commit/v1.0.0
|
||||
|
||||
```
|
||||
$ git ci -m "Gemoji 1.0.0"
|
||||
$ git tag v1.0.0
|
||||
$ git push
|
||||
$ git push --tags
|
||||
```
|
||||
|
||||
### Publish the gem
|
||||
|
||||
Build and push the new gem with
|
||||
|
||||
```
|
||||
$ gem build gemoji.gemspec
|
||||
$ gem push gemoji-1.0.0.gem
|
||||
```
|
||||
@@ -56,7 +56,7 @@ See the [Emoji cheat sheet](http://www.emoji-cheat-sheet.com) for more examples.
|
||||
module EmojiHelper
|
||||
def emojify(content)
|
||||
h(content).to_str.gsub(/:([\w+-]+):/) do |match|
|
||||
if emoji = Emoji.find_by_alias($1) { nil }
|
||||
if emoji = Emoji.find_by_alias($1)
|
||||
%(<img alt="#$1" src="#{asset_path("emoji/#{emoji.image_filename}")}" style="vertical-align:middle" width="20" height="20" />)
|
||||
else
|
||||
match
|
||||
|
||||
23
Rakefile
@@ -1,4 +1,5 @@
|
||||
require 'rake/testtask'
|
||||
require 'rake/extensiontask'
|
||||
|
||||
task :default => :test
|
||||
|
||||
@@ -27,3 +28,25 @@ end
|
||||
file 'db/NamesList.txt' do |t|
|
||||
system "curl -fsSL '#{nameslist_url}' -o '#{t.name}'"
|
||||
end
|
||||
|
||||
namespace :images do
|
||||
desc %(Extract PNG images from Apple's "Apple Color Emoji.ttf" font)
|
||||
task :extract do
|
||||
require 'emoji/extractor'
|
||||
gem_dir = File.dirname(File.realpath(__FILE__))
|
||||
Emoji::Extractor.new(64, "#{gem_dir}/images/emoji/unicode").extract!
|
||||
end
|
||||
end
|
||||
|
||||
namespace :c do
|
||||
task :headers do
|
||||
require 'emoji/tables'
|
||||
gem_dir = File.dirname(File.realpath(__FILE__))
|
||||
|
||||
File.open(File.join(gem_dir, "ext/gemoji/emoji.h"), "w") do |file|
|
||||
file.puts(Emoji::Tables.generate_length_tables)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Rake::ExtensionTask.new('gemoji')
|
||||
|
||||
13
db/aliases.applescript
Normal file
@@ -0,0 +1,13 @@
|
||||
set jsCode to "document.getElementById('output').value"
|
||||
set json to missing value
|
||||
|
||||
tell application "Safari"
|
||||
repeat
|
||||
set json to (do JavaScript jsCode in current tab of window 1)
|
||||
if (json is not missing value) then exit repeat
|
||||
delay 0.5
|
||||
end repeat
|
||||
close current tab of window 1
|
||||
end tell
|
||||
|
||||
return json
|
||||
@@ -13,6 +13,7 @@
|
||||
<script>
|
||||
const VARIATION_SELECTOR_15 = String.fromCharCode(0xfe0e);
|
||||
const VARIATION_SELECTOR_16 = String.fromCharCode(0xfe0f);
|
||||
const EMOJI_SIZE = 32
|
||||
|
||||
function detectAliases(db) {
|
||||
for (var i = 0; i < db.length; ++i) {
|
||||
@@ -22,23 +23,14 @@
|
||||
continue;
|
||||
}
|
||||
|
||||
var candidates = [];
|
||||
|
||||
if (raw.length === 1) {
|
||||
candidates.push(raw + VARIATION_SELECTOR_15);
|
||||
candidates.push(raw + VARIATION_SELECTOR_16);
|
||||
} else if (raw[raw.length - 1] === VARIATION_SELECTOR_16) {
|
||||
var base = raw.substr(0, raw.length - 1);
|
||||
candidates.push(base);
|
||||
candidates.push(base + VARIATION_SELECTOR_15);
|
||||
if (raw.indexOf(VARIATION_SELECTOR_16) > -1) {
|
||||
var candidates = [raw.replace(VARIATION_SELECTOR_16, ""), raw];
|
||||
} else {
|
||||
var candidates = [raw, raw + VARIATION_SELECTOR_16];
|
||||
}
|
||||
|
||||
var aliases = candidates.filter(isColorEmoji);
|
||||
if (aliases.length) {
|
||||
emoji.unicodes = aliases;
|
||||
} else {
|
||||
delete emoji.unicodes;
|
||||
}
|
||||
emoji.emoji = aliases[0];
|
||||
}
|
||||
|
||||
dump(db);
|
||||
@@ -52,14 +44,16 @@
|
||||
}
|
||||
|
||||
var canvas = document.createElement("canvas");
|
||||
canvas.width = canvas.height = EMOJI_SIZE;
|
||||
|
||||
function color(emoji, rgb) {
|
||||
var context = canvas.getContext("2d");
|
||||
context.clearRect(0, 0, 32, 32);
|
||||
context.clearRect(0, 0, canvas.width, canvas.height);
|
||||
context.fillStyle = rgb;
|
||||
context.textBaseline = "top";
|
||||
context.font = "32px Arial";
|
||||
context.font = EMOJI_SIZE+"px Arial";
|
||||
context.fillText(emoji, 0, 0);
|
||||
var data = context.getImageData(0, 0, 32, 32).data;
|
||||
var data = context.getImageData(0, 0, EMOJI_SIZE, EMOJI_SIZE).data;
|
||||
for (var i = 0; i < data.length; i += 4) {
|
||||
if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0) {
|
||||
continue;
|
||||
|
||||
@@ -52,19 +52,14 @@ end
|
||||
trap(:PIPE) { abort }
|
||||
|
||||
items = []
|
||||
variation = "\u{fe0f}".freeze
|
||||
|
||||
variation_codepoint = Emoji::VARIATION_SELECTOR_16.codepoints[0]
|
||||
|
||||
for emoji in Emoji.all
|
||||
unicodes = emoji.unicode_aliases.dup
|
||||
|
||||
item = {}
|
||||
|
||||
unless emoji.custom?
|
||||
variation_codepoint = variation.codepoints[0]
|
||||
chars = emoji.raw.codepoints.map { |code| UnicodeCharacter.fetch(code) unless code == variation_codepoint }.compact
|
||||
item[:emoji] = unicodes.shift
|
||||
item[:unicodes] = unicodes if unicodes.any?
|
||||
item[:emoji] = emoji.raw
|
||||
item[:description] = chars.map(&:description).join(' + ')
|
||||
end
|
||||
|
||||
|
||||
346
db/emoji.json
@@ -931,10 +931,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "✨"
|
||||
, "unicodes": [
|
||||
"✨︎"
|
||||
, "✨️"
|
||||
]
|
||||
, "description": "sparkles"
|
||||
, "aliases": [
|
||||
"sparkles"
|
||||
@@ -1126,10 +1122,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "✊"
|
||||
, "unicodes": [
|
||||
"✊︎"
|
||||
, "✊️"
|
||||
]
|
||||
, "description": "raised fist"
|
||||
, "aliases": [
|
||||
"fist"
|
||||
@@ -1161,10 +1153,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "✋"
|
||||
, "unicodes": [
|
||||
"✋︎"
|
||||
, "✋️"
|
||||
]
|
||||
, "description": "raised hand"
|
||||
, "aliases": [
|
||||
"hand"
|
||||
@@ -2916,10 +2904,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⭐️"
|
||||
, "unicodes": [
|
||||
"⭐"
|
||||
]
|
||||
"emoji": "⭐"
|
||||
, "description": "white medium star"
|
||||
, "aliases": [
|
||||
"star"
|
||||
@@ -2938,11 +2923,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⛅️"
|
||||
, "unicodes": [
|
||||
"⛅"
|
||||
, "⛅︎"
|
||||
]
|
||||
"emoji": "⛅"
|
||||
, "description": "sun behind cloud"
|
||||
, "aliases": [
|
||||
"partly_sunny"
|
||||
@@ -2962,10 +2943,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⚡️"
|
||||
, "unicodes": [
|
||||
"⚡"
|
||||
]
|
||||
"emoji": "⚡"
|
||||
, "description": "high voltage sign"
|
||||
, "aliases": [
|
||||
"zap"
|
||||
@@ -2976,10 +2954,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "☔️"
|
||||
, "unicodes": [
|
||||
"☔"
|
||||
]
|
||||
"emoji": "☔"
|
||||
, "description": "umbrella with rain drops"
|
||||
, "aliases": [
|
||||
"umbrella"
|
||||
@@ -3002,11 +2977,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⛄️"
|
||||
, "unicodes": [
|
||||
"⛄"
|
||||
, "⛄︎"
|
||||
]
|
||||
"emoji": "⛄"
|
||||
, "description": "snowman without snow"
|
||||
, "aliases": [
|
||||
"snowman"
|
||||
@@ -3511,10 +3482,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "⏳"
|
||||
, "unicodes": [
|
||||
"⏳︎"
|
||||
, "⏳️"
|
||||
]
|
||||
, "description": "hourglass with flowing sand"
|
||||
, "aliases": [
|
||||
"hourglass_flowing_sand"
|
||||
@@ -3524,10 +3491,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⌛️"
|
||||
, "unicodes": [
|
||||
"⌛"
|
||||
]
|
||||
"emoji": "⌛"
|
||||
, "description": "hourglass"
|
||||
, "aliases": [
|
||||
"hourglass"
|
||||
@@ -3538,10 +3502,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "⏰"
|
||||
, "unicodes": [
|
||||
"⏰︎"
|
||||
, "⏰️"
|
||||
]
|
||||
, "description": "alarm clock"
|
||||
, "aliases": [
|
||||
"alarm_clock"
|
||||
@@ -3551,10 +3511,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⌚️"
|
||||
, "unicodes": [
|
||||
"⌚"
|
||||
]
|
||||
"emoji": "⌚"
|
||||
, "description": "watch"
|
||||
, "aliases": [
|
||||
"watch"
|
||||
@@ -4530,11 +4487,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "🀄️"
|
||||
, "unicodes": [
|
||||
"🀄"
|
||||
, "🀄︎"
|
||||
]
|
||||
"emoji": "🀄"
|
||||
, "description": "mahjong tile red dragon"
|
||||
, "aliases": [
|
||||
"mahjong"
|
||||
@@ -4584,10 +4537,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⚽️"
|
||||
, "unicodes": [
|
||||
"⚽"
|
||||
]
|
||||
"emoji": "⚽"
|
||||
, "description": "soccer ball"
|
||||
, "aliases": [
|
||||
"soccer"
|
||||
@@ -4646,11 +4596,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⛳️"
|
||||
, "unicodes": [
|
||||
"⛳"
|
||||
, "⛳︎"
|
||||
]
|
||||
"emoji": "⛳"
|
||||
, "description": "flag in hole"
|
||||
, "aliases": [
|
||||
"golf"
|
||||
@@ -4754,10 +4700,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "☕️"
|
||||
, "unicodes": [
|
||||
"☕"
|
||||
]
|
||||
"emoji": "☕"
|
||||
, "description": "hot beverage"
|
||||
, "aliases": [
|
||||
"coffee"
|
||||
@@ -5415,11 +5358,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⛪️"
|
||||
, "unicodes": [
|
||||
"⛪"
|
||||
, "⛪︎"
|
||||
]
|
||||
"emoji": "⛪"
|
||||
, "description": "church"
|
||||
, "aliases": [
|
||||
"church"
|
||||
@@ -5482,11 +5421,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⛺️"
|
||||
, "unicodes": [
|
||||
"⛺"
|
||||
, "⛺︎"
|
||||
]
|
||||
"emoji": "⛺"
|
||||
, "description": "tent"
|
||||
, "aliases": [
|
||||
"tent"
|
||||
@@ -5595,11 +5530,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⛲️"
|
||||
, "unicodes": [
|
||||
"⛲"
|
||||
, "⛲︎"
|
||||
]
|
||||
"emoji": "⛲"
|
||||
, "description": "fountain"
|
||||
, "aliases": [
|
||||
"fountain"
|
||||
@@ -5626,11 +5557,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⛵️"
|
||||
, "unicodes": [
|
||||
"⛵"
|
||||
, "⛵︎"
|
||||
]
|
||||
"emoji": "⛵"
|
||||
, "description": "sailboat"
|
||||
, "aliases": [
|
||||
"boat"
|
||||
@@ -5659,10 +5586,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⚓️"
|
||||
, "unicodes": [
|
||||
"⚓"
|
||||
]
|
||||
"emoji": "⚓"
|
||||
, "description": "anchor"
|
||||
, "aliases": [
|
||||
"anchor"
|
||||
@@ -6090,11 +6014,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⛽️"
|
||||
, "unicodes": [
|
||||
"⛽"
|
||||
, "⛽︎"
|
||||
]
|
||||
"emoji": "⛽"
|
||||
, "description": "fuel pump"
|
||||
, "aliases": [
|
||||
"fuelpump"
|
||||
@@ -6608,10 +6528,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "⏪"
|
||||
, "unicodes": [
|
||||
"⏪︎"
|
||||
, "⏪️"
|
||||
]
|
||||
, "description": "black left-pointing double triangle"
|
||||
, "aliases": [
|
||||
"rewind"
|
||||
@@ -6621,10 +6537,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "⏩"
|
||||
, "unicodes": [
|
||||
"⏩︎"
|
||||
, "⏩️"
|
||||
]
|
||||
, "description": "black right-pointing double triangle"
|
||||
, "aliases": [
|
||||
"fast_forward"
|
||||
@@ -6634,10 +6546,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "⏫"
|
||||
, "unicodes": [
|
||||
"⏫︎"
|
||||
, "⏫️"
|
||||
]
|
||||
, "description": "black up-pointing double triangle"
|
||||
, "aliases": [
|
||||
"arrow_double_up"
|
||||
@@ -6647,10 +6555,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "⏬"
|
||||
, "unicodes": [
|
||||
"⏬︎"
|
||||
, "⏬️"
|
||||
]
|
||||
, "description": "black down-pointing double triangle"
|
||||
, "aliases": [
|
||||
"arrow_double_down"
|
||||
@@ -6792,11 +6696,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "🈯️"
|
||||
, "unicodes": [
|
||||
"🈯"
|
||||
, "🈯︎"
|
||||
]
|
||||
"emoji": "🈯"
|
||||
, "description": "squared cjk unified ideograph-6307"
|
||||
, "aliases": [
|
||||
"u6307"
|
||||
@@ -6877,11 +6777,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "🈚️"
|
||||
, "unicodes": [
|
||||
"🈚"
|
||||
, "🈚︎"
|
||||
]
|
||||
"emoji": "🈚"
|
||||
, "description": "squared cjk unified ideograph-7121"
|
||||
, "aliases": [
|
||||
"u7121"
|
||||
@@ -6965,10 +6861,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♿️"
|
||||
, "unicodes": [
|
||||
"♿"
|
||||
]
|
||||
"emoji": "♿"
|
||||
, "description": "wheelchair symbol"
|
||||
, "aliases": [
|
||||
"wheelchair"
|
||||
@@ -6987,7 +6880,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "🈷"
|
||||
"emoji": "🈷️"
|
||||
, "description": "squared cjk unified ideograph-6708"
|
||||
, "aliases": [
|
||||
"u6708"
|
||||
@@ -7005,7 +6898,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "🈂"
|
||||
"emoji": "🈂️"
|
||||
, "description": "squared katakana sa"
|
||||
, "aliases": [
|
||||
"sa"
|
||||
@@ -7190,11 +7083,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⛔️"
|
||||
, "unicodes": [
|
||||
"⛔"
|
||||
, "⛔︎"
|
||||
]
|
||||
"emoji": "⛔"
|
||||
, "description": "no entry"
|
||||
, "aliases": [
|
||||
"no_entry"
|
||||
@@ -7223,10 +7112,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "❎"
|
||||
, "unicodes": [
|
||||
"❎︎"
|
||||
, "❎️"
|
||||
]
|
||||
, "description": "negative squared cross mark"
|
||||
, "aliases": [
|
||||
"negative_squared_cross_mark"
|
||||
@@ -7236,10 +7121,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "✅"
|
||||
, "unicodes": [
|
||||
"✅︎"
|
||||
, "✅️"
|
||||
]
|
||||
, "description": "white heavy check mark"
|
||||
, "aliases": [
|
||||
"white_check_mark"
|
||||
@@ -7295,7 +7176,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "🅰"
|
||||
"emoji": "🅰️"
|
||||
, "description": "negative squared latin capital letter a"
|
||||
, "aliases": [
|
||||
"a"
|
||||
@@ -7304,7 +7185,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "🅱"
|
||||
"emoji": "🅱️"
|
||||
, "description": "negative squared latin capital letter b"
|
||||
, "aliases": [
|
||||
"b"
|
||||
@@ -7322,7 +7203,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "🅾"
|
||||
"emoji": "🅾️"
|
||||
, "description": "negative squared latin capital letter o"
|
||||
, "aliases": [
|
||||
"o2"
|
||||
@@ -7341,9 +7222,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "➿"
|
||||
, "unicodes": [
|
||||
"➿️"
|
||||
]
|
||||
, "description": "double curly loop"
|
||||
, "aliases": [
|
||||
"loop"
|
||||
@@ -7363,10 +7241,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♈️"
|
||||
, "unicodes": [
|
||||
"♈"
|
||||
]
|
||||
"emoji": "♈"
|
||||
, "description": "aries"
|
||||
, "aliases": [
|
||||
"aries"
|
||||
@@ -7375,10 +7250,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♉️"
|
||||
, "unicodes": [
|
||||
"♉"
|
||||
]
|
||||
"emoji": "♉"
|
||||
, "description": "taurus"
|
||||
, "aliases": [
|
||||
"taurus"
|
||||
@@ -7387,10 +7259,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♊️"
|
||||
, "unicodes": [
|
||||
"♊"
|
||||
]
|
||||
"emoji": "♊"
|
||||
, "description": "gemini"
|
||||
, "aliases": [
|
||||
"gemini"
|
||||
@@ -7399,10 +7268,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♋️"
|
||||
, "unicodes": [
|
||||
"♋"
|
||||
]
|
||||
"emoji": "♋"
|
||||
, "description": "cancer"
|
||||
, "aliases": [
|
||||
"cancer"
|
||||
@@ -7411,10 +7277,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♌️"
|
||||
, "unicodes": [
|
||||
"♌"
|
||||
]
|
||||
"emoji": "♌"
|
||||
, "description": "leo"
|
||||
, "aliases": [
|
||||
"leo"
|
||||
@@ -7423,10 +7286,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♍️"
|
||||
, "unicodes": [
|
||||
"♍"
|
||||
]
|
||||
"emoji": "♍"
|
||||
, "description": "virgo"
|
||||
, "aliases": [
|
||||
"virgo"
|
||||
@@ -7435,10 +7295,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♎️"
|
||||
, "unicodes": [
|
||||
"♎"
|
||||
]
|
||||
"emoji": "♎"
|
||||
, "description": "libra"
|
||||
, "aliases": [
|
||||
"libra"
|
||||
@@ -7447,10 +7304,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♏️"
|
||||
, "unicodes": [
|
||||
"♏"
|
||||
]
|
||||
"emoji": "♏"
|
||||
, "description": "scorpius"
|
||||
, "aliases": [
|
||||
"scorpius"
|
||||
@@ -7459,10 +7313,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♐️"
|
||||
, "unicodes": [
|
||||
"♐"
|
||||
]
|
||||
"emoji": "♐"
|
||||
, "description": "sagittarius"
|
||||
, "aliases": [
|
||||
"sagittarius"
|
||||
@@ -7471,10 +7322,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♑️"
|
||||
, "unicodes": [
|
||||
"♑"
|
||||
]
|
||||
"emoji": "♑"
|
||||
, "description": "capricorn"
|
||||
, "aliases": [
|
||||
"capricorn"
|
||||
@@ -7483,10 +7331,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♒️"
|
||||
, "unicodes": [
|
||||
"♒"
|
||||
]
|
||||
"emoji": "♒"
|
||||
, "description": "aquarius"
|
||||
, "aliases": [
|
||||
"aquarius"
|
||||
@@ -7495,10 +7340,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "♓️"
|
||||
, "unicodes": [
|
||||
"♓"
|
||||
]
|
||||
"emoji": "♓"
|
||||
, "description": "pisces"
|
||||
, "aliases": [
|
||||
"pisces"
|
||||
@@ -7508,10 +7350,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "⛎"
|
||||
, "unicodes": [
|
||||
"⛎︎"
|
||||
, "⛎️"
|
||||
]
|
||||
, "description": "ophiuchus"
|
||||
, "aliases": [
|
||||
"ophiuchus"
|
||||
@@ -7565,10 +7403,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "©"
|
||||
, "unicodes": [
|
||||
"©️"
|
||||
]
|
||||
"emoji": "©️"
|
||||
, "description": "copyright sign"
|
||||
, "aliases": [
|
||||
"copyright"
|
||||
@@ -7577,10 +7412,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "®"
|
||||
, "unicodes": [
|
||||
"®️"
|
||||
]
|
||||
"emoji": "®️"
|
||||
, "description": "registered sign"
|
||||
, "aliases": [
|
||||
"registered"
|
||||
@@ -7589,10 +7421,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "™"
|
||||
, "unicodes": [
|
||||
"™️"
|
||||
]
|
||||
"emoji": "™️"
|
||||
, "description": "trade mark sign"
|
||||
, "aliases": [
|
||||
"tm"
|
||||
@@ -7603,10 +7432,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "❌"
|
||||
, "unicodes": [
|
||||
"❌︎"
|
||||
, "❌️"
|
||||
]
|
||||
, "description": "cross mark"
|
||||
, "aliases": [
|
||||
"x"
|
||||
@@ -7633,11 +7458,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "❗️"
|
||||
, "unicodes": [
|
||||
"❗"
|
||||
, "❗︎"
|
||||
]
|
||||
"emoji": "❗"
|
||||
, "description": "heavy exclamation mark symbol"
|
||||
, "aliases": [
|
||||
"exclamation"
|
||||
@@ -7649,10 +7470,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "❓"
|
||||
, "unicodes": [
|
||||
"❓︎"
|
||||
, "❓️"
|
||||
]
|
||||
, "description": "black question mark ornament"
|
||||
, "aliases": [
|
||||
"question"
|
||||
@@ -7663,10 +7480,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "❕"
|
||||
, "unicodes": [
|
||||
"❕︎"
|
||||
, "❕️"
|
||||
]
|
||||
, "description": "white exclamation mark ornament"
|
||||
, "aliases": [
|
||||
"grey_exclamation"
|
||||
@@ -7676,10 +7489,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "❔"
|
||||
, "unicodes": [
|
||||
"❔︎"
|
||||
, "❔️"
|
||||
]
|
||||
, "description": "white question mark ornament"
|
||||
, "aliases": [
|
||||
"grey_question"
|
||||
@@ -7688,11 +7497,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⭕️"
|
||||
, "unicodes": [
|
||||
"⭕"
|
||||
, "⭕︎"
|
||||
]
|
||||
"emoji": "⭕"
|
||||
, "description": "heavy large circle"
|
||||
, "aliases": [
|
||||
"o"
|
||||
@@ -7981,10 +7786,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "➕"
|
||||
, "unicodes": [
|
||||
"➕︎"
|
||||
, "➕️"
|
||||
]
|
||||
, "description": "heavy plus sign"
|
||||
, "aliases": [
|
||||
"heavy_plus_sign"
|
||||
@@ -7994,10 +7795,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "➖"
|
||||
, "unicodes": [
|
||||
"➖︎"
|
||||
, "➖️"
|
||||
]
|
||||
, "description": "heavy minus sign"
|
||||
, "aliases": [
|
||||
"heavy_minus_sign"
|
||||
@@ -8007,10 +7804,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "➗"
|
||||
, "unicodes": [
|
||||
"➗︎"
|
||||
, "➗️"
|
||||
]
|
||||
, "description": "heavy division sign"
|
||||
, "aliases": [
|
||||
"heavy_division_sign"
|
||||
@@ -8112,10 +7905,6 @@
|
||||
}
|
||||
, {
|
||||
"emoji": "➰"
|
||||
, "unicodes": [
|
||||
"➰︎"
|
||||
, "➰️"
|
||||
]
|
||||
, "description": "curly loop"
|
||||
, "aliases": [
|
||||
"curly_loop"
|
||||
@@ -8124,10 +7913,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "〰"
|
||||
, "unicodes": [
|
||||
"〰️"
|
||||
]
|
||||
"emoji": "〰️"
|
||||
, "description": "wavy dash"
|
||||
, "aliases": [
|
||||
"wavy_dash"
|
||||
@@ -8172,10 +7958,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "◾️"
|
||||
, "unicodes": [
|
||||
"◾"
|
||||
]
|
||||
"emoji": "◾"
|
||||
, "description": "black medium small square"
|
||||
, "aliases": [
|
||||
"black_medium_small_square"
|
||||
@@ -8184,10 +7967,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "◽️"
|
||||
, "unicodes": [
|
||||
"◽"
|
||||
]
|
||||
"emoji": "◽"
|
||||
, "description": "white medium small square"
|
||||
, "aliases": [
|
||||
"white_medium_small_square"
|
||||
@@ -8241,10 +8021,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⚫️"
|
||||
, "unicodes": [
|
||||
"⚫"
|
||||
]
|
||||
"emoji": "⚫"
|
||||
, "description": "medium black circle"
|
||||
, "aliases": [
|
||||
"black_circle"
|
||||
@@ -8253,10 +8030,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⚪️"
|
||||
, "unicodes": [
|
||||
"⚪"
|
||||
]
|
||||
"emoji": "⚪"
|
||||
, "description": "medium white circle"
|
||||
, "aliases": [
|
||||
"white_circle"
|
||||
@@ -8292,10 +8066,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⬜️"
|
||||
, "unicodes": [
|
||||
"⬜"
|
||||
]
|
||||
"emoji": "⬜"
|
||||
, "description": "white large square"
|
||||
, "aliases": [
|
||||
"white_large_square"
|
||||
@@ -8304,10 +8075,7 @@
|
||||
]
|
||||
}
|
||||
, {
|
||||
"emoji": "⬛️"
|
||||
, "unicodes": [
|
||||
"⬛"
|
||||
]
|
||||
"emoji": "⬛"
|
||||
, "description": "black large square"
|
||||
, "aliases": [
|
||||
"black_large_square"
|
||||
@@ -8351,6 +8119,20 @@
|
||||
, "tags": [
|
||||
]
|
||||
}
|
||||
, {
|
||||
"aliases": [
|
||||
"basecamp"
|
||||
]
|
||||
, "tags": [
|
||||
]
|
||||
}
|
||||
, {
|
||||
"aliases": [
|
||||
"basecampy"
|
||||
]
|
||||
, "tags": [
|
||||
]
|
||||
}
|
||||
, {
|
||||
"aliases": [
|
||||
"bowtie"
|
||||
|
||||
11
ext/gemoji/emoji.h
Normal file
@@ -0,0 +1,11 @@
|
||||
static const long emoji_byte_lengths[][5] = {
|
||||
{0},
|
||||
{11, 8, 7, 4, 0},
|
||||
{6, 3, 0},
|
||||
{7, 0},
|
||||
{6, 0},
|
||||
{5, 0},
|
||||
};
|
||||
|
||||
static const int8_t emoji_magic_bytes[] =
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
6
ext/gemoji/extconf.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
require 'mkmf'
|
||||
|
||||
$CFLAGS << ' -ggdb3 -O0 '
|
||||
|
||||
dir_config('gemoji')
|
||||
create_makefile('gemoji')
|
||||
125
ext/gemoji/gemoji.c
Normal file
@@ -0,0 +1,125 @@
|
||||
#include <ruby.h>
|
||||
#include <ruby/encoding.h>
|
||||
#include "emoji.h"
|
||||
|
||||
#define unlikely(x) __builtin_expect((x),0)
|
||||
|
||||
static long
|
||||
lookup_emoji(VALUE *rb_emoji, VALUE rb_bytes, VALUE rb_unicode_map, const long *possible_len)
|
||||
{
|
||||
const uint8_t *src = (uint8_t *)RSTRING_PTR(rb_bytes);
|
||||
|
||||
for (; *possible_len; ++possible_len) {
|
||||
const long emoji_size = *possible_len;
|
||||
|
||||
if (emoji_size > RSTRING_LEN(rb_bytes))
|
||||
continue;
|
||||
|
||||
if ((src[emoji_size - 1] & 0xC0) != 0x80)
|
||||
continue;
|
||||
|
||||
rb_str_set_len(rb_bytes, emoji_size);
|
||||
|
||||
*rb_emoji = rb_hash_lookup(rb_unicode_map, rb_bytes);
|
||||
if (!NIL_P(*rb_emoji))
|
||||
return emoji_size;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
replace_emoji(const uint8_t *src, long size, VALUE rb_unicode_map)
|
||||
{
|
||||
VALUE rb_emoji, rb_bytes, rb_out = Qnil;
|
||||
long i = 0, org, emoji_len;
|
||||
int8_t emoji_byte;
|
||||
|
||||
while (i < size) {
|
||||
org = i;
|
||||
|
||||
retry_search:
|
||||
while (i < size && (emoji_byte = emoji_magic_bytes[(int)src[i]]) == 0)
|
||||
i++;
|
||||
|
||||
if (i + 1 < size && (src[i + 1] & 0x80) != 0x80) {
|
||||
i++;
|
||||
goto retry_search;
|
||||
}
|
||||
|
||||
if (unlikely(org == 0)) {
|
||||
if (i == size)
|
||||
return Qnil;
|
||||
|
||||
rb_out = rb_str_buf_new(size * 4 / 3);
|
||||
rb_enc_associate(rb_out, rb_utf8_encoding());
|
||||
|
||||
rb_bytes = rb_str_buf_new(16);
|
||||
rb_enc_associate(rb_bytes, rb_utf8_encoding());
|
||||
}
|
||||
|
||||
if (i > org)
|
||||
rb_str_buf_cat(rb_out, (const char *)src + org, i - org);
|
||||
|
||||
if (unlikely(i == size))
|
||||
break;
|
||||
|
||||
emoji_len = size - i;
|
||||
if (emoji_len > 12)
|
||||
emoji_len = 12;
|
||||
|
||||
memcpy(RSTRING_PTR(rb_bytes), src + i, emoji_len);
|
||||
rb_str_set_len(rb_bytes, emoji_len);
|
||||
|
||||
emoji_len = lookup_emoji(&rb_emoji, rb_bytes, rb_unicode_map, emoji_byte_lengths[(int)emoji_byte]);
|
||||
|
||||
if (emoji_len) {
|
||||
VALUE rb_repl = rb_yield(rb_emoji);
|
||||
|
||||
if (NIL_P(rb_repl)) {
|
||||
rb_str_buf_cat(rb_out, (const char *)src + i, emoji_len);
|
||||
} else {
|
||||
Check_Type(rb_repl, T_STRING);
|
||||
rb_str_buf_append(rb_out, rb_repl);
|
||||
}
|
||||
|
||||
i += emoji_len;
|
||||
continue;
|
||||
}
|
||||
|
||||
rb_str_buf_cat(rb_out, (const char *)src + i, 1);
|
||||
i++;
|
||||
}
|
||||
|
||||
return rb_out;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
rb_gemoji_replace_unicode(VALUE klass, VALUE rb_source)
|
||||
{
|
||||
VALUE rb_output;
|
||||
VALUE rb_unicode_map = rb_funcall(klass, rb_intern("unicodes_index"), 0);
|
||||
|
||||
Check_Type(rb_source, T_STRING);
|
||||
Check_Type(rb_unicode_map, T_HASH);
|
||||
|
||||
rb_must_asciicompat(rb_source);
|
||||
|
||||
if (ENC_CODERANGE_ASCIIONLY(rb_source))
|
||||
return rb_source;
|
||||
|
||||
if (rb_enc_get(rb_source) != rb_utf8_encoding())
|
||||
rb_raise(rb_eEncCompatError, "expected UTF-8 encoding");
|
||||
|
||||
rb_output = replace_emoji((uint8_t *)RSTRING_PTR(rb_source), RSTRING_LEN(rb_source), rb_unicode_map);
|
||||
if (NIL_P(rb_output))
|
||||
return rb_source;
|
||||
|
||||
return rb_output;
|
||||
}
|
||||
|
||||
void Init_gemoji(void)
|
||||
{
|
||||
VALUE rb_mEmoji = rb_define_module("Emoji");
|
||||
rb_define_method(rb_mEmoji, "gsub_unicode", rb_gemoji_replace_unicode, 1);
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
Gem::Specification.new do |s|
|
||||
s.name = "gemoji"
|
||||
s.version = "2.0.1"
|
||||
s.version = "2.1.0"
|
||||
s.summary = "Emoji conversion and image assets"
|
||||
s.description = "Image assets and character information for emoji."
|
||||
|
||||
|
||||
BIN
images/emoji/basecamp.png
Normal file
|
After Width: | Height: | Size: 898 B |
BIN
images/emoji/basecampy.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 1016 B After Width: | Height: | Size: 1004 B |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.7 KiB |
BIN
images/emoji/unicode/0023-20e3.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
BIN
images/emoji/unicode/0030-20e3.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
BIN
images/emoji/unicode/0031-20e3.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
BIN
images/emoji/unicode/0032-20e3.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
BIN
images/emoji/unicode/0033-20e3.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
BIN
images/emoji/unicode/0034-20e3.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
BIN
images/emoji/unicode/0035-20e3.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
BIN
images/emoji/unicode/0036-20e3.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
BIN
images/emoji/unicode/0037-20e3.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
BIN
images/emoji/unicode/0038-20e3.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
BIN
images/emoji/unicode/0039-20e3.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
BIN
images/emoji/unicode/1f004.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
BIN
images/emoji/unicode/1f17f.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
BIN
images/emoji/unicode/1f21a.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
BIN
images/emoji/unicode/1f22f.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 2.2 KiB |