index: release v1.18 with only altgr index linked
[sheet.git] / chars.plp
index ebfdc6b816c795287cc48a572a009df200d14b84..91df3b83d817fd0640bc2c407a7b336292a0ec69 100644 (file)
--- a/chars.plp
+++ b/chars.plp
@@ -2,19 +2,27 @@
 
 Html({
        title => 'character support sheet',
-       version => 'v1.0',
+       version => '1.2',
        keywords => [qw'
                unicode glyph char character reference common ipa symbol sign mark table digraph
        '],
        stylesheet => [qw'light dark mono circus red'],
-       data => [qw( unicode-cover.inc.pl ttfsupport unicode-char.inc.pl )],
+       data => [qw( data/unicode-cover.inc.pl data/font data/unicode-char.inc.pl )],
+       raw => <<'EOT',
+<style>
+       tbody tr:hover th {
+               font-size: 300%;
+               min-width: 1.2em;
+               border-width: 1px;
+       }
+</style>
+EOT
 });
 
-use 5.010;
 use Shiar_Sheet::FormatChar;
 my $glyphs = Shiar_Sheet::FormatChar->new;
 
-my $groupinfo = do 'unicode-cover.inc.pl' or die $@ || $!;
+my $groupinfo = Data('data/unicode-cover');
 
 my @ossel = @{ $groupinfo->{osdefault} };
 my @fontlist = map { $_->{file} }
@@ -22,11 +30,10 @@ my @fontlist = map { $_->{file} }
 
 my %font;
 for my $fontid (@fontlist) {
-               my ($fontmeta, @fontrange) = do "ttfsupport/$fontid.inc.pl";
-               $fontmeta or next;
+               my $fontmeta = eval { Data("data/font/$fontid") } or next;
                $font{$fontid} = {
                        (map { (-$_ => $fontmeta->{$_}) } keys %{$fontmeta}),
-                       map { (chr $_ => 1) } @fontrange
+                       map { (chr $_ => 1) } @{ $fontmeta->{cover} }
                };
 }
 
@@ -34,8 +41,7 @@ for my $fontid (@fontlist) {
 
 my ($title, $parent) = ('Character overview');
 my $query = eval {
-       for ($ENV{PATH_INFO} || ()) {
-               s{^/}{};
+       for ($Request || ()) {
                return $_ if m{^[0-9 +-]+$};
 
                my ($cat, $name) = split m{/}, $_, 2 or die "invalid query\n";
@@ -55,8 +61,7 @@ my $query = eval {
 say "<h1>$title</h1>";
 
 if (!$query) {
-       say "<p>Unicode group not specified: $@</p>";
-       exit;
+       Abort(["Unicode group not found", $@], '404 no matches');
 };
 
 for ($parent || 'Unicode range') {
@@ -75,21 +80,22 @@ for ($parent || 'Unicode range') {
 my @chars;
 for (map { split /[^\d-]/ } $query) {
        my @range = split /-/, $_, 2;
-       m/^[0-9]+$/ or die "Invalid code point $_ in query $query\n" for @range;
+       m/^[0-9]+$/ or Abort("Invalid code point $_ in query $query", 400)
+               for @range;
        push @chars, chr $_ for $range[0] .. ($range[1] // $range[0]);
 }
 
-@chars or die "No match for query $query\n";
+@chars or Abort("No match for query $query", '404 no results');
 
-@chars <= 1500 or die sprintf(
-       'Too many matches (%d) for query %s'."\n",
-       scalar @chars, $query,
+@chars <= 1500 or Abort(
+       sprintf('Too many matches (%d) for query', scalar @chars),
+       '403 not allowed', $query
 );
 
 # output character list
 
 say '<div>';
-print '<table class=mapped>';
+print '<table class="mapped cover">';
 print '<col>' x 3;
 print "<colgroup span=$_>"
        for 2, map { scalar @{ $groupinfo->{os}->{$_} } } @ossel;
@@ -114,14 +120,14 @@ for my $chr (@chars) {
        my $codepoint = ord $chr;
        my $ascii = $codepoint <= 127;
 
-       print "<tr><th>$chr\n";
+       say '<tr><th>', $chr;
        my $info = $glyphs->glyph_info($codepoint);
-       my ($class, $name, $mnem, $html, $string) = @$info;
+       my ($class, $name, $mnem, $entity, $string) = @$info;
        print "<td>$_" for sprintf('%X', $codepoint), EscapeHTML($name || '?');
        printf '<td class="%s">%s', @$_ for (
                [$ascii ? 'l0' : defined $mnem ? $class =~ /\bu-di\b/ ? 'l4' : 'l3' : 'l1',
                        EscapeHTML($mnem) // ''],
-               [$ascii ? 'l0' : defined $html ? 'l4' : 'l1', $html // ''],
+               [$ascii ? 'l0' : defined $entity ? 'l4' : 'l1', $entity // ''],
                (map {
                        !defined $font{$_}->{-name} ? [l0 => '?'] :
                        $font{$_}->{$chr} ? [l4 => '✔'] : [l1 => '✘']