#
# Should be called like
#
# perl mkhtmldoc.pl [FULLPATH_TO_SOURCE] [FULLPATH_TO_HTMLDIR]
#
# for example
#
# perl mkhtmldoc.pl `pwd`/blib/lib `pwd`/html
#
# reverted to use Pod::Html from normal perl distrib
# Christian
#
# (mod. by Tjl)
use File::Find;
use File::Basename;
use File::Basename;
use Getopt::Std;
use Pod::Html;
use Cwd;
use IO::File; # for hack_links()
$opt_v = 0;
getopts('v');
my $verbose = $opt_v;
##############################################################
## Subroutines
sub has_pod # does file contain HTML-able pod?
{
my $line; #mustn't clobber $_ during find
open(POD,shift) || return 0;
while ($line=) {return 1 if $line =~ /^=head/} # only a guess, avoids "=for nobody", etc.
return 0;
}
sub mkdir_p ($$$) {
return if -d $_[0];
# my @dirs = File::Spec->splitdir($_[0]);
my @dirs = split '/', $_[0];
pop @dirs;
if(!@dirs) {die "Couldn't create directory $_[2]"}
# my $dir = File::Spec->catdir( @dirs );
my $dir = join '/', @dirs;
mkdir_p ($dir, $_[1], $_[2]);
print "Creating directory $_[0]\n" if $verbose;
mkdir $_[0], $_[1] or die "Couldn't create directory $_[0]";
}
# Replace PDL/...|PDL/... with PDL/...
# as Pod::Html v1.01 (perlv 5.005_03 )
# doesn't seem to be able to handle
# L correctly
#
# (not necessary for perl 5.6.0)
#
sub hack_html ($) {
my $infile = shift;
my $outfile = "${infile}.n";
my $ifh = new IO::File "<$infile"
or die "ERROR: Unable to read from <$infile>\n";
my $ofh = new IO::File ">$outfile"
or die "ERROR: Unable to write to <$outfile>\n";
# assume that links do not break across a line
while ( <$ifh> ) {
# fix the links
s{PDL/([^|]+)\|PDL/\1}{PDL/$1}g;
# fix the text of the link
s{PDL::([^|]+)\|PDL::\1}{PDL::$1}g;
# now fix any links for scripts
s{/([^|]+)\|PDL/\1}{/PDL/$1}g;
s{([^|]+)\|PDL::\1}{$1}g;
print $ofh $_;
}
$ifh->close;
$ofh->close;
rename $outfile, $infile
or die "ERROR: Unable to rename $outfile\n";
}
##############################################################
## Code
$SIG{__DIE__} = sub {print Carp::longmess(@_); die;};
$back = getcwd;
$startdir = shift @ARGV; #$ARGV[0];
unless (defined $startdir) {
require PDL;
($startdir = $INC{'PDL.pm'}) =~ s/\.pm$//i;
umask 0022;
}
die "couldn't find directory '$startdir'" unless -d $startdir;
chdir $startdir or die "can't change to $startdir";
$startdir = getcwd; # Hack to get absolute pathname
chdir $back;
$htmldir = shift @ARGV; #$ARGV[1];
#$htmldir = File::Spec->catdir( $startdir, "HtmlDocs", "PDL" )
$htmldir = "${startdir}/HtmlDocs/PDL"
unless defined $htmldir;
mkdir_p $htmldir, 0777, $htmldir;
chdir $htmldir or die "can't change to $htmldir";
$htmldir = getcwd; # Hack to get absolute pathname
chdir $back;
#my $updir = File::Spec->updir;
print "Making HTML docs...\n\n";
print "Put HTML $htmldir\n" if $verbose;
print "Scanning $startdir ... \n\n" if $verbose;
$sub = sub {
return unless $File::Find::name =~ /[.]pod$/ or
($File::Find::name =~ /[.]pm$/ and
$File::Find::name !~ /PP.pm/ and
$File::Find::dir !~ m{/PP|/Gen});
# if (($File::Find::name =~ /[.]pm$/ and
# $File::Find::name !~ /PP.pm/ and
# $File::Find::dir !~ m#/PP|/Gen#) or
# $File::Find::name =~ /[.]pod$/) {
if (!&has_pod($File::Find::name)) {
printf STDERR "%-30s\n", $_ ."... skipped (no pod)"
if $verbose;
return;
}
my $re = "\Q$startdir\E"; # ach: '+' in $outdir here!
my $outdir = $File::Find::dir;
# $outdir =~ s/$re/$htmldir/;
$outdir =~ s/$re//;
$outdir =~ /(^\/)?(.*)$/;
my $basename = basename($File::Find::name);
my $outfi;
# Special case for needed for PDL.pm file since it is in a
# different location than the other .pm and pod files.
if( $basename eq 'PDL.pm'){
$outfi = $basename;
} else {
$outfi = $2.($2 =~ /^\s*$/ ? '' : '/').$basename;
#
# with the following substitution, everything gets stored in the same directory -
# so PDL/Graphics/LUT -> PDL_Graphics_LUT for example
#
#$outfi =~ s|/|_|g;
}
# create the output directory, if required
if ( $outdir ne "" ) {
# $outdir = File::Spec->catdir( $htmldir, $outdir );
$outdir = "${htmldir}/${outdir}";
mkdir_p $outdir, 0777, $outdir;
}
# print "outdir = $outdir, making $outfi\n"; return;
# mkdir_p $outdir, 0777, $outdir;
my $file = $File::Find::name;
# my $outfile = File::Spec->catfile( $htmldir, $outfi );
my $outfile = "${htmldir}/${outfi}";
$outfile =~ s/[.](pm|pod)$//;
$outfile .= ".html";
printf STDERR "%-30s\n", $_ ."..."; # > $outfile";
chdir $htmldir; # reuse our pod caches
my $topPerlDir = $startdir;
# get Directory just above PDL for podroot arg
$topPerlDir = $1 if ($startdir =~ /^(.+?)\/PDL$/);
print "startdir: $startdir, podroot: $topPerlDir\n" if $verbose;
# instead of having htmlroot="../../.."
# (or even File::Spec->catdir( $updir, $updir, $updir ) )
# calculate it from the known location of the
# file we're creating
my $htmlrootdir = $htmldir;
$htmlrootdir =~ s|PDL$||;
my $verbopts = $verbose ? "--verbose" : "--quiet";
pod2html("--podpath=PDL:.",
"--podroot=$topPerlDir",
"--htmldir=$htmlrootdir",
"--libpods=perlfaq",
"--recurse",
"--infile=$file",
"--outfile=$outfile",
$verbopts,
);
hack_html( $outfile ) if $] < 5.006;
chdir $File::Find::dir; # don't confuse File::Find
};
#File::Find::find($sub,$startdir,File::Spec->catdir( $startdir, $updir, "PDL.pm"));
File::Find::find( $sub, $startdir, "${startdir}/../PDL.pm" );
## End