word_wrap method for String?

J

Jeff Coleman

Hi all,

For a text adventure program I'm working on I needed a method to word
wrap a long string based on spaces or non-word characters so I came up
with this. I just thought I'd post it to see if there are any thoughts
or if there might be a better way to do it.

class String
def word_wrap(width)
source = self.dup
original_width = width
while width < source.length do
last_space = source.rindex( / |\W/, width )
source.insert( last_space, "\n" )
source.gsub!(/\n */,"\n")
width = last_space + original_width
end
source
end
end

Jeff Coleman
 
M

Mike

For a text adventure program I'm working on I needed a method
to word wrap a long string based on spaces or non-word
characters so I came up with this. I just thought I'd post
it to see if there are any thoughts or if there might be a
better way to do it.

I wrote one last week, actually

def wrap(wrap_len=78)
start_pos = wrap_len
while start_pos < @fact.length
sp = @fact.rindex(' ', start_pos)
@fact.insert(sp, '|')
start_pos = sp + wrap_len + 1
end
@fact.gsub!(/\|[\s]/, "\n")
end

I'm far from an expert, so I don't know which method may be better :)

-M
 
L

Lou Vanek

here's a (partially modded) excerpt from a previous discussion on this topic:

width = 11
str = 'This is a test of the emergency broadcasting servicings I asseverate'
p str.scan(/\S.{0,#{width}}\S(?=\s|$)|\S+/)
 
J

Jeff Coleman

Lou said:
here's a (partially modded) excerpt from a previous discussion on this
topic:

width = 11
str = 'This is a test of the emergency broadcasting servicings I
asseverate'
p str.scan(/\S.{0,#{width}}\S(?=\s|$)|\S+/)

When I was writing that I just KNEW there must be some one-line solution
involving regular expressions!

Although I don't quite follow the exact structure of this one, it
definitely works...

Jeff
 
M

Matthew Harris

Mike said:
For a text adventure program I'm working on I needed a method
to word wrap a long string based on spaces or non-word
characters so I came up with this. I just thought I'd post
it to see if there are any thoughts or if there might be a
better way to do it.

I wrote one last week, actually

def wrap(wrap_len=78)
start_pos = wrap_len
while start_pos < @fact.length
sp = @fact.rindex(' ', start_pos)
@fact.insert(sp, '|')
start_pos = sp + wrap_len + 1
end
@fact.gsub!(/\|[\s]/, "\n")
end

I'm far from an expert, so I don't know which method may be better :)

-M

class String
# Wrap string by the given length, and join it with the given
character.
# The method doesn't distinguish between words, it will only work based
on
# the length. The method will also strip and whitespace.
#
def wrap(length = 80, character = $/)
scan(/.{#{length}}|.+/).map { |x| x.strip }.join(character)
end
end

puts 'Hello, World! I am quite very long :)'.wrap(15, "<br>\n")

# Output:
#
# Hello, World! I<br>
# am quite very<br>
# long :)

Have fun =)

- Matt
 
L

Lou Vanek

everthing old is new again.
you might also want to compare speeds. Yours might be faster.
-lv
 
J

Jeff Coleman

Lou said:
everthing old is new again.
you might also want to compare speeds. Yours might be faster.
-lv

It's my first time using the profiler, but if I'm reading this
correctly--

It took my version 27 seconds to do 6000 word_wraps. Your regexp
version did the same in 2.4 seconds :)

Jeff Coleman
 
L

Lou Vanek

yahtzee!
btw, this isn't my regex. Like most things of mine, they're
either cribbed, borrowed, or outright stolen.
-lv
 
D

Daniel Harple

For a text adventure program I'm working on I needed a method to word
wrap a long string based on spaces or non-word characters so I came up
with this. I just thought I'd post it to see if there are any
thoughts
or if there might be a better way to do it.

This one is taken from facets[1]. I use it to wrap lines in TextMate.

def word_wrap(text, col_width=80)
text.gsub!( /(\S{#{col_width}})(?=\S)/, '\1 ' )
text.gsub!( /(.{1,#{col_width}})(?:\s+|$)/, "\\1\n" )
text
end

[1] gem install facets

-- Daniel
 
W

William James

Lou said:
here's a (partially modded) excerpt from a previous discussion on this topic:

width = 11
str = 'This is a test of the emergency broadcasting servicings I asseverate'
p str.scan(/\S.{0,#{width}}\S(?=\s|$)|\S+/)

When you modded, you didn't notice that 8 was 2 less than the width.

str =
'This is a test of the emergency broadcasting servicings I asseverate'
p str.scan(/\S.{0,#{width-2}}\S(?=\s|$)|\S+/)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,202
Messages
2,571,057
Members
47,667
Latest member
DaniloB294

Latest Threads

Top