dieren: generic extension syntax for secret exceptions
[sheet.git] / dieren.plp
1 <(common.inc.plp)><:
2 use warnings;
3 no warnings 'qw';
4
5 my $intro = 'dieren die in het Nederlands vernoemd zijn naar andere dieren.';
6 my %subpages = (
7         standaard => {
8                 title => 'dieren',
9                 intro => $intro,
10                 altlink => 'Zie ook <a href="/dieren/uitgebreid">verdergezochte verbanden</a>' .
11                            ' of het <a href="/dieren/beknopt">beknopte overzicht</a>.',
12                 prefix => qr/^(?!#)\+?/, # no # optional +
13                 colfilter => 0,
14         },
15         uitgebreid => {
16                 title => 'uitgebreid dieren',
17                 intro => "$intro.. en dergelijke.",
18                 altlink => 'Zie het <a href="/dieren">populaire overzicht</a> voor minder.',
19                 prefix => qr/.*?[#]|^[#+]*/, # after optional # or +
20                 secrets => 1,
21         },
22         beknopt => {
23                 title => 'beknopt dieren',
24                 intro => "een aantal $intro",
25                 altlink => 'Zie het <a href="/dieren">populaire overzicht</a> voor meer.',
26                 prefix => qr/^\+/, # only +
27                 colfilter => 1,
28         },
29 );
30
31 $Request ||= 'standaard';
32 my $pageinfo = $subpages{$Request}
33         or Html(), Abort("Onbekende dierenpagina <q>$Request</q>", '404 request not found');
34
35 Html({
36         title => $pageinfo->{title}.' cheat sheet',
37         version => '1.0',
38         description => "Tabeloverzicht met afbeeldingen van $pageinfo->{intro}",
39         keywords => [qw'
40                 dier beest naam naamgeving woord taal nederlands gerelateerd
41                 relatie vernoemd vernoeming combinatie samenstelling voorvoegsel onverwant
42                 land zee lucht  animals dutch language
43         '],
44         raw => <<'EOT',
45 <style>
46 figure[hidden] {
47         opacity: 0; /* secret */
48         transition: opacity 1s 0s;
49         display: block;
50 }
51 figure[hidden]:hover {
52         opacity: 1;
53         transition-delay: 1s;
54 }
55 figure[hidden]:hover > figcaption {
56         transition-delay: 2s;
57 }
58
59 @media (max-width: 60em) {
60         td, th {
61                 font-size: 50%;
62         }
63         figcaption small {
64                 display: none;
65         }
66         th:first-child {
67                 display: none;
68         }
69 }
70 </style>
71 EOT
72 });
73
74 :>
75 <h1>Dierennamen <small>(Dutch animal names)</small></h1>
76
77 <p>
78 <:
79 say ucfirst $pageinfo->{intro};
80 say $pageinfo->{altlink};
81 :>
82 </p>
83
84 <:
85 my $table = readdata('dieren');
86
87 if (exists $get{r}) {
88         use List::MoreUtils qw( part );
89         my @trans = (part { state $col; /^#?>/ ? ($col = 0) : ++$col } @{$table});
90         $table = [];
91         for (@trans) {
92                 unshift @$_, '?:' if $_->[0] !~ /:$/;
93                 $_->[0] =~ s/^#?\K>?/>>/;
94                 for (@$_) {
95                         push @$table, s/^#?\K>/$1/r;
96                 }
97         }
98 }
99
100 for my $prefix ($pageinfo->{prefix}) {
101         for my $col ($pageinfo->{colfilter} // ()) {
102                 @{$table} = grep { $_->[$col] =~ $prefix } @{$table};
103         }
104         $_ = [ grep { s/$prefix// } @{$_} ] for @{$table};
105 }
106
107 say '<table class="gallery">';
108 for my $row (@{$table}) {
109         print '<tr>';
110         for my $name (@{$row}) {
111                 my $hidden = $name =~ s/^\?//;
112                 $name =~ s/#.*//; # ignore prefixed part
113                 $name =~ s/^-$//;
114                 my ($img) = $name =~ /([\w-]+)/;
115                 $name =~ y/_/ /;
116                 if ($name =~ s/:$//) {
117                         # trailing colon indicates header text
118                         print "<th>$name</th>";
119                         next;
120                 }
121                 print '<td>';
122                 my $alt = $1 if $name =~ s/=(.*)//;
123                 $name = "<q>$name</q>" if $name =~ s/\?$//;
124                 $name .= " <small>($alt)</small>" if $alt;
125
126                 printf '<figure%s>', $hidden && !$pageinfo->{secrets} && ' hidden';
127                 if ($img and -e ($img = "data/dieren/$img.jpg")) {
128                         printf '<img src="/%s"', $img;
129                         printf ' alt="%s"', $alt || $name;
130                         print ' />';
131                         print "<figcaption>$name</figcaption>";
132                 }
133                 elsif ($hidden) {
134                         printf '<figcaption>%s</figcaption>', "$name?";
135                 }
136                 else {
137                         print $name;
138                 }
139                 print '</figure>';
140                 print '</td>';
141         }
142         say '</tr>';
143 }
144 say '</table>';