Split cgi_goto into a goto plugin

master
Simon McVittie 2009-01-31 23:01:10 +00:00
parent 46b880f839
commit c886bea320
6 changed files with 92 additions and 52 deletions

View 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();

View 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);
}
}

View 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");
}

View File

@ -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;

View 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 () {

View File

@ -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.