#!/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 "green"

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"

		character set to use, if different from the default
		
	-r --replacement "new string"

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

	-c --color "code"

		an RGB color code, expressed either as the concatenation of
		3 comma-separated decimal values (each one in the range
		0..255, ex: "72,61,139" for a dark slate blue), or a 6-digit
		hexadecimal number, preceded by a "#" (ex: #00ff00 for green)
		or, if a colormap is available and known in your
		OpenOffice::OODoc installation, a symbolic color name (ex:
		"sky blue")

	-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.201;
use Getopt::Long;

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

my $encoding		= undef;
my $target		= undef;
my $replace		= undef;
my $color		= '#ffff00'; # yellow
my %properties		= ();

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

$color = rgb2oo($color); # color validity check

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

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

$color	= rgb2oo($color) or die "Color code is not valid\n";

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

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

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

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

$doc->createStyle
	(
	"MyHighLight",
	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, "MyHighLight");
	}

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

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

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