Commit b7f5dd5b authored by Phil Hughes's avatar Phil Hughes Committed by Igor Drozdov

Updates the gemojione ruby gem

Updating the gem brings with it the correct sorting
of emoji for the award menu.

Closes https://gitlab.com/gitlab-org/gitlab/-/issues/15744
parent 944aea27
...@@ -293,7 +293,7 @@ gem 'autoprefixer-rails', '10.2.0.0' ...@@ -293,7 +293,7 @@ gem 'autoprefixer-rails', '10.2.0.0'
gem 'terser', '1.0.2' gem 'terser', '1.0.2'
gem 'addressable', '~> 2.7' gem 'addressable', '~> 2.7'
gem 'gemojione', '~> 3.3' gem 'gemojione', '~> 4.3.3'
gem 'gon', '~> 6.2' gem 'gon', '~> 6.2'
gem 'request_store', '~> 1.5' gem 'request_store', '~> 1.5'
gem 'base32', '~> 0.3.0' gem 'base32', '~> 0.3.0'
......
...@@ -412,7 +412,7 @@ GEM ...@@ -412,7 +412,7 @@ GEM
ruby-progressbar (~> 1.4) ruby-progressbar (~> 1.4)
fuzzyurl (0.9.0) fuzzyurl (0.9.0)
gemoji (3.0.1) gemoji (3.0.1)
gemojione (3.3.0) gemojione (4.3.3)
json json
get_process_mem (0.2.5) get_process_mem (0.2.5)
ffi (~> 1.0) ffi (~> 1.0)
...@@ -1414,7 +1414,7 @@ DEPENDENCIES ...@@ -1414,7 +1414,7 @@ DEPENDENCIES
fog-rackspace (~> 0.1.1) fog-rackspace (~> 0.1.1)
fugit (~> 1.2.1) fugit (~> 1.2.1)
fuubar (~> 2.2.0) fuubar (~> 2.2.0)
gemojione (~> 3.3) gemojione (~> 4.3.3)
gettext (~> 3.3) gettext (~> 3.3)
gettext_i18n_rails (~> 1.8.0) gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.3) gettext_i18n_rails_js (~> 1.3)
......
app/assets/images/emoji.png

1.16 MB | W: | H:

app/assets/images/emoji.png

2 MB | W: | H:

app/assets/images/emoji.png
app/assets/images/emoji.png
app/assets/images/emoji.png
app/assets/images/emoji.png
  • 2-up
  • Swipe
  • Onion skin
app/assets/images/emoji@2x.png

2.84 MB | W: | H:

app/assets/images/emoji@2x.png

5.37 MB | W: | H:

