#!/usr/bin/env perl use v5.30.0; use strict; use warnings; use Data::Dumper; use Path::Tiny qw/path/; use Mojo::Template; use Mojo::DOM; use File::pushd; my $current_dir = path(__FILE__)->parent->parent->child('lib'); $current_dir->visit( sub { my ( $path, $state ) = @_; if ( -f $path ) { return if $path !~ /\.pm$/; system mkdir => '-pv', 'doc/' . $path->parent; system pod2html => $path, '-o', 'doc/' . $path . '.html', '--recurse'; } }, { recurse => 1 } ); my $documentation_path = path(__FILE__)->parent->parent->child('doc'); my %modules; $documentation_path->visit( sub { my ( $path, $state ) = @_; if ( !-f $path ) { return; } if ( $path !~ /\.pm\.html$/ ) { return; } $modules{ $path =~ s{^.*/lib/}{}r =~ s/\.pm\.html$//r =~ s{/}{::}gr } = $path }, { recurse => 1 }, ); $documentation_path->visit( sub { my ( $path, $state ) = @_; if ( !-f $path ) { return; } if ( $path !~ /\.pm\.html$/ ) { return; } my $html = Mojo::DOM->new($path->slurp_utf8); for my $a ($html->find('a')->each) { next if $a->{href}; if (exists $modules{$a->text}) { $a->{href} = relativize_path($path, $modules{$a->text}); next; } $a->{href} = "https://metacpan.org/pod/@{[$a->text]}"; } $path->spew_utf8(''.$html); }, { recurse => 1 }, ); my $mojo_template = Mojo::Template->new; my $html = $mojo_template->render(<<'EOF', \%modules); % my ($modules) = @_; % use Path::Tiny;

Welcome to the Peace documentation

EOF $documentation_path->child('index.html')->spew_utf8($html); sub relativize_path { my $current_path = $_[0]; my $foreign_path = $_[1]; return $foreign_path->relative($current_path->parent); }