#!/usr/bin/perl use strict; use Template; use Parse::RecDescent; use Carp; my $location_of_will_master = "."; %::p = (); # Global hash to collect relevant parse data my $grammer = q{ will : comment | blank | parameter | specific_bequest | comment : /^#.*$/ {1;} blank : /^\s*$/ {1;} parameter : /\w+/ '=' /.*/ { $::p{$item[1]} = $item[3] } specific_bequest : /to/i name /or/ name /i give/i item { $item[2] = $::p{default_specific_beneficiary} if $item[2] eq '-'; $item[4] = $::p{default_specific_survivor} if $item[4] eq '-'; push @{$::p{bequests}}, { item => $item[6], beneficiary => $item[2], survivor => $item[4], } } name: word(s) {$return = join(' ',@{$item{'word(s)'}})} item: /.*/ { ($return = $item[1]) =~ s/\s+/ /g; } word: ...!/or/ ...!/i give/i /\S+/ }; sub parse_will { my $parse = Parse::RecDescent->new($grammer); #$::RD_TRACE = 1; my @lines = (); while (<>) { chomp; next unless $_; if (m/^\s/) { push @lines,$_; } else { if (@lines) { my $result = $parse->will("@lines"); @lines = (); } push @lines,$_; } } my $result = $parse->will("@lines") if @lines; return \%::p; } sub prepare_for_tex { my $p = shift; my $bequests = $p->{bequests}; foreach (@$bequests) { # Escape most of latex special chars. # Note I leave \ and ~ alone $_->{item} =~ s/([#\$%&_^{}])/\\$1/g; } } sub main { my $file = $ARGV[0]; unless ($file) { print < $location_of_will_master, PRE_CHOMP => 1, POST_CHOMP => 1 }) or carp $! ; $template->process("will_master.tex" ,$result,$outfile) or carp $template->error ; } main(); __END__ =head1 NAME will - Perl program to generate a will =head1 SYNOPSIS will filename.ext creates filename.tex ready for latex =head1 DESCRIPTION Merges the latex file F with the specific data entered in F. After running this you are read for B =head1 AUTHOR Henry Laxen nadine.and.henry@pobox.com =head1 SEE ALSO sample_will.txt =cut