[Rt-commit] r9967 - rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT
audreyt at bestpractical.com
audreyt at bestpractical.com
Sat Dec 15 15:20:06 EST 2007
Author: audreyt
Date: Sat Dec 15 15:20:05 2007
New Revision: 9967
Added:
rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT/Template_Vendor.pm
Log:
* Add RichText from Template_Vendor.
Added: rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT/Template_Vendor.pm
==============================================================================
--- (empty file)
+++ rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT/Template_Vendor.pm Sat Dec 15 15:20:05 2007
@@ -0,0 +1,134 @@
+# ABERDEEN BRANCH SPECIFIC!
+
+package RT::Template;
+
+use strict;
+use warnings;
+no warnings 'once';
+no warnings 'redefine';
+
+BEGIN {
+ *RT::Template::OldParse = \&RT::Template::Parse;
+}
+
+
+sub Parse {
+ my $self = shift;
+ my ($rv, $msg);
+
+ if ($self->Content =~ m{^Content-Type:\s+text/html\b}im) {
+ local $RT::Transaction::PreferredContentType = 'text/html';
+ ($rv, $msg) = $self->OldParse(@_);
+ }
+ else {
+ ($rv, $msg) = $self->OldParse(@_);
+ }
+
+ # We only HTMLify things if the template includes at least one Transaction->Content call.
+ return ($rv, $msg) unless $rv and $self->Content =~ /->\s*Content\b/;
+
+ my $orig_entity = $self->MIMEObj;
+ my $mime_type = $self->MIMEObj->mime_type;
+
+ if (!$mime_type or $mime_type eq 'text/plain') {
+ $self->_UpgradeToHTML(@_);
+ }
+ elsif ($mime_type eq 'text/html') {
+ $self->_DowngradeFromHTML(@_);
+ }
+
+ return ($rv, $msg);
+}
+
+sub _DowngradeFromHTML {
+ my $self = shift;
+ my $orig_entity = $self->MIMEObj;
+
+ local $RT::Transaction::PreferredContentType = 'text/plain';
+
+ my ($rv, $msg) = $self->OldParse(@_);
+ if (!$rv) {
+ $self->{MIMEObj} = $orig_entity;
+ return;
+ }
+
+ $orig_entity->head->mime_attr( "Content-Type" => 'text/html' );
+ $orig_entity->head->mime_attr( "Content-Type.charset" => 'utf-8' );
+ $orig_entity->make_multipart('alternative', Force => 1);
+
+ my $new_entity = $self->{MIMEObj};
+ $new_entity->head->mime_attr( "Content-Type" => 'text/plain' );
+ $new_entity->head->mime_attr( "Content-Type.charset" => 'utf-8' );
+
+ require HTML::FormatText;
+ require HTML::TreeBuilder;
+ $new_entity->bodyhandle(MIME::Body::InCore->new(\(scalar(HTML::FormatText->new(
+ leftmargin => 0,
+ rightmargin => 78,
+ )->format(
+ HTML::TreeBuilder->new_from_content( $new_entity->bodyhandle->as_string )
+ )))));
+
+ $orig_entity->add_part($new_entity, 0); # plain comes before html
+ $self->{MIMEObj} = $orig_entity;
+
+ return ($rv, $msg);
+}
+
+sub _UpgradeToHTML {
+ my $self = shift;
+ my $orig_entity = $self->MIMEObj;
+
+ local $RT::Transaction::PreferredContentType = 'text/html';
+
+ require Text::Template;
+ my $old_compile = \&Text::Template::compile;
+ local *Text::Template::compile = sub {
+ $old_compile->(@_) or return undef;
+
+ my $self = shift;
+ my @new_content;
+ my $seen_header;
+ foreach my $chunk (@{$self->{SOURCE}}) {
+ if ($chunk->[0] eq 'TEXT') {
+ my $new_text = $chunk->[1];
+ if (!$seen_header) {
+ # We don't HTMLify anything within the header.
+ $seen_header = 1 if $new_text =~ /\n\n/;
+ push @new_content, $chunk;
+ next;
+ }
+ $new_text =~ s/&/&/g;
+ $new_text =~ s/</</g;
+ $new_text =~ s/>/>/g;
+ $new_text =~ s/\n/\n<br \/>/g;
+ push @new_content, [$chunk->[0], $new_text, $chunk->[2]];
+ }
+ else {
+ push @new_content, $chunk;
+ }
+ }
+ $self->{SOURCE} = \@new_content;
+ };
+
+ my ($rv, $msg) = $self->OldParse(@_);
+ if (!$rv) {
+ $self->{MIMEObj} = $orig_entity;
+ return;
+ }
+
+ $orig_entity->head->mime_attr( "Content-Type" => 'text/plain' );
+ $orig_entity->head->mime_attr( "Content-Type.charset" => 'utf-8' );
+ $orig_entity->make_multipart('alternative', Force => 1);
+
+ my $new_entity = $self->{MIMEObj};
+ $new_entity->head->mime_attr( "Content-Type" => 'text/html' );
+ $new_entity->head->mime_attr( "Content-Type.charset" => 'utf-8' );
+
+ $orig_entity->add_part($new_entity);
+ $self->{MIMEObj} = $orig_entity;
+
+ return ($rv, $msg);
+}
+
+1;
More information about the Rt-commit
mailing list