App-podtohtml
view release on metacpan or search on metacpan
lib/App/podtohtml.pm view on Meta::CPAN
},
},
args_rels => {
choose_one => [qw/outfile browser/],
},
examples => [
{
argv => [qw/some.pod/],
summary => 'Convert POD file to HTML, print result to STDOUT',
test => 0,
'x.doc.show_result' => 0,
},
{
argv => [qw/some.pod -b/],
summary => 'Convert POD file to HTML, show result in browser',
test => 0,
'x.doc.show_result' => 0,
},
{
argv => [qw/some.pod -b -t metacpan-20180911/],
summary => 'Convert POD file to HTML, show result in browser using the MetaCPAN template to give an idea how it will look on MetaCPAN',
test => 0,
'x.doc.show_result' => 0,
},
{
argv => [qw/some.pod -b -t sco-20180123/],
summary => 'Convert POD file to HTML, show result in browser using the sco template to give an idea how it will look on (now-dead) search.cpan.org',
test => 0,
'x.doc.show_result' => 0,
},
{
argv => [qw/some.pod -b -t perldoc_perl_org-20180911/],
summary => 'Convert POD file to HTML, show result in browser using the perldoc.perl.org template to give an idea how it will look on perldoc.perl.org',
test => 0,
'x.doc.show_result' => 0,
},
{
argv => [qw/-l/],
summary => 'List which templates are available',
test => 0,
'x.doc.show_result' => 0,
},
],
};
sub podtohtml {
require File::Slurper;
require File::Temp;
require Pod::Html;
my %args = @_;
if ($args{list_templates}) {
return [200, "OK", _list_templates()];
}
my $infile = $args{infile} // '-';
my $outfile = $args{outfile} // '-';
my $browser = $args{browser};
unless ($infile eq '-' or -f $infile) {
return [404, "No such file '$infile'"];
}
my $tempdir = File::Temp::tempdir();
Pod::Html::pod2html(
($infile eq '-' ? () : ("--infile=$infile")),
"--outfile=$tempdir/outfile.html",
"--cachedir=$tempdir",
);
if ($browser) {
require Browser::Open;
require HTML::Entities;
my $url = "file:$tempdir/outfile.html";
USE_TEMPLATE: {
my $tmplname = $args{template};
last unless defined $tmplname;
my $tarball_path = _get_template_tarball($tmplname);
unless ($tarball_path) {
warn "podtohtml: Cannot find template '$tmplname', use -l to list available templates\n";
last;
}
require Archive::Tar;
my $tar = Archive::Tar->new;
$tar->read($tarball_path);
local $CWD = $tempdir;
$tar->extract;
my $content = File::Slurper::read_text("outfile.html");
my ($rpod) = $content =~ m!(<ul.+)</body>!s
or die "podtohtml: Cannot extract rendered POD from output file\n";
my $tmplvars;
{
my $module;
if (defined $args{-orig_infile}) { ($module = $args{-orig_infile}) =~ s!/!::!g }
my $dist;
if (defined $module) { ($dist = $module) =~ s!::!-!g }
my $author = "AUTHOR";
$tmplvars = {
module => $module,
author => $author, # XXX some "actual" author
author_letter1 => substr($author, 0, 1),
author_letter12 => substr($author, 0, 2),
dist => $dist,
version => 1.234, # XXX actual version
release_date => "2021-12-31", # XXX today's date
module_path => "lib/Foo/Bar.pm", # XXX "actual" module path
abstract => "Some abstract", # XXX actual abstract
};
}
my $tmplcontent = File::Slurper::read_text("$tmplname/$tmplname.html");
$tmplcontent =~ s{<!--TEMPLATE:BEGIN_POD-->.+<!--TEMPLATE:END_POD-->}{$rpod}s
or die "podtohtml: Cannot insert rendered POD to template\n";
( run in 1.939 second using v1.01-cache-2.11-cpan-39bf76dae61 )