X-Git-Url: http://git.shiar.net/sheet.git/blobdiff_plain/81016fe5cca26a3ff511010fa88ee9f569897a5e..ada87baf9947ff8d17f0099f29011313c7fbff34:/font.plp?ds=inline diff --git a/font.plp b/font.plp index 547b297..d789262 100644 --- a/font.plp +++ b/font.plp @@ -1,20 +1,45 @@ <(common.inc.plp)><: -use 5.014; + +my $font = $Request; Html({ - title => 'character support sheet', - version => 'v1.1', + title => 'font coverage '.($font ? "for $font" : 'sheet'), + 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 (my $font = $ENV{PATH_INFO} =~ s{^/}{}r) { - my ($fontmeta, @cover) = do "ttfsupport/$font.inc.pl"; - $fontmeta or die "Unknown font $font\n"; +if ($font) { + 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 = Data('data/unicode-cover'); + + my ($cat, $name) = split m{/}, $get{map}, 2 or die "invalid map\n"; + if (!$name) { + ($cat, $name) = ('table', $cat); + } + + my $row = $groupinfo->{$cat}->{$name} + or die "unknown character group $cat/$name\n"; + my $query = $row->{query}; + + my @map; + for (map { split /[^\d-]/ } $query) { + my @range = split /-/, $_, 2; + m/^[0-9]+$/ or die "Invalid code point $_ in query $query\n" for @range; + push @map, $_ for $range[0] .. ($range[1] // $range[0]); + } + return \@map; + }; + Abort($@, '404 invalid query') if $@; require Unicode::UCD; @@ -27,14 +52,14 @@ if (my $font = $ENV{PATH_INFO} =~ s{^/}{}r) { return $_->[0]->[0] for Unicode::UCD::charblock(ucfirst) || (); # block die "Unknown offset query '$_'\n"; }; - die $@ if $@; + Abort($@, '400 invalid offset') if $@; say "
Version %s released %s contains %d glyphs.", !!$_->[2] && qq( title="revision $_->[2]"), $_->[1], $_->[0], - scalar @cover, + scalar @{ $fontmeta->{cover} }, ) for [ grep { $_ } ($fontmeta->{date} || '?') =~ s/T.*//r, @@ -49,7 +74,7 @@ if (my $font = $ENV{PATH_INFO} =~ s{^/}{}r) { (map { "with $_" } $_ || ()), ('and published as freeware "Core Web font"') x ($_ eq 'Windows 2000'), (map { "under a $_ license" } - map { $fontmeta->{license} ? qq($_) : $_ } + map { $fontmeta->{license} ? qq($_) : $_ } $_ && $_ ne 'Android' ? 'proprietary' : 'free', ), ); @@ -61,7 +86,7 @@ if (my $font = $ENV{PATH_INFO} =~ s{^/}{}r) { 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"; @@ -69,25 +94,35 @@ if (my $font = $ENV{PATH_INFO} =~ s{^/}{}r) { .glyphs tbody th[!colspan] { text-align: right } .glyphs tbody td { font-family: "$fontmeta->{name}" } .glyphs tbody td:nth-child(18) { border-left-width: 2px } + \@font-face { + font-family: "$fontmeta->{name}"; + src: url(/data/font/$font.ttf); + } EOT say '
%X', $cp; + } + $lastcp = $cp; + } + } + say sprintf ' | |
---|---|
%X', $cp if $colpos++ % $pagecols == 0; my $info = $glyphs->glyph_info($cp); - my ($class, $name, $mnem, $html, $string) = @{$info}; + 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 ' | %s', - !$class ? ('l0', $cp, '', '') : + !$class ? ('l0', $cp, '', '') : ( $cover{$cp} ? $np ? 'l2' : 'l5' : $np ? 'Xi' : 'l1', $cp, !!$name && ": $name", - ($cover{$cp} || !$np) && $html; + $html + ); } say ' |
%d%%', "l$class", $rel*100; + printf ' | %d', "l$class", $rel*10; } say ''; } |