2009-02-01 00:01:10 +01:00
|
|
|
#!/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");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-06-06 08:36:40 +02:00
|
|
|
# It's possible that $page is not a valid page name;
|
|
|
|
# if so attempt to turn it into one.
|
|
|
|
if ($page !~ /$config{wiki_file_regexp}/) {
|
|
|
|
$page=titlepage($page);
|
|
|
|
}
|
|
|
|
|
2009-02-01 00:01:10 +01:00
|
|
|
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}) {
|
2009-02-18 01:37:36 +01:00
|
|
|
IkiWiki::redirect($q, $pagestate{$page}{meta}{permalink});
|
2009-02-01 00:01:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
my $link = bestlink("", $page);
|
|
|
|
|
|
|
|
if (! length $link) {
|
2009-02-01 01:02:50 +01:00
|
|
|
IkiWiki::cgi_custom_failure(
|
2009-12-15 00:16:47 +01:00
|
|
|
$q,
|
|
|
|
"404 Not Found",
|
2009-02-01 01:02:50 +01:00
|
|
|
IkiWiki::misctemplate(gettext("missing page"),
|
|
|
|
"<p>".
|
|
|
|
sprintf(gettext("The page %s does not exist."),
|
|
|
|
htmllink("", "", $page)).
|
|
|
|
"</p>")
|
|
|
|
)
|
2009-02-01 00:01:10 +01:00
|
|
|
}
|
|
|
|
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' ||
|
2009-02-27 19:21:29 +01:00
|
|
|
$do eq 'recentchanges_link')) {
|
2009-02-01 00:01:10 +01:00
|
|
|
# goto is the preferred name for this; recentchanges_link and
|
|
|
|
# commenter are for compatibility with any saved URLs
|
|
|
|
cgi_goto($cgi);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|