class GetText::Tools::MsgMerge::FuzzyEntryFinder

@private

Constants

MAX_DIFFERENCE_RATIO
MAX_FUZZY_DISTANCE

Public Class Methods

new(entries) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 213
def initialize(entries)
  @entries = entries
  @target_entries = {}
end

Public Instance Methods

find(msgid, msgctxt) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 219
def find(msgid, msgctxt)
  return nil if msgid == :last
  min_distance_entry = nil
  min_distance = MAX_FUZZY_DISTANCE

  target_entries = extract_target_entries(msgctxt)
  target_entries.each do |entry|
    distance = compute_distance(entry.msgid, msgid)
    next if distance.nil?
    if min_distance > distance
      min_distance = distance
      min_distance_entry = entry
    end
  end

  min_distance_entry
end

Private Instance Methods

collect_same_msgctxt_entries(msgctxt) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 238
def collect_same_msgctxt_entries(msgctxt)
  @entries.find_all do |entry|
    entry.msgctxt == msgctxt and not entry.msgid == :last
  end
end
compute_distance(source, destination) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 249
def compute_distance(source, destination)
  max_size = [source.size, destination.size].max
  return 0.0 if max_size.zero?

  if destination.include?(source)
    added_size = destination.size - source.size
    return MAX_FUZZY_DISTANCE * (added_size.to_f / destination.size)
  end

  max_difference = (max_size * MAX_DIFFERENCE_RATIO).ceil + 1
  distance = Text::Levenshtein.distance(source,
                                        destination,
                                        max_difference)
  if distance == max_difference
    nil
  else
    distance / max_size.to_f
  end
end
extract_target_entries(msgctxt) click to toggle source
# File lib/gettext/tools/msgmerge.rb, line 244
def extract_target_entries(msgctxt)
  @target_entries[msgctxt] ||= collect_same_msgctxt_entries(msgctxt)
end