This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
In buildtoc, remove a superfluous "\n " passed to output()
[perl5.git] / installhtml
index a33dec3..a495281 100644 (file)
@@ -1,11 +1,13 @@
-#!/usr/bin/perl -w
+#!./perl -Ilib -w
 
 
+# This file should really be extracted from a .PL file
+
+use strict;
 use Config;            # for config options in the makefile
 use Config;            # for config options in the makefile
+use File::Spec;
 use Getopt::Long;      # for command-line parsing
 use Cwd;
 use Getopt::Long;      # for command-line parsing
 use Cwd;
-use Pod::Html;
-
-umask 022;
+use Pod::Html 'anchorify';
 
 =head1 NAME
 
 
 =head1 NAME
 
@@ -16,7 +18,8 @@ installhtml - converts a collection of POD pages to HTML format.
     installhtml  [--help] [--podpath=<name>:...:<name>] [--podroot=<name>]
          [--htmldir=<name>] [--htmlroot=<name>]  [--norecurse] [--recurse]
          [--splithead=<name>,...,<name>]   [--splititem=<name>,...,<name>]
     installhtml  [--help] [--podpath=<name>:...:<name>] [--podroot=<name>]
          [--htmldir=<name>] [--htmlroot=<name>]  [--norecurse] [--recurse]
          [--splithead=<name>,...,<name>]   [--splititem=<name>,...,<name>]
-        [--libpods=<name>,...,<name>]  [--verbose]
+         [--libpods=<name>,...,<name>]        [--ignore=<name>,...,<name>]
+         [--verbose]
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
@@ -32,16 +35,21 @@ pages found in the perl distribution.
 
 Displays the usage.
 
 
 Displays the usage.
 
-=item B<--podpath> POD search path
-
-The list of diretories to search for .pod and .pm files to be converted.
-Default is `podroot/.'.
-
 =item B<--podroot> POD search path base directory
 
 The base directory to search for all .pod and .pm files to be converted.
 Default is current directory.
 
 =item B<--podroot> POD search path base directory
 
 The base directory to search for all .pod and .pm files to be converted.
 Default is current directory.
 
+=item B<--podpath> POD search path
+
+The list of directories to search for .pod and .pm files to be converted.
+Default is 'podroot/.'.
+
+=item B<--recurse> recurse on subdirectories
+
+Whether or not to convert all .pm and .pod files found in subdirectories
+too.  Default is to not recurse.
+
 =item B<--htmldir> HTML destination directory
 
 The base directory which all HTML files will be written to.  This should
 =item B<--htmldir> HTML destination directory
 
 The base directory which all HTML files will be written to.  This should
@@ -50,30 +58,35 @@ be a path relative to the filesystem, not the resulting URL.
 =item B<--htmlroot> URL base directory
 
 The base directory which all resulting HTML files will be visible at in
 =item B<--htmlroot> URL base directory
 
 The base directory which all resulting HTML files will be visible at in
-a URL.  The default is `/'.
-
-=item B<--recurse> recurse on subdirectories
-
-Whether or not to convert all .pm and .pod files found in subdirectories
-too.  Default is to not recurse.
+a URL.  The default is '/'.
 
 =item B<--splithead> POD files to split on =head directive
 
 
 =item B<--splithead> POD files to split on =head directive
 
-Colon-seperated list of pod files to split by the =head directive.  These
-files should have names specified relative to podroot.
+Comma-separated list of pod files to split by the =head directive.  The
+.pod suffix is optional. These files should have names specified
+relative to podroot.
 
 =item B<--splititem> POD files to split on =item directive
 
 
 =item B<--splititem> POD files to split on =item directive
 
-Colon-seperated list of all pod files to split by the =item directive.
-I<installhtml> does not do the actual split, rather it invokes I<splitpod>
-to do the dirty work.  As with --splithead, these files should have names
-specified relative to podroot.
+Comma-separated list of all pod files to split by the =item directive.
+The .pod suffix is optional.  I<installhtml> does not do the actual
+split, rather it invokes I<splitpod> to do the dirty work.  As with
+--splithead, these files should have names specified relative to podroot.
+
+=item B<--splitpod> Directory containing the splitpod program
+
+The directory containing the splitpod program. The default is 'podroot/pod'.
 
 =item B<--libpods> library PODs for LE<lt>E<gt> links
 
 
 =item B<--libpods> library PODs for LE<lt>E<gt> links
 
-Colon-seperated list of "library" pod files.  This is the same list that
+Comma-separated list of "library" pod files.  This is the same list that
 will be passed to pod2html when any pod is converted.
 
 will be passed to pod2html when any pod is converted.
 
+=item B<--ignore> files to be ignored
+
+Comma-separated of files that shouldn't be installed, given relative
+to podroot.
+
 =item B<--verbose> verbose output
 
 Self-explanatory.
 =item B<--verbose> verbose output
 
 Self-explanatory.
@@ -86,28 +99,28 @@ The following command-line is an example of the one we use to convert
 perl documentation:
 
     ./installhtml --podpath=lib:ext:pod:vms   \
 perl documentation:
 
     ./installhtml --podpath=lib:ext:pod:vms   \
-                 --podroot=/usr/src/perl     \
-                  --htmldir=/perl/nmanual     \
-                 --htmlroot=/perl/nmanual    \
-                 --splithead=pod/perlipc.pod \
-                 --splititem=pod/perlfunc    \
-                 --libpods=perlfunc:perlguts:perlvar:perlrun:perlop \
-                  --recurse \
-                 --verbose
+                       --podroot=/usr/src/perl     \
+                       --htmldir=/perl/nmanual     \
+                       --htmlroot=/perl/nmanual    \
+                       --splithead=pod/perlipc     \
+                       --splititem=pod/perlfunc    \
+                       --libpods=perlfunc,perlguts,perlvar,perlrun,perlop \
+                       --recurse \
+                       --verbose
 
 =head1 AUTHOR
 
 Chris Hall E<lt>hallc@cs.colorado.eduE<gt>
 
 
 =head1 AUTHOR
 
 Chris Hall E<lt>hallc@cs.colorado.eduE<gt>
 
-=head1 TODO
-
 =cut
 
 =cut
 
+my $usage;
+
 $usage =<<END_OF_USAGE;
 Usage: $0 --help --podpath=<name>:...:<name> --podroot=<name>
          --htmldir=<name> --htmlroot=<name> --norecurse --recurse
          --splithead=<name>,...,<name> --splititem=<name>,...,<name>
 $usage =<<END_OF_USAGE;
 Usage: $0 --help --podpath=<name>:...:<name> --podroot=<name>
          --htmldir=<name> --htmlroot=<name> --norecurse --recurse
          --splithead=<name>,...,<name> --splititem=<name>,...,<name>
-        --libpods=<name>,...,<name> --verbose
+         --libpods=<name>,...,<name> --ignore=<name>,...,<name> --verbose
 
     --help      - this message
     --podpath   - colon-separated list of directories containing .pod and
 
     --help      - this message
     --podpath   - colon-separated list of directories containing .pod and
@@ -115,7 +128,7 @@ Usage: $0 --help --podpath=<name>:...:<name> --podroot=<name>
     --podroot   - filesystem base directory from which all relative paths in
                   podpath stem (default is .).
     --htmldir   - directory to store resulting html files in relative
     --podroot   - filesystem base directory from which all relative paths in
                   podpath stem (default is .).
     --htmldir   - directory to store resulting html files in relative
-                  to the filesystem (\$podroot/html by default). 
+                  to the filesystem (\$podroot/html by default).
     --htmlroot  - http-server base directory from which all relative paths
                   in podpath stem (default is /).
     --libpods   - comma-separated list of files to search for =item pod
     --htmlroot  - http-server base directory from which all relative paths
                   in podpath stem (default is /).
     --libpods   - comma-separated list of files to search for =item pod
@@ -125,16 +138,20 @@ Usage: $0 --help --podpath=<name>:...:<name> --podroot=<name>
                   (default behavior).
     --recurse   - recurse on those subdirectories listed in podpath
     --splithead - comma-separated list of .pod or .pm files to split.  will
                   (default behavior).
     --recurse   - recurse on those subdirectories listed in podpath
     --splithead - comma-separated list of .pod or .pm files to split.  will
-                  split each file into several smaller files at every occurance
+                  split each file into several smaller files at every occurrence
                   of a pod =head[1-6] directive.
     --splititem - comma-separated list of .pod or .pm files to split using
                   splitpod.
                   of a pod =head[1-6] directive.
     --splititem - comma-separated list of .pod or .pm files to split using
                   splitpod.
