#! /usr/bin/perl -w
#================================================================
# mypldoc
# Document generator for Perl sources
#================================================================
use strict;
use warnings;
# main routine
sub main {
my($i, $err, $destdir, $ptitle, $afile, @files, $file);
$err = 0;
$ptitle = "Perl API";
for($i = 0; $i < scalar(@ARGV); $i++){
if($ARGV[$i] =~ m/^-d/){
$destdir = $ARGV[++$i];
} elsif($ARGV[$i] =~ m/^-t/){
$ptitle = $ARGV[++$i];
} elsif($ARGV[$i] =~ m/^-a/){
$afile = $ARGV[++$i];
} else {
push(@files, $ARGV[$i]);
}
}
(scalar(@files) > 0) || usage();
(defined($destdir)) || ($destdir = ".");
(-d $destdir) || (mkdir($destdir)) || die "$1: $!\n";
foreach $file (@files){
(makedoc($destdir, $ptitle, $file)) || ($err = 1);
}
(makeindex($destdir, $ptitle, $afile, \@files)) || ($err = 1);
return $err ? 1 : 0;
}
# print the usage and exit
sub usage {
printf(STDERR "$0: usage: $0 [-d dir] [-t str] [-a file] file ...\n");
exit(1);
}
# generate a document
sub makedoc {
my($destdir) = shift;
my($ptitle) = shift;
my($source) = shift;
my($dest, $in, $out, $line, @group, $kbd, $i);
if(!(-r $source)){
printf(STDERR "$0: $source: no such file\n");
return 0;
}
if(!open(IN, $source)){
printf(STDERR "$0: $source: cannot open\n");
return 0;
}
$in = *IN;
$source =~ s/.*\///;
$dest = ">$destdir/$source.html";
if(!open(OUT, $dest)){
printf(STDERR "$0: $dest: cannot open\n");
return 0;
}
$out = *OUT;
writehead($out, $ptitle, $source);
while(defined($line = <$in>)){
chomp($line);
if($line =~ m/^\x23\x23/){
@group = ();
while(defined($line = <$in>)){
chomp($line);
($line =~ m/^\x23/) || last;
(length($line) > 1) || next;
push(@group, $line);
}
if(scalar(@group) > 0){
printf($out "
\n");
$kbd = $group[0] =~ m/^\x23:/;
for($i = 0; $i < scalar(@group); $i++){
$group[$i] =~ s/^\x23[ :]*//;
$group[$i] =~ s/&/&/;
$group[$i] =~ s/</;
$group[$i] =~ s/>/>/;
$group[$i] =~ s/\x22/"/;
}
if($kbd){
printf($out "- %s
\n", $group[0]);
} else {
printf($out "- %s
\n", $group[0]);
}
if(scalar(@group) > 1){
printf($out "- \n");
for($i = 1; $i < scalar(@group); $i++){
printf($out "%s\n", $group[$i]);
}
printf($out "
\n");
}
printf($out "
\n");
}
}
}
printf($out "
\n");
writetail($out);
close($out);
close($in);
return 1;
}
# generate the index file
sub makeindex {
my($destdir) = shift;
my($ptitle) = shift;
my($afile) = shift;
my($filesref) = shift;
my($line, @files, $dest, $in, $out, $file, $name);
@files = @$filesref;
$dest = ">$destdir/index.html";
if(!open(OUT, $dest)){
printf(STDERR "$0: $dest: cannot open\n");
return 0;
}
$out = *OUT;
writehead($out, $ptitle);
if(defined($afile)){
if(open(IN, $afile)){
while(defined($line = )){
chomp($line);
printf(OUT "%s\n", $line);
}
close(IN);
} else {
printf(STDERR "$0: $afile: cannot open\n");
}
printf($out "
\n");
}
printf($out "API
\n");
printf($out "\n");
foreach $file (@files){
$file =~ s/.*\///;
$name = $file;
$name =~ s/\..*//;
printf($out "- $name
\n");
}
printf($out "
\n");
printf($out "
\n");
writetail($out);
close($out);
return 1;
}
# write header
sub writehead {
my($out) = shift;
my($ptitle) = shift;
my($name) = shift;
my($title, $head, $navi);
if(defined($name)){
$name =~ s/\..*//;
$title = "$name ($ptitle)";
$head = "API of $name";
$navi = "";
} else {
$title = "INDEX ($ptitle)";
$head = "$ptitle";
$navi = "Perl Source Documents
";
}
print $out <<__MYEOF
$title
$navi
$head
__MYEOF
}
# write tail
sub writetail {
my($out) = shift;
my($sec,$min,$hour,$mday,$mon,$year) = localtime();
my($datestr) = sprintf("%04d/%02d/%02d", $year + 1900, $mon + 1, $mday);
print $out <<__MYEOF
Generated by $0, $datestr.
__MYEOF
}
# execute main
$0 =~ s/.*\///;
exit(main());
# END OF FILE