Source of dieren.plp

<(common.inc.plp)><:
use warnings;
no warnings 'qw';

my $intro = 'dieren die in het Nederlands vernoemd zijn naar andere dieren.';
my %subpages = (
	standaard => {
		title => 'dieren',
		intro => $intro,
		altlink => 'Zie ook <a href="/dieren/uitgebreid">verdergezochte verbanden</a>' .
		           ' of het <a href="/dieren/beknopt">beknopte overzicht</a>.',
		prefix => qr/^(?!#)\+?/, # no # optional +
		colfilter => 0,
	},
	uitgebreid => {
		title => 'uitgebreid dieren',
		intro => "$intro.. en dergelijke.",
		altlink => 'Zie het <a href="/dieren">populaire overzicht</a> voor minder.',
		prefix => qr/.*?[#]|^[#+]*/, # after optional # or +
		secrets => 1,
	},
	beknopt => {
		title => 'beknopt dieren',
		intro => "een aantal $intro",
		altlink => 'Zie het <a href="/dieren">populaire overzicht</a> voor meer.',
		prefix => qr/^\+/, # only +
		colfilter => 1,
	},
);

$Request ||= 'standaard';
my $pageinfo = $subpages{$Request}
	or Html(), Abort("Onbekende dierenpagina <q>$Request</q>", '404 request not found');

Html({
	title => $pageinfo->{title}.' cheat sheet',
	version => '1.2',
	lang => 'nl',
	description => "Tabeloverzicht met afbeeldingen van $pageinfo->{intro}",
	keywords => [qw'
		dier beest naam naamgeving woord taal nederlands gerelateerd
		relatie vernoemd vernoeming combinatie samenstelling voorvoegsel onverwant
		land zee lucht  animals dutch language
	'],
	image => 'dieren.jpg',
	raw => <<"EOT",
<style>
figure[hidden] {
	opacity: 0; /* secret */
	transition: opacity 1s 0s;
	display: block;
}
figure[hidden]:hover {
	opacity: 1;
	transition-delay: 1s;
}
figure[hidden]:hover > figcaption {
	transition-delay: 2s;
}

\@media (max-width: 60em) {
	td, th {
		font-size: 50%;
	}
	figcaption small {
		display: none;
	}
	th:first-child {
		display: none;
	}
}
</style>
EOT
});

:>
<h1>Dierennamen <small lang=en>(Dutch animal names)</small></h1>

<p>
<:
say ucfirst $pageinfo->{intro};
say $pageinfo->{altlink};
:>
</p>

<:
my $table = Data('dieren');

if (exists $get{r}) {
	use List::MoreUtils qw( part );
	my @trans = (part { state $col; /^#?>/ ? ($col = 0) : ++$col } @{$table});
	$table = [];
	for (@trans) {
		unshift @$_, '?:' if $_->[0] !~ /:$/;
		$_->[0] =~ s/^#?\K>?/>>/;
		for (@$_) {
			push @$table, s/^#?\K>/$1/r;
		}
	}
}

for my $prefix ($pageinfo->{prefix}) {
	for my $col ($pageinfo->{colfilter} // ()) {
		@{$table} = grep { $_->[$col] =~ $prefix } @{$table};
	}
	$_ = [ grep { s/$prefix// } @{$_} ] for @{$table};
}

say '<table class="gallery">';
for my $row (@{$table}) {
	print '<tr>';
	for my $name (@{$row}) {
		my $hidden = $name =~ s/^\?//;
		$name =~ s/#.*//; # ignore prefixed part
		$name =~ s/^-$//;
		my ($img) = $name =~ /([\w-]+)/;
		$name =~ y/_/ /;
		if ($name =~ s/:$//) {
			# trailing colon indicates header text
			print "<th>$name</th>";
			next;
		}
		print '<td>';
		my $alt = $1 if $name =~ s/=(.*)//;
		$name = "<q>$name</q>" if $name =~ s/\?$//;
		$name .= " <small>($alt)</small>" if $alt;

		printf '<figure%s>', $hidden && !$pageinfo->{secrets} && ' hidden';
		if ($img and -e ($img = lc "data/dieren/$img.jpg")) {
			printf '<img src="/%s"', $img;
			printf ' alt="%s"', $alt || $name;
			print ' />';
			print "<figcaption>$name</figcaption>";
		}
		elsif ($hidden) {
			printf '<figcaption>%s</figcaption>', "$name?";
		}
		else {
			print $name;
		}
		print '</figure>';
		print '</td>';
	}
	say '</tr>';
}
say '</table>';