summaryrefslogtreecommitdiff
path: root/lib/gitlab/emoji.rb
blob: 42703545c4f5b33146e93357fb83205abfb8fdc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
module Gitlab
  module Emoji
    extend self

    def emojis
      Gemojione.index.instance_variable_get(:@emoji_by_name)
    end

    def emojis_by_moji
      Gemojione.index.instance_variable_get(:@emoji_by_moji)
    end

    def emojis_unicodes
      emojis_by_moji.keys
    end

    def emojis_names
      emojis.keys
    end

    def emojis_aliases
      @emoji_aliases ||= JSON.parse(File.read(Rails.root.join('fixtures', 'emojis', 'aliases.json')))
    end

    def emoji_filename(name)
      emojis[name]["unicode"]
    end

    def emoji_unicode_filename(moji)
      emojis_by_moji[moji]["unicode"]
    end

    def emoji_unicode_version(name)
      @emoji_unicode_versions_by_name ||= JSON.parse(File.read(Rails.root.join('node_modules', 'emoji-unicode-version', 'emoji-unicode-version-map.json')))
      @emoji_unicode_versions_by_name[name]
    end

    def normalize_emoji_name(name)
      emojis_aliases[name] || name
    end

    def emoji_image_tag(name, src)
      "<img class='emoji' title=':#{name}:' alt=':#{name}:' src='#{src}' height='20' width='20' align='absmiddle' />"
    end

    # CSS sprite fallback takes precedence over image fallback
    def gl_emoji_tag(name, image: false, sprite: false, force_fallback: false)
      emoji_name = emojis_aliases[name] || name
      emoji_info = emojis[emoji_name]
      emoji_fallback_image_source = ActionController::Base.helpers.url_to_image("emoji/#{emoji_info['name']}.png")
      emoji_fallback_sprite_class = "emoji-#{emoji_name}"

      data = {
        name: emoji_name,
        unicode_version: emoji_unicode_version(emoji_name)
      }
      data[:fallback_src] = emoji_fallback_image_source if image
      data[:fallback_sprite_class] = emoji_fallback_sprite_class if sprite
      ActionController::Base.helpers.content_tag 'gl-emoji',
        class: ("emoji-icon #{emoji_fallback_sprite_class}" if force_fallback && sprite),
        data: data do
        if force_fallback && !sprite
          emoji_image_tag(emoji_name, emoji_fallback_image_source)
        else
          emoji_info['moji']
        end
      end
    end
  end
end