index: release v1.18 with only altgr index linked
[sheet.git] / codec.plp
index 27a6cb73960bd54f1d7f88f8177239d4aa41598f..f13b93ac198d545bbdcc5d12ab2a5eb35bc16867 100644 (file)
--- a/codec.plp
+++ b/codec.plp
@@ -1,51 +1,73 @@
 <(common.inc.plp)><:
 
-my @feat = split m{/+}, $Request || 'default';
+my ($page, @feat) = split m{/+}, $Request || 'image';
+$page !~ /\W/ or Html(), Abort('Invalid codec type request', 400);
+@feat or @feat = 'default';
+my $title = "$page codecs";
+my $info = eval { Data("codec-$page") };
+if ($@) {
+       $info = {};
+}
 
 Html({
-       title => 'Codecs',
-       version => '1.0',
-       description => [
-       ],
-       keywords => [qw'
-       '],
+       title => "$title cheat sheet",
+       version => '1.1',
+       description => $info->{intro},
+       keywords => [@{ $info->{keywords} // [] }, qw' feature comparison support benchmark '],
        stylesheet => [qw'light circus dark red'],
-       data => [qw'codec.inc.pl'],
+       data => ["codec-$page.inc.pl"],
+       raw => '<style>td,th {width:8%} tbody th {white-space:nowrap}</style>',
 });
 
-my $info = do 'codec.inc.pl';
-$info and %{$info} > 1 or Abort("cannot open operator include", 500, $@ // $!);
+%{$info}
+       or Abort("Requested codec type <q>$page</q> not available", '404 request not found');
+
+say "<h1>\u$title</h1>";
+say "<p>$_</p>" for $info->{intro} // ();
 
-my %BOOLSCORE = (y => 5, n => 1);
+my %BOOLSCORE = (y => [5, '✔'], n => [1, '✘'], 0 => [0, 'n/a']);
 :>
-<h1>Image codecs</h1>
 
 <div class="section">
 <table class="mapped">
-       <col><colgroup span=2><colgroup span=2><colgroup span=3>
-<thead><tr><th rowspan=2>feature
 <:
 my @codecs = sort {
        $info->{codec}->{$a}->{available} <=> $info->{codec}->{$b}->{available}
 } keys $info->{codec}->%*;
+my @codeccols = @{$info->{codec}}{@codecs};
 
-print '<th>', $_->{name} for @{$info->{codec}}{@codecs};
-print "\n<tr>";
-print '<td>', $_->{available} for @{$info->{codec}}{@codecs};
+{
+       print '<col>';
+       my @spans;
+       $spans[ $_->{generation} ]++ for @codeccols;
+       print "<colgroup span=$_>" for @spans;
+}
+say '<thead><tr><th rowspan=2>';
+say "\t", '<th>', $_->{name} for @codeccols;
+print '<tr>';
+print '<td>', $_->{available} for @codeccols;
 say '</thead>';
 
 while (defined (my $feat = shift @feat)) {
        my $featinfo = $info->{feature}->{$feat} or next;
        unshift @feat, @{$_} for $featinfo->{children} // ();
-       $featinfo->{score} or $featinfo->{data} or next;
+       $featinfo->{score} or next;
        print '<tbody>' if $featinfo->{children};
        printf '<tr><th>%s', $featinfo->{name} // $feat;
-       printf('<td class="l%d">%s',
-               (map { $_ && $BOOLSCORE{$_} || $_ || 0 } $featinfo->{score}->{$_}),
-               $featinfo->{data}->{$_} // (map {
-                       $BOOLSCORE{$_} ? ($_ eq 'y' ? '✔' : '✘') : '•' x ($_ - 1)
-               } $featinfo->{score}->{$_}),
-       ) for @codecs;
+       for (@codecs) {
+               my ($score, $data, $title) = map { ref ? @$_ : $_ } $featinfo->{score}->{$_};
+               if (not defined $data) {
+                       if (my $override = $BOOLSCORE{$score}) {
+                               ($score, $data) = @{$override};
+                       }
+                       else {
+                               $data = '•' x ($score - 1);
+                       }
+               }
+               printf '<td class="l%d"', $score;
+               printf ' title="%s"', EscapeHTML($_) for $title // ();
+               print '>', $data;
+       }
        say '</td>';
 }