summaryrefslogtreecommitdiff
path: root/tooling/danger/emoji_checker.rb
blob: 9d8ff93037ccfbe3079c5a055b7f1bd7b9c5d98f (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
# frozen_string_literal: true

require 'json'

module Tooling
  module Danger
    class EmojiChecker
      DIGESTS = File.expand_path('../../fixtures/emojis/digests.json', __dir__)
      ALIASES = File.expand_path('../../fixtures/emojis/aliases.json', __dir__)

      # A regex that indicates a piece of text _might_ include an Emoji. The regex
      # alone is not enough, as we'd match `:foo:bar:baz`. Instead, we use this
      # regex to save us from having to check for all possible emoji names when we
      # know one definitely is not included.
      LIKELY_EMOJI = /:[\+a-z0-9_\-]+:/.freeze

      UNICODE_EMOJI_REGEX = %r{(
        [\u{1F300}-\u{1F5FF}] |
        [\u{1F1E6}-\u{1F1FF}] |
        [\u{2700}-\u{27BF}] |
        [\u{1F900}-\u{1F9FF}] |
        [\u{1F600}-\u{1F64F}] |
        [\u{1F680}-\u{1F6FF}] |
        [\u{2600}-\u{26FF}]
      )}x.freeze

      def initialize
        names = JSON.parse(File.read(DIGESTS)).keys +
          JSON.parse(File.read(ALIASES)).keys

        @emoji = names.map { |name| ":#{name}:" }
      end

      def includes_text_emoji?(text)
        return false unless text.match?(LIKELY_EMOJI)

        @emoji.any? { |emoji| text.include?(emoji) }
      end

      def includes_unicode_emoji?(text)
        text.match?(UNICODE_EMOJI_REGEX)
      end
    end
  end
end