X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/6721f1111bc49b8ee5efc0b39d74321c1393cdfb..29a87b835d71d96bef2a123b68b1bf5fa3ce1608:/chars.plp diff --git a/chars.plp b/chars.plp index c36615d..ebfdc6b 100644 --- a/chars.plp +++ b/chars.plp @@ -10,98 +10,104 @@ Html({ data => [qw( unicode-cover.inc.pl ttfsupport unicode-char.inc.pl )], }); -:> -

Character support

- -

-Selected characters from Unicode preset -or range. -

- -
- -<: use 5.010; use Shiar_Sheet::FormatChar; my $glyphs = Shiar_Sheet::FormatChar->new; -my %oslist = ( - win95 => [qw( arial ariuni verdana times )], # microsoft - mac10 => [qw( )], # apple - android => [qw( droidsans )], # google - oss => [qw( dvsans c2k unifont )], -); -my @ossel = qw( win95 oss android ); +my $groupinfo = do 'unicode-cover.inc.pl' or die $@ || $!; + +my @ossel = @{ $groupinfo->{osdefault} }; +my @fontlist = map { $_->{file} } + @{ $groupinfo->{fonts} }[ map { @{ $groupinfo->{os}->{$_} } } @ossel ]; -my (%font, @fontlist); -for my $os (@ossel) { - my $osfonts = $oslist{$os}; - for my $fontid (@{$osfonts}) { - push @fontlist, $fontid; +my %font; +for my $fontid (@fontlist) { my ($fontmeta, @fontrange) = do "ttfsupport/$fontid.inc.pl"; $fontmeta or next; $font{$fontid} = { - -id => $fontmeta->{id} || $fontid, - -name => $fontmeta->{name}, + (map { (-$_ => $fontmeta->{$_}) } keys %{$fontmeta}), map { (chr $_ => 1) } @fontrange }; - } } # parse input -my @chars; -my @querydesc; - -if (my $query = $ENV{PATH_INFO} || $get{q} || 'ipa') { - my $groupinfo = do 'unicode-cover.inc.pl' or die $@ || $!; - for (split /[\s+]/, $query) { +my ($title, $parent) = ('Character overview'); +my $query = eval { + for ($ENV{PATH_INFO} || ()) { s{^/}{}; - when (qr{^[\d,;\s+-]+$}) { - push @querydesc, "character codepoints $_"; - for (map { split /[^\d-]/ } $_) { - my ($charnum, $range) = split /-/, $_; - push @chars, chr $_ for $charnum .. ($range // $charnum); - } - } - when ($_) { - my $row = $groupinfo->{$_} or do { - warn "group $_ not found"; - next; - }; - push @querydesc, $row->{-name} // $_; - push @chars, map { chr } @{ $row->{-chars} }; - } - default { - die "unknown parameter: $_\n"; + return $_ if m{^[0-9 +-]+$}; + + my ($cat, $name) = split m{/}, $_, 2 or die "invalid query\n"; + if (!$name) { + ($cat, $name) = ('table', $cat); } + + my $row = $groupinfo->{$cat}->{$name} + or die "unknown character group $cat/$name\n"; + + $title = ucfirst EscapeHTML($name).' characters'; + $parent = $cat; + return EscapeHTML($row->{query}); } +} || $get{q}; + +say "

$title

"; + +if (!$query) { + say "

Unicode group not specified: $@

"; + exit; +}; + +for ($parent || 'Unicode range') { + my %CATDESC = ( + block => 'Unicode block', + script => 'Unicode script', + category => 'Unicode category', + table => 'Unicode preset group', + ); + say sprintf('

List %s in selected %s.

', + 'characters and font support', + $CATDESC{$parent} || $parent, + ); } +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; + push @chars, chr $_ for $range[0] .. ($range[1] // $range[0]); +} + +@chars or die "No match for query $query\n"; + @chars <= 1500 or die sprintf( - 'too many matches (%d) for %s'."\n", - scalar @chars, join(', ', @querydesc), + 'Too many matches (%d) for query %s'."\n", + scalar @chars, $query, ); # output character list +say '
'; print ''; -say ''; print '' x 3; -print "" for 2, map { scalar @{$oslist{$_}} } @ossel; +print "" + for 2, map { scalar @{ $groupinfo->{os}->{$_} } } @ossel; print ''; print ''; print ''; for my $chr (@chars) { @@ -113,16 +119,16 @@ for my $chr (@chars) { my ($class, $name, $mnem, $html, $string) = @$info; print "
'.EscapeHTML(join ', ', @querydesc).'
character'; print 'input'; -printf '%s fonts', scalar @{ $oslist{$_} }, $_ +printf '%s', scalar @{ $groupinfo->{os}->{$_} }, $_ for @ossel; print '
unicode'; print 'name'; print 'dihtml'; -printf '%s', $font{$_}->{-name}, $font{$_}->{-id} // $_ - for @fontlist; +printf('%s', map { EscapeHTML($_) } + join("\n", $font{$_}->{-name}, $font{$_}->{-description}), + $font{$_}->{-abbr}, +) for @fontlist; say '
$_" for sprintf('%X', $codepoint), EscapeHTML($name || '?'); printf '%s', @$_ for ( - [$ascii ? 'l0' : defined $mnem ? $class =~ /\bu-di\b/ ? 'l4' : 'l3' : 'l1', $mnem // ''], + [$ascii ? 'l0' : defined $mnem ? $class =~ /\bu-di\b/ ? 'l4' : 'l3' : 'l1', + EscapeHTML($mnem) // ''], [$ascii ? 'l0' : defined $html ? 'l4' : 'l1', $html // ''], (map { - !$font{$_}->{-id} ? [l0 => '?'] : + !defined $font{$_}->{-name} ? [l0 => '?'] : $font{$_}->{$chr} ? [l4 => '✔'] : [l1 => '✘'] } @fontlist), ); } say "
\n"; - -:>
+say "
\n";