class Rabbit::Searcher

Public Class Methods

new(canvas) click to toggle source
# File lib/rabbit/searcher.rb, line 15
def initialize(canvas)
  @canvas = canvas
end

Public Instance Methods

regexp(text) click to toggle source
# File lib/rabbit/searcher.rb, line 19
def regexp(text)
  unless text == @text
    @text = text
    @regexp = nil
  end
  @regexp ||= internal_regexp
end

Private Instance Methods

have_migemo_static_dict?() click to toggle source
# File lib/rabbit/searcher.rb, line 72
def have_migemo_static_dict?
  if @@migemo_static_dict.nil?
    dict, dict_cache = search_migemo_static_dict
    @@migemo_static_dict, @@migemo_static_dict_cache = dict, dict_cache
  end
  not @@migemo_static_dict.nil?
end
internal_regexp() click to toggle source
# File lib/rabbit/searcher.rb, line 28
def internal_regexp
  if migemo_available?
    migemo_regexp
  else
    begin
      /#{@text}/u
    rescue RegexpError
      /#{Regexp.escape(@text)}/u
    end
  end
end
make_migemo_dict(path) click to toggle source
# File lib/rabbit/searcher.rb, line 96
def make_migemo_dict(path)
  dict = MigemoStaticDict.new(path)
  dict_cache = nil
  dict_cache_path = "#{path}.cache"
  if File.readable?(dict_cache_path)
    dict_cache = MigemoDictCache.new(dict_cache_path)
  end
  [dict, dict_cache]
end
migemo_available?() click to toggle source
# File lib/rabbit/searcher.rb, line 68
def migemo_available?
  defined?(::Migemo) and have_migemo_static_dict?
end
migemo_generate_regexp_str(pattern, with_paren) click to toggle source
# File lib/rabbit/searcher.rb, line 55
def migemo_generate_regexp_str(pattern, with_paren)
  Converter.keep_kcode("EUC-JP") do
    migemo = Migemo.new(@@migemo_static_dict, pattern)
    migemo.dict_cache = @@migemo_static_dict_cache
    migemo.with_paren = with_paren
    migemo.regex
  end
end
migemo_regexp() click to toggle source
# File lib/rabbit/searcher.rb, line 40
def migemo_regexp
  text = Converter.to_eucjp_from_utf8(@text)
  segments = migemo_split_text(text)
  if segments.size <= 1
    regexp_str = migemo_generate_regexp_str(text, false)
  else
    regexp_str1 = migemo_generate_regexp_str(text, true)
    regexp_str2 = segments.collect do |pattern|
      migemo_generate_regexp_str(pattern, true)
    end.join
    regexp_str = [regexp_str1, regexp_str2].join("|")
  end
  /#{Converter.to_utf8_from_eucjp(regexp_str)}/u
end
migemo_split_text(text) click to toggle source
# File lib/rabbit/searcher.rb, line 64
def migemo_split_text(text)
  text.scan(/[A-Z]?[^A-Z]+|[A-Z]+/)
end
search_migemo_static_dict() click to toggle source
# File lib/rabbit/searcher.rb, line 80
def search_migemo_static_dict
  @canvas.migemo_dictionary_search_path.each do |target|
    if File.directory?(target)
      [
       File.join(target, @canvas.migemo_dictionary_name),
       File.join(target, "migemo", @canvas.migemo_dictionary_name),
      ].each do |guess|
        return make_migemo_dict(guess) if File.readable?(guess)
      end
    elsif File.readable?(target)
      return make_migemo_dict(target)
    end
  end
  nil
end