diff options
Diffstat (limited to 'webapp/make-emojis')
-rwxr-xr-x | webapp/make-emojis | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/webapp/make-emojis b/webapp/make-emojis new file mode 100755 index 000000000..8a6bce47f --- /dev/null +++ b/webapp/make-emojis @@ -0,0 +1,178 @@ +#!/usr/bin/env ruby + +gem_name, *gem_ver_reqs = 'gemoji', '~> 3.0.0' +gdep = Gem::Dependency.new(gem_name, *gem_ver_reqs) +found_gspec = gdep.matching_specs.max_by(&:version) + +if !found_gspec + abort("ERROR: gemoji #{gdep.requirement} is required: `gem install gemoji -v '#{gdep.requirement}'`") +end + +puts "using gemoji #{found_gspec.version}" + +gem 'gemoji', found_gspec.version +require 'emoji' +require 'fileutils' +require 'json' + +emoji_path = File.join(File.dirname(__FILE__), 'images', 'emoji') +if File.directory? emoji_path + FileUtils.remove_dir emoji_path +end +Dir.mkdir emoji_path + +Emoji.create('mattermost') +FileUtils.cp(File.join(File.dirname(__FILE__), 'images', 'icon64x64.png'), File.join(emoji_path, 'mattermost.png')) + +blacklist = ['basecamp', 'basecampy'] + +categories = [] + +File.open(File.join(File.dirname(__FILE__), 'utils', 'emoji.jsx'), 'w') do |f| + emojis = [] + emoji_indices_by_alias = [] + emoji_indices_by_unicode = [] + emoji_indices_by_category = [] + + Emoji.all.each do |emoji| + if blacklist.include? emoji.name + next + end + emoji.aliases.each do |emoji_alias| + emoji_indices_by_alias << [emoji_alias, emojis.length] + end + emoji.unicode_aliases.each do |unicode_alias| + emoji_indices_by_unicode << [emoji.class.hex_inspect(unicode_alias), emojis.length] + end + category = emoji.category ? emoji.category.downcase : 'custom' + if !categories.include? category + categories << category + emoji_indices_by_category << [category, []] + end + emoji_indices_by_category[categories.index(category)][1] << emojis.length + filename = emoji.custom? ? emoji.name : emoji.hex_inspect + emojis << { + 'aliases' => emoji.aliases, + 'filename' => filename, + } + emoji.image_filename = filename + '.png' + end + + f.write("// This file is automatically generated via `make emojis`. Do not modify it manually.\n\n") + f.write("/* eslint-disable */\n\n") + f.write("export const Emojis = #{JSON.generate emojis};\n\n") + f.write("export const EmojiIndicesByAlias = new Map(#{JSON.generate emoji_indices_by_alias});\n\n") + f.write("export const EmojiIndicesByUnicode = new Map(#{JSON.generate emoji_indices_by_unicode});\n\n") + f.write("export const CategoryNames = #{JSON.generate categories};\n\n") + f.write("export const EmojiIndicesByCategory = new Map(#{JSON.generate emoji_indices_by_category});\n\n") + f.write("/* eslint-enable */") + + puts "wrote #{emojis.length} emojis to utils/emoji.jsx" +end + +require 'emoji/extractor' + +Emoji::Extractor.new(64, emoji_path).extract! + +Dir["#{Emoji.images_path}/*.png"].each do |png| + if blacklist.include? File.basename(png, '.png') + next + end + FileUtils.cp(png, File.join(emoji_path, File.basename(png))) +end + +puts "images written to images/emoji" + +### Spritesheet Generation ### + +['sprite-factory', 'chunky_png'].each do |name| + gdep = Gem::Dependency.new(name, '>1.0') + found_gspec = gdep.matching_specs.max_by(&:version) + + if !found_gspec + abort("ERROR: #{name} is required for spritesheet generation: `gem install #{name}'`") + end +end + +require 'sprite_factory' + +css_rules = [ + '@charset "UTF-8";', + '.emojisprite-preview {', + ' @include transform(scale(.55));', + ' background-repeat: no-repeat;', + ' cursor: pointer;', + ' height: 64px;', + ' max-width: none;', + ' transform-origin: 0 0;', + ' width: 64px;', + ' padding: 0 10px 0 0;', + '}', + '.emojisprite {', + ' @include transform(scale(.35));', + ' background-repeat: no-repeat;', + ' border-radius: 18px;', + ' cursor: pointer;', + ' height: 64px;', + ' max-width: none;', + ' transform-origin: 0 0;', + ' width: 64px;', + '}', + '.emojisprite-loading {', + ' background-image: none !important;', + ' @include transform(scale(.35));', + ' background-repeat: no-repeat;', + ' border-radius: 18px;', + ' cursor: pointer;', + ' height: 64px;', + ' max-width: none;', + ' transform-origin: 0 0;', + ' width: 64px;', + '}', +] + +spritesheet_path = File.join(File.dirname(__FILE__), 'images', 'emoji-sheets') +if File.directory? spritesheet_path + FileUtils.remove_dir spritesheet_path +end +Dir.mkdir spritesheet_path + +categories.each do |category| + count = 0 + + tmp_directory = File.join(spritesheet_path, 'temp') + Dir.mkdir tmp_directory + Emoji.all.each do |emoji| + if blacklist.include? emoji.name + next + end + if category == (emoji.category ? emoji.category.downcase : 'custom') + FileUtils.cp(File.join(emoji_path, emoji.image_filename), File.join(tmp_directory, emoji.image_filename)) + count += 1 + end + end + + SpriteFactory.run!( + tmp_directory, + :layout => :packed, + :library => 'chunkypng', + :output_image => File.join(spritesheet_path, category + '.png'), + :nocomments => true, + :nocss => true, + ) do |images| + images.each do |name, image| + if image[:cssw] != 64 || image[:cssh] != 64 + css_rules << ".emoji-#{name} { background-image: url(../images/emoji-sheets/#{category}.png); background-position: -#{image[:cssx]}px -#{image[:cssy]}px; width: #{image[:cssw]}px; height: #{image[:cssh]}px; }" + else + css_rules << ".emoji-#{name} { background-image: url(../images/emoji-sheets/#{category}.png); background-position: -#{image[:cssx]}px -#{image[:cssy]}px; }" + end + end + end + + FileUtils.remove_dir tmp_directory + + puts "#{count} emojis written to images/emoji-sheets/#{category}.png" +end + +File.write(File.join(File.dirname(__FILE__), 'sass', 'components', '_emojisprite.scss'), css_rules.join("\n")) +puts "sprite stylesheet written to sass/components/_emojisprite.scss" |