lib/ES/Toc.pm (86 lines of code) (raw):

package ES::Toc; use strict; use warnings; use v5.10; use ES::Util qw(build_single); #=================================== sub new { #=================================== my ( $class, $title, $extra, $lang ) = @_; $lang ||= 'en'; bless { title => $title, extra => $extra, lang => $lang, entries => [] }, $class; } #=================================== sub add_entry { #=================================== my $self = shift; push @{ $self->{entries} }, shift(); } #=================================== sub write { #=================================== my ( $self, $raw_dir, $dir, $temp_dir, $indent ) = @_; $indent = 1 unless defined $indent; my $adoc = join "\n", "= " . $self->title, '', $self->render($indent); my $adoc_file = $temp_dir->file( 'index.asciidoc' ); $adoc_file->spew( iomode => '>:utf8', $adoc ); my $extra = $self->{extra} ? $self->{extra}->slurp( iomode => "<:encoding(UTF-8)" ) : 0; build_single( $adoc_file, $raw_dir, $dir, type => 'article', lang => $self->lang, is_toc => 1, latest => 1, # Run all of our warnings private => 1, # Don't generate edit me urls branch => '', # TOCs don't have a branch but it is a required arg relativize => 1, extra => $extra, ); $adoc_file->remove; } #=================================== sub render { #=================================== my ( $self, $indent ) = @_; my @adoc; my $prefix = $indent ? ' ' . ( '*' x $indent ) . ' ' : "[float]\n=== "; for my $entry ( $self->entries ) { if ( ref($entry) eq 'ES::Toc' ) { push @adoc, $prefix . $entry->{title}; push @adoc, '' unless $indent; push @adoc, $entry->render( $indent + 1 ); push @adoc, '' unless $indent; } else { push @adoc, $prefix . "link:$entry->{url}" . "[$entry->{title}]"; if ( $entry->{versions} ) { $adoc[-1] .= " -- link:$entry->{versions}" . "[other versions]"; } push @adoc, '' unless $indent; } } return @adoc; } #=================================== sub _toc { #=================================== my $indent = shift; my @adoc = ''; while ( my $entry = shift @_ ) { my $prefix = ' ' . ( '*' x $indent ) . ' '; if ( my $sections = $entry->{sections} ) { push @adoc, $prefix . $entry->{title}; push @adoc, _toc( $indent + 1, @$sections ); } else { my $versions = $entry->{versions} ? " link:$entry->{versions}" . "[(other versions)]" : ''; push @adoc, $prefix . "link:$entry->{url}" . "[$entry->{title}]" . $versions; } } return @adoc; } #=================================== sub title { shift->{title} } sub lang { shift->{lang} } sub entries { @{ shift->{entries} } } #=================================== 1;