word_wrap(text, *args) public

Wraps the text into lines no longer than line_width width. This method breaks on the first whitespace character that does not exceed line_width (which is 80 by default).

Examples

  word_wrap('Once upon a time')
  # => Once upon a time

  word_wrap('Once upon a time, in a kingdom called Far Far Away, a king fell ill, and finding a successor to the throne turned out to be more trouble than anyone could have imagined...')
  # => Once upon a time, in a kingdom called Far Far Away, a king fell ill, and finding\n a successor to the throne turned out to be more trouble than anyone could have\n imagined...

  word_wrap('Once upon a time', :line_width => 8)
  # => Once upon\na time

  word_wrap('Once upon a time', :line_width => 1)
  # => Once\nupon\na\ntime

You can still use word_wrap with the old API that accepts the line_width as its optional second parameter:

  word_wrap('Once upon a time', 8)     # => Once upon\na time
Show source
Register or log in to add new notes.
October 14, 2008 - (v1.0.0 - v1.2.6)
1 thank

Wrapping peculiarities

word_wrap will consume multiple line-breaks as well as leading & trailing line-breaks.

word_wrap("\nOnce upon a time\n\nThe End\n")
# => Once upon a time\nThe End

word_wrap will NOT break long words

"supercalifragilisticexpialidocious".length
# => 34
word_wrap("\nOnce upon a supercalifragilisticexpialidocious time", 15)
# => Once upon a\nsupercalifragilisticexpialidocious\ntime

If you want a function that will break long words & maintain multiple line-breaks try this alternative. Note it does add a line break at the end of the output.

def breaking_wrap_wrap(txt, col = 80)
  txt.gsub(/(.{1,#{col}})( +|$\n?)|(.{1,#{col}})/,
    "\\1\\3\n") 
end

breaking_wrap_wrap("\nOnce upon a supercalifragilisticexpialidocious time", 15)
# => \nOnce upon a\nsupercalifragil\nisticexpialidoc\nious time\n

Regex-based code from http://blog.macromates.com/2006/wrapping-text-with-regular-expressions/

October 14, 2008
0 thanks

Wrapping peculiarities as of 2.x

In Rails 2.x word_wrap has been improved so that it no longer consumes multiple line-breaks or leading & trailing line-breaks.

word_wrap("\nOnce upon a time\n\nThe End\n")
# => \nOnce upon a time\n\nThe End

However it still doesn’t break long words

"supercalifragilisticexpialidocious".length
# => 30
word_wrap("\nOnce upon a supercalifragilisticexpialidocious time", 15)
# => \nOnce upon a\nsupercalifragilisticexpialidocious\ntime
November 18, 2010
0 thanks

word_wrap with breaking long words

Code

def breaking_word_wrap(text, *args)
   options = args.extract_options!
   unless args.blank?
     options[:line_width] = args[0] || 80
   end
   options.reverse_merge!(:line_width => 80)
   text = text.split(" ").collect do |word|
     word.length > options[:line_width] ? word.gsub(/(.{1,#{options[:line_width]}})/, "\\1 ") : word
   end * " "
   text.split("\n").collect do |line|
     line.length > options[:line_width] ? line.gsub(/(.{1,#{options[:line_width]}})(\s+|$)/, "\\1\n").strip : line
   end * "\n"
end

breaking_word_wrap("Once upon a supercalifragilisticexpialidocious time",15)
# => Once upon a\nsupercalifragil\nisticexpialidoc\nious  time