From fcbf63e62c627deae76c1b8cb8c0876c536ed811 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Mon, 16 Mar 2020 18:49:26 +0900 Subject: Fresh start --- jni/ruby/lib/rubygems/text.rb | 75 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 jni/ruby/lib/rubygems/text.rb (limited to 'jni/ruby/lib/rubygems/text.rb') 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 + -- cgit v1.2.3