The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package Perldoc::Server::Controller::Index;

use strict;
use warnings;
use parent 'Catalyst::Controller';

=head1 NAME

Perldoc::Server::Controller::Index - Catalyst Controller

=head1 DESCRIPTION

Catalyst Controller.

=head1 METHODS

=cut


=head2 index

=cut

sub index :Path :Args(1) {
  my ($self, $c, $section) = @_;

  if ($c->model('Section')->exists($section)) {
    my @pages = map {
      {
        name  => $_,
        title => $c->model('Pod')->title($_),
        link  => $c->uri_for('/view',split(/::/,$_)),
      }
    } $c->model('Section')->pages($section);
    
    $c->stash->{pages}         = \@pages;
    $c->stash->{title}         = $c->model('Section')->name($section);
    $c->stash->{page_template} = 'section_index.tt';
  }
}


sub modules :Local :Args(0) {
  my ($self, $c) = @_;
    
  $c->response->redirect( $c->uri_for('/index/modules','A') );
}


sub functions :Local :Args(0) {
  my ($self, $c) = @_;
  
  my @function_az;
  foreach my $letter ('A'..'Z') {
    my ($link,@functions);
    if (my @function_list = grep {/^[^a-z]*$letter/i} sort ($c->model('PerlFunc')->list)) {
      $link = "#$letter";
      foreach my $function (@function_list) {
        (my $url = $function) =~ s/[^\w-].*//i;
        my $description = $c->model('PerlFunc')->description($function);
        push @functions,{name=>$function, url=>$url, description=>$description};
      }
    } 
    push @function_az, {letter=>$letter, link=>$link, functions=>\@functions};
  }
  
  $c->stash->{title}         = 'Perl functions A-Z';
  $c->stash->{function_az}   = \@function_az;
  $c->stash->{page_template} = 'function_index.tt';
}


sub functions_by_category :Local :Args(0) {
  my ($self, $c) = @_;

  my @function_cat;  
  foreach my $category ($c->model('PerlFunc')->category_list) {
    $c->log->debug($category);
    my $name = $c->model('PerlFunc')->category_description($category);
    (my $link = $name) =~ tr/ /-/;
    my @functions;
    foreach my $function (sort ($c->model('PerlFunc')->category_functions($category))) {
      (my $url = $function) =~ s/[^\w-].*//i;
      my $description = $c->model('PerlFunc')->description($function);
      push @functions,{name=>$function, url=>$url, description=>$description};
    }
    push @function_cat,{name=>$name, link=>$link, functions=>\@functions};
  }

  $c->stash->{title}         = 'Perl functions by category';
  $c->stash->{function_cat}  = \@function_cat;
  $c->stash->{page_template} = 'function_bycat.tt';
}


sub pragmas :Local :Args(0) {
  my ($self, $c) = @_;

  my %pages = map {$_=>1} grep {
    /^[a-z]/
  } $c->model('Index')->find_modules;

  foreach my $section ($c->model('Section')->list) {
    delete $pages{$_} foreach $c->model('Section')->pages($section);
  }
  
  delete $pages{$_} foreach qw/
    perllocal perltoc perlcn perljp perlko perltw lwpcook lwptut pp
    inc::Module::Install perl5db
  /;

  my @pages = map {
    {
      name  => $_,
      title => $c->model('Pod')->title($_),
      link  => $c->uri_for('/view',split(/::/,$_)),
    }
  } keys %pages;

  $c->stash->{pages}         = [ sort {$a->{name} cmp $b->{name}} @pages ];
  $c->stash->{title}         = 'Pragmas';
  $c->stash->{page_template} = 'section_index.tt';
}

=head1 AUTHOR

Jon Allen

=head1 LICENSE

This library is free software, you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut

1;