<(common.inc.plp)><: Html({ title => 'character support sheet', version => 'v1.0', keywords => [qw' unicode glyph char character reference common ipa symbol sign mark table digraph '], stylesheet => [qw'light dark mono circus red'], data => [qw'unicode-table.inc.pl 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 $tables = do 'unicode-table.inc.pl' or die $@ || $!; my (%font, @fontlist); for my $os (@ossel) { my $osfonts = $oslist{$os}; for my $fontid (@{$osfonts}) { push @fontlist, $fontid; my ($fontmeta, @fontrange) = do "ttfsupport/$fontid.inc.pl"; $fontmeta or next; $font{$fontid} = { -id => $fontmeta->{id} || $fontid, -name => $fontmeta->{name}, map { (chr $_ => 1) } @fontrange }; } } # parse input my @chars; my @querydesc; my $query = $ENV{PATH_INFO} || $get{q} || 'ipa'; for ($query) { s{^/}{}; when (qr{^[a-z]+(?:/|\z)}) { for (split / /) { push @querydesc, "preset group $_"; my ($tablegroup, $tablename) = split m{/}, $_, 2; my @tables = $tablename ? $tables->{$tablegroup}->{$tablename} : sort values %{ $tables->{$tablegroup} }; for (@tables) { my $includerows; # ignore rows before body row for (@{$_}) { $includerows ||= m/^[.]/ or next; next if /^[.-]/; next if $_ eq '>' or $_ eq '='; push @chars, $_; } } } when ('ipa') { @chars = grep { !m/[a-zA-Z]/ } @chars; } } when (qr{[\d,;\s+-]+}) { push @querydesc, "character codepoints $_"; for (map { split /[^\d-]/ } $_) { my ($charnum, $range) = split /-/, $_; push @chars, chr $_ for $charnum .. ($range // $charnum); } } when (qr{[A-Z]}) { push @querydesc, "unicode match $_"; eval { my $match = qr/\A\p{$_}\z/; push @chars, grep { m/$match/ } map { chr $_ } 0..0xD7FF, 0xE000..0xFDCF, 0xFDF0..0xFFFD; } or die "invalid unicode match: $_\n"; } default { die "unknown parameter: $_\n"; } } @chars <= 1500 or die sprintf( 'too many matches (%d) for %s'."\n", scalar @chars, join(', ', @querydesc), ); # output character list print ''; say ''; print '' x 3; print "" for 2, map { scalar @{$oslist{$_}} } @ossel; print ''; print ''; print ''; for my $chr (@chars) { my $codepoint = ord $chr; my $ascii = $codepoint <= 127; print "
'.EscapeHTML(join ', ', @querydesc).'
character'; print 'input'; printf '%s fonts', scalar @{ $oslist{$_} }, $_ for @ossel; print '
unicode'; print 'name'; print 'dihtml'; printf '%s', $font{$_}->{-name}, $font{$_}->{-id} // $_ for @fontlist; say '
$chr\n"; my $info = $glyphs->glyph_info($codepoint); my ($class, $name, $mnem, $html, $string) = @$info; print "$_" for sprintf('%X', $codepoint), EscapeHTML($name || '?'); printf '%s', @$_ for ( [$ascii ? 'l0' : defined $mnem ? $class =~ /\bu-di\b/ ? 'l4' : 'l3' : 'l1', $mnem // ''], [$ascii ? 'l0' : defined $html ? 'l4' : 'l1', $html // ''], (map { !$font{$_}->{-id} ? [l0 => '?'] : $font{$_}->{$chr} ? [l4 => '✔'] : [l1 => '✘'] } @fontlist), ); } say "
\n"; :>