Split String into roughly equal-sized chunks.
Delimiter is preserved in output.
1 2 class String 3 def chunk_string(average_segment_size = 40, sclice_on = /\s+/) 4 out = [] 5 slices_estimate = self.size.divmod(average_segment_size) 6 slice_count = (slices_estimate[1] > 0 ? slices_estimate[0] + 1 : slices_estimate[0]) 7 slice_guess = self.size / slice_count 8 previous_slice_location = 0 9 (1..slice_count - 1).each do 10 |i| 11 slice_location = self.nearest_split(slice_guess * i, sclice_on) 12 out << self.slice(previous_slice_location..slice_location) 13 previous_slice_location = slice_location + 1 14 end 15 out << self.slice(previous_slice_location..self.size) 16 out 17 end 18 19 def nearest_split(slice_start, slice_on) 20 left_scan_location = (self.slice(0..slice_start).rindex(slice_on)).to_i 21 right_scan_location = (self.slice((slice_start+1)..self.size).index(slice_on)).to_i + slice_start 22 ((slice_start - left_scan_location) < (right_scan_location - slice_start) ? left_scan_location : right_scan_location) 23 end 24 end