app/assets/images/emoji@2x.png
app/assets/images/emoji@2x.png
app/assets/images/emoji@2x.png
app/assets/images/emoji@2x.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -3,10 +3,10 @@ export const FREQUENTLY_USED_COOKIE_KEY = 'frequently_used_emojis'; ...@@ -3,10 +3,10 @@ export const FREQUENTLY_USED_COOKIE_KEY = 'frequently_used_emojis';
export const CATEGORY_ICON_MAP = { export const CATEGORY_ICON_MAP = {
[FREQUENTLY_USED_KEY]: 'history', [FREQUENTLY_USED_KEY]: 'history',
activity: 'dumbbell',
people: 'smiley', people: 'smiley',
nature: 'nature', nature: 'nature',
food: 'food', food: 'food',
activity: 'dumbbell',
travel: 'car', travel: 'car',
objects: 'object', objects: 'object',
symbols: 'heart', symbols: 'heart',
......
...@@ -8,7 +8,7 @@ let emojiMap = null; ...@@ -8,7 +8,7 @@ let emojiMap = null;
let validEmojiNames = null; let validEmojiNames = null;
export const FALLBACK_EMOJI_KEY = 'grey_question'; export const FALLBACK_EMOJI_KEY = 'grey_question';
export const EMOJI_VERSION = '1'; export const EMOJI_VERSION = '2';
const isLocalStorageAvailable = AccessorUtilities.isLocalStorageAccessSafe(); const isLocalStorageAvailable = AccessorUtilities.isLocalStorageAccessSafe();
......
import AccessorUtilities from '../../lib/utils/accessor'; import AccessorUtilities from '../../lib/utils/accessor';
const GL_EMOJI_VERSION = '0.2.0'; const GL_EMOJI_VERSION = '0.3.0';
const unicodeSupportTestMap = { const unicodeSupportTestMap = {
// man, student (emojione does not have any of these yet), http://emojipedia.org/emoji-zwj-sequences/ // man, student (emojione does not have any of these yet), http://emojipedia.org/emoji-zwj-sequences/
...@@ -25,6 +25,8 @@ const unicodeSupportTestMap = { ...@@ -25,6 +25,8 @@ const unicodeSupportTestMap = {
// angel_tone5 // angel_tone5
'\u{1F47C}\u{1F3FF}', '\u{1F47C}\u{1F3FF}',
], ],
// star_struck, http://emojipedia.org/unicode-9.0/
'10.0': '\u{1F929}',
// rofl, http://emojipedia.org/unicode-9.0/ // rofl, http://emojipedia.org/unicode-9.0/
'9.0': '\u{1F923}', '9.0': '\u{1F923}',
// metal, http://emojipedia.org/unicode-8.0/ // metal, http://emojipedia.org/unicode-8.0/
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -8,6 +8,13 @@ module Gitlab ...@@ -8,6 +8,13 @@ module Gitlab
Gemojione.index.instance_variable_get(:@emoji_by_name) Gemojione.index.instance_variable_get(:@emoji_by_name)
end end
def emojis_by_category
Gemojione::Categories.all.values.flatten.flat_map do |emoji|
tone_emojis = (1..5).map { |i| Gemojione.index.find_by_name("#{emoji['name']}_tone#{i}") }
[emoji] + tone_emojis.compact
end
end
def emojis_by_moji def emojis_by_moji
Gemojione.index.instance_variable_get(:@emoji_by_moji) Gemojione.index.instance_variable_get(:@emoji_by_moji)
end end
......
# frozen_string_literal: true # frozen_string_literal: true
EMOJI_VERSION = "2"
namespace :gemojione do namespace :gemojione do
desc 'Generates Emoji SHA256 digests' desc 'Generates Emoji SHA256 digests'
task aliases: ['yarn:check', 'environment'] do task aliases: ['yarn:check', 'environment'] do
require 'json' require 'json'
aliases = {} aliases = {
basketball_player: "man_bouncing_ball",
basketball_player_tone1: "man_bouncing_ball_tone1",
basketball_player_tone2: "man_bouncing_ball_tone2",
basketball_player_tone3: "man_bouncing_ball_tone3",
basketball_player_tone4: "man_bouncing_ball_tone4",
basketball_player_tone5: "man_bouncing_ball_tone5"
}
index_file = File.join(Rails.root, 'fixtures', 'emojis', 'index.json') index_file = File.join(Rails.root, 'fixtures', 'emojis', 'index.json')
index = Gitlab::Json.parse(File.read(index_file)) index = Gitlab::Json.parse(File.read(index_file))
...@@ -36,7 +45,9 @@ namespace :gemojione do ...@@ -36,7 +45,9 @@ namespace :gemojione do
resultant_emoji_map = {} resultant_emoji_map = {}
resultant_emoji_map_new = {} resultant_emoji_map_new = {}
Gitlab::Emoji.emojis.each do |name, emoji_hash| Gitlab::Emoji.emojis_by_category.each do |emoji_hash|
name = emoji_hash['name']
# Ignore aliases # Ignore aliases
unless Gitlab::Emoji.emojis_aliases.key?(name) unless Gitlab::Emoji.emojis_aliases.key?(name)
fpath = File.join(dir, "#{emoji_hash['unicode']}.png") fpath = File.join(dir, "#{emoji_hash['unicode']}.png")
...@@ -74,7 +85,7 @@ namespace :gemojione do ...@@ -74,7 +85,7 @@ namespace :gemojione do
handle.write(Gitlab::Json.pretty_generate(resultant_emoji_map)) handle.write(Gitlab::Json.pretty_generate(resultant_emoji_map))
end end
out_new = File.join(Rails.root, 'public', '-', 'emojis', '1', 'emojis.json') out_new = File.join(Rails.root, 'public', '-', 'emojis', EMOJI_VERSION, 'emojis.json')
File.open(out_new, 'w') do |handle| File.open(out_new, 'w') do |handle|
handle.write(Gitlab::Json.pretty_generate(resultant_emoji_map_new)) handle.write(Gitlab::Json.pretty_generate(resultant_emoji_map_new))
end end
...@@ -101,22 +112,21 @@ namespace :gemojione do ...@@ -101,22 +112,21 @@ namespace :gemojione do
# Update these values to the width and height of the spritesheet when # Update these values to the width and height of the spritesheet when
# new emoji are added. # new emoji are added.
SPRITESHEET_WIDTH = 860 SPRITESHEET_WIDTH = 1080
SPRITESHEET_HEIGHT = 840 SPRITESHEET_HEIGHT = 1060
# Set up a map to rename image files # Set up a map to rename image files
emoji_unicode_string_to_name_map = {} emoji_unicode_string_to_name_map = {}
Gitlab::Emoji.emojis.each do |name, emoji_hash| Gitlab::Emoji.emojis.each do |name, emoji_hash|
# Ignore aliases # Ignore aliases
unless Gitlab::Emoji.emojis_aliases.key?(name) unless Gitlab::Emoji.emojis_aliases.key?(name)
emoji_unicode_string_to_name_map[emoji_hash['unicode']] = name emoji_unicode_string_to_name_map[emoji_hash['unicode'].downcase] = name
end end
end end
# Copy the Gemojione assets to the temporary folder for renaming # Copy the Gemojione assets to the temporary folder for renaming
emoji_dir = "app/assets/images/emoji" emoji_dir = "public/-/emojis/#{EMOJI_VERSION}"
FileUtils.rm_rf(emoji_dir) FileUtils.rm_rf(emoji_dir)
FileUtils.mkdir_p(emoji_dir, mode: 0700)
FileUtils.cp_r(File.join(Gemojione.images_path, '.'), emoji_dir) FileUtils.cp_r(File.join(Gemojione.images_path, '.'), emoji_dir)
Dir[File.join(emoji_dir, "**/*.png")].each do |png| Dir[File.join(emoji_dir, "**/*.png")].each do |png|
image_path = png image_path = png
...@@ -133,7 +143,7 @@ namespace :gemojione do ...@@ -133,7 +143,7 @@ namespace :gemojione do
end end
end end
style_path = Rails.root.join(*%w(app assets stylesheets framework emoji_sprites.scss)) style_path = Rails.root.join(*%w(app assets stylesheets emoji_sprites.scss))
# Combine the resized assets into a packed sprite and re-generate the SCSS # Combine the resized assets into a packed sprite and re-generate the SCSS
SpriteFactory.cssurl = "image-url('$IMAGE')" SpriteFactory.cssurl = "image-url('$IMAGE')"
...@@ -165,6 +175,7 @@ namespace :gemojione do ...@@ -165,6 +175,7 @@ namespace :gemojione do
height: #{SIZE}px; height: #{SIZE}px;
width: #{SIZE}px; width: #{SIZE}px;
/* stylelint-disable media-feature-name-no-vendor-prefix */
@media only screen and (-webkit-min-device-pixel-ratio: 2), @media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min--moz-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2),
only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-o-min-device-pixel-ratio: 2/1),
...@@ -174,6 +185,7 @@ namespace :gemojione do ...@@ -174,6 +185,7 @@ namespace :gemojione do
background-image: image-url('emoji@2x.png'); background-image: image-url('emoji@2x.png');
background-size: #{SPRITESHEET_WIDTH}px #{SPRITESHEET_HEIGHT}px; background-size: #{SPRITESHEET_WIDTH}px #{SPRITESHEET_HEIGHT}px;
} }
/* stylelint-enable media-feature-name-no-vendor-prefix */
} }
CSS CSS
end end
......
This diff is collapsed.
...@@ -212,11 +212,11 @@ RSpec.describe 'GFM autocomplete', :js do ...@@ -212,11 +212,11 @@ RSpec.describe 'GFM autocomplete', :js do
end end
it 'doesn\'t wrap for emoji values' do it 'doesn\'t wrap for emoji values' do
fill_in 'Comment', with: ':cartwheel_' fill_in 'Comment', with: ':thumb'
find_highlighted_autocomplete_item.click find_highlighted_autocomplete_item.click
expect(find_field('Comment').value).to have_text('cartwheel_tone1') expect(find_field('Comment').value).to have_text('thumbsdown')
end end
it 'doesn\'t open autocomplete after non-word character' do it 'doesn\'t open autocomplete after non-word character' do
......
...@@ -137,11 +137,11 @@ RSpec.describe 'User interacts with awards' do ...@@ -137,11 +137,11 @@ RSpec.describe 'User interacts with awards' do
page.within('.note-actions') do page.within('.note-actions') do
find('.note-emoji-button').click find('.note-emoji-button').click
end end
find('gl-emoji[data-name="8ball"]').click find('gl-emoji[data-name="grinning"]').click
wait_for_requests wait_for_requests
page.within('.note-awards') do page.within('.note-awards') do
expect(page).to have_emoji('8ball') expect(page).to have_emoji('grinning')
end end
expect(note.reload.award_emoji.size).to eq(2) expect(note.reload.award_emoji.size).to eq(2)
end end
......
...@@ -56,13 +56,13 @@ describe('gl_emoji', () => { ...@@ -56,13 +56,13 @@ describe('gl_emoji', () => {
'bomb emoji just with name attribute', 'bomb emoji just with name attribute',
'<gl-emoji data-name="bomb"></gl-emoji>', '<gl-emoji data-name="bomb"></gl-emoji>',
'<gl-emoji data-name="bomb" data-unicode-version="6.0" title="bomb">💣</gl-emoji>', '<gl-emoji data-name="bomb" data-unicode-version="6.0" title="bomb">💣</gl-emoji>',
'<gl-emoji data-name="bomb" data-unicode-version="6.0" title="bomb"><img class="emoji" title=":bomb:" alt=":bomb:" src="/-/emojis/1/bomb.png" width="20" height="20" align="absmiddle"></gl-emoji>', '<gl-emoji data-name="bomb" data-unicode-version="6.0" title="bomb"><img class="emoji" title=":bomb:" alt=":bomb:" src="/-/emojis/2/bomb.png" width="20" height="20" align="absmiddle"></gl-emoji>',
], ],
[ [
'bomb emoji with name attribute and unicode version', 'bomb emoji with name attribute and unicode version',
'<gl-emoji data-name="bomb" data-unicode-version="6.0">💣</gl-emoji>', '<gl-emoji data-name="bomb" data-unicode-version="6.0">💣</gl-emoji>',
'<gl-emoji data-name="bomb" data-unicode-version="6.0">💣</gl-emoji>', '<gl-emoji data-name="bomb" data-unicode-version="6.0">💣</gl-emoji>',
'<gl-emoji data-name="bomb" data-unicode-version="6.0"><img class="emoji" title=":bomb:" alt=":bomb:" src="/-/emojis/1/bomb.png" width="20" height="20" align="absmiddle"></gl-emoji>', '<gl-emoji data-name="bomb" data-unicode-version="6.0"><img class="emoji" title=":bomb:" alt=":bomb:" src="/-/emojis/2/bomb.png" width="20" height="20" align="absmiddle"></gl-emoji>',
], ],
[ [
'bomb emoji with sprite fallback', 'bomb emoji with sprite fallback',
...@@ -80,7 +80,7 @@ describe('gl_emoji', () => { ...@@ -80,7 +80,7 @@ describe('gl_emoji', () => {
'invalid emoji', 'invalid emoji',
'<gl-emoji data-name="invalid_emoji"></gl-emoji>', '<gl-emoji data-name="invalid_emoji"></gl-emoji>',
'<gl-emoji data-name="grey_question" data-unicode-version="6.0" title="white question mark ornament">❔</gl-emoji>', '<gl-emoji data-name="grey_question" data-unicode-version="6.0" title="white question mark ornament">❔</gl-emoji>',
'<gl-emoji data-name="grey_question" data-unicode-version="6.0" title="white question mark ornament"><img class="emoji" title=":grey_question:" alt=":grey_question:" src="/-/emojis/1/grey_question.png" width="20" height="20" align="absmiddle"></gl-emoji>', '<gl-emoji data-name="grey_question" data-unicode-version="6.0" title="white question mark ornament"><img class="emoji" title=":grey_question:" alt=":grey_question:" src="/-/emojis/2/grey_question.png" width="20" height="20" align="absmiddle"></gl-emoji>',
], ],
])('%s', (name, markup, withEmojiSupport, withoutEmojiSupport) => { ])('%s', (name, markup, withEmojiSupport, withoutEmojiSupport) => {
it(`renders correctly with emoji support`, async () => { it(`renders correctly with emoji support`, async () => {
......
...@@ -28,7 +28,7 @@ describe('Unicode Support Map', () => { ...@@ -28,7 +28,7 @@ describe('Unicode Support Map', () => {
expect(getArgs[1][0]).toBe('gl-emoji-user-agent'); expect(getArgs[1][0]).toBe('gl-emoji-user-agent');
expect(setArgs[0][0]).toBe('gl-emoji-version'); expect(setArgs[0][0]).toBe('gl-emoji-version');
expect(setArgs[0][1]).toBe('0.2.0'); expect(setArgs[0][1]).toBe('0.3.0');
expect(setArgs[1][0]).toBe('gl-emoji-user-agent'); expect(setArgs[1][0]).toBe('gl-emoji-user-agent');
expect(setArgs[1][1]).toBe(navigator.userAgent); expect(setArgs[1][1]).toBe(navigator.userAgent);
expect(setArgs[2][0]).toBe('gl-emoji-unicode-support-map'); expect(setArgs[2][0]).toBe('gl-emoji-unicode-support-map');
......
...@@ -183,14 +183,14 @@ describe('User Popover Component', () => { ...@@ -183,14 +183,14 @@ describe('User Popover Component', () => {
it('should show message and emoji', () => { it('should show message and emoji', () => {
const user = { const user = {
...DEFAULT_PROPS.user, ...DEFAULT_PROPS.user,
status: { emoji: 'basketball_player', message_html: 'Hello World' }, status: { emoji: 'thumbsup', message_html: 'Hello World' },
}; };
createWrapper({ user }); createWrapper({ user });
expect(findUserStatus().exists()).toBe(true); expect(findUserStatus().exists()).toBe(true);
expect(wrapper.text()).toContain('Hello World'); expect(wrapper.text()).toContain('Hello World');
expect(wrapper.html()).toContain('<gl-emoji data-name="basketball_player"'); expect(wrapper.html()).toContain('<gl-emoji data-name="thumbsup"');
}); });
it('hides the div when status is null', () => { it('hides the div when status is null', () => {
......
...@@ -16,6 +16,19 @@ RSpec.describe Gitlab::Emoji do ...@@ -16,6 +16,19 @@ RSpec.describe Gitlab::Emoji do
end end
end end
describe '.emojis_by_category' do
it 'contains emojis with tones' do
emojis = described_class.emojis_by_category
angel_index = emojis.find_index { |e| e['name'] == 'angel' }
angel_tones = emojis[angel_index..angel_index + 5].map { |e| e['name'] }
expect(angel_tones).to eq(
%w[angel angel_tone1 angel_tone2 angel_tone3 angel_tone4 angel_tone5]
)
end
end
describe '.emojis_by_moji' do describe '.emojis_by_moji' do
it 'return emojis by moji' do it 'return emojis by moji' do
current_emojis_by_moji = described_class.emojis_by_moji current_emojis_by_moji = described_class.emojis_by_moji
......
...@@ -4388,10 +4388,10 @@ emoji-regex@^8.0.0: ...@@ -4388,10 +4388,10 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
emoji-unicode-version@^0.2.1: emoji-unicode-version@^0.3.0:
version "0.2.1" version "0.3.0"
resolved "https://registry.yarnpkg.com/emoji-unicode-version/-/emoji-unicode-version-0.2.1.tgz#0ebf3666b5414097971d34994e299fce75cdbafc" resolved "https://registry.yarnpkg.com/emoji-unicode-version/-/emoji-unicode-version-0.3.0.tgz#5cfc511d4a7ccacf3cd02887909a5911b6dde5ec"
integrity sha1-Dr82ZrVBQJeXHTSZTimfznXNuvw= integrity sha512-DCHEeGr11QbUy9HMZ70f/NsOJp+cqzMktO5tBMJhX393ZphHDH5WAp3CzZmMawRxfc4Opr1GZTAwWtSGC8/flA==
emojis-list@^3.0.0: emojis-list@^3.0.0:
version "3.0.0" version "3.0.0"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment