module Kaomoji

Constants

THRESHOLD
VERSION

Public Class Methods

get_kaomoji_left_side(start_index, str) click to toggle source
# File lib/kaomoji.rb, line 48
def get_kaomoji_left_side(start_index, str)
  return 0 if start_index.zero?
  first = start_index
  count = 0
  str.chars[0..start_index].reverse.each_with_index do |chr, index|
    if kaomoji_parts?(chr)
      count = 0
      first = start_index - index
    elsif normal_char?(chr)
      count += 1
    end
    return first if count > THRESHOLD || index == start_index-1
  end
end
get_kaomoji_right_side(start_index, str) click to toggle source
# File lib/kaomoji.rb, line 33
def get_kaomoji_right_side(start_index, str)
  return start_index if start_index==str.chars.length-1
  last = start_index
  count = 0
  str.chars[start_index..str.length-1].each_with_index do |chr, index|
    if kaomoji_parts?(chr)
      count = 0
      last = start_index + index
    elsif normal_char?(chr)
      count += 1
    end
    return last if count > THRESHOLD || index == str.chars[start_index..str.length-1].length - 1
  end
end
get_one_unicode_kaomoji_at_index(index, str) click to toggle source
# File lib/kaomoji.rb, line 25
def get_one_unicode_kaomoji_at_index(index, str)
  start = get_kaomoji_left_side(index, str)
  last = get_kaomoji_right_side(index, str)
  str.chars[start..last].join
end
get_unicode_kaomojis(str) click to toggle source
# File lib/kaomoji.rb, line 18
def get_unicode_kaomojis(str)
  return [] if str.chars.length.zero?

  kaomojis = (0..str.chars.size-1).map{|i| get_one_unicode_kaomoji_at_index(i, str) if kaomoji_parts?(str.chars[i]) }.uniq.compact
  kaomojis.select{|k|valid_kaomoji?(k)}.reject{|target|kaomojis.map{|kaomoji| (kaomoji!=target) && kaomoji.include?(target)}.any?}
end
half_of_normal_chars(str) click to toggle source
# File lib/kaomoji.rb, line 96
def half_of_normal_chars(str)
  normal_chars = %w(Lc Ll Lm Lo Lt Lu Nd Nl)
  normal_words_count =str.split('').map{|chr|::Unicode::Categories.categories(chr).map{|block|normal_chars.include?(block)}.any? ? 1 : 0}.sum.to_f
  all_count = str.length.to_f
  result = (normal_words_count / all_count) > 0.5
  result
end
kaomoji_parts?(chr) click to toggle source
# File lib/kaomoji.rb, line 6
def kaomoji_parts?(chr)
  kaomoji_group_categories = %w(Pc Pd Pe Pf Pi Po Ps Sc Sk Sm So)
  japanese_group = %w(Basic\ Latin Hiragana CJK\ Unified\ Ideographs Fullwidth\ ASCII\ Variants)
  return !japanese_group.include?(::Unicode::Blocks.blocks(chr).first) || kaomoji_group_categories.include?(::Unicode::Categories.categories(chr).first)
end
normal_char?(chr) click to toggle source
# File lib/kaomoji.rb, line 12
def normal_char?(chr)
  normal_char_blocks = %w(Lc Ll Lm Lo Lt Lu Nd Nl)
  target_block = ::Unicode::Categories.categories(chr)
  normal_char_blocks.include?(target_block.first)
end
unicode_kaomojis(threshold = 2, str) click to toggle source
# File lib/kaomoji.rb, line 63
def unicode_kaomojis(threshold = 2, str)
  kaomojis = []
  current=[]
  count=0
  str.split('').each do |chr|
    if kaomoji_parts?(chr)
      current.push(chr)
      count=0
    else
      count+=1
    end

    pp [chr,count]
    if count > threshold
      kaomoji = current.join
      kaomojis.push(kaomoji) if valid_kaomoji?(kaomoji)
      current=[]
      count=0
    end
  end

  if current.count > 0
    kaomoji = current.join
    kaomojis.push(kaomoji) if valid_kaomoji?(kaomoji)
  end

  kaomojis
end
valid_kaomoji?(kaomoji) click to toggle source
# File lib/kaomoji.rb, line 92
def valid_kaomoji?(kaomoji)
  kaomoji.length > 3 && !half_of_normal_chars(kaomoji)
end