lib/emoji_data.rb in emoji_data-0.0.3 vs lib/emoji_data.rb in emoji_data-0.1.0.rc1

- old
+ new

@@ -6,54 +6,95 @@ GEM_ROOT = File.join(File.dirname(__FILE__), '..') RAW_JSON = IO.read(File.join(GEM_ROOT, 'vendor/emoji-data/emoji.json')) EMOJI_MAP = JSON.parse( RAW_JSON ) EMOJI_CHARS = EMOJI_MAP.map { |em| EmojiChar.new(em) } - # hashmap for fast unified lookups + # + # construct hashmap for fast precached lookups for `.find_by_unified` + # EMOJICHAR_UNIFIED_MAP = Hash[EMOJI_CHARS.map { |u| [u.unified, u] }] + # merge variant encodings into map so we can look them up as well + EMOJI_CHARS.select(&:variant?).each do |char| + char.variations.each do |variant| + EMOJICHAR_UNIFIED_MAP.merge! Hash[variant,char] + end + end def self.all EMOJI_CHARS end - def self.chars - @chars ||= EMOJI_CHARS.map(&:char) + def self.all_doublebyte + EMOJI_CHARS.select(&:doublebyte?) end - def self.codepoints - @codepoints ||= EMOJI_CHARS.map(&:unified) + def self.all_with_variants + EMOJI_CHARS.select(&:variant?) end + def self.chars(options={}) + options = {include_variants: false}.merge(options) + + normals = EMOJI_CHARS.map { |c| c.char({variant_encoding: false}) } + extras = self.all_with_variants.map { |c| c.char({variant_encoding: true}) } + + if options[:include_variants] + return normals + extras + end + normals + end + + def self.codepoints(options={}) + options = {include_variants: false}.merge(options) + + if options[:include_variants] + return EMOJI_CHARS.map(&:unified) + self.all_with_variants.map {|c| c.variant} + end + EMOJI_CHARS.map(&:unified) + end + def self.char_to_unified(char) char.codepoints.to_a.map {|i| i.to_s(16).rjust(4,'0')}.join('-').upcase end def self.unified_to_char(cp) - find_by_unified(cp).char + EmojiChar::unified_to_char(cp) end def self.find_by_unified(cp) - # EMOJI_CHARS.detect { |ec| ec.unified == cp.upcase } EMOJICHAR_UNIFIED_MAP[cp.upcase] end def self.find_by_str(str) - matches = EMOJI_CHARS.select { |ec| str.include? ec.char } - matches.sort_by { |matched_char| str.index(matched_char.char) } + str.extend EmojiData::StringUtils + + matches = EMOJI_CHARS.select { |ec| str.include_any? ec.chars } + matches.sort_by { |mc| str.index_first(mc.chars) } end def self.find_by_name(name) - # self.all.select { |char| char.name.include? name.upcase } self.find_by_value(:name, name.upcase) end def self.find_by_short_name(short_name) - # self.all.select { |char| char.short_name.include? name.downcase } self.find_by_value(:short_name, short_name.downcase) end protected def self.find_by_value(field,value) self.all.select { |char| char.send(field).include? value } + end + + module StringUtils + def include_any?(charstr) + charstr.any? { |char| self.include? char } + end + + def index_first(charstr) + charstr.each do |char| + return self.index(char) if !self.index(char).nil? + end + nil + end end end