Split cgi_goto into a goto plugin
parent
46b880f839
commit
c886bea320
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
|
@ -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 () {
|
||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue