#!/usr/bin/perl -w

=head1	NAME

oohighlight - search, replace and highlight text in a document

=head1	SYNOPSIS

oohighlight "myfile.sxw" "search string" -r "replacement" -o "target.sxw"

replaces "search string" by "replacement" in the file "myfile.sxw", highlights
each replacement with a yellow (default) backgound, then writes the resulting
document as "target.sxw"

oohighlight "myfile.sxw" "search string" -color "#00ff00"

highlights each occurrence of "search string" in "myfile.sxw" with a green
background color, without changing the text (without "-o" option, the changes
apply to "myfile.sxw"

=head1	ARGUMENTS AND OPTIONS

=head2	Default behaviour

With the "minimal" command line, with only a filename and a string as
arguments, each matching string is highlighted with a yellow background
and represented with the "Standard" style.

=head2	Options

	-e --encoding "xxxxxx"

		local character set to be used, knowing that the default
		encoding is "iso-8859-1"; this option is mandatory if the
		search string or the replacement one contains non-ASCII
		characters
		
	-r --replacement "new string"

		"new string" is used as a replacement for "search string"

	-c --color "#xxxxxx"

		a six-digit hexadecimal number, preceded by a "#",
		representing a color (RGB) to be used in place of the
		default one for the background of the selected areas

	-p --property "property=value"

		for OOo advanced users only ! this option can be repeated;
		each occurrence gives an additional property for the
		highlight style (font name, size, foreground color, ...)
		For example, with the combination of -p fo:color=#ff0000
		and -p fo:font-size=18pt, the highlighted text will be
		made of 18pt-sized, red characters. In order to master
		these option, you should have some knowledge of the
		OpenOffice styling vocabulary
	
	-o --output "filename"
	-t --target "filename"

		an alternative filename to save the modified document, when
		the source document must remain unchanged

=cut


#-----------------------------------------------------------------------------

use OpenOffice::OODoc	1.107;
use Getopt::Long;

#-----------------------------------------------------------------------------
# getting the arguments and options

my $encoding	= 'iso-8859-1';
my $target	= undef;
my $replace	= undef;
my $color	= '#ffff00';
my %properties	= ();

GetOptions
	(
	'encoding=s'		=> \$encoding,
	'replacement=s'		=> \$replace,
	'color=s'		=> \$color,
	'property=s'		=> \%properties,
	'output|target=s'	=> \$target
	);

#-----------------------------------------------------------------------------

my $filename	= $ARGV[0];
my $search	= $ARGV[1];
die "usage: oohighlight <file> <search_string> [-options]\n"
	unless ($filename && $search);

#-----------------------------------------------------------------------------
# opening the document

my $doc		= ooDocument(file => $filename)
	or die "File unavailable or non-OOo file\n";
localEncoding($encoding);

#-----------------------------------------------------------------------------
# creating the highlight style

$properties{'style:text-background-color'} = $color;

$doc->createStyle
	(
	"HighLight",
	family		=> 'text',
	properties	=> { %properties }
	);

#-----------------------------------------------------------------------------
# searching and replacing

my @list = $doc->selectElementsByContent($search, $replace);

#-----------------------------------------------------------------------------
# coloring

if (defined $replace)
	{
		# just in order to avoid unneeded metacharacter processing
	$replace =~ s/([\\\(\)\.\*\?\[\]\|\-])/\\$1/g;
	$search	= $replace;
	}

foreach my $element (@list)
	{
	$doc->setSpan($element, $search, "HighLight");
	}

#-----------------------------------------------------------------------------
# saving the result

$doc->save($target);
exit;

#-----------------------------------------------------------------------------

