The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use 5.8.0;
use strict;
use warnings;
use Getopt::Long;
use Pod::Usage;
use RTF::HTMLConverter;

my %opts;
GetOptions(
  "help|h|?"     => \$opts{help},
  "man|m"        => \$opts{man},
  "dom=s"        => \$opts{dom},
  "noimages|n"   => \$opts{noimages},
  "imagedir|d=s" => \$opts{imagedir},
  "imageuri|u=s" => \$opts{imageuri},
  "encoding|e=s" => \$opts{encoding},
  "indented|i=i" => \$opts{indented},
);

pod2usage(-verbose => 1, -exitval => 0) if $opts{help};
pod2usage(-verbose => 2, -exitval => 0) if $opts{man};

my %params;
if($opts{dom}){
  eval "require $opts{dom}";
  die $@ if $@;
  $params{DOMImplementation} = $opts{dom};
}else{
  eval { require XML::GDOME };
  if($@){
    eval { require XML::DOM };
    die "Can't load either XML::GDOME or XML::DOM\n" if $@;
    $params{DOMImplementation} = 'XML::DOM';
  }
}

if($opts{noimages}){
  $params{discard_images} = 1;
}else{
  $params{image_dir} = $opts{imagedir} if defined $opts{imagedir};
  $params{image_uri} = $opts{imageuri} if defined $opts{imageuri};
}

$params{codepage} = $opts{encoding} if $opts{encoding};
$params{formatting} = $opts{indented} if defined $opts{indented};

if(defined $ARGV[0]){
  open(FR, "< $ARGV[0]") or die "Can't open '$ARGV[0]': $!!\n";
  $params{in} = \*FR;
  if(defined $ARGV[1]){
    open(FW, "> $ARGV[1]") or die "Can't open '$ARGV[1]': $!!\n";
    $params{out} = \*FW;
  }
}

my $parser = RTF::HTMLConverter->new(%params);
$parser->parse();

__END__

=head1 NAME

rtf2html.pl - Simple RTF to HTML converter

=head1 SYNOPSIS

rtf2html.pl [options] [in.rtf [out.html]]

=head1 OPTIONS

=over 4

=item B<help>,B<h>,B<?>

Print usage information and exit.

=item B<man>,B<m>

Print manual page and exit.

=item B<dom>

DOM implementation name. Default: C<XML::GDOME>.

=item B<noimages>,B<n>

Do not process images.

=item B<imagedir>,B<d> I<path>

Directory where to store images if any. Default: current directory.

=item B<imageuri>,B<u> I<uri>

Image url prefix.

=back

C<XML::GDOME> specific options:


=over 4

=item B<encoding>, B<e> I<name>

The encoding of resulted HTML page. Default: C<UTF-8>.

=item B<indented>, B<i> I<1|0>

Can be C<1> or C<0>. If the value specified is C<1> the
resulted HTML tags will be indented to make the code more
readable. If the value specified is C<0> there will be no
indentation. Default: C<1>.

=back

=head1 DESCRIPTION

This is a simple RTF to HTML converter. It reads RTF from C<in.rtf> (or
C<STDIN> by default) and writes HTML to C<out.html> (or C<STDOUT>). If RTF
contains images, they will be stored in directory specified by B<imagedir>
(or B<d>) option and their URLs in HTML will be started with whatever
specified by B<imageuri> (or B<u>) option.

=head1 EXAMPLES

  rtf2html.pl < in.rtf > out.html
  rtf2html.pl -n -e 'KOI8-R' in.html
  rtf2html.pl -d /opt/www/images \
              -u http://www.somewhere.net/images \
              -dom 'XML::DOM' in.rtf /opt/www/out.html

=cut