class Somemoji::EmojiCollection

Public Class Methods

new(emojis = []) click to toggle source

@param emojis [Array<Somemoji::Emoji>]

# File lib/somemoji/emoji_collection.rb, line 6
def initialize(emojis = [])
  @emojis = emojis
end

Public Instance Methods

+(emoji_collection) click to toggle source

Compounds two emoji collections into a new one @param emoji_collection [Somemoji::EmojiCollection] @return [Somemoji::EmojiCollection] a new emoji collection @example

custom_emoji_collection = Somemoji.emoji_collection + Somemoji::EmojiCollection.new(
  [
    Somemoji::Emoji.new(code: "foo"),
    Somemoji::Emoji.new(code: "bar"),
  ]
)
custom_emoji_collection.find_by_code("foo").class #=> Somemoji::Emoji
custom_emoji_collection.find_by_code("bar").class #=> Somemoji::Emoji
custom_emoji_collection.find_by_code("100").class #=> Somemoji::Emoji
# File lib/somemoji/emoji_collection.rb, line 23
def +(emoji_collection)
  self.class.new(to_a + emoji_collection.to_a)
end
character_pattern() click to toggle source

@return [Regexp] a regexp to match with emoji characters

# File lib/somemoji/emoji_collection.rb, line 28
def character_pattern
  @character_pattern ||= ::Regexp.union(characters)
end
characters() click to toggle source

@return [Array<String>] all emoij characters included in this collection

# File lib/somemoji/emoji_collection.rb, line 33
def characters
  index_by_character.keys
end
code_pattern() click to toggle source

@return [Regexp] a regexp to match with emoji codes

# File lib/somemoji/emoji_collection.rb, line 38
def code_pattern
  @code_pattern ||= /:(#{::Regexp.union(codes)}):/
end
codes() click to toggle source

@return [Array<String>] all emoji codes included in this collection

# File lib/somemoji/emoji_collection.rb, line 43
def codes
  index_by_code.keys
end
each(&block) click to toggle source

@note Implementation for Enumerable

# File lib/somemoji/emoji_collection.rb, line 48
def each(&block)
  @emojis.each(&block)
end
filter_by_category(category) click to toggle source

@param category [Object] @return [Somemoji::EmojiCollection] a emoji collection filtered by a given category pattern @example

Somemoji.emoji_collection.filter_by_category("activity").count #=> 145
Somemoji.emoji_collection.filter_by_category("people").count #=> 570
# File lib/somemoji/emoji_collection.rb, line 57
def filter_by_category(category)
  ::Somemoji::EmojiCollection.new(
    select do |emoji|
      category === emoji.category
    end
  )
end
filter_by_keyword(keyword) click to toggle source

@param keyword [Object] @return [Somemoji::EmojiCollection] a emoji collection filtered by a given keyword pattern @example

Somemoji.emoji_collection.filter_by_keyword("numbers").count #=> 13
Somemoji.emoji_collection.filter_by_keyword("vehicle").count #=> 31
# File lib/somemoji/emoji_collection.rb, line 70
def filter_by_keyword(keyword)
  ::Somemoji::EmojiCollection.new(
    select do |emoji|
      emoji.keywords.any? do |emoji_keyword|
        keyword === emoji_keyword
      end
    end
  )
end
find_by_character(character) click to toggle source

Finds an emoji from an emoji character (a.k.a. unicode grapheme cluster) @param character [String] an emoji character (e.g. “u2934”) @return [Somemoji::Emoji, nil] @example

Somemoji.emoji_collection.find_by_character("👍").class #=> Somemoji::Emoji
Somemoji.emoji_collection.find_by_character("👎").class #=> Somemoji::Emoji
# File lib/somemoji/emoji_collection.rb, line 86
def find_by_character(character)
  index_by_character[character]
end
find_by_code(code) click to toggle source

Finds an emoji from an emoji code @param code [String] an emoji code (e.g. “arrow_heading_up”) @return [Somemoji::Emoji, nil] @example

Somemoji.emoji_collection.find_by_code("thumbsup").class #=> Somemoji::Emoji
Somemoji.emoji_collection.find_by_code("+1").class #=> Somemoji::Emoji
Somemoji.emoji_collection.find_by_code("undefined_code") #=> nil
# File lib/somemoji/emoji_collection.rb, line 97
def find_by_code(code)
  index_by_code[code]
end
replace_character(string, &block) click to toggle source

Replaces emoji characters in a given string with a given block result @param string [String] a string that to be replaced @return [String] a replaced result @example

Somemoji.emoji_collection.replace_character("I ❤ Emoji") do |emoji|
  %(<img alt="#{emoji.character}" class="emoji" src="/images/emoji/#{emoji.base_path}.png">)
end
#=> 'I <img alt="❤" class="emoji" src="/images/emoji/unicode/2764.png"> Emoji'
# File lib/somemoji/emoji_collection.rb, line 109
def replace_character(string, &block)
  string.gsub(character_pattern) do |character|
    block.call(find_by_character(character), character)
  end
end
replace_code(string, &block) click to toggle source

Replaces emoji codes in a given string with a given block result @param string [String] a string that to be replaced @return [String] a replaced result @example

Somemoji.emoji_collection.replace_code("I :heart: Emoji") do |emoji|
  %(<img alt="#{emoji.character}" class="emoji" src="/images/emoji/#{emoji.base_path}.png">)
end
#=> 'I <img alt="❤" class="emoji" src="/images/emoji/unicode/2764.png"> Emoji'
# File lib/somemoji/emoji_collection.rb, line 123
def replace_code(string, &block)
  string.gsub(code_pattern) do |matched_string|
    block.call(find_by_code(::Regexp.last_match(1)), matched_string)
  end
end
search_by_code(pattern) click to toggle source

Searches emojis that match with given pattern @param pattern [Object] @return [Somemoji::EmojiCollection] @example

Somemoji.emoji_collection.search_by_code(/^cus/).map(&:code)
#=> ["custard", "customs"]
# File lib/somemoji/emoji_collection.rb, line 135
def search_by_code(pattern)
  self.class.new(
    select do |emoji|
      pattern === emoji.code || emoji.aliases.any? do |alias_code|
        pattern === alias_code
      end
    end
  )
end

Private Instance Methods

index_by_character() click to toggle source

@return [Hash{String => Somemoji::Emoji}]

# File lib/somemoji/emoji_collection.rb, line 148
def index_by_character
  @index_by_character ||= each_with_object({}) do |emoji, hash|
    hash[emoji.character] = emoji
  end
end
index_by_code() click to toggle source

@return [Hash{String => Somemoji::Emoji}]

# File lib/somemoji/emoji_collection.rb, line 155
def index_by_code
  @index_by_code ||= each_with_object({}) do |emoji, hash|
    hash[emoji.code] = emoji
    emoji.aliases.each do |alias_code|
      hash[alias_code] = emoji
    end
  end
end