summaryrefslogtreecommitdiff
path: root/IkiWiki
diff options
context:
space:
mode:
authorSimon McVittie <smcv@ http://smcv.pseudorandom.co.uk/>2009-01-31 14:36:23 +0000
committerSimon McVittie <smcv@ http://smcv.pseudorandom.co.uk/>2009-01-31 14:36:23 +0000
commitc2dafcb4e5e8c9f654c0ad5719607366cf84b75a (patch)
tree1a0d3aea683b05079274bff130e6005eac0aa4d4 /IkiWiki
parent013a5e4ca74108bf9206be25d3ffdad985ce266f (diff)
CGI: add cgi_goto(CGI, [page])
This redirects to the given page (or if none is given, the page parameter given to the CGI), or displays an error with a create link if the page doesn't exist.
Diffstat (limited to 'IkiWiki')
-rw-r--r--IkiWiki/CGI.pm41
1 files changed, 41 insertions, 0 deletions
diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm
index 3fadc462e..a6b485edb 100644
--- a/IkiWiki/CGI.pm
+++ b/IkiWiki/CGI.pm
@@ -291,6 +291,47 @@ sub cgi_savesession ($) {
umask($oldmask);
}
+# 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 = decode_utf8($q->param("page"));
+
+ if (!defined $page) {
+ error("missing page parameter");
+ }
+ }
+
+ loadindex();
+
+ # If the page is internal (like a comment), see if it has a
+ # permalink. Comments do.
+ if (isinternal($page) &&
+ defined $pagestate{$page}{meta}{permalink}) {
+ redirect($q, $pagestate{$page}{meta}{permalink});
+ }
+
+ my $link = bestlink("", $page);
+
+ if (! length $link) {
+ print "Content-type: text/html\n\n";
+ print misctemplate(gettext("missing page"),
+ "<p>".
+ sprintf(gettext("The page %s does not exist."),
+ htmllink("", "", $page)).
+ "</p>");
+ }
+ else {
+ redirect($q, urlto($link, undef, 1));
+ }
+
+ exit;
+}
+
sub cgi (;$$) {
my $q=shift;
my $session=shift;