#! /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