[Templates] Generating, eh, HTML email

Ask Bjørn Hansen ask at develooper.com
Sun May 25 00:50:19 BST 2008


On May 24, 2008, at 3:04 PM, Bill Moseley wrote:

> But, it's somewhat of a pain to maintain two very similar by different
> files.  I'd rather have a single file that generates both.
>
> Anyone have a better approach for generating both HTML and text
> versions of the same email?

We generate an html mail and then parse the text out for the plaintext  
version.  Don't recommend it though; or rather - it'll need more work  
than we put into it to work well.  The text mails are never as neatly  
formatted as they should be.  Another missing bit is that it still  
requires links to be written out as text in the html version, so we  
end up with both versions sucking a bit.

I've been planning to reverting to just having two separate templates,  
but if you want to try just having one then something like the  
following might help you get started.

Another approach could be having the "master template" in textile or  
Markdown or some such format and use that to convert to text and html.


  - ask

     my $html = $tt->process(...);

     my @msg;
     my $parser = HTML::Parser->new(api_version => 3,
                                    handlers => { default => [\@msg,  
"tagname,event,attr,text"],
                                                },

                                   );
     $parser->parse($html);

     my $plain_text = "";
     my $subject = "";
     my $in_subject = 0;
     for my $m (@msg) {
         if ($in_subject) {
             $subject .= $m->[3] and next if $m->[1] eq 'text';
         }
         $plain_text .= $m->[3] and next if $m->[1] eq 'text';

         $plain_text .= "\n" if $m->[0] eq 'br';

         $in_subject = 1 if $m->[1] eq 'start' and $m->[0] eq 'title';
         $in_subject = 0 if $m->[1] eq 'end'   and $m->[0] eq 'title';
     }

     $plain_text =~ s/^\s+//s;  # whitespace before the message
     $plain_text =~ s/\s+$//s;  # whitespace after the message

     $plain_text =~ s/ +(\S)/ $1/gsm;
     $plain_text =~ s/\n(\s*\n)/\n\n/g;





-- 
http://develooper.com/ - http://askask.com/





More information about the templates mailing list