diff options
author | Simon McVittie <smcv@ http://smcv.pseudorandom.co.uk/> | 2009-01-31 14:36:23 +0000 |
---|---|---|
committer | Simon McVittie <smcv@ http://smcv.pseudorandom.co.uk/> | 2009-01-31 14:36:23 +0000 |
commit | c2dafcb4e5e8c9f654c0ad5719607366cf84b75a (patch) | |
tree | 1a0d3aea683b05079274bff130e6005eac0aa4d4 /IkiWiki | |
parent | 013a5e4ca74108bf9206be25d3ffdad985ce266f (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.pm | 41 |
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; |