#!./perl -Ilib -w
$| = 1;
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>
--ignore=<name>,...,<name> --verbose
--help - this message
--podpath - colon-separated list of directories containing .pod and
.pm files to be converted ('lib/' by default).
--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).
--htmlroot - http-server base directory from which all relative paths
in podpath stem (default is /).
--norecurse - don't recurse on those subdirectories listed in podpath.
(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 occurrence
of a pod =head[1-6] directive.
--splititem - comma-separated list of .pod or .pm files to split using
splitpod.
--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
my
(
@podpath
,
$podroot
,
$htmldir
,
$htmlroot
,
$recurse
,
@splithead
,
@splititem
,
$splitpod
,
$verbose
,
$pod2html
,
@ignore
);
@podpath
= (
"lib"
);
$podroot
=
"."
;
$htmldir
=
""
;
$htmlroot
=
"/"
;
$recurse
= 0;
@splithead
= ();
@splititem
= ();
$splitpod
=
""
;
$verbose
= 0;
$pod2html
=
"pod/pod2html"
;
usage(
""
)
unless
@ARGV
;
if
( $^O eq
'VMS'
) {
@ARGV
=
split
(/\s+/,
$ARGV
[0]); }
our
%Options
;
my
$result
= GetOptions( \
%Options
,
qw(
help
podpath=s
podroot=s
htmldir=s
htmlroot=s
ignore=s
recurse!
splithead=s
splititem=s
splitpod=s
verbose
)
);
usage(
"invalid parameters"
)
unless
$result
;
parse_command_line();
$htmldir
=
"$htmlroot/html"
unless
$htmldir
;
$splitpod
=
"$podroot/pod"
unless
$splitpod
;
(
mkdir
(
$htmldir
, 0755) ||
die
"$0: cannot make directory $htmldir: $!\n"
)
if
! -d
$htmldir
;
my
@splitdirs
;
@splitdirs
= ();
split_on_head(
$podroot
,
$htmldir
, \
@splitdirs
, \
@ignore
,
@splithead
);
split_on_item(
$podroot
, \
@splitdirs
, \
@ignore
,
@splititem
);
foreach
my
$dir
(
@podpath
) {
installdir(
$dir
,
$recurse
,
$podroot
, \
@splitdirs
, \
@ignore
);
}
foreach
my
$dir
(
@splititem
) {
print
"creating index $htmldir/$dir.html\n"
if
$verbose
;
create_index(
"$htmldir/$dir.html"
,
"$htmldir/$dir"
);
}
foreach
my
$dir
(
@splithead
) {
(
my
$pod
=
$dir
) =~ s,^.*/,,;
$dir
.=
".pod"
unless
$dir
=~ /(\.pod|\.pm)$/;
runpod2html(
$dir
, 1);
$dir
=~ /^(.*?)(\.pod|\.pm)?$/sm;
my
$file
=
"$htmldir/$1"
;
print
"creating index $file.html\n"
if
$verbose
;
open
(H,
'<'
,
"$file.html"
) ||
die
"$0: error opening $file.html for input: $!\n"
;
$/ =
""
;
my
@data
= ();
while
(<H>) {
last
if
m!<h1 id=
"NAME"
>NAME</h1>!;
$_
=~ s{href=
"#(.*)"
>}{
my
$url
=
"$file/@{[anchorify(qq($1))]}.html"
;
$url
= relativize_url(
$url
,
"$file.html"
)
if
( !
defined
$Options
{htmlroot} ||
$Options
{htmlroot} eq
''
);
"href=\"$url\">"
;
}egi;
push
@data
,
$_
;
}
close
(H);
open
(H,
'>'
,
"$file.html"
) ||
die
"$0: error opening $file.html for output: $!\n"
;
print
H
@data
,
"</body>\n\n</html>\n\n\n"
;
close
(H);
}
remove_tree(
@splitdirs
, {
safe
=>1});
sub
usage {
warn
"$0: @_\n"
if
@_
;
die
$usage
;
}
sub
parse_command_line {
usage()
if
defined
$Options
{help};
$Options
{help} =
""
;
@podpath
=
split
(
":"
,
$Options
{podpath})
if
defined
$Options
{podpath};
@splithead
=
split
(
","
,
$Options
{splithead})
if
defined
$Options
{splithead};
@splititem
=
split
(
","
,
$Options
{splititem})
if
defined
$Options
{splititem};
$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};
$recurse
=
$Options
{recurse}
if
defined
$Options
{recurse};
$verbose
=
$Options
{verbose}
if
defined
$Options
{verbose};
@ignore
=
map
"$podroot/$_"
,
split
(
","
,
$Options
{ignore})
if
defined
$Options
{ignore};
}
sub
create_index {
my
(
$html
,
$dir
) =
@_
;
(
my
$pod
=
$dir
) =~ s,^.*/,,;
opendir
(DIR,
$dir
) ||
die
"$0: error opening directory $dir for reading: $!\n"
;
my
@files
=
sort
(
grep
(/\.html?$/,
readdir
(DIR)));
closedir
(DIR);
open
(HTML,
'>'
,
$html
) ||
die
"$0: error opening $html for output: $!\n"
;
print
HTML
"<DL COMPACT>\n"
;
foreach
my
$file
(
@files
) {
my
$filedata
=
do
{
open
(
my
$in
,
'<'
,
"$dir/$file"
) ||
die
"$0: error opening $dir/$file for input: $!\n"
;
local
$/ =
undef
;
<
$in
>;
};
my
(
$lcp1
,
$lcp2
) =
(
$filedata
=~
m
defined
$lcp1
or
die
"$0: can't find NAME section in $dir/$file\n"
;
my
$url
=
"$dir/$file"
;
if
( !
defined
$Options
{htmlroot} ||
$Options
{htmlroot} eq
''
) {
$url
= relativize_url(
$url
,
$html
) ;
}
print
HTML
qq(<DT><A HREF="$url">)
;
print
HTML
"$lcp1</A></DT><DD>$lcp2</DD>\n"
;
}
print
HTML
"</DL>\n"
;
close
(HTML);
}
sub
split_on_head {
my
(
$podroot
,
$htmldir
,
$splitdirs
,
$ignore
,
@splithead
) =
@_
;
my
(
$pod
,
$dirname
,
$filename
);
print
"splitting files by head.\n"
if
$verbose
&&
$#splithead
>= 0;
foreach
$pod
(
@splithead
) {
$pod
=~ s,^([^/]*)$,/$1,;
$pod
=~ m,(.*)/(.*?)(\.pod)?$,;
$dirname
= $1;
$filename
=
"$2.pod"
;
push
(
@$ignore
,
"$podroot/$dirname/$filename"
);
splitpod(
"$podroot/$dirname/$filename"
,
"$podroot/$dirname"
,
$htmldir
,
$splitdirs
);
}
}
sub
split_on_item {
my
(
$podroot
,
$splitdirs
,
$ignore
,
@splititem
) =
@_
;
my
(
$pwd
,
$dirname
,
$filename
);
print
"splitting files by item.\n"
if
$verbose
&&
$#splititem
>= 0;
$pwd
= getcwd();
my
$splitter
= rel2abs(
"$splitpod/splitpod"
,
$pwd
);
my
$perl
= rel2abs($^X,
$pwd
);
foreach
my
$pod
(
@splititem
) {
$pod
=~ s,^([^/]*)$,/$1,;
$pod
=~ m,(.*)/(.*?)(\.pod)?$,;
$dirname
=
"$1/$2"
;
$filename
=
"$2.pod"
;
push
(
@$ignore
,
"$podroot/$dirname.pod"
);
push
(
@$splitdirs
,
"$podroot/$dirname"
);
-d
"$podroot/$dirname"
and remove_tree(
"$podroot/$dirname"
, {
safe
=>1});
mkdir
(
"$podroot/$dirname"
, 0755) ||
die
"$0: error creating directory $podroot/$dirname: $!\n"
;
chdir
(
"$podroot/$dirname"
) ||
die
"$0: error changing to directory $podroot/$dirname: $!\n"
;
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
);
}
sub
splitpod {
my
(
$pod
,
$poddir
,
$htmldir
,
$splitdirs
) =
@_
;
my
(
@poddata
,
@filedata
,
@heads
);
my
(
$file
,
$i
,
$j
,
$prevsec
,
$section
,
$nextsec
);
print
"splitting $pod\n"
if
$verbose
;
$/ =
""
;
open
(SPLITIN,
'<'
,
$pod
) ||
die
"$0: error opening $pod for input: $!\n"
;
@filedata
= <SPLITIN>;
close
(SPLITIN) ||
die
"$0: error closing $pod: $!\n"
;
@poddata
= ();
for
(
$i
= 0,
$j
= -1;
$i
<=
$#filedata
;
$i
++) {
$j
++
if
(
$filedata
[
$i
] =~ /^\s*=head[1-6]/);
if
(
$j
>= 0) {
$poddata
[
$j
] =
""
unless
defined
$poddata
[
$j
];
$poddata
[
$j
] .=
"\n$filedata[$i]"
if
$j
>= 0;
}
}
my
%heads
= ();
foreach
$i
(0..
$#poddata
) {
$heads
{anchorify($1)} = 1
if
$poddata
[
$i
] =~ /=head[1-6]\s+(.*)/;
}
$pod
=~ s,.*/(.*),$1,;
my
$dir
=
$pod
;
$dir
=~ s/\.pod//g;
push
(
@$splitdirs
,
"$poddir/$dir"
);
-d
"$poddir/$dir"
and remove_tree(
"$poddir/$dir"
, {
safe
=>1});
mkdir
(
"$poddir/$dir"
, 0755) ||
die
"$0: could not create directory $poddir/$dir: $!\n"
;
$poddata
[0] =~ /^\s*=head[1-6]\s+(.*)/;
$section
=
""
;
$nextsec
= $1;
for
(
$i
= 0;
$i
<=
$#poddata
;
$i
++) {
$prevsec
=
$section
;
$section
=
$nextsec
;
if
(
$i
<
$#poddata
) {
$poddata
[
$i
+1] =~ /^\s*=head[1-6]\s+(.*)/;
$nextsec
= $1;
}
else
{
$nextsec
=
""
;
}
$file
=
"$dir/"
. anchorify(
$section
) .
".pod"
;
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
{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
"=item *\n\nForward to L<$dir/\"$nextsec\">\n\n"
if
$nextsec
;
print
SPLITOUT
"=item *\n\nUp to L<$dir>\n\n"
;
print
SPLITOUT
"=back\n\n"
;
close
(SPLITOUT) ||
die
"$0: error closing $poddir/$file: $!\n"
;
}
}
sub
installdir {
my
(
$dir
,
$recurse
,
$podroot
,
$splitdirs
,
$ignore
) =
@_
;
my
@dirlist
;
my
@podlist
;
my
@pmlist
;
my
$doindex
= (
grep
(
$_
eq
"$podroot/$dir"
,
@$splitdirs
) ? 0 : 1);
opendir
(DIR,
"$podroot/$dir"
)
||
die
"$0: error opening directory $podroot/$dir: $!\n"
;
while
(
readdir
DIR) {
no_upwards(
$_
) or
next
;
my
$is_dir
= -d
"$podroot/$dir/$_"
;
next
if
$is_dir
and not
$recurse
;
my
$target
=
$is_dir
? \
@dirlist
: s/\.pod$// ? \
@podlist
: s/\.pm$// ? \
@pmlist
:
undef
;
push
@$target
,
"$dir/$_"
if
$target
;
}
closedir
(DIR);
if
($^O eq
'VMS'
) { s/\.dir$//i
for
@dirlist
}
foreach
$dir
(
@dirlist
) {
installdir(
$dir
,
$recurse
,
$podroot
,
$splitdirs
,
$ignore
);
}
foreach
my
$pod
(
@podlist
) {
next
if
$pod
=~ m(/t/);
next
if
grep
(
$_
eq
"$pod.pod"
,
@$ignore
);
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
);
}
foreach
my
$pm
(
@pmlist
) {
next
if
$pm
=~ m(/t/);
next
if
grep
(
$_
eq
"$pm.pm"
,
@ignore
);
runpod2html(
"$pm.pm"
,
$doindex
);
}
}
sub
runpod2html {
my
(
$pod
,
$doindex
) =
@_
;
my
(
$html
,
$i
,
$dir
,
@dirs
);
$html
=
$pod
;
$html
=~ s/\.(pod|pm)$/.html/g;
@dirs
=
split
(
"/"
,
$html
);
$dir
=
"$htmldir/"
;
for
(
$i
= 0;
$i
<
$#dirs
;
$i
++) {
if
(! -d
"$dir$dirs[$i]"
) {
mkdir
(
"$dir$dirs[$i]"
, 0755) ||
die
"$0: error creating directory $dir$dirs[$i]: $!\n"
;
}
$dir
.=
"$dirs[$i]/"
;
}
print
"$podroot/$pod => $htmldir/$html\n"
if
$verbose
;
Pod::Html::pod2html(
"--htmldir=$htmldir"
,
"--htmlroot=$htmlroot"
,
"--podpath="
.
join
(
":"
,
@podpath
),
"--podroot=$podroot"
,
"--header"
,
(
$doindex
?
"--index"
:
"--noindex"
),
"--"
. (
$recurse
?
""
:
"no"
) .
"recurse"
,
"--infile=$podroot/$pod"
,
"--outfile=$htmldir/$html"
);
die
"$0: error running $pod2html: $!\n"
if
$?;
}