aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/goto.pm
blob: 42d2425ca2a0dbe85b172fee06eb63ec50b07d00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/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 (! 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, undef, 1));
	}

	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;