}
}
-sub sortspec_translate ($) {
+sub sortspec_translate ($$) {
my $spec = shift;
+ my $reverse = shift;
my $code = "";
my @data;
return sub { 0 };
}
+ if ($reverse) {
+ $code="-($code)";
+ }
+
no warnings;
return eval 'sub { '.$code.' }';
}
my $sub=pagespec_translate($pagespec);
error "syntax error in pagespec \"$pagespec\""
if ! defined $sub;
+ my $sort=sortspec_translate($params{sort}, $params{reverse})
+ if defined $params{sort};
my @candidates;
if (exists $params{list}) {
? grep { ! $params{filter}->($_) } keys %pagesources
: keys %pagesources;
}
-
- if (defined $params{sort}) {
- @candidates = IkiWiki::SortSpec::sort_pages($params{sort},
- @candidates);
- }
-
- @candidates=reverse(@candidates) if $params{reverse};
-
- $depends{$page}{$pagespec} |= ($params{deptype} || $DEPEND_CONTENT);
# clear params, remainder is passed to pagespec
+ $depends{$page}{$pagespec} |= ($params{deptype} || $DEPEND_CONTENT);
my $num=$params{num};
delete @params{qw{num deptype reverse sort filter list}};
+ # when only the top matches will be returned, it's efficient to
+ # sort before matching to pagespec,
+ if (defined $num && defined $sort) {
+ @candidates=IkiWiki::SortSpec::sort_pages(
+ $sort, @candidates);
+ }
+
my @matches;
my $firstfail;
my $count=0;
$depends_simple{$page}{lc $k} |= $i->{$k};
}
- return @matches;
+ # when all matches will be returned, it's efficient to
+ # sort after matching
+ if (! defined $num && defined $sort) {
+ return IkiWiki::SortSpec::sort_pages(
+ $sort, @matches);
+ }
+ else {
+ return @matches;
+ }
}
sub pagespec_valid ($) {
package IkiWiki::SortSpec;
# This is in the SortSpec namespace so that the $a and $b that sort() uses
-# $IkiWiki::SortSpec::a and $IkiWiki::SortSpec::b, so that plugins' cmp
-# functions can access them easily.
-sub sort_pages
-{
- my $f = IkiWiki::sortspec_translate(shift);
-
- return sort $f @_;
+# are easily available in this namespace, for cmp functions to use them.
+sub sort_pages {
+ my $f=shift;
+ sort $f @_
}
sub cmp_title {