Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Tiny little paragraph wrapper

by mw (Sexton)
on Mar 10, 2005 at 09:32 UTC ( [id://438189]=CUFP: print w/replies, xml ) Need Help??

I needed to wrap a paragraph of text to a sensible line length, as a part of one of my HTML generating scripts. Looked at the existing wrap functions and found they all required modules which may or may not be installed on the target machines. Hence, decided to do some algorithmic crunching and write my own wrap function.
# fmt("text",width); #--------------------------------------------------------------------- +- # Wraps long lines to manageable size. If a word is too long, the line # length is temporarily raised until the word does fit. sub fmt { my $text=shift; # Input text my $width=shift; # Desired width $width=70 if(!$width); # Default to 70 if omitted my $rc=""; # Return value my $cll=$width; # Current line length my $cp=0; # Current position my $i; # Index to last space. my $lot=length($text); # Length of $text. $text=~s/\s+/ /g; # Reduce all series of whitespace to o +ne while($cp+$cll < $lot) { print STDERR "cp=$cp cll=$cll\n"; while((($i=rindex($text," ",$cp+$cll))<=$cp) && $cp+$cll < $lot) { $cll+=$width; } if($i>$cp) { $rc=$rc.substr($text,$cp,$i-$cp)."\n"; $cp=$i+1; $cll=$width; } } $rc=$rc.substr($text,$cp)."\n"; return $rc; }
Use as follows:
print fmt("Type in your paragraph of text here...",40);

Replies are listed 'Best First'.
Re: Tiny little paragraph wrapper
by rnahi (Curate) on Mar 10, 2005 at 10:02 UTC

    Even without using modules, you could do it in a much simpler way:

    perl -lne 'print $1 while /(.{0,70}(?:\s|$))/g' < text_file.txt

    Just change the size of your desired line inside the regexp.

Re: Tiny little paragraph wrapper
by blahblahblah (Priest) on Mar 12, 2005 at 13:24 UTC
    Your version chops off the beginning of words that are longer than the wrap length, instead of temporarily increasing the wrap length like the original snippet does.

    For the text "Check out http://www.perlmonks.org/?node_id=438189 (it has nice line-wrapping snippet).", here is the output:

    method 1:

    Check out http://www.perlmonks.org/?node_id=438189 (it has nice line-wrapping snippet).
    method 2:
    Check out .org/?node_id=438189 (it has nice line-wrapping snippet).
      Try this regex s/(.{5,12}\s+)/$1\n/g. On the sample text it gives: :-)
      Check out http://www.perlmonks.org/?node_id=438189 (it has nice line-wrapping snippet).

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: CUFP [id://438189]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (4)
As of 2024-04-23 22:57 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found