1require 'rubygems' 2 3## 4# A collection of text-wrangling methods 5 6module Gem::Text 7 8 ## 9 # Wraps +text+ to +wrap+ characters and optionally indents by +indent+ 10 # characters 11 12 def format_text(text, wrap, indent=0) 13 result = [] 14 work = text.dup 15 16 while work.length > wrap do 17 if work =~ /^(.{0,#{wrap}})[ \n]/ then 18 result << $1.rstrip 19 work.slice!(0, $&.length) 20 else 21 result << work.slice!(0, wrap) 22 end 23 end 24 25 result << work if work.length.nonzero? 26 result.join("\n").gsub(/^/, " " * indent) 27 end 28 29 # This code is based directly on the Text gem implementation 30 # Returns a value representing the "cost" of transforming str1 into str2 31 def levenshtein_distance str1, str2 32 s = str1 33 t = str2 34 n = s.length 35 m = t.length 36 max = n/2 37 38 return m if (0 == n) 39 return n if (0 == m) 40 return n if (n - m).abs > max 41 42 d = (0..m).to_a 43 x = nil 44 45 n.times do |i| 46 e = i+1 47 48 m.times do |j| 49 cost = (s[i] == t[j]) ? 0 : 1 50 x = [ 51 d[j+1] + 1, # insertion 52 e + 1, # deletion 53 d[j] + cost # substitution 54 ].min 55 d[j] = e 56 e = x 57 end 58 59 d[m] = x 60 end 61 62 return x 63 end 64end 65 66