As usual, its been done before. Look at the modules which support
SpamAssassin, and particularly MIME-Tools. Get them from CPAN :-)

----- Original Message ----- 
From: "Will of Thornhenge" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, July 11, 2003 5:38 PM
Subject: Recursive design


> I hate recursion. It makes my head hurt.
>
> Background: I'm working on reformating .mbox files to convert email
> archives to HTML and to PDA compatible text. I'm running into problems
> with the MIME types "multipart/mixed" and "multipart/related". These are
> umbrella types that can hold an assortment of simple types, like
> "text/plain", and "image/jpg". However they can also hold other
> multipart types, which can happen when someone backquotes the entirety
> of a previous multipart message.
>
> There is also the "multipart/alternative" type, but these are always
> collections of simple types where the user agent chooses one and ignores
> the rest-- they are never re-entrant.
>
> My code is something like this (following is simplified to keep it short
> and on point):
>
> sub handleBody {
>     my ($type, $body) = @_;
>     my $superbody = '';
>     if ( $type =~ m{multipart}i ) {
>        my ( @parts ) = splitOnBoundary($type, $body);
>        if ( $type =~ m{alternative}i ) {
>           # code to find the $best of the alternatives in @parts
>           ($type, $body) = handlePart($parts[$best])
>           processSimpleType($type, $body);
>           return $body;
>        }
>        else { # PLACE WHERE MY HEAD HURTS
>           foreach (@parts) {
>              $superbody .= handleBody(handlePart($_) );
>           }
>           return $superbody;
>        }
>     }
>     else { # handle a simple type
>        processSimpleType($type, $body)
>        return $body
>     }
> }
>
> sub handlePart {
>     my $part = shift;
>     my ($head, $body) = split /^$/m, $part, 2;
>     # treat exceptions as a type of its own:
>     my $type = '[NONE STATED]';
>     if ( $head =~ m{^Content-Type: (.*)$}mi ) {
>        $type = $1;
>     }
>     return ($type, $body);
> }
>
>
> Hmm, as I wrote this, I discovered the apparent need for $superbody, and
> I think I may have solved my logic problem. So the first of my two
> questions:
>
> 1) Does the above code look right?
>
> A major difficulty is that I'm dealing with archives where some of the
> messages aren't fully compliant with the MIME standard and I can't tell
> whether the bugs I've got are in the logic or because I need to tweak
> the regexes to handle the special cases. Which brings me to the other,
> more important, question:
>
> 2) Is there a better tool for designing re-entrant code other than
> pseudocode? How do people who do a lot of this kind of thing work out
> the design?
>
> --
> Will
>
>
> _______________________________________________
> Perl-Win32-Users mailing list
> [EMAIL PROTECTED]
> To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
>
>
>
_______________________________________________
Perl-Win32-Users mailing list
[EMAIL PROTECTED]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to