#!/usr/bin/perl -w
=head1 NAME
command_doc - Scripting system commands in an OpenOffice.org document
=head1 SYNOPSIS
This sample script triggers an external program each time a given string
is found in a given OpenOffice.org Writer document
usage : command_doc filename -command "command" -trigger "trigger_string"
The "command" option is executed using the shell (so it depends on the
target program name and the operating system)
If the command is successful, the search string is replaced by "PASSED";
in case of failure, there is no replacement
The main goal of this small program is to demonstrate the possibility
to control a business process with the content of an OpenOffice.org
document.
=cut
use OpenOffice::OODoc;
use Getopt::Long;
my $command = undef;
my $trigger = undef;
my $count = 0;
my $verbose = undef;
my $save_file = undef;
# command execution subroutine, assuming the return code of the command
# is 0 if OK, or -1 (or any nonzero value) if not
sub executeCommand
{
my $found_text = shift;
# conditional trace message
$verbose && print "Found $found_text !\n";
# count the occurences
$count++;
# execute the command & get the system return code
my $result = system($command);
# return something or nothing according to the return code
return $result == 0 ? "PASSED" : undef;
}
# get the command line parameters
GetOptions
(
'command=s' => \$command,
'trigger=s' => \$trigger,
'verbose' => \$verbose,
'save' => \$save_file
);
my $filename = $ARGV[0];
die "usage : command_doc filename -command cmd -trigger trigger_string\n"
unless ($command && $trigger && $filename);
# create an OpenOffice.org text object from the file
my $doc = ooText(file => $filename);
die "$filename is unavailable or is not an OpenOffice.org document\n"
unless $doc;
# execute the command each time $trigger is found in the text
# in case of failure, 'executeCommand' returns 'undef', so there is
# no replacement
$doc->replaceAll($trigger, \&executeCommand);
# final trace message
$verbose && print "The expression $trigger has been found $count time(s)\n";
# append an execution report as a new paragraph at the end of
# the OpenOffice.org document, and commit the changes
if ($save_file)
{
my $time_string = localtime();
$doc->appendParagraph
(
text => "Processed by command_doc at $time_string",
style => "Text body"
);
$doc->save;
}
exit;