def wrap_line(line, options)
@document = options[:document]
@size = options[:size]
@kerning = options[:kerning]
@width = options[:width]
@accumulated_width = 0
@output = ""
scan_pattern = @document.font.unicode? ? /\S+|\s+/ : /\S+|\s+/n
space_scan_pattern = @document.font.unicode? ? /\s/ : /\s/n
line.scan(scan_pattern).each do |segment|
segment_width = @document.width_of(segment,
:size => @size,
:kerning => @kerning)
if @accumulated_width + segment_width <= @width
@accumulated_width += segment_width
@output << segment
else
break if @output =~ space_scan_pattern
wrap_by_char(segment)
break
end
end
@output
end