86 lines
1.7 KiB
Perl
86 lines
1.7 KiB
Perl
#!/usr/bin/perl
|
|
package IkiWiki::Plugin::goto;
|
|
|
|
use warnings;
|
|
use strict;
|
|
use IkiWiki 3.00;
|
|
|
|
sub import {
|
|
hook(type => "cgi", id => 'goto', call => \&cgi);
|
|
hook(type => "getsetup", id => 'goto', call => \&getsetup);
|
|
}
|
|
|
|
sub getsetup () {
|
|
return
|
|
plugin => {
|
|
safe => 1,
|
|
rebuild => 0,
|
|
section => "web",
|
|
}
|
|
}
|
|
|
|
# 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");
|
|
}
|
|
}
|
|
|
|
# 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);
|
|
}
|
|
|
|
IkiWiki::loadindex();
|
|
|
|
my $link;
|
|
if (! IkiWiki::isinternal($page)) {
|
|
$link = bestlink("", $page);
|
|
}
|
|
elsif (defined $pagestate{$page}{meta}{permalink}) {
|
|
# Can only redirect to an internal page if it has a
|
|
# permalink.
|
|
IkiWiki::redirect($q, $pagestate{$page}{meta}{permalink});
|
|
}
|
|
|
|
if (! defined $link || ! length $link) {
|
|
IkiWiki::cgi_custom_failure(
|
|
$q,
|
|
"404 Not Found",
|
|
IkiWiki::misctemplate(gettext("missing page"),
|
|
"<p>".
|
|
sprintf(gettext("The page %s does not exist."),
|
|
htmllink("", "", $page)).
|
|
"</p>")
|
|
)
|
|
}
|
|
else {
|
|
IkiWiki::redirect($q, urlto($link));
|
|
}
|
|
|
|
exit;
|
|
}
|
|
|
|
sub cgi ($) {
|
|
my $cgi=shift;
|
|
my $do = $cgi->param('do');
|
|
|
|
if (defined $do && ($do eq 'goto' || $do eq 'commenter' ||
|
|
$do eq 'recentchanges_link')) {
|
|
# goto is the preferred name for this; recentchanges_link and
|
|
# commenter are for compatibility with any saved URLs
|
|
cgi_goto($cgi);
|
|
}
|
|
}
|
|
|
|
1;
|