Skip to content

Instantly share code, notes, and snippets.

@iliajie
Last active March 21, 2019 20:04
Show Gist options
  • Save iliajie/730891413e0a8a3f37fe79850bf716fe to your computer and use it in GitHub Desktop.
Save iliajie/730891413e0a8a3f37fe79850bf716fe to your computer and use it in GitHub Desktop.
Perl pagination generator for Bootstrap
Perl implementation with generating Bootstrap pagination like output.
@iliajie
Copy link
Author

iliajie commented Mar 21, 2019

Output example:
image

sub pagination
{

    my ($page, $pages) = @_;

    my $left  = $page - 2;
    my $right = $page + 3;
    my @range;
    my $last;
    my $pagination;

    my $start = sub {
        my $start;
        my $disabled = ($page == 1 ? " disabled" : undef);

        $start = '<div class="dataTables_paginate paging_simple_numbers spaginates">';
        $start .= '<ul class="pagination">';
        $start .= "<li class='paginate_button previous$disabled'>";
        $start .= '<a href="#"><i class="fa fa-fw fa-angle-left"></i></a>';
        $start .= "</li>";
        return $start;
    };

    my $current = sub {
        my ($i) = @_;
        my $end;
        my $active = ($page eq $i ? " active" : undef);
        $end = "<li class='paginate_button$active'>";
        $end .= "<a class='spaginated' href='list.cgi?page=$i'>$i</a>";
        $end .= "</li>";
        return $end;
    };

    my $range = sub {
        my $range;
        $range = '<li class="paginate_button disabled">';
        $range .= '<a href="#">…</a>';
        $range .= "</li>";

    };

    my $end = sub {
        my $end;
        my $disabled = ($page == $pages ? " disabled" : undef);
        $end = "<li class='paginate_button next$disabled'>";
        $end .= '<a href="#"><i class="fa fa-fw fa-angle-right"></i></a>';
        $end .= "</li>";
        $end .= '</ul>';
        $end .= '</div>';
        return $end;
    };

    for (my $i = 1; $i <= $pages; $i++) {
        if ($i == 1 || $i == $pages || $i >= $left && $i < $right) {
            push(@range, $i);
        }
    }

    foreach my $i (@range) {
        if ($last) {
            if ($i - $last == 2) {
                $pagination .= &$current($last + 1);
            } elsif ($i - $last != 1) {
                $pagination .= &$range();
            }
        }
        $pagination .= &$current($i);
        $last = $i;
    }

    $pagination = &$start() . $pagination . &$end();
    return $pagination;
}

my $page = 10;
my $pages = 100;
my $pagination = pagination($page, $pages);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment