]> sipb.mit.edu Git - ikiwiki.git/commitdiff
add renamepage hooks
authorJoey Hess <joey@kodama.kitenet.net>
Wed, 23 Jul 2008 22:14:20 +0000 (18:14 -0400)
committerJoey Hess <joey@kodama.kitenet.net>
Wed, 23 Jul 2008 22:14:20 +0000 (18:14 -0400)
Implemented for regular wikilinks, with a test suite.

IkiWiki/Plugin/link.pm
debian/changelog
doc/plugins/write.mdwn
t/renamepage.t [new file with mode: 0755]

index 24579057ccb159450bf5d9a49e892be848747eb6..51afaec9e7392b3ca15fe6b8c39db5d4b90d88bf 100644 (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
index cfe1688255b0b722d8f3cf945347c36326c38087..3e6fba58696121059e4ed7dd0cfdd2fdf5fc4ff9 100644 (file)
@@ -6,6 +6,8 @@ ikiwiki (2.55) UNRELEASED; urgency=low
     (Sponsored by The TOVA Company.) (This one's for you, Kyle.)
   * All rcs backends need to implement rcs_remove, rcs_commitstaged,
     and rcs_rename. (Done for svn, git).
     (Sponsored by The TOVA Company.) (This one's for you, Kyle.)
   * All rcs backends need to implement rcs_remove, rcs_commitstaged,
     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
     converted. (Simon McVittie)
   * editpage: Don't show attachments link when attachments are disabled.
   * prefix_directives enabled in doc wiki, all preprocessor directives
     converted. (Simon McVittie)
   * editpage: Don't show attachments link when attachments are disabled.
index 12bd336621fe8c94338b5a8bbcd3c4478ff45c51..3dd8bdaa16b6955893f196575ee7b82e3499ac5b 100644 (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
 they're saved, etc.
 
 the state is saved. The function can save other state, modify values before
 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
 
 To import the ikiwiki plugin interface:
 ## Plugin interface
 
 To import the ikiwiki plugin interface:
diff --git a/t/renamepage.t b/t/renamepage.t
new file mode 100755 (executable)
index 0000000..ce62bf4
--- /dev/null
@@ -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