use strict;
use 5.005;
use Pod::Tree::HTML;
use Pod::Tree::PerlUtil;
package Pod::Tree::HTML::PerlTop;
use base qw(Pod::Tree::HTML);
sub set_links
{
my($html, $links) = @_;
$html->{links} = $links;
}
sub _emit_verbatim
{
my($html, $node) = @_;
my $stream = $html->{stream};
my $links = $html->{links};
my $text = $node->get_text;
$text =~ s( \n\n$ )()x;
my @words = split m/(\s+)/, $text;
$stream->PRE;
for my $word (@words)
{
if ($links->{$word})
{
my $link = $links->{$word};
$stream->A(HREF => "$link.html")->text($word)->_A;
}
else
{
$stream->text($word);
}
}
$stream->_PRE;
}
package Pod::Tree::PerlTop;
use base qw(Pod::Tree::PerlUtil);
sub new
{
my %defaults = (bgcolor => '#ffffff',
text => '#000000');
my($class, $perl_dir, $html_dir, $link_map, %options) = @_;
my $options = { %defaults, %options, link_map => $link_map };
my $pod_src = -d "$perl_dir/pod"
? 'pod' # for building the doc set from a Perl distribution
: 'lib/pod'; # for building the doc set from a Windows installation
my $perl_top = { perl_dir => $perl_dir,
html_dir => $html_dir,
index => 'index.html',
pod_src => 'pod',
pod_dst => 'pod',
page => 'perl',
options => $options };
bless $perl_top, $class
}
sub index
{
my($perl_top, @translators) = @_;
$perl_top->report1("index");
my @entries = map { $_->get_top_entry } @translators;
my $html_dir = $perl_top->{html_dir};
my $dest = "$html_dir/index.html";
my $fh = new IO::File ">$dest";
defined $fh or die "Pod::Tree::PerlTop::index: Can't open $dest: $!\n";
my $stream = new HTML::Stream $fh;
my $options = $perl_top->{options};
my $bgcolor = $options->{bgcolor};
my $text = $options->{text};
my $title = "Perl Documentation";
$stream-> HTML->HEAD;
$stream-> TITLE->text($title)->_TITLE;
$stream->_HEAD
-> BODY(BGCOLOR => $bgcolor, TEXT => $text);
$stream->H1->t($title)->_H1;
$perl_top->_emit_entries($stream, @entries);
$stream->_BODY->_HTML;
}
sub _emit_entries
{
my($perl_top, $stream, @entries) = @_;
$stream->UL;
for my $entry (@entries)
{
$stream->LI
->A(HREF => $entry->{URL})
->t($entry->{description})
->_A
->_LI;
}
$stream->_UL;
}
sub translate
{
my $perl_top = shift;
$perl_top->report1("translate");
my $perl_dir = $perl_top->{perl_dir};
my $options = $perl_top->{options};
$options->{link_map}->set_depth(1);
my $html_dir = $perl_top->{html_dir};
my $pod_src = $perl_top->{pod_src};
my $pod_dst = $perl_top->{pod_dst};
my $page = $perl_top->{page};
my $source = "$perl_dir/$pod_src/$page.pod";
my $dest = "$html_dir/$pod_dst/$page.html";
my $html = new Pod::Tree::HTML::PerlTop $source, $dest, %$options;
my $links = $perl_top->_get_links;
$html->set_links($links);
$html->translate;
}
sub get_top_entry
{
my $perl_top = shift;
my $pod_dst = $perl_top->{pod_dst};
my $page = $perl_top->{page};
+{ URL => "$pod_dst/$page.html",
description => 'perl(1)' }
}
sub _get_links
{
my $perl_top = shift;
my $links = {};
$perl_top->_get_pod_links ($links);
$perl_top->_get_dist_links($links);
$links
}
sub _get_pod_links
{
my($perl_top, $links) = @_;
my $perl_dir = $perl_top->{perl_dir};
my $pod_src = $perl_top->{pod_src};
my $dir = "$perl_dir/$pod_src";
opendir(DIR, $dir) or
die "Pod::Tree::PerlTop::get_pod_links: Can't opendir $dir: $!\n";
my @files = readdir(DIR);
closedir(DIR);
my @pods = grep { m( \.pod$ )x } @files;
my @others = grep { $_ ne 'perl.pod' } @pods;
for my $other (@others)
{
$other =~ s( \.pod$ )()x;
$links->{$other} = $other;
}
}
sub _get_dist_links
{
my($perl_top, $links) = @_;
my $dir = $perl_top->{perl_dir};
opendir(DIR, $dir) or
die "Pod::Tree::PerlTop::get_dist_links: Can't opendir $dir: $!\n";
my @files = readdir(DIR);
closedir(DIR);
my @README = grep { /^README/ } @files;
for my $file (@README)
{
my($base, $ext) = split m(\.), $file;
$links->{"perl$ext"} = "../$file";
}
}
1
__END__
=head1 NAME
Pod::Tree::PerlTop - generate a top-level index for Perl PODs
=head1 SYNOPSIS
$perl_map = new Pod::Tree::PerlMap;
$perl_top = new Pod::Tree::PerlTop $perl_dir, $HTML_dir, $perl_map, %opts;
$perl_top->index(@translators);
$perl_top->translate;
$top = $perl_top->get_top_entry;
=head1 DESCRIPTION
C generates a top-level index for Perl PODs.
It also translates F to F
The translator is specially hacked to insert links into the big verbatim
paragraph that lists all the other Perl PODs.
=head1 METHODS
=over 4
=item I<$perl_top> = C C I<$perl_dir>,
I<$HTML_dir>, I<$perl_map>, I<%options>
Creates and returns a new C object.
I<$perl_dir> is the root of the Perl source tree.
I<$HTML_dir> is the directory where HTML files will be written.
I<$perl_map> maps POD names to URLs.
C uses it to resolve links in the F page.
I<%options> are passed through to C.
=item I<$perl_top>->C(I<@translators>)
Generates a top-level index of all the PODs.
The index is written to IC.
I<@translators> is a list of other C translator objects.
C makes a C call on each of them to obtain
URLs and descriptions of the pages that it links to.
=item I<$perl_top>->C
Translates the F file to HTML.
The HTML page is written to IC
=item I<$perl_top>->C
Returns a hash reference of the form
{ URL => $URL,
description => $description }
C uses this to build a top-level index of all the
Perl PODs.
=back
=head1 REQUIRES
5.005;
Pod::Tree::HTML;
Pod::Tree::PerlUtil;
=head1 EXPORTS
Nothing.
=head1 SEE ALSO
L>, L>,
=head1 AUTHOR
Steven McDougall, swmcd@world.std.com
=head1 COPYRIGHT
Copyright (c) 2000 by Steven McDougall. This module is free software;
you can redistribute it and/or modify it under the same terms as Perl.