RSS Git Download  Clone
Raw Blame History
package Local::Paginator;

# adapted from Template::Plugin::Bootstrap::Pagination
use strict;
use warnings;

use Template;
use Data::Page;
use Data::Printer alias => 'ddp';

use base qw(Exporter);
our @EXPORT_OK = qw(paginate);

my $pagination_template_string = <<"EOTEMPLATE";
[%- USE Bootstrap.Pagination -%]
[%- Bootstrap.Pagination.pagination(pager = pager, uri = uri, siblings = sibs,
    version = 3) -%]
EOTEMPLATE

my $pager_template_string = <<"EOTEMPLATE";
[%- USE Bootstrap.Pagination -%]
[%- Bootstrap.Pagination.pager(pager = pager, uri = uri, version = 3) -%]
EOTEMPLATE

sub paginate {
    my $args = shift; # p $args; # uri, total_entries, entries_per_page, current_page, sibs

    my $pager = Data::Page->new();
    $pager->$_($args->{$_}) for qw(total_entries entries_per_page current_page);

    my $uri = $args->{uri} . '__PAGE__'; # placeholder replaced inline
    my $sibs = $args->{sibs} || 5;
    my $template = Template->new(STRICT => 1);

    my %html = ();
    {
        my $output;
        $template->process(\$pagination_template_string, {
            pager => $pager,
            sibs  => $sibs,
            uri   => $uri,
        }, \$output) or die $template->error();
        $html{pagination} = $output;
    }
    {
        my $output;
        $template->process(\$pager_template_string, {
            pager => $pager,
            uri   => $uri,
        }, \$output) or die $template->error();
        $html{pager} = $output;
    } # ddp %html;
    # add formatted html to args:
    $args->{html} = \%html;
    return $args;
}

1;