index: release v1.18 with only altgr index linked
[sheet.git] / font.plp
index d4d7debf24147e339fc81579840c33d55aed6fa0..701957305cdcee045ee06d6b4b0156ffaff9400d 100644 (file)
--- a/font.plp
+++ b/font.plp
@@ -4,23 +4,23 @@ my $font = $Request;
 
 Html({
        title => 'font coverage '.($font ? "for $font" : 'sheet'),
-       version => '1.2',
+       version => '1.4',
        keywords => [qw(
                unicode font glyph char character support overview cover coverage
                script block symbol sign mark reference table
        )],
        stylesheet => [qw( light dark mono circus red )],
-       data => [qw( unicode-cover.inc.pl )],
+       data => [qw( data/unicode-cover.inc.pl )],
 });
 
 if ($font) {
-       my ($fontmeta, @cover) = do "ttfsupport/$font.inc.pl";
-       $fontmeta or die "Unknown font $font\n";
+       my $fontmeta = eval { Data("data/font/$font") }
+               or Abort("Unknown font $font", '404 font not found', ref $@ && $@->[1]);
 
        my $map = eval {
                $get{map} or return;
 
-               my $groupinfo = do 'unicode-cover.inc.pl' or die $@ || $!;
+               my $groupinfo = Data('data/unicode-cover');
 
                my ($cat, $name) = split m{/}, $get{map}, 2 or die "invalid map\n";
                if (!$name) {
@@ -39,7 +39,7 @@ if ($font) {
                }
                return \@map;
        };
-       die $@ if $@;
+       Abort($@, '404 invalid query') if $@;
 
        require Unicode::UCD;
 
@@ -52,14 +52,14 @@ if ($font) {
                return $_->[0]->[0] for Unicode::UCD::charblock(ucfirst) || ();  # block
                die "Unknown offset query '$_'\n";
        };
-       die $@ if $@;
+       Abort($@, '400 invalid offset') if $@;
 
        say "<h1>Font coverage</h1>";
        say "<h2>$_</h2>" for EscapeHTML($fontmeta->{name});
        printf("<p>Version <strong%s>%s</strong> released %s contains %d glyphs.",
                !!$_->[2] && qq( title="revision $_->[2]"),
                $_->[1], $_->[0],
-               scalar @cover,
+               scalar @{ $fontmeta->{cover} },
        ) for [
                grep { $_ }
                ($fontmeta->{date} || '?') =~ s/T.*//r,
@@ -86,7 +86,7 @@ if ($font) {
        require Shiar_Sheet::FormatChar;
        my $glyphs = Shiar_Sheet::FormatChar->new;
 
-       my %cover = map { ($_ => 1) } @cover;  # lookup map
+       my %cover = map { ($_ => 1) } @{ $fontmeta->{cover} };  # lookup map
 
        say <<"EOT";
 
@@ -156,12 +156,15 @@ EOT
                my ($class, $name, $mnem, $entity, $string) = @{$info};
                my $np = $class =~ /\bC\S\b/;  # noprint if control or invalid
                # display literal character, with placeholder circle if non-spacing/enclosing
-               my $html = ($class =~ /\bM[ne]\b/ && chr 9676) . EscapeHTML(chr $cp);
+               $string ||= ($class =~ /\bM[ne]\b/ && chr 9676) . chr($cp);
+               my $html = $np ? !!$cover{$cp} && sprintf("&#%d;", $cp) :
+                       EscapeHTML($string);
                say sprintf '<td class="%s" title="U+%04X%s">%s',
-                       !$class ? ('l0', $cp, '', '') :
+                       !$class ? ('l0', $cp, '', '') : (
                        $cover{$cp} ? $np ? 'l2' : 'l5' : $np ? 'Xi' : 'l1',
                        $cp, !!$name && ": $name",
-                       ($cover{$cp} || !$np) && $html;
+                       $html
+                       );
        }
        say '</table>';
 
@@ -180,7 +183,7 @@ Character support of Unicode
 
 <:
 
-my $cover = do 'unicode-cover.inc.pl' or die $@ || $!;
+my $cover = Data('data/unicode-cover');
 
 my @ossel = @{ $cover->{osdefault} };
 my @fontlist = map { @{ $cover->{os}->{$_} } } @ossel;
@@ -218,7 +221,7 @@ my @rows = (
 
 if (my $group = $get{q}) {
        my $grouprows = $cover->{$group}
-               or die "Unknown character category $_\n";
+               or Abort("Unknown character category $_", 404);
        @rows = map { "$group/$_" } sort keys %{$grouprows};
 }