clear sandbox/test commit
[ikiwiki.git] / IkiWiki / Plugin / goto.pm
blob6b596ac8b6af95641dec071071e5be38b3898f87
1 #!/usr/bin/perl
2 package IkiWiki::Plugin::goto;
4 use warnings;
5 use strict;
6 use IkiWiki 3.00;
8 sub import {
9 hook(type => "cgi", id => 'goto', call => \&cgi);
10 hook(type => "getsetup", id => 'goto', call => \&getsetup);
13 sub getsetup () {
14 return
15 plugin => {
16 safe => 1,
17 rebuild => 0,
18 section => "web",
22 # cgi_goto(CGI, [page])
23 # Redirect to a specified page, or display "not found". If not specified,
24 # the page param from the CGI object is used.
25 sub cgi_goto ($;$) {
26 my $q = shift;
27 my $page = shift;
29 if (!defined $page) {
30 $page = IkiWiki::decode_utf8($q->param("page"));
32 if (!defined $page) {
33 error("missing page parameter");
37 # It's possible that $page is not a valid page name;
38 # if so attempt to turn it into one.
39 if ($page !~ /$config{wiki_file_regexp}/) {
40 $page=titlepage($page);
43 IkiWiki::loadindex();
45 my $link;
46 if (! IkiWiki::isinternal($page)) {
47 $link = bestlink("", $page);
49 elsif (defined $pagestate{$page}{meta}{permalink}) {
50 # Can only redirect to an internal page if it has a
51 # permalink.
52 IkiWiki::redirect($q, $pagestate{$page}{meta}{permalink});
55 if (! defined $link || ! length $link) {
56 IkiWiki::cgi_custom_failure(
57 $q,
58 "404 Not Found",
59 IkiWiki::cgitemplate($q, gettext("missing page"),
60 "<p>".
61 sprintf(gettext("The page %s does not exist."),
62 htmllink("", "", $page)).
63 "</p>")
66 else {
67 IkiWiki::redirect($q, urlto($link));
70 exit;
73 sub cgi ($) {
74 my $cgi=shift;
75 my $do = $cgi->param('do');
77 if (defined $do && ($do eq 'goto' || $do eq 'commenter' ||
78 $do eq 'recentchanges_link')) {
79 # goto is the preferred name for this; recentchanges_link and
80 # commenter are for compatibility with any saved URLs
81 cgi_goto($cgi);