ikiwiki/IkiWiki/Plugin/goto.pm

86 lines
1.7 KiB
Perl
Raw Normal View History

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);
2010-07-14 20:44:40 +02:00
hook(type => "getsetup", id => 'goto', call => \&getsetup);
2009-02-01 00:01:10 +01:00
}
sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 0,
2010-02-12 10:22:15 +01:00
section => "web",
2009-02-01 00:01:10 +01:00
}
}
# 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(scalar $q->param("page"));
2009-02-01 00:01:10 +01:00
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);
}
2009-02-01 00:01:10 +01:00
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});
2009-02-01 00:01:10 +01:00
}
2010-10-26 05:31:41 +02:00
if (! defined $link || ! length $link) {
2009-02-01 01:02:50 +01:00
IkiWiki::cgi_custom_failure(
$q,
"404 Not Found",
2011-01-05 22:15:38 +01:00
IkiWiki::cgitemplate($q, gettext("missing page"),
2009-02-01 01:02:50 +01:00
"<p>".
sprintf(gettext("The page %s does not exist."),
htmllink("", "", $page)).
"</p>")
)
2009-02-01 00:01:10 +01:00
}
else {
2010-11-29 20:07:26 +01:00
IkiWiki::redirect($q, urlto($link));
2009-02-01 00:01:10 +01:00
}
exit;
}
sub cgi ($) {
my $cgi=shift;
my $do = $cgi->param('do');
if (defined $do && ($do eq 'goto' || $do eq 'commenter' ||
$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;