X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/5f96944dd5ad099d96adbf0273b4dc7d1da98829..838c1b5aec17ad90a894f21c12bb58adb5225276:/IkiWiki/Plugin/goto.pm diff --git a/IkiWiki/Plugin/goto.pm b/IkiWiki/Plugin/goto.pm index 06ec0bdca..3a946b19d 100644 --- a/IkiWiki/Plugin/goto.pm +++ b/IkiWiki/Plugin/goto.pm @@ -7,6 +7,7 @@ use IkiWiki 3.00; sub import { hook(type => "cgi", id => 'goto', call => \&cgi); + hook(type => "getsetup", id => 'goto', call => \&getsetup); } sub getsetup () { @@ -14,6 +15,7 @@ sub getsetup () { plugin => { safe => 1, rebuild => 0, + section => "web", } } @@ -25,28 +27,36 @@ sub cgi_goto ($;$) { my $page = shift; if (!defined $page) { - $page = IkiWiki::decode_utf8($q->param("page")); + $page = IkiWiki::decode_utf8(scalar $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(); - # If the page is internal (like a comment), see if it has a - # permalink. Comments do. - if (IkiWiki::isinternal($page) && - defined $pagestate{$page}{meta}{permalink}) { - IkiWiki::redirect($q, $pagestate{$page}{meta}{permalink}); + 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}); } - my $link = bestlink("", $page); - - if (! length $link) { + if (! defined $link || ! length $link) { IkiWiki::cgi_custom_failure( - $q->header(-status => "404 Not Found"), - IkiWiki::misctemplate(gettext("missing page"), + $q, + "404 Not Found", + IkiWiki::cgitemplate($q, gettext("missing page"), "
". sprintf(gettext("The page %s does not exist."), htmllink("", "", $page)). @@ -54,7 +64,7 @@ sub cgi_goto ($;$) { ) } else { - IkiWiki::redirect($q, urlto($link, undef, 1)); + IkiWiki::redirect($q, urlto($link)); } exit; @@ -65,7 +75,7 @@ sub cgi ($) { my $do = $cgi->param('do'); if (defined $do && ($do eq 'goto' || $do eq 'commenter' || - $do eq 'recentchanged_link')) { + $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);