diff options
author | Jari Vetoniemi <jari.vetoniemi@indooratlas.com> | 2020-03-16 18:49:26 +0900 |
---|---|---|
committer | Jari Vetoniemi <jari.vetoniemi@indooratlas.com> | 2020-03-30 00:39:06 +0900 |
commit | fcbf63e62c627deae76c1b8cb8c0876c536ed811 (patch) | |
tree | 64cb17de3f41a2b6fef2368028fbd00349946994 /jni/ruby/lib/rubygems/text.rb |
Fresh start
Diffstat (limited to 'jni/ruby/lib/rubygems/text.rb')
-rw-r--r-- | jni/ruby/lib/rubygems/text.rb | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/jni/ruby/lib/rubygems/text.rb b/jni/ruby/lib/rubygems/text.rb new file mode 100644 index 0000000..5c9287a --- /dev/null +++ b/jni/ruby/lib/rubygems/text.rb @@ -0,0 +1,75 @@ +require 'rubygems' + +## +# A collection of text-wrangling methods + +module Gem::Text + + ## + # Wraps +text+ to +wrap+ characters and optionally indents by +indent+ + # characters + + def format_text(text, wrap, indent=0) + result = [] + work = text.dup + + while work.length > wrap do + if work =~ /^(.{0,#{wrap}})[ \n]/ then + result << $1.rstrip + work.slice!(0, $&.length) + else + result << work.slice!(0, wrap) + end + end + + result << work if work.length.nonzero? + result.join("\n").gsub(/^/, " " * indent) + end + + def min3 a, b, c # :nodoc: + if a < b && a < c then + a + elsif b < c then + b + else + c + end + end + + # This code is based directly on the Text gem implementation + # Returns a value representing the "cost" of transforming str1 into str2 + def levenshtein_distance str1, str2 + s = str1 + t = str2 + n = s.length + m = t.length + max = n/2 + + return m if (0 == n) + return n if (0 == m) + return n if (n - m).abs > max + + d = (0..m).to_a + x = nil + + str1.each_char.each_with_index do |char1,i| + e = i+1 + + str2.each_char.each_with_index do |char2,j| + cost = (char1 == char2) ? 0 : 1 + x = min3( + d[j+1] + 1, # insertion + e + 1, # deletion + d[j] + cost # substitution + ) + d[j] = e + e = x + end + + d[m] = x + end + + return x + end +end + |