[wellwell-devel] [wellwell] Add support for [decade-prev] and [decade-next] to custom paging subroutine.
Stefan Hornburg
wellwell-devel at rt.icdevgroup.org
Thu Mar 22 18:49:48 UTC 2012
commit d1acc7380133136f3e1a798ec06a6aa17f114c02
Author: Stefan Hornburg (Racke) <racke at linuxia.de>
Date: Thu Mar 22 19:48:54 2012 +0100
Add support for [decade-prev] and [decade-next] to custom paging subroutine.
code/paging.sub | 99 +++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 89 insertions(+), 10 deletions(-)
---
diff --git a/code/paging.sub b/code/paging.sub
index 85b5057..998bd29 100644
--- a/code/paging.sub
+++ b/code/paging.sub
@@ -3,9 +3,7 @@ sub {
my ($next, $prev, $page, $border, $border_selected, $opt, $r) = @_;
my ($q, $pages, $first, $curpage, $url, @links, @labels, @more, $base_url,
$prefix, $suffix, $session, $form_arg, $nav, $ml, $matches, $replace,
- $out, $link_prefix, $link_suffix);
-
- my $q;
+ $out, $link_prefix, $link_suffix, $redux, %active, %indirect);
$q = $opt->{object} || $::Instance->{SearchObject}{$opt->{label}};
return '' unless $q->{matches} > $q->{mv_matchlimit}
@@ -37,9 +35,13 @@ sub {
if ($curpage) {
$first = ($curpage - 1) * $ml;
}
- else {
+ elsif ($q->{mv_first_match}) {
$first = $q->{mv_first_match} || 1;
+ $curpage = (int($q->{mv_first_match} / 20)) + 1;
}
+ else {
+ $first = $curpage = 1;
+ }
if ($r =~ /\[more\]/) {
# check for [more] replacement
@@ -68,9 +70,31 @@ sub {
for my $anchor qw(first prev next last) {
if ($r =~ s:\[$anchor[-_]anchor\](.*?)\[/$anchor[-_]anchor\]::i) {
$anchor_labels{$anchor} = $1;
+
+ if ($anchor eq 'first') {
+ $indirect{1} = 1;
+ }
+ elsif ($anchor eq 'prev') {
+ $indirect{$curpage - 1} = 1;
+ }
+ elsif ($anchor eq 'next') {
+ $indirect{$curpage + 1} = 1;
+ }
+ elsif ($anchor eq 'last') {
+ $indirect{$pages} = 1;
+ }
}
}
+ %active = %indirect;
+
+ # extract decade(s)
+ my (%decade_labels, %decade_links);
+
+ while ($r =~ s:\[decade[-_](next|prev)\](.*?)\[/decade[-_]\1\]::i) {
+ $decade_labels{$1} = $2;
+ }
+
# link prefix / link suffix
$link_prefix = (exists $opt->{link_prefix}) ? $opt->{link_prefix} : '<li>';
$link_suffix = (exists $opt->{link_suffix}) ? $opt->{link_suffix} : '</li>';
@@ -98,7 +122,40 @@ sub {
$base_url =~ s%^/%%;
$base_url =~ s%(/\d+)?(\.html)?$%%;
+ if (keys %decade_labels && $pages > 10) {
+ # calculating pages to be displayed
+ my ($range_start, $range_end);
+
+ $start = int(($first + 1) / $ml) + 1;
+ $range_start = (int(($start - 1) / 10) * 10) + 1;
+ $range_end = $range_start + 9;
+
+ if ($range_end > $pages) {
+ $range_end = $pages;
+ }
+
+ for my $pos ($range_start .. $range_end) {
+ $active{$pos} = 1;
+ delete $indirect{$pos};
+ }
+
+ if ($range_start > 1) {
+ $nav = join(':', $session, ($range_start - 11) * $ml,
+ ($range_start - 10) * $ml - 1, $ml);
+ $decade_links{prev} = $Tag->area({href => "scan/MM=$nav", form => $form_arg});
+ }
+
+ $nav = join(':', $session, $range_end * $ml,
+ ($range_end + 1) * $ml - 1, $ml);
+ $decade_links{next} = $Tag->area({href => "scan/MM=$nav", form => $form_arg});
+
+ $redux = 1;
+ }
+
for (my $i = 1; $i <= $pages; $i++) {
+ # inside paging ranges?
+ next if $redux && ! $active{$i};
+
$start = ($i - 1) * $ml;
if ($start eq $first) {
# current page
@@ -126,6 +183,8 @@ sub {
$labels[$curpage] = $curpage;
for (my $i = 1; $i <= $pages; $i++) {
+ next if $redux && exists $indirect{$i};
+
if ($links[$i]) {
push(@more, qq{$link_prefix<a href="$links[$i]">$labels[$i]</a>$link_suffix});
}
@@ -134,25 +193,42 @@ sub {
}
}
+ if ($decade_labels{prev} && $curpage > 10) {
+ $url = $decade_links{prev};
+
+ unshift(@more, qq{$link_prefix<a href="$url">$decade_labels{prev}</a>$link_suffix});
+ }
+
unless ($curpage == 1) {
+ # previous page
$url = $links[$curpage-1];
- if ($anchor_labels{first}) {
- unshift(@more, qq{$link_prefix<a href="$url">$anchor_labels{first}</a>$link_suffix});
+ if ($anchor_labels{prev}) {
+ unshift(@more, qq{$link_prefix<a href="$url">$anchor_labels{prev}</a>$link_suffix});
}
else {
- unshift(@more, qq{$link_prefix<a href="$url">first</a>$link_suffix});
+ unshift(@more, qq{$link_prefix<a href="$url">previous <</a>$link_suffix});
}
- if ($anchor_labels{prev}) {
- unshift(@more, qq{$link_prefix<a href="$url">$anchor_labels{prev}</a>$link_suffix});
+ # first page
+ $url = $links[1];
+
+ if ($anchor_labels{first}) {
+ unshift(@more, qq{$link_prefix<a href="$url">$anchor_labels{first}</a>$link_suffix});
}
else {
- unshift(@more, qq{$link_prefix<a href="$url">previous <</a>$link_suffix});
+ unshift(@more, qq{$link_prefix<a href="$url">first</a>$link_suffix});
}
}
+ if ($decade_labels{next} && int(($curpage - 1) / 10) < int(($pages - 1) / 10)) {
+ $url = $decade_links{next};
+
+ push(@more, qq{$link_prefix<a href="$url">$decade_labels{next}</a>$link_suffix});
+ }
+
unless ($curpage == int($pages)) {
+ # next page
$url = $links[$curpage+1];
if ($anchor_labels{next}) {
@@ -162,6 +238,9 @@ sub {
push(@more, qq{$link_prefix<a href="$url">next ></a>$link_suffix});
}
+ # last page
+ $url = $links[$pages];
+
if ($anchor_labels{last}) {
push(@more, qq{$link_prefix<a href="$url">$anchor_labels{last}</a>$link_suffix});
}
More information about the wellwell-devel
mailing list