#
# - Put the path to this program in your .mh_profile under formatproc:
#
-# formatproc: replyfilter
+# formatproc: replyfilter
#
-# - Create a mhl reply filter that consists of the following line:
+# or invoke repl with "-fmtproc replyfilter".
#
-# body:nocomponent,format,nowrap,formatarg="%(trim{content-type})%(putstr)",formatarg="%(trim{content-transfer-encoding})%(putstr)",formatarg=">"
+# - Create an mhl reply filter that consists of the following line:
+#
+# body:nocomponent,format,nowrap,formatarg="%(trim{content-type})%(putstr)",formatarg="%(trim{content-transfer-encoding})%(putstr)",formatarg=">"
+#
+# By default, repl will look for the mhl reply filter by the name
+# "mhl.reply", but it will look elsewhere if the -filter switch is given.
#
# To decode this a bit:
#
# component prefix of ">" as a quote character, but we're
# going to have replyfilter do that).
# nowrap - Don't wrap lines if they exceed the column width
-# formatarg - Arguments to fmtproc. The first argument is the value of
-# the Content-type header; the second is the value of the
+# formatarg - Arguments to formatproc. The first argument is the value
+# of the Content-type header; the second is the value of the
# Content-Transfer-Encoding header. The last "formatarg"
# is used as your quoting prefix. Replace it with whatever
# you want.
use Encode;
#
-# The program we use to format "long" text
+# The program we use to format "long" text. Should be capable of reading
+# from standard input and sending the formatted text to standard output.
#
$filterprogram = 'par';
+#
+# If the above filter program has problems with some input, use the following
+# regular expression to remove any problematic input. In this example we
+# filter out the UTF-8 non-breaking space (U+00A0) because that makes par
+# mangle the output. Uncomment this if this ends up being a problem for
+# you, or feel free to add others.
+#
+
+#%filterreplace = ( "\N{U+a0}" => " " );
+
#
# Our output character set. This script assumes a UTF-8 locale, but if you
# want to run under a different locale the change it here.
$maxcolwidth = 78;
#
-# Out HTML converter program & arguments
+# Out HTML converter program & arguments. charset will be appended
#
@htmlconv = ('w3m', '-dump', '-cols', $maxcolwidth - 2, '-T', 'text/html',
- '-O', $outcharset);
+ '-O', $outcharset, '-I');
die "Usage: $0 Content-type content-transfer-encoding quote-prefix\n"
my ($input, $encoding, $charset, $boundary) = @_;
my $text, $filterpid, $prefixpid, $finread, $finwrite;
my $foutread, $foutwrite, $decoder, $ret, $filterflag;
- my @text = ( '' ), $maxline = 0;
+ my $text, $maxline = 0;
#
# In the simple case, just spit out the text prefixed by the
#
if ($encoding eq '7bit' || $encoding eq '8bit') {
+ #
+ # Switch the character set to whatever is specified by
+ # the MIME message
+ #
+ binmode($input, ":encoding($charset)");
while (<$input>) {
$ret = match_boundary($_, $boundary);
if (defined $ret) {
+ binmode($input, ':encoding(us-ascii)');
return $ret;
}
print $quoteprefix, $_;
}
return 'EOF';
} else {
- $decoder = find_decoder($encoding);
+ #
+ # If we've got some other encoding, the input text is almost
+ # certainly US-ASCII
+ #
+
+ binmode($input, ':encoding(us-ascii)');
+
+ $decoder = find_decoder(lc($encoding));
if (! defined $decoder) {
return 'EOF';
}
#
# Okay, assume that the encoding will make it so that we MIGHT need
- # to filter it. Read it in; if it's too long, filter it.
+ # to filter it. Read it in; if the lines are too long, filter it
#
+ my $chardecode = find_encoding($charset);
+
while (<$input>) {
- my $line, $len;
+ my @lines, $len;
last if ($ret = match_boundary($_, $boundary));
- $line = decode($charset, &$decoder($_));
+ $text .= $_;
- if (substr($text[$#text], -1, 1) eq "\n") {
- push @text, $line;
- } else {
- $text[$#text] .= $line;
- }
- if (($len = length($text[$#text])) > $maxline) {
- $maxline = $len;
- }
}
+ binmode($input, ':encoding(us-ascii)');
+
+ $text = $chardecode->decode(&$decoder($text));
+
+ grep {
+ my $len;
+ if (($len = length) > $maxline) {
+ $maxline = $len;
+ }} split(/^/, $text);
+
if (! defined $ret) {
$ret = 'EOF';
}
#
# These are short enough; just output it now as-is
#
- print STDOUT @text;
+ foreach my $line (split(/^/, $text)) {
+ print STDOUT $quoteprefix, $line;
+ }
return $ret;
}
# Send our input to the filter program
#
- print $finwrite @text;
+ if (%filterreplace) {
+ foreach my $match (keys %filterreplace) {
+ $text =~ s/$match/$filterreplace{$match}/g;
+ }
+ }
+
+ print $finwrite $text;
close($finwrite);
waitpid $filterpid, 0;
my $filterpid, $prefixpid, $finread, $finwrite;
my $foutread, $foutwrite, $decoder, $ret;
- if (! defined($decoder = find_decoder($encoding))) {
+ if (! defined($decoder = find_decoder(lc($encoding)))) {
return 'EOF';
}
# Exec our converter
#
- exec (@htmlconv) ||
+ my @conv = (@htmlconv, $charset);
+ exec (@conv) ||
die "Unable to exec $filterprogram: $!\n";
} else {
die "Fork for $htmlconv[0] failed: $!\n";
$charset = 'us-ascii';
}
- $encoding = defined $cte ? $cte->param('_') : '7bit';
+ $encoding = defined $cte ? lc($cte->param('_')) : '7bit';
$name = defined $cdispo ? $cdispo->param('filename') : undef;
#
sub match_boundary($$)
{
- my ($_, $boundary) = @_;
+ my ($line, $boundary) = @_;
+
+ return if ! defined $boundary;
- if (substr($_, 0, 2) eq '--') {
- s/[ \t\r\n]+\Z//;
- if ($_ eq "--$boundary") {
+ if (substr($line, 0, 2) eq '--') {
+ $line =~ s/[ \t\r\n]+\Z//;
+ if ($line eq "--$boundary") {
return 'EOP';
- } elsif ($_ eq "--$boundary--") {
+ } elsif ($line eq "--$boundary--") {
return 'EOM';
}
}