5830d80b8d
By pre-calculating the digests we can manually construct the emoji URLs, removing the need for using Rails' asset URL helpers. The reason we don't want to use these helpers for Emojis is two-fold: 1. Rails' image_url() method is slow, really slow. For one it _might_ have to calculate digests but it also performs a lot of other intensive operations (judging by the source code and based on measuring timings). 2. We have a lot of Emoji which coupled with the above can result in it taking minutes to load Emoji autocomplete data. Using this pre-calculation setup generating the digests takes around 7 seconds (including the time it takes to start Rails/Rake), and only around 600 milliseconds to load _all_ the autocomplete data of a project (measured locally). This commit _does_ change the Emoji URLs from absolute to relative URLs as these are much easier to generate. To update the Emoji data simply run: rake gemojione:digests Then commit any changes. Fixes gitlab-org/gitlab-ce#14009
70 lines
1.7 KiB
Ruby
70 lines
1.7 KiB
Ruby
class AwardEmoji
|
|
CATEGORIES = {
|
|
other: "Other",
|
|
objects: "Objects",
|
|
places: "Places",
|
|
travel_places: "Travel",
|
|
emoticons: "Emoticons",
|
|
objects_symbols: "Symbols",
|
|
nature: "Nature",
|
|
celebration: "Celebration",
|
|
people: "People",
|
|
activity: "Activity",
|
|
flags: "Flags",
|
|
food_drink: "Food"
|
|
}.with_indifferent_access
|
|
|
|
def self.normilize_emoji_name(name)
|
|
aliases[name] || name
|
|
end
|
|
|
|
def self.emoji_by_category
|
|
unless @emoji_by_category
|
|
@emoji_by_category = {}
|
|
|
|
emojis.each do |emoji_name, data|
|
|
data["name"] = emoji_name
|
|
|
|
@emoji_by_category[data["category"]] ||= []
|
|
@emoji_by_category[data["category"]] << data
|
|
end
|
|
|
|
@emoji_by_category = @emoji_by_category.sort.to_h
|
|
end
|
|
|
|
@emoji_by_category
|
|
end
|
|
|
|
def self.emojis
|
|
@emojis ||= begin
|
|
json_path = File.join(Rails.root, 'fixtures', 'emojis', 'index.json' )
|
|
JSON.parse(File.read(json_path))
|
|
end
|
|
end
|
|
|
|
def self.aliases
|
|
@aliases ||= begin
|
|
json_path = File.join(Rails.root, 'fixtures', 'emojis', 'aliases.json' )
|
|
JSON.parse(File.read(json_path))
|
|
end
|
|
end
|
|
|
|
# Returns an Array of Emoji names and their asset URLs.
|
|
def self.urls
|
|
@urls ||= begin
|
|
path = File.join(Rails.root, 'fixtures', 'emojis', 'digests.json')
|
|
prefix = Gitlab::Application.config.assets.prefix
|
|
digest = Gitlab::Application.config.assets.digest
|
|
|
|
JSON.parse(File.read(path)).map do |hash|
|
|
if digest
|
|
fname = "#{hash['unicode']}-#{hash['digest']}"
|
|
else
|
|
fname = hash['unicode']
|
|
end
|
|
|
|
{ name: hash['name'], path: "#{prefix}/#{fname}.png" }
|
|
end
|
|
end
|
|
end
|
|
end
|