summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <smcv@debian.org>2010-03-24 00:29:10 +0000
committerSimon McVittie <smcv@debian.org>2010-03-24 00:29:10 +0000
commite67a9382f67e745af3be7d367fe7a0d36c1777e6 (patch)
treea8c244b493dbc96b13488df948f5ac90718df45a
parente74a85c671cf9fe1e445ad183d66e059beaec2f9 (diff)
Allow hooks to add sorting functions to pagespec_match_list
-rw-r--r--IkiWiki.pm6
-rw-r--r--doc/ikiwiki/pagespec/sorting.mdwn2
-rw-r--r--doc/plugins/write.mdwn15
-rwxr-xr-xt/pagespec_match_list.t6
4 files changed, 27 insertions, 2 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index 022bfe3bd..1a4dc47dd 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -2035,7 +2035,11 @@ sub pagespec_match_list ($$;@) {
if (defined $params{sort}) {
my $f;
- if ($params{sort} eq 'title') {
+
+ 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') {
diff --git a/doc/ikiwiki/pagespec/sorting.mdwn b/doc/ikiwiki/pagespec/sorting.mdwn
index 697818a2a..9007c23bf 100644
--- a/doc/ikiwiki/pagespec/sorting.mdwn
+++ b/doc/ikiwiki/pagespec/sorting.mdwn
@@ -10,4 +10,6 @@ orders can be specified.
installed. Orders by title, but numbers in the title are treated
as such, ("1 2 9 10 20" instead of "1 10 2 20 9")
+Plugins can add additional sort orders.
+
[[!meta robots="noindex, follow"]]
diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn
index 96a2aa16d..bfa6617bd 100644
--- a/doc/plugins/write.mdwn
+++ b/doc/plugins/write.mdwn
@@ -588,6 +588,21 @@ describes the plugin as a whole. For example:
This hook is used to inject C code (which it returns) into the `main`
function of the ikiwiki wrapper when it is being generated.
+### sort
+
+ hook(type => "sort", id => "foo", call => \&sort_by_foo);
+
+This hook adds an additional [[ikiwiki/pagespec/sorting]] order or overrides
+an existing one. The callback is given two page names as arguments, and
+returns negative, zero or positive if the first page should come before,
+close to (i.e. undefined order), or after the second page.
+
+For instance, the built-in `title` sort order could be reimplemented as
+
+ sub sort_by_title {
+ pagetitle(basename($_[0])) cmp pagetitle(basename($_[1]));
+ }
+
## Exported variables
Several variables are exported to your plugin when you `use IkiWiki;`
diff --git a/t/pagespec_match_list.t b/t/pagespec_match_list.t
index dd5dcc5b0..b34ee769f 100755
--- a/t/pagespec_match_list.t
+++ b/t/pagespec_match_list.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl
use warnings;
use strict;
-use Test::More tests => 88;
+use Test::More tests => 89;
BEGIN { use_ok("IkiWiki"); }
@@ -9,6 +9,8 @@ BEGIN { use_ok("IkiWiki"); }
$config{srcdir}=$config{destdir}="/dev/null";
IkiWiki::checkconfig();
+hook(type => "sort", id => "path", call => sub { $_[0] cmp $_[1] });
+
%pagesources=(
foo => "foo.mdwn",
foo2 => "foo2.mdwn",
@@ -34,6 +36,8 @@ is_deeply([pagespec_match_list("foo", "post/*", sort => "title", num => 50)],
is_deeply([pagespec_match_list("foo", "post/*", sort => "title",
filter => sub { $_[0] =~ /3/}) ],
["post/1", "post/2"]);
+is_deeply([pagespec_match_list("foo", "*", sort => "path", num => 2)],
+ ["bar", "foo"]);
my $r=eval { pagespec_match_list("foo", "beep") };
ok(eval { pagespec_match_list("foo", "beep") } == 0);
ok(! $@, "does not fail with error when unable to match anything");