#! /usr/bin/perl use warnings; use strict; my $itemsPerPage = 10; # some tests &FormatPages( 199, $_, $itemsPerPage ) for 0..20; &FormatPages( 1 , $_, $itemsPerPage ) for 0..3; &FormatPages( 211, $_, $itemsPerPage ) for 21..23; &FormatPages( 218, $_, $itemsPerPage ) for (1,2,4,6,9,14,19,20,22); &FormatPages( 0 , 0 , $itemsPerPage ); &FormatPages( 130, 20, $itemsPerPage ); &FormatPages( 81, $_, $itemsPerPage ) for (3..8); sub FormatPages { my( $max, $act, $itemsPerPage ) = @_; my $min = 1; $max = int( 0.99 + $max / $itemsPerPage ); $act = 1 unless $act; print "IN: Max: $max, Act: $act, Min: $min, ItemsPerPage: $itemsPerPage\n"; # pick pages to link my @pages = map { { text => $_, link => 1 } } grep { $_ >= $min && $_ <= $max } $act-2 .. $act+2; # may add first page if( defined $pages[0]->{text} and $pages[0]->{text} > $min ) { if( $pages[0]->{text} > $min+2 ) { unshift( @pages, { text => $min, link => 1 }, { text => '...', link => 0 }, ); } # if else { unshift( @pages, { text => $_, link => 1 } ) for reverse $min .. $pages[0]->{text}-1; } # else } # if # may add last page if( defined $pages[0]->{text} and $pages[-1]->{text} < $max ) { if( $pages[-1]->{text} < $max-2 ) { push( @pages, { text => '...', link => 0 }, { text => $max, link => 1 }, ); } # if else { push( @pages, { text => $_, link => 1 } ) for $pages[-1]->{text}+1 .. $max; } # else } # if @pages = () if scalar @pages < 2; # debug output print "Output: ", join( ' ', map { $_->{link} ? "L<$_->{text}>" : "'$_->{text}'" } @pages ), "\n\n"; # return \@pages; } # FormatPages