add renamepage hooks

Implemented for regular wikilinks, with a test suite.
master
Joey Hess 2008-07-23 18:14:20 -04:00
parent 96dab37a8e
commit 4691a2ad39
4 changed files with 77 additions and 0 deletions

View File

@ -80,4 +80,28 @@ sub scan (@) { #{{{
} }
} # }}} } # }}}
sub renamepage (@) { #{{{
my %params=@_;
my $page=$params{page};
my $old=$params{oldpage};
my $new=$params{newpage};
$params{content} =~ s{(?<!\\)$link_regexp}{
my $link=$2;
if (bestlink($page, $2) eq $old) {
if (index($2, "/") == 0) {
$link="/$new";
}
else {
$link=$new;
}
}
defined $1
? ( "[[$1|$link".($3 ? "#$3" : "")."]]" )
: ( "[[$link". ($3 ? "#$3" : "")."]]" )
}eg;
return $params{content};
} #}}}
1 1

2
debian/changelog vendored
View File

@ -6,6 +6,8 @@ ikiwiki (2.55) UNRELEASED; urgency=low
(Sponsored by The TOVA Company.) (This one's for you, Kyle.) (Sponsored by The TOVA Company.) (This one's for you, Kyle.)
* All rcs backends need to implement rcs_remove, rcs_commitstaged, * All rcs backends need to implement rcs_remove, rcs_commitstaged,
and rcs_rename. (Done for svn, git). and rcs_rename. (Done for svn, git).
* This version adds renamepage hooks, which can be used to modify page content,
including links, during renames.
* prefix_directives enabled in doc wiki, all preprocessor directives * prefix_directives enabled in doc wiki, all preprocessor directives
converted. (Simon McVittie) converted. (Simon McVittie)
* editpage: Don't show attachments link when attachments are disabled. * editpage: Don't show attachments link when attachments are disabled.

View File

@ -348,6 +348,15 @@ This hook is called whenever ikiwiki normally saves its state, just before
the state is saved. The function can save other state, modify values before the state is saved. The function can save other state, modify values before
they're saved, etc. they're saved, etc.
## renamepage
hook(type => "renamepage", id => "foo", call => \&renamepage);
This hook is called by the [[plugins/rename]] plugin when it renames
something. The hook is passed named parameters: `page`, `oldpage`,
`newpage`, and `content`, and should try to modify the content to reflect
the name change. For example, by converting links to point to the new page.
## Plugin interface ## Plugin interface
To import the ikiwiki plugin interface: To import the ikiwiki plugin interface:

42
t/renamepage.t 100755
View File

@ -0,0 +1,42 @@
#!/usr/bin/perl
use warnings;
use strict;
use Test::More tests => 11;
use Encode;
BEGIN { use_ok("IkiWiki"); }
BEGIN { use_ok("IkiWiki::Plugin::link"); }
%config=IkiWiki::defaultconfig();
$config{srcdir}=$config{destdir}="/dev/null";
IkiWiki::checkconfig();
# tests of the link plugin's renamepage function
sub try {
my ($page, $oldpage, $newpage, $content)=@_;
%IkiWiki::pagecase=();
%links=();
$IkiWiki::config{userdir}="foouserdir";
foreach my $page ($page, $oldpage, $newpage) {
$IkiWiki::pagecase{lc $page}=$page;
$links{$page}=[];
}
IkiWiki::Plugin::link::renamepage(
page => $page,
oldpage => $oldpage,
newpage => $newpage,
content => $content,
);
}
is(try("z", "foo" => "bar", "[[xxx]]"), "[[xxx]]"); # unrelated link
is(try("z", "foo" => "bar", "[[bar]]"), "[[bar]]"); # link already to new page
is(try("z", "foo" => "bar", "[[foo]]"), "[[bar]]"); # basic conversion to new page name
is(try("z", "foo" => "bar", "[[/foo]]"), "[[/bar]]"); # absolute link
is(try("z", "foo" => "bar", "[[foo]] [[xxx]]"), "[[bar]] [[xxx]]"); # 2 links, 1 converted
is(try("z", "foo" => "bar", "[[xxx|foo]]"), "[[xxx|bar]]"); # conversion w/text
is(try("z", "foo" => "bar", "[[foo#anchor]]"), "[[bar#anchor]]"); # with anchor
is(try("z", "foo" => "bar", "[[xxx|foo#anchor]]"), "[[xxx|bar#anchor]]"); # with anchor
is(try("z", "foo" => "bar", "[[!moo ]]"), "[[!moo ]]"); # preprocessor directive unchanged
is(try("bugs", "bugs/foo" => "wishlist/bar", "[[foo]]"), "[[wishlist/bar]]"); # subpage link