summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IkiWiki.pm27
-rw-r--r--doc/plugins/write.mdwn11
2 files changed, 30 insertions, 8 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index e75175a8d..f2b50e77a 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -807,6 +807,7 @@ sub will_render ($$;$) { #{{{
sub bestlink ($$) { #{{{
my $page=shift;
my $link=shift;
+ my $res=undef;
my $cwd=$page;
if ($link=~s/^\/+//) {
@@ -821,25 +822,35 @@ sub bestlink ($$) { #{{{
$l.=$link;
if (exists $links{$l}) {
- return $l;
+ $res=$l;
}
elsif (exists $pagecase{lc $l}) {
- return $pagecase{lc $l};
+ $res=$pagecase{lc $l};
}
- } while $cwd=~s{/?[^/]+$}{};
+ } while ($cwd=~s{/?[^/]+$}{} && ! defined $res);
- if (length $config{userdir}) {
+ if (! defined $res && length $config{userdir}) {
my $l = "$config{userdir}/".lc($link);
if (exists $links{$l}) {
- return $l;
+ $res=$l;
}
elsif (exists $pagecase{lc $l}) {
- return $pagecase{lc $l};
+ $res=$pagecase{lc $l};
}
}
- #print STDERR "warning: page $page, broken link: $link\n";
- return "";
+ if (defined $res) {
+ run_hooks(tweakbestlink => sub {
+ $res=shift->(
+ page => $page,
+ link => $res);
+ });
+ return $res;
+ }
+ else {
+ #print STDERR "warning: page $page, broken link: $link\n";
+ return "";
+ }
} #}}}
sub isinlinableimage ($) { #{{{
diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn
index 15f6c8a20..e7656b299 100644
--- a/doc/plugins/write.mdwn
+++ b/doc/plugins/write.mdwn
@@ -447,6 +447,17 @@ ikiwiki; it is run just after ikiwiki has removed the trailing
It should return the modified url.
+### tweakbestlink
+
+ hook(type => "tweakbestlink", id => "foo", call => \&tweakbestlink);
+
+This hook can be used to modify the page returned by `bestlink`. It is
+passed named parameters `page` and `link`. These are, respectively,
+the page where the link will appear and the link ikiwiki would choose
+as the best one, if no `tweakbestlink` hook was in effect.
+
+It should return the modified link.
+
## Plugin interface
To import the ikiwiki plugin interface: