problems with making wordwrap

L

luke

hi,

i've found a great bit of code from

http://dev.rubyonrails.org/ticket/1449

that takes some text and makes it wrap at 80 lines. the only issue is that
it takes multiple line breaks (like paragraphs), and makes them into single
line breaks.

this is the code:

text.gsub( /\n/, "\n\n" ).gsub( /(.{1,80})(\s+|$)/, "\\1\n")

i've tinkered with it for a while, but i can't work out how to not have it
eat lines breaks so hungrily.

thanks for any help
luke
 
P

Pit Capitain

luke said:
i've found a great bit of code from

http://dev.rubyonrails.org/ticket/1449

that takes some text and makes it wrap at 80 lines. the only issue is that
it takes multiple line breaks (like paragraphs), and makes them into single
line breaks.

this is the code:

text.gsub( /\n/, "\n\n" ).gsub( /(.{1,80})(\s+|$)/, "\\1\n")

i've tinkered with it for a while, but i can't work out how to not have it
eat lines breaks so hungrily.

Hi Luke,

can you tell us how you want to treat whitespace in the given text? You
talked about newlines, but what should be the result in the following cases:

"abcde\n c".wrap(5) # => "abcde\nc" or "abcde\n c"
"a e\na".wrap(5) # => "a e\na" or "a e a"

Regards,
Pit
 
E

Eric Hodel

hi,

i've found a great bit of code from

http://dev.rubyonrails.org/ticket/1449

that takes some text and makes it wrap at 80 lines. the only issue
is that
it takes multiple line breaks (like paragraphs), and makes them
into single
line breaks.

I use Text::Format for this:

def wrap(text)
formatter = Text::Format.new
formatter.columns = 72 # 70 + '> ' = 72
formatter.format_style = Text::Format::LEFT_ALIGN
formatter.first_indent = 0

formatted = []

text.split(/\r?\n\r?\n/).each do |chunk|
formatted << formatter.paragraphs(chunk)
end

return formatted.join("\n")
end

http://www.halostatue.ca/ruby/Text__Format.html
 
L

luke

Hi Luke,

can you tell us how you want to treat whitespace in the given text? You
talked about newlines, but what should be the result in the following cases:

"abcde\n c".wrap(5) # => "abcde\nc" or "abcde\n c"
"a e\na".wrap(5) # => "a e\na" or "a e a"

Regards,
Pit

hi pit,

thanks for your help.

ideally how i would like it to behave given your examples, would be like:

"abcde\n c".wrap(5) # => "abcde\nc"
"a e\na".wrap(5) # => "a e\na"

does that make sense? so text would be flush with the left margin with no
white space at the beginning of new lines. but whitespace within a line
should remain intact.

thanks

luke
 
P

Pit Capitain

luke said:
ideally how i would like it to behave given your examples, would be like:

"abcde\n c".wrap(5) # => "abcde\nc"
"a e\na".wrap(5) # => "a e\na"

does that make sense? so text would be flush with the left margin with no
white space at the beginning of new lines. but whitespace within a line
should remain intact.

Of course it makes sense. Here's one version:

class String
def wrap n
gsub(
/
\b # word boundary
[ \t\r\f]* # whitespace (no newline)
\n # newline
[ \t\r\f]* # whitespace (no newline)
\b # word boundary
/x,
" " # replaced by space
).gsub(
/
(.{1,#{n}}) # upto n characters
( # followed by either:
\n # exactly one newline
|\s+ # or other whitespace characters
)
/x,
"\\1\n" # insert newline after first part
)
end
end

I used extended regular expressions to show what they are doing. You can
shorten them if you want.

The first gsub replaces newlines inside of paragraphs into spaces, but
leaves newlines between paragraphs unchanged. The second gsub is mostly
the original one, but it consumes at most one newline character
(replacing it with itself). This has the effect that newlines between
paragraphs are preserved.

If you still have problems or questions, feel free to ask.

Regards,
Pit
 
A

Austin Ziegler

On Nov 19, 2005, at 10:07 PM, luke wrote:
I use Text::Format for this:

If I remember correctly, portions or the whole of Text::Format is
included with rails-core, too, but it may not be easily accessible.

-austin
 
W

William James

luke said:
hi,

i've found a great bit of code from

http://dev.rubyonrails.org/ticket/1449

that takes some text and makes it wrap at 80 lines. the only issue is that
it takes multiple line breaks (like paragraphs), and makes them into single
line breaks.

this is the code:

text.gsub( /\n/, "\n\n" ).gsub( /(.{1,80})(\s+|$)/, "\\1\n")

i've tinkered with it for a while, but i can't work out how to not have it
eat lines breaks so hungrily.

thanks for any help
luke

text.gsub( /(.{1,39}[^\s])([ \t]*\n[ \t]*|[ \t]+|$)/, "\\1\n")
 
L

luke

thanks pit,

works like a treat! nice idea of having it in the string class.

thanks a lot,
luke




Pit Capitain said:
luke said:
ideally how i would like it to behave given your examples, would be like:

"abcde\n c".wrap(5) # => "abcde\nc"
"a e\na".wrap(5) # => "a e\na"

does that make sense? so text would be flush with the left margin with no
white space at the beginning of new lines. but whitespace within a line
should remain intact.

Of course it makes sense. Here's one version:

class String
def wrap n
gsub(
/
\b # word boundary
[ \t\r\f]* # whitespace (no newline)
\n # newline
[ \t\r\f]* # whitespace (no newline)
\b # word boundary
/x,
" " # replaced by space
).gsub(
/
(.{1,#{n}}) # upto n characters
( # followed by either:
\n # exactly one newline
|\s+ # or other whitespace characters
)
/x,
"\\1\n" # insert newline after first part
)
end
end

I used extended regular expressions to show what they are doing. You can
shorten them if you want.

The first gsub replaces newlines inside of paragraphs into spaces, but
leaves newlines between paragraphs unchanged. The second gsub is mostly
the original one, but it consumes at most one newline character
(replacing it with itself). This has the effect that newlines between
paragraphs are preserved.

If you still have problems or questions, feel free to ask.

Regards,
Pit
 

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

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top