<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#!/usr/bin/perl
package IkiWiki::Plugin::goto;

use warnings;
use strict;
use IkiWiki 3.00;

sub import {
	hook(type =&gt; "cgi", id =&gt; 'goto',  call =&gt; \&amp;cgi);
	hook(type =&gt; "getsetup", id =&gt; 'goto',  call =&gt; \&amp;getsetup);
}

sub getsetup () {
	return
		plugin =&gt; {
			safe =&gt; 1,
			rebuild =&gt; 0,
			section =&gt; "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(scalar $q-&gt;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 (! defined $link || ! length $link) {
		IkiWiki::cgi_custom_failure(
			$q,
			"404 Not Found",
			IkiWiki::cgitemplate($q, gettext("missing page"),
				"&lt;p&gt;".
				sprintf(gettext("The page %s does not exist."),
					htmllink("", "", $page)).
				"&lt;/p&gt;")
		)
	}
	else {
		IkiWiki::redirect($q, urlto($link));
	}

	exit;
}

sub cgi ($) {
	my $cgi=shift;
	my $do = $cgi-&gt;param('do');

	if (defined $do &amp;&amp; ($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;
</pre></body></html>