#!/usr/bin/perl # # Wrapper to call ispell on mail messages, ignoring quoted portions # and signatures. # By Brendan O'Dea , public domain. # Usage: set ispell = /usr/lib/mutt/mailspell # use IO::File; use POSIX 'tmpnam'; use File::Copy 'move'; $0 =~ s#.*/##; my $ISPELL = 'ispell'; my $DIFF = 'diff'; my $ED = 'ed'; # make sure that we don't inherit SIGCHLD $SIG{CHLD} = 'DEFAULT'; # ignore -x ispell option shift if $ARGV[0] eq '-x'; die "Usage: $0 [-x] FILE\n" unless @ARGV == 1; my $msg = $ARGV[0]; # create temporary files my (%orig, %ed); END { unlink $ed{path} if $ed{path}; unlink $orig{path} if $orig{path}; } foreach (\%orig, \%ed) { $_->{path} = tmpnam; $_->{fd} = IO::File->new($_->{path}, O_RDWR|O_CREAT|O_EXCL, 0600) or die "$0: can't create $_->{path} ($!)"; } while (<>) { # stop at sigdashes last if /^-- \n/; # drop quoted text and attribution $orig{fd}->print($_) unless /^>/ or /^On \w{3}, \w{3} \d{2}, \d{4} at \d/; } $orig{fd}->close; my $pid = fork; die "$0: can't fork ($!)\n" unless defined $pid; unless ($pid) { open STDOUT, '>&=' . $ed{fd}->fileno or die "$0: can't dup stdout to ed script ($!)\n"; $ed{fd}->close; exec $DIFF, '-e', $orig{path}, $msg; die "$0: can't exec $DIFF ($!)\n"; } die "$0: can't reap child ($!)\n" unless wait == $pid; system $ISPELL, '-x', $orig{path} and die "$0: problem with $ISPELL ($?)\n"; $ed{fd}->seek(0, SEEK_END); $ed{fd}->print("w\nq\n"); $ed{fd}->seek(0, SEEK_SET); open STDIN, '<&=' . $ed{fd}->fileno or die "$0: can't dup stdin from ed script ($!)\n"; system $ED, '-s', $orig{path} and die "$0: problem with $ED ($?)\n"; move $orig{path}, $msg or die "$0: can't replace $msg ($!)\n"; delete $orig{path}; 1;