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 214 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 220 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 239 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 250 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 245 def extract_target_entries(msgctxt) @target_entries[msgctxt] ||= collect_same_msgctxt_entries(msgctxt) end