aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki.pm
diff options
context:
space:
mode:
authorSimon McVittie <smcv@debian.org>2010-03-24 23:51:48 +0000
committerSimon McVittie <smcv@debian.org>2010-03-24 23:51:48 +0000
commit60edd2dc3157f756f4f7a213ee15836fe7bbb769 (patch)
treeeff866087835eda7e49a6cfa14a4d6b0f402294b /IkiWiki.pm
parentb0ae19872d443860aeaab7069255e3a68a520887 (diff)
downloadikiwiki-60edd2dc3157f756f4f7a213ee15836fe7bbb769.tar
ikiwiki-60edd2dc3157f756f4f7a213ee15836fe7bbb769.tar.gz
Allow sorting to be combined and/or reversed
Diffstat (limited to 'IkiWiki.pm')
-rw-r--r--IkiWiki.pm84
1 files changed, 60 insertions, 24 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index 1a4dc47dd..ce8fdd454 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -2005,6 +2005,64 @@ sub pagespec_match ($$;@) {
return $sub->($page, @params);
}
+sub get_sort_function {
+ my $method = $_[0];
+
+ if ($method =~ m/\s/) {
+ my @methods = map { get_sort_function($_) } split(' ', $method);
+
+ return sub {
+ foreach my $method (@methods) {
+ my $answer = $method->($_[0], $_[1]);
+ return $answer if $answer;
+ }
+
+ return 0;
+ };
+ }
+
+ my $sense = 1;
+
+ if ($method =~ s/^-//) {
+ $sense = -1;
+ }
+
+ my $token = $method;
+ my $parameter = undef;
+
+ if ($method =~ m/^(\w+)\((.*)\)$/) {
+ $token = $1;
+ $parameter = $2;
+ }
+
+ if (exists $hooks{sort}{$token}{call}) {
+ my $callback = $hooks{sort}{$token}{call};
+ return sub { $sense * $callback->($_[0], $_[1], $parameter) };
+ }
+
+ if ($method eq 'title') {
+ return sub { $sense * (pagetitle(basename($_[0])) cmp pagetitle(basename($_[1]))) };
+ }
+
+ if ($method eq 'title_natural') {
+ eval q{use Sort::Naturally};
+ if ($@) {
+ error(gettext("Sort::Naturally needed for title_natural sort"));
+ }
+ return sub { $sense * Sort::Naturally::ncmp(pagetitle(basename($_[0])), pagetitle(basename($_[1]))) };
+ }
+
+ if ($method eq 'mtime') {
+ return sub { $sense * ($pagemtime{$_[1]} <=> $pagemtime{$_[0]}) };
+ }
+
+ if ($method eq 'age') {
+ return sub { $sense * ($pagectime{$_[1]} <=> $pagectime{$_[0]}) };
+ }
+
+ error sprintf(gettext("unknown sort type %s"), $method);
+}
+
sub pagespec_match_list ($$;@) {
my $page=shift;
my $pagespec=shift;
@@ -2034,31 +2092,9 @@ sub pagespec_match_list ($$;@) {
}
if (defined $params{sort}) {
- my $f;
+ my $f = get_sort_function($params{sort});
- if (exists $hooks{sort}{$params{sort}}{call}) {
- $f = sub { $hooks{sort}{$params{sort}}{call}($a, $b) };
- }
- elsif ($params{sort} eq 'title') {
- $f=sub { pagetitle(basename($a)) cmp pagetitle(basename($b)) };
- }
- elsif ($params{sort} eq 'title_natural') {
- eval q{use Sort::Naturally};
- if ($@) {
- error(gettext("Sort::Naturally needed for title_natural sort"));
- }
- $f=sub { Sort::Naturally::ncmp(pagetitle(basename($a)), pagetitle(basename($b))) };
- }
- elsif ($params{sort} eq 'mtime') {
- $f=sub { $pagemtime{$b} <=> $pagemtime{$a} };
- }
- elsif ($params{sort} eq 'age') {
- $f=sub { $pagectime{$b} <=> $pagectime{$a} };
- }
- else {
- error sprintf(gettext("unknown sort type %s"), $params{sort});
- }
- @candidates = sort { &$f } @candidates;
+ @candidates = sort { $f->($a, $b) } @candidates;
}
@candidates=reverse(@candidates) if $params{reverse};