class WordWrap::Wrapper

TODO: Refactor similar passages out of the two functions into a common one

def fit

def fit
  lines = []
  next_line = ""
  @text.lines do |line|
    line.chomp! "\n"
    if line.length == 0
      if next_line.length > 0
        lines.push next_line
        next_line = ""
      end
      lines.push ""
    end
    words = line.split " "
    words.each do |word|
      word.chomp! "\n"
      if next_line.length + word.length < @width
        if next_line.length > 0
          next_line << " " << word
        else
          next_line = word
        end
      else
        if word.length >= @width
          lines.push next_line unless next_line == ""
          lines.push word
          next_line = ""
        else
          lines.push next_line
          next_line = word
        end
      end
    end
  end
  lines.push next_line
  if next_line.length <= 0
    lines.join("\n")
  else
    lines.join("\n") + "\n"
  end
end

def initialize(text, width)

def initialize(text, width)
  @text = text
  @width = width
end

def split_line(line, width)

def split_line(line, width)
  at = line.index /\s/
  last_at = at
  while at != nil && at < width
    last_at = at
    at = line.index /\s/, last_at + 1
  end
  if last_at == nil
    [line]
  else
    [line[0,last_at], line[last_at+1, line.length]]
  end
end

def wrap

def wrap
  output = []
  @text.lines do |line|
    line.chomp! "\n"
    if line.length > @width
      new_lines = split_line(line, @width)
      while new_lines.length > 1 && new_lines[1].length > @width
        output.push new_lines[0]
        new_lines = split_line new_lines[1], @width
      end
      output += new_lines
    else
      output.push line
    end
  end
  output.map { |s| s.rstrip! }
  output.join("\n") + "\n"
end