in reply to Re: Long URLs and Text::Wrap
in thread Long URLs and Text::Wrap

OK Fastolfe, Thanks for writing.
Here is my code:
#! /usr/local/bin/perl use Text::Wrap; # Check Referring URL &check_url; # Code not included for clarity # Parse Form Contents &parse_form; # Code not included for clarity # Send E-Mail &send_mail; # This is the function we need to deal with! sub send_mail { my $count, $to, $name; # When these are commented out, the URL fits beautifully, # Only prob is that we need to wrap the text! $Text::Wrap::columns=60; $FORM{'message'} = wrap("","",$FORM{'message'}); if ($FORM{'fromemail'} eq "") { $FORM{'fromemail'} ="webmaster\@xxx +.com"; } if ($FORM{'from'} eq "") { $FORM{'from'} ="xxx.com"; } # Process form variables for up to 5 email addresses # sent in by the form. for ($count=1; $count<=5; $count++) { $to = 'email' . $count; $name = 'name' . $count; $type = 'email_type' . $count; if ($FORM{$to} ne "") { if ($FORM{$type} eq 'text') { open(MAIL,"|$mailprog -t"); print MAIL "To: $FROM{$name} <$FORM{$to}>\n"; print MAIL "From: $FORM{'from'} <$FORM{'fromemail'} +>\n"; print MAIL "Content-type: text\n"; print MAIL "Subject: National Biosolids Partnership + Web Site\n\n"; print MAIL "$FORM{'message'}\n"; close (MAIL); } else # it's HTML mail { # Grab the header $header = &GetTheHeader (); # Grab the footer $footer = &GetTheFooter (); # Format the message to HTML $message = $FORM{'message'}; $message =~ s/\n/<BR>/g; $message =~ s|(http\S+\s)|<A href="$1">$1</A>|g; open(MAIL,"|$mailprog -t"); print MAIL "To: $FROM{$name} <$FORM{$to}>\n"; print MAIL "From: $FORM{'from'} <$FORM{'fromemail'} +>\n"; print MAIL "Content-type: text/html\n"; print MAIL "MIME-Version: 1.0\n"; + print MAIL "Subject: National Biosolids Partnership + Web Site\n\n"; print MAIL "$header"; print MAIL "$message\n"; print MAIL "$footer"; close (MAIL); } } } print "Location: $FORM{'redirect'}\n\n"; }
Cheers!
Robert

Replies are listed 'Best First'.
Re: Re: Re: Long URLs and Text::Wrap
by Fastolfe (Vicar) on Nov 30, 2001 at 03:25 UTC

    I said a simple test case, not your entire application. :)

    Before we begin, I need to state right off the bat: use strict and warnings and use CGI or die;

    Here is the test case I used. The results are not consistent with the problem you're seeing. See if you can reduce your application down to something as simple as this and see if your problem persists.

    #!/usr/bin/perl use strict; use warnings; use Text::Wrap; my $data; { local $/; $data = <DATA>; } $Text::Wrap::columns = 60; print "Before:\n"; print $data; print "\n"; print "After:\n"; print wrap("", "", $data); print "\n"; __DATA__ This is a block of text that will precede the URL that is being presen +ted THE URL http://xxx.yyy.com/admin/more_grassroots/bigalerts/thefeder +algovernment/oy_veit/email/the_email_template.html This is the concluding block of text that will appear AFTER the URL. If this block is NOT at the bottom of the email, then we need to fix t +he wrapping algorithm!
    This prints:
    ... After: This is a block of text that will precede the URL that is being presented THE URL http://xxx.yyy.com/admin/more_grassroots/bigalerts/thefeder algovernment/oy_veit/email/the_email_template.html This is the concluding block of text that will appear AFTER the URL. If this block is NOT at the bottom of the email, then we need to fix the wrapping algorithm!
    As expected.
      Maybe my conundrum is different, but I'd like it to output text like below, with text wrapped but URLs not. How would you do this? I thought of doing a split on the URL regex I found here, but that could get messy quick...

      Thanks!
      Troy

      ---

      This is a block of text that will precede the URL that is
      being presented

      THE URL
      http://xxx.yyy.com/admin/more_grassroots/bigalerts/thefederalgovernment/oy_veit/email/the_email_template.html

      This is the concluding block of text that will appear AFTER
      the URL.

      If this block is NOT at the bottom of the email, then we
      need to fix the wrapping algorithm!

        Ok, so maybe I've figured this out on my own...

        Could it be simplified? I don't like the <<LINK X>> placeholders, but it's what I could figure out on a deadline.

        Cheers,
        Troy

        #!/usr/bin/perl use strict; use warnings; use Text::Wrap; require URI::Find; $Text::Wrap::columns = 60; my @links; my $data; { local $/; $data = <DATA>; } my $finder = URI::Find->new(\&uriFound); my $how_many_found = $finder->find(\$data); $data = wrap("", "", $data); # Substitute the links back in my $i = 0; foreach my $url (@links) { $data =~ s/<<LINK $i>>/$url/; $i++; } print "$data\n\n"; sub uriFound { push (@links, $_[1]); return "<<LINK $#links>>"; } __DATA__ This is a block of text that will precede the URL that is being presen +ted THE URL http://xxx.yyy.com/admin/more_grassroots/bigalerts/thefeder +algovernment/oy_veit/email/the_email_template.html This is the mid block of text that will appear between the URLs. http://www.google.com/search?q=POST+MSIE+GET&ie=UTF-8&oe=UTF-8 This is the after block of text that will appear after the URLs. If this block is NOT at the bottom of the email, then we need to fix t +he wrapping algorithm!

        -------

        Output:

        This is a block of text that will precede the URL that is being presented THE URL http://xxx.yyy.com/admin/more_grassroots/bigalerts/thefeder +algovernment/oy_veit/email/the_email_template.html This is the mid block of text that will appear between the URLs. http://www.google.com/search?q=POST+MSIE+GET&ie=UTF-8&oe=UTF-8 This is the after block of text that will appear after the URLs. If this block is NOT at the bottom of the email, then we need to fix the wrapping algorithm!
Re: Re: Re: Long URLs and Text::Wrap
by John M. Dlugosz (Monsignor) on Nov 30, 2001 at 03:51 UTC
    I agree, definitly make a simple example! You are concluding that Text::Wrap is the problem, but there is a lot more going on in there.

    Try peeking at $FORM{'message'} just before and just after the call to wrap, and see if it indeed got re-arranged at that point.