Split cgi_goto into a goto plugin
authorSimon McVittie <smcv@ http://smcv.pseudorandom.co.uk/>
Sat, 31 Jan 2009 23:01:10 +0000 (23:01 +0000)
committerSimon McVittie <smcv@ http://smcv.pseudorandom.co.uk/>
Sat, 31 Jan 2009 23:01:10 +0000 (23:01 +0000)
IkiWiki/CGI.pm
IkiWiki/Plugin/apache404.pm
IkiWiki/Plugin/comments.pm
IkiWiki/Plugin/goto.pm [new file with mode: 0644]
IkiWiki/Plugin/recentchanges.pm
doc/plugins/goto.mdwn [new file with mode: 0644]

index e75ebcd27652fb6a2a1c6317afd6b9ab99332930..c91914564fb2d05817c8b7ceb5f1674c0552de60 100644 (file)
@@ -294,50 +294,6 @@ sub cgi_savesession ($) {
        umask($oldmask);
 }
 
-# cgi_goto(CGI, [page])
-# Redirect to a specified page, or display "not found". If not specified,
-# the page param from the CGI object is used.
-sub cgi_goto ($;$) {
-       my $q = shift;
-       my $page = shift;
-
-       if (!defined $page) {
-               $page = decode_utf8($q->param("page"));
-
-               if (!defined $page) {
-                       error("missing page parameter");
-               }
-       }
-
-       loadindex();
-
-       # If the page is internal (like a comment), see if it has a
-       # permalink. Comments do.
-       if (isinternal($page) &&
-           defined $pagestate{$page}{meta}{permalink}) {
-               redirect($q, $pagestate{$page}{meta}{permalink});
-       }
-
-       my $link = bestlink("", $page);
-
-       if (! length $link) {
-               print $q->header(-status => "404 Not Found");
-               print misctemplate(gettext("missing page"),
-                       "<p>".
-                       sprintf(gettext("The page %s does not exist."),
-                               htmllink("", "", $page)).
-                       "</p>".
-                       # Internet Explorer won't show custom 404 responses
-                       # unless they're >= 512 bytes
-                       (" " x 512));
-       }
-       else {
-               redirect($q, urlto($link, undef, 1));
-       }
-
-       exit;
-}
-
 sub cgi (;$$) {
        my $q=shift;
        my $session=shift;
@@ -365,13 +321,6 @@ sub cgi (;$$) {
                }
        }
 
-       # goto is the preferred name for this; recentchanges_link and
-       # commenter are for compatibility with any saved URLs
-       if ($do eq 'goto' || $do eq 'recentchanges_link' ||
-           $do eq 'commenter') {
-               cgi_goto($q);
-       }
-
        # Need to lock the wiki before getting a session.
        lockwiki();
        loadindex();
index 3ac6b3af507a17c0612fe9619b1a5ae4c0c00124..e7ce70435490063b2d429f21692cac3dd5e40780 100644 (file)
@@ -10,6 +10,7 @@ use IkiWiki 3.00;
 
 sub import {
        hook(type => "cgi", id => 'apache404',  call => \&cgi);
+       IkiWiki::loadplugin("goto");
 }
 
 sub getsetup () {
@@ -69,7 +70,7 @@ sub cgi ($) {
        if ($ENV{REDIRECT_STATUS} eq '404') {
                my $page = cgi_page_from_404($ENV{REDIRECT_URL},
                        $config{url}, $config{usedirs});
-               IkiWiki::cgi_goto($cgi, $page);
+               IkiWiki::Plugin::goto::cgi_goto($cgi, $page);
        }
 }
 
index 995d1f4eb6a1252db56914bc6083af07edd390b8..3cdffe856132160df72045d275d6de6d7666631c 100644 (file)
@@ -26,6 +26,8 @@ sub import {
        hook(type => "htmlize", id => "_comment", call => \&htmlize);
        hook(type => "pagetemplate", id => "comments", call => \&pagetemplate);
        hook(type => "formbuilder_setup", id => "comments", call => \&formbuilder_setup);
+       # Load goto to fix up user page links for logged-in commenters
+       IkiWiki::loadplugin("goto");
        IkiWiki::loadplugin("inline");
 }
 
diff --git a/IkiWiki/Plugin/goto.pm b/IkiWiki/Plugin/goto.pm
new file mode 100644 (file)
index 0000000..9e7a262
--- /dev/null
@@ -0,0 +1,76 @@
+#!/usr/bin/perl
+package IkiWiki::Plugin::goto;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+       hook(type => "cgi", id => 'goto',  call => \&cgi);
+}
+
+sub getsetup () {
+       return
+               plugin => {
+                       safe => 1,
+                       rebuild => 0,
+               }
+}
+
+# cgi_goto(CGI, [page])
+# Redirect to a specified page, or display "not found". If not specified,
+# the page param from the CGI object is used.
+sub cgi_goto ($;$) {
+       my $q = shift;
+       my $page = shift;
+
+       if (!defined $page) {
+               $page = IkiWiki::decode_utf8($q->param("page"));
+
+               if (!defined $page) {
+                       error("missing page parameter");
+               }
+       }
+
+       IkiWiki::loadindex();
+
+       # If the page is internal (like a comment), see if it has a
+       # permalink. Comments do.
+       if (IkiWiki::isinternal($page) &&
+           defined $pagestate{$page}{meta}{permalink}) {
+               redirect($q, $pagestate{$page}{meta}{permalink});
+       }
+
+       my $link = bestlink("", $page);
+
+       if (! length $link) {
+               print $q->header(-status => "404 Not Found");
+               print IkiWiki::misctemplate(gettext("missing page"),
+                       "<p>".
+                       sprintf(gettext("The page %s does not exist."),
+                               htmllink("", "", $page)).
+                       "</p>".
+                       # Internet Explorer won't show custom 404 responses
+                       # unless they're >= 512 bytes
+                       (" " x 512));
+       }
+       else {
+               IkiWiki::redirect($q, urlto($link, undef, 1));
+       }
+
+       exit;
+}
+
+sub cgi ($) {
+       my $cgi=shift;
+       my $do = $cgi->param('do');
+
+       if (defined $do && ($do eq 'goto' || $do eq 'commenter' ||
+                              $do eq 'recentchanged_link')) {
+               # goto is the preferred name for this; recentchanges_link and
+               # commenter are for compatibility with any saved URLs
+               cgi_goto($cgi);
+       }
+}
+
+1;
index 56e80e7b815954e8a42c32bc284a03a62e94e327..329dd6f3255f278a81322a87a7d2c2ca6ebec2e8 100644 (file)
@@ -13,6 +13,8 @@ sub import {
        hook(type => "refresh", id => "recentchanges", call => \&refresh);
        hook(type => "pagetemplate", id => "recentchanges", call => \&pagetemplate);
        hook(type => "htmlize", id => "_change", call => \&htmlize);
+       # Load goto to fix up links from recentchanges
+       IkiWiki::loadplugin("goto");
 }
 
 sub getsetup () {
diff --git a/doc/plugins/goto.mdwn b/doc/plugins/goto.mdwn
new file mode 100644 (file)
index 0000000..21dda16
--- /dev/null
@@ -0,0 +1,10 @@
+[[!template id=plugin name=goto author="[[Simon_McVittie|smcv]]"]]
+[[!tag type/useful]]
+
+This plugin adds a `do=goto` mode for the IkiWiki CGI script. It's mainly
+for internal use by the [[apache404]], [[comments]] and [[recentchanges]]
+plugins, which enable it automatically.
+
+With this plugin enabled you can link to `ikiwiki.cgi?do=goto&page=some/where`
+to make a link that will redirect to the page `/some/where` if it exists, or
+offer a link to create it if it doesn't.