-    --splitpod  - where the program splitpod can be found (\$podroot/pod by
-                  default).
+    --splitpod  - directory where the program splitpod can be found
+                  (\$podroot/pod by default).
+    --ignore    - comma-separated list of files that shouldn't be installed.
     --verbose   - self-explanatory.
 
 END_OF_USAGE
 
     --verbose   - self-explanatory.
 
 END_OF_USAGE
 
+my (@libpods, @podpath, $podroot, $htmldir, $htmlroot, $recurse, @splithead,
+    @splititem, $splitpod, $verbose, $pod2html, @ignore);
+
 @libpods = ();
 @podpath = ( "." );    # colon-separated list of directories containing .pod
                        # and .pm files to be converted.
 @libpods = ();
 @podpath = ( "." );    # colon-separated list of directories containing .pod
                        # and .pm files to be converted.
@@ -146,19 +163,27 @@ $recurse = 0;             # default behavior
 @splititem = ();       # don't split any files by default
 $splitpod = "";                # nothing for now.
 
 @splititem = ();       # don't split any files by default
 $splitpod = "";                # nothing for now.
 
-$verbose = 0;          # whether or not to print debugging info
+$verbose = 0;          # whether or not to print debugging info
 
 $pod2html = "pod/pod2html";
 
 
 $pod2html = "pod/pod2html";
 
+usage("") unless @ARGV;
+
+# Overcome shell's p1,..,p8 limitation.  
+# See vms/descrip_mms.template -> descrip.mms for invocation.
+if ( $^O eq 'VMS' ) { @ARGV = split(/\s+/,$ARGV[0]); }
+
+use vars qw( %Options );
 
 # parse the command-line
 
 # parse the command-line
-$result = GetOptions( qw(
+my $result = GetOptions( \%Options, qw(
        help
        podpath=s
        podroot=s
        htmldir=s
        htmlroot=s
        libpods=s
        help
        podpath=s
        podroot=s
        htmldir=s
        htmlroot=s
        libpods=s
+       ignore=s
        recurse!
        splithead=s
        splititem=s
        recurse!
        splithead=s
        splititem=s
@@ -184,38 +209,38 @@ $splitpod = "$podroot/pod" unless $splitpod;
 # ignored in the conversion process.  these are files that have been
 # process by splititem or splithead and should not be converted as a
 # result.
 # ignored in the conversion process.  these are files that have been
 # process by splititem or splithead and should not be converted as a
 # result.
-@ignore = ();
+my @splitdirs;
 
 
-
-# split pods.  its important to do this before convert ANY pods because
-#  it may effect some of the links
+# split pods. It's important to do this before convert ANY pods because
+# it may affect some of the links
 @splitdirs = ();    # files in these directories won't get an index
 split_on_head($podroot, $htmldir, \@splitdirs, \@ignore, @splithead);
 @splitdirs = ();    # files in these directories won't get an index
 split_on_head($podroot, $htmldir, \@splitdirs, \@ignore, @splithead);
-split_on_item($podroot, \@splitdirs, \@ignore, @splititem);
+split_on_item($podroot,           \@splitdirs, \@ignore, @splititem);
 
 
 # convert the pod pages found in @poddirs
 #warn "converting files\n" if $verbose;
 #warn "\@ignore\t= @ignore\n" if $verbose;
 
 
 # convert the pod pages found in @poddirs
 #warn "converting files\n" if $verbose;
 #warn "\@ignore\t= @ignore\n" if $verbose;
-foreach $dir (@podpath) {
+foreach my $dir (@podpath) {
     installdir($dir, $recurse, $podroot, \@splitdirs, \@ignore);
 }
 
 
 # now go through and create master indices for each pod we split
     installdir($dir, $recurse, $podroot, \@splitdirs, \@ignore);
 }
 
 
 # now go through and create master indices for each pod we split
-foreach $dir (@splititem) {
+foreach my $dir (@splititem) {
     print "creating index $htmldir/$dir.html\n" if $verbose;
     create_index("$htmldir/$dir.html", "$htmldir/$dir");
 }
 
     print "creating index $htmldir/$dir.html\n" if $verbose;
     create_index("$htmldir/$dir.html", "$htmldir/$dir");
 }
 
-foreach $dir (@splithead) {
+foreach my $dir (@splithead) {
+    (my $pod = $dir) =~ s,^.*/,,;
     $dir .= ".pod" unless $dir =~ /(\.pod|\.pm)$/;
     # let pod2html create the file
     runpod2html($dir, 1);
 
     # now go through and truncate after the index
     $dir =~ /^(.*?)(\.pod|\.pm)?$/sm;
     $dir .= ".pod" unless $dir =~ /(\.pod|\.pm)$/;
     # let pod2html create the file
     runpod2html($dir, 1);
 
     # now go through and truncate after the index
     $dir =~ /^(.*?)(\.pod|\.pm)?$/sm;
-    $file = "$htmldir/$1";
+    my $file = "$htmldir/$1";
     print "creating index $file.html\n" if $verbose;
 
     # read in everything until what would have been the first =head
     print "creating index $file.html\n" if $verbose;
 
     # read in everything until what would have been the first =head
@@ -223,18 +248,23 @@ foreach $dir (@splithead) {
     open(H, "<$file.html") ||
        die "$0: error opening $file.html for input: $!\n";
     $/ = "";
     open(H, "<$file.html") ||
        die "$0: error opening $file.html for input: $!\n";
     $/ = "";
-    @data = ();
+    my @data = ();
     while (<H>) {
     while (<H>) {
-       last if /NAME=/;
-       s,HREF="#(.*)">,HREF="$file/$1.html">,g;
+       last if /name="name"/i;
+       $_ =~ s{href="#(.*)">}{
+           my $url = "$pod/$1.html" ;
+           $url = Pod::Html::relativize_url( $url, "$file.html" )
+           if ( ! defined $Options{htmlroot} || $Options{htmlroot} eq '' );
+           "href=\"$url\">" ;
+       }egi;
        push @data, $_;
        push @data, $_;
-    } 
+    }
     close(H);
 
     close(H);
 
-    # now rewrite the file 
+    # now rewrite the file
     open(H, ">$file.html") ||
        die "$0: error opening $file.html for output: $!\n";
     open(H, ">$file.html") ||
        die "$0: error opening $file.html for output: $!\n";
-    print H "@data\n";
+    print H "@data", "\n";
     close(H);
 }
 
     close(H);
 }
 
@@ -248,35 +278,40 @@ sub usage {
 
 
 sub parse_command_line {
 
 
 sub parse_command_line {
-    usage() if defined $opt_help;
-    $opt_help = "";                # make -w shut up
+    usage() if defined $Options{help};
+    $Options{help} = "";                   # make -w shut up
 
     # list of directories
 
     # list of directories
-    @podpath   = split(":", $opt_podpath) if defined $opt_podpath;
+    @podpath   = split(":", $Options{podpath}) if defined $Options{podpath};
 
     # lists of files
 
     # lists of files
-    @splithead = split(",", $opt_splithead) if defined $opt_splithead;
-    @splititem = split(",", $opt_splititem) if defined $opt_splititem;
-    @libpods   = split(",", $opt_libpods) if defined $opt_libpods;
+    @splithead = split(",", $Options{splithead}) if defined $Options{splithead};
+    @splititem = split(",", $Options{splititem}) if defined $Options{splititem};
+    @libpods   = split(",", $Options{libpods}) if defined $Options{libpods};
+
+    $htmldir  = $Options{htmldir}          if defined $Options{htmldir};
+    $htmlroot = $Options{htmlroot}         if defined $Options{htmlroot};
+    $podroot  = $Options{podroot}          if defined $Options{podroot};
+    $splitpod = $Options{splitpod}         if defined $Options{splitpod};
 
 
-    $htmldir  = $opt_htmldir       if defined $opt_htmldir;
-    $htmlroot = $opt_htmlroot      if defined $opt_htmlroot;
-    $podroot  = $opt_podroot       if defined $opt_podroot;
-    $splitpod = $opt_splitpod      if defined $opt_splitpod;
+    $recurse  = $Options{recurse}          if defined $Options{recurse};
+    $verbose  = $Options{verbose}          if defined $Options{verbose};
 
 
-    $recurse  = $opt_recurse       if defined $opt_recurse;
-    $verbose  = $opt_verbose       if defined $opt_verbose;
+    @ignore = map "$podroot/$_", split(",", $Options{ignore}) if defined $Options{ignore};
 }
 
 
 sub create_index {
     my($html, $dir) = @_;
 }
 
 
 sub create_index {
     my($html, $dir) = @_;
+    (my $pod = $dir) =~ s,^.*/,,;
     my(@files, @filedata, @index, $file);
     my(@files, @filedata, @index, $file);
+    my($lcp1,$lcp2);
+
 
     # get the list of .html files in this directory
     opendir(DIR, $dir) ||
        die "$0: error opening directory $dir for reading: $!\n";
 
     # get the list of .html files in this directory
     opendir(DIR, $dir) ||
        die "$0: error opening directory $dir for reading: $!\n";
-    @files = sort(grep(/\.html$/, readdir(DIR)));
+    @files = sort(grep(/\.html?$/, readdir(DIR)));
     closedir(DIR);
 
     open(HTML, ">$html") ||
     closedir(DIR);
 
     open(HTML, ">$html") ||
@@ -294,20 +329,29 @@ sub create_index {
        close(IN);
 
        # pull out the NAME section
        close(IN);
 
        # pull out the NAME section
-       ($name) = grep(/NAME=/, @filedata);
-       $name =~ m,/H1>\s(\S+)\s[\s-]*(.*?)\s*$,sm;
-       print HTML qq(<A HREF="$dir/$file">);
-       print HTML "<DT>$1</A><DD>$2\n" if defined $1;
-#      print HTML qq(<A HREF="$dir/$file">$1</A><BR>\n") if defined $1;
+       my $name;
+       ($name) = grep(/name="name"/i, @filedata);
+       ($lcp1,$lcp2) = ($name =~ m,/H1>\s(\S+)\s[\s-]*(.*?)\s*$,smi);
+       if (defined $lcp1 and $lcp1 =~ m,^<P>$,i) { # Uninteresting.  Try again.
+           ($lcp1,$lcp2) = ($name =~ m,/H1>\s<P>\s*(\S+)\s[\s-]*(.*?)\s*$,smi);
+       }
+       my $url= "$pod/$file" ;
+       if ( ! defined $Options{htmlroot} || $Options{htmlroot} eq '' ) {
+           $url = Pod::Html::relativize_url( "$pod/$file", $html ) ;
+       }
+
+       if (defined $lcp1) {
+           print HTML qq(<DT><A HREF="$url">);
+           print HTML "$lcp1</A></DT><DD>$lcp2</DD>\n";
+       }
 
        next;
 
        @index = grep(/<!-- INDEX BEGIN -->.*<!-- INDEX END -->/s,
                    @filedata);
        for (@index) {
 
        next;
 
        @index = grep(/<!-- INDEX BEGIN -->.*<!-- INDEX END -->/s,
                    @filedata);
        for (@index) {
-           s/<!-- INDEX BEGIN -->(\s*<!--)(.*)(-->\s*)<!-- INDEX END -->/$2/s;
+           s/<!-- INDEX BEGIN -->(\s*<!--)(.*)(-->\s*)<!-- INDEX END -->/$lcp2/s;
            s,#,$dir/$file#,g;
            s,#,$dir/$file#,g;
-           # print HTML "$_\n";
            print HTML "$_\n<P><HR><P>\n";
        }
     }
            print HTML "$_\n<P><HR><P>\n";
        }
     }
@@ -326,7 +370,7 @@ sub split_on_head {
     foreach $pod (@splithead) {
        # figure out the directory name and filename
        $pod      =~ s,^([^/]*)$,/$1,;
     foreach $pod (@splithead) {
        # figure out the directory name and filename
        $pod      =~ s,^([^/]*)$,/$1,;
-       $pod      =~ m,(.*?)/(.*?)(\.pod)?$,;
+       $pod      =~ m,(.*)/(.*?)(\.pod)?$,;
        $dirname  = $1;
        $filename = "$2.pod";
 
        $dirname  = $1;
        $filename = "$2.pod";
 
@@ -346,10 +390,12 @@ sub split_on_item {
 
     print "splitting files by item.\n" if $verbose && $#splititem >= 0;
     $pwd = getcwd();
 
     print "splitting files by item.\n" if $verbose && $#splititem >= 0;
     $pwd = getcwd();
-    foreach $pod (@splititem) {
+    my $splitter = File::Spec->rel2abs("$splitpod/splitpod", $pwd);
+    my $perl = File::Spec->rel2abs($^X, $pwd);
+    foreach my $pod (@splititem) {
        # figure out the directory to split into
        $pod      =~ s,^([^/]*)$,/$1,;
        # figure out the directory to split into
        $pod      =~ s,^([^/]*)$,/$1,;
-       $pod      =~ m,(.*?)/(.*?)(\.pod)?$,;
+       $pod      =~ m,(.*)/(.*?)(\.pod)?$,;
        $dirname  = "$1/$2";
        $filename = "$2.pod";
 
        $dirname  = "$1/$2";
        $filename = "$2.pod";
 
@@ -364,7 +410,11 @@ sub split_on_item {
        }
        chdir("$podroot/$dirname") ||
            die "$0: error changing to directory $podroot/$dirname: $!\n";
        }
        chdir("$podroot/$dirname") ||
            die "$0: error changing to directory $podroot/$dirname: $!\n";
-       system("./splitpod", "../$filename");
+       die "$splitter not found. Use '-splitpod dir' option.\n"
+           unless -f $splitter;
+       system($perl, $splitter, "../$filename") &&
+           warn "$0: error running '$splitter ../$filename'"
+                ." from $podroot/$dirname";
     }
     chdir($pwd);
 }
     }
     chdir($pwd);
 }
@@ -402,15 +452,15 @@ sub splitpod {
 
     # create list of =head[1-6] sections so that we can rewrite
     #  L<> links as necessary.
 
     # create list of =head[1-6] sections so that we can rewrite
     #  L<> links as necessary.
-    %heads = ();
+    my %heads = ();
     foreach $i (0..$#poddata) {
     foreach $i (0..$#poddata) {
-       $heads{htmlize($1)} = 1 if $poddata[$i] =~ /=head[1-6]\s+(.*)/;
+       $heads{anchorify($1)} = 1 if $poddata[$i] =~ /=head[1-6]\s+(.*)/;
     }
 
     # create a directory of a similar name and store all the
     #  files in there
     $pod =~ s,.*/(.*),$1,;     # get the last part of the name
     }
 
     # create a directory of a similar name and store all the
     #  files in there
     $pod =~ s,.*/(.*),$1,;     # get the last part of the name
-    $dir = $pod;
+    my $dir = $pod;
     $dir =~ s/\.pod//g;
     push(@$splitdirs, "$poddir/$dir");
     mkdir("$poddir/$dir", 0755) ||
     $dir =~ s/\.pod//g;
     push(@$splitdirs, "$poddir/$dir");
     mkdir("$poddir/$dir", 0755) ||
@@ -436,15 +486,15 @@ sub splitpod {
        # determine an appropriate filename (this must correspond with
        #  what pod2html will try and guess)
        # $poddata[$i] =~ /^\s*=head[1-6]\s+(.*)/;
        # determine an appropriate filename (this must correspond with
        #  what pod2html will try and guess)
        # $poddata[$i] =~ /^\s*=head[1-6]\s+(.*)/;
-       $file = "$dir/" . htmlize($section) . ".pod";
+       $file = "$dir/" . anchorify($section) . ".pod";
 
        # create the new .pod file
        print "\tcreating $poddir/$file\n" if $verbose;
        open(SPLITOUT, ">$poddir/$file") ||
            die "$0: error opening $poddir/$file for output: $!\n";
        $poddata[$i] =~ s,L<([^<>]*)>,
 
        # create the new .pod file
        print "\tcreating $poddir/$file\n" if $verbose;
        open(SPLITOUT, ">$poddir/$file") ||
            die "$0: error opening $poddir/$file for output: $!\n";
        $poddata[$i] =~ s,L<([^<>]*)>,
-                           defined $heads{htmlize($1)} ? "L<$dir/$1>" : "L<$1>"
-                        ,ge;
+                       defined $heads{anchorify($1)} ? "L<$dir/$1>" : "L<$1>"
+                    ,ge;
        print SPLITOUT $poddata[$i]."\n\n";
        print SPLITOUT "=over 4\n\n";
        print SPLITOUT "=item *\n\nBack to L<$dir/\"$prevsec\">\n\n" if $prevsec;
        print SPLITOUT $poddata[$i]."\n\n";
        print SPLITOUT "=over 4\n\n";
        print SPLITOUT "=item *\n\nBack to L<$dir/\"$prevsec\">\n\n" if $prevsec;
@@ -476,7 +526,7 @@ sub installdir {
        || die "$0: error opening directory $podroot/$dir: $!\n";
 
     # find the directories to recurse on
        || die "$0: error opening directory $podroot/$dir: $!\n";
 
     # find the directories to recurse on
-    @dirlist = map { "$dir/$_" }
+    @dirlist = map { if ($^O eq 'VMS') {/^(.*)\.dir$/i; "$dir/$1";} else {"$dir/$_";}}
        grep(-d "$podroot/$dir/$_" && !/^\.{1,2}/, readdir(DIR)) if $recurse;
     rewinddir(DIR);
 
        grep(-d "$podroot/$dir/$_" && !/^\.{1,2}/, readdir(DIR)) if $recurse;
     rewinddir(DIR);
 
@@ -497,22 +547,24 @@ sub installdir {
     }
 
     # install all the pods we found
     }
 
     # install all the pods we found
-    foreach $pod (@podlist) {
+    foreach my $pod (@podlist) {
        # check if we should ignore it.
        # check if we should ignore it.
-       next if grep($_ eq "$podroot/$pod.pod", @$ignore);
+       next if $pod =~ m(/t/); # comes from a test file
+       next if grep($_ eq "$pod.pod", @$ignore);
 
        # check if a .pm files exists too
 
        # check if a .pm files exists too
-       if (grep($_ eq "$pod.pm", @pmlist)) {
-           print  "$0: Warning both `$podroot/$pod.pod' and "
-               . "`$podroot/$pod.pm' exist, using pod\n";
+       if (grep($_ eq $pod, @pmlist)) {
+           print  "$0: Warning both '$podroot/$pod.pod' and "
+               . "'$podroot/$pod.pm' exist, using pod\n";
            push(@ignore, "$pod.pm");
        }
        runpod2html("$pod.pod", $doindex);
     }
 
     # install all the .pm files we found
            push(@ignore, "$pod.pm");
        }
        runpod2html("$pod.pod", $doindex);
     }
 
     # install all the .pm files we found
-    foreach $pm (@pmlist) {
+    foreach my $pm (@pmlist) {
        # check if we should ignore it.
        # check if we should ignore it.
+       next if $pm =~ m(/t/); # comes from a test file
        next if grep($_ eq "$pm.pm", @ignore);
 
        runpod2html("$pm.pm", $doindex);
        next if grep($_ eq "$pm.pm", @ignore);
 
        runpod2html("$pm.pm", $doindex);
@@ -544,17 +596,15 @@ sub runpod2html {
 
     # invoke pod2html
     print "$podroot/$pod => $htmldir/$html\n" if $verbose;
 
     # invoke pod2html
     print "$podroot/$pod => $htmldir/$html\n" if $verbose;
-#system("./pod2html",
-        Pod::Html'pod2html(
-        #Pod::Html'pod2html($pod2html,
+    Pod::Html::pod2html(
+        "--htmldir=$htmldir",
        "--htmlroot=$htmlroot",
        "--podpath=".join(":", @podpath),
        "--podroot=$podroot", "--netscape",
        "--htmlroot=$htmlroot",
        "--podpath=".join(":", @podpath),
        "--podroot=$podroot", "--netscape",
+       "--header",
        ($doindex ? "--index" : "--noindex"),
        "--" . ($recurse ? "" : "no") . "recurse",
        ($#libpods >= 0) ? "--libpods=" . join(":", @libpods) : "",
        "--infile=$podroot/$pod", "--outfile=$htmldir/$html");
     die "$0: error running $pod2html: $!\n" if $?;
 }
        ($doindex ? "--index" : "--noindex"),
        "--" . ($recurse ? "" : "no") . "recurse",
        ($#libpods >= 0) ? "--libpods=" . join(":", @libpods) : "",
        "--infile=$podroot/$pod", "--outfile=$htmldir/$html");
     die "$0: error running $pod2html: $!\n" if $?;
 }
-
-sub htmlize { htmlify(0, @_) }