#!/usr/bin/perl ########################################### # mailit -- Print letters with OpenOffice # Mike Schilli, 2004 (m@perlmeister.com) ########################################### use warnings; use strict; my $CFG_DIR = "$ENV{HOME}/.mailit"; my $OO_TEMPLATE = "$CFG_DIR/letter.sxw"; my $ADDR_YML_FILE = "$CFG_DIR/addr.yml"; my $OO_EXE = "$ENV{HOME}/ooffice/soffice"; use OpenOffice::OODoc; use Template; use YAML qw(LoadFile); use File::Temp; use Date::Calc qw(Language Decode_Language Today Month_to_Text); Language(Decode_Language("Deutsch")); my ($year,$month,$day) = Today(); my $doc = OpenOffice::OODoc::Text->new( file => $OO_TEMPLATE, ); # Read from STDIN or file given my $data = join '', <>; # Split subject and body my($subject, $body) = ($data =~ /(.*?)\n\n(.*)/s); # Remove superfluous blanks my $text; for my $paragraph (split /\n\n/, $body) { $paragraph =~ s/\n/ /g; $text .= "$paragraph\n\n"; } my $yml = LoadFile($ADDR_YML_FILE); my $nick = pick("Recipient", [keys %$yml]); my $recipient = $yml->{$nick}; print "Preparing letter for ", $recipient->[0], "\n"; my $template = Template->new(); my %vars = ( recipient => join("\n", @$recipient), subject => $subject, text => $text, date => sprintf("%d. %s %d", $day, Month_to_Text($month), $year), ); for my $e ($doc->getTextElementList()) { my $text_element = $doc->getText($e); $template->process(\$text_element, \%vars, sub { $doc->setText($e, $_[0]); }); } my $oo_output = File::Temp->new( TEMPLATE => 'ooXXXXX', DIR => '/tmp', SUFFIX => '.sxw', UNLINK => 1, ); $doc->save($oo_output->filename); print "Printing $oo_output\n"; system("$OO_EXE -p $oo_output"); ########################################### sub pick { ########################################### my ($prompt, $options) = @_; my $count = 0; my %files = (); foreach (@$options) { print STDERR "[", ++$count, "] $_\n"; $files{$count} = $_; } print STDERR "$prompt [1]> "; my $input = ; chomp($input); $input = 1 unless length($input); return "$files{$input}"; }