たとえば mod_perl2 だと以下のような感じのハンドラになります(テストスクリプトも POD もないですが)。
package Podview;
use strict;
use Apache2::Const -compile => qw(:common);
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Pod::HtmlEasy;
use Pod::Perldoc;
sub handler : method {
my $class = shift;
my $r = shift;
my ($path_info, $location);
my ($pkg_name, $pod_path, $html);
my $converter;
$location = $r->location;
if ($location) {
$path_info = $r->uri;
$path_info =~ s|${location}||;
} else {
$path_info = $r->path_info;
}
for ($path_info) {
s'(::|//+)'/'go;
s'^/''o;
}
$pod_path = find_pod_path($path_info);
unless ($pod_path) {
return Apache2::Const::NOT_FOUND;
}
$pkg_name = $path_info;
$pkg_name =~ s'/'::'go;
$converter = Pod::HtmlEasy->new(
on_L => sub {
my ($this, $L, $text, $page, $section, $type) = @_;
if ($type eq 'pod') {
$section = "#${section}" if $section ne '';
$page =~ s'::'/'go;
return qq|<i><a href="${location}/${page}${section}">${text}</a></i>|;
}
elsif ($type eq 'man') {
return qq|<i>${text}</i>|;
}
elsif ($type eq 'url') {
return qq|<a href="${page}" target="_blank">${text}</a>|;
}
},
);
$html = $converter->pod2html(
$pod_path,
'',
title => "podview: ${pkg_name}",
basic_entities => 1,
no_generator => 1,
);
unless ($html) {
return Apache2::Const::NOT_FOUND;
}
$html =~ s'charset=iso-8859-1'charset=UTF-8'io;
$r->content_type('text/html; charset=UTF-8');
$r->print($html);
return Apache2::Const::OK;
}
sub find_module_path { return _find_module_or_pod($_[0], 1); }
sub find_pod_path { return _find_module_or_pod($_[0], 0); }
sub _find_module_or_pod {
my ($pod, $opt_m) = @_;
my $pd = Pod::Perldoc->new();
$pd->opt_l(1);
$pd->opt_m($opt_m) if ($opt_m);
my @pages = ( $pod );
my @found = $pd->grand_search_init(\@pages);
return join('', @found);
}
1;使い方は,
<Location /perldoc> SetHandler perl-script PerlResponseHandler Podview </Location>
として,http://〜/perldoc/CGI/Cookie をアクセス,のように,「::」は「/」に変換してください。