X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/2279bc9a6d42121149d1a4178cb4f29e73658332..61b62b05f9858aa087974581df08aa9973d899b3:/chars.plp diff --git a/chars.plp b/chars.plp new file mode 100644 index 0000000..b081ac2 --- /dev/null +++ b/chars.plp @@ -0,0 +1,147 @@ +<(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"; + +:>
+