X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/5fadf3bba74628ae85920b5c2d71f804e3256601..57f9cfa126a76ddeaac15fd55e05277afdcba98f:/font.plp diff --git a/font.plp b/font.plp index 95630b2..b081ac2 100644 --- a/font.plp +++ b/font.plp @@ -26,13 +26,12 @@ use Shiar_Sheet::FormatChar; my $glyphs = Shiar_Sheet::FormatChar->new; my %oslist = ( - win95 => [qw/arial ariuni verdana times/], - mac10 => [qw//], - oss => ['dv ss', qw/droid c2k guf/], - - android => ['droid'], + win95 => [qw( arial ariuni verdana times )], # microsoft + mac10 => [qw( )], # apple + android => [qw( droidsans )], # google + oss => [qw( dvsans c2k unifont )], ); -my @ossel = qw(win95 oss); +my @ossel = qw( win95 oss android ); my $tables = do 'unicode-table.inc.pl' or die $@ || $!; my (%font, @fontlist); @@ -50,69 +49,99 @@ for my $os (@ossel) { } } -my @config = qw( - punctuation/common punctuation/marks - latin/sample - symbols/signs1 - math/logic -); -$_ and m{/*+(.+)} and @config = split /[ ]/, $1 for $ENV{PATH_INFO}, $get{q}; -@config = qw(ipa/cons ipa/vowels) if 0; - -for (@config) { - my ($tablegroup, $tablename) = split m{/}, $_, 2; - - print ''; - printf '', "$tablegroup: $tablename"; - say ''; - print '' x 3; - print "" for 2, map { scalar @{$oslist{$_}} } @ossel; - print ''; - print ''; - my $table = $tables->{$tablegroup}->{$tablename}; - - for my $chr (@$table) { - $chr =~ m/^\./ .. 1 or next; - given ($chr) { - when (/^[.]/) { - print "\n"; - next; - } - when ([qw(> - =)]) { - next; +# 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, $_; + } } } - - my $ex = s/^-//; - my $codepoint = ord $chr; - my $ascii = $codepoint <= 127; - - print "
%s
char'; - print 'name'; - print 'dihtml'; - printf('%s', - (map { - scalar @{$_}, - join(', ', map { $_->{-name} } @font{ @{$_} }), - } $oslist{$_}), - $_, - ) for @ossel; - 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 ? 'l4' : 'l1', $mnem // ''], - [$ascii ? 'l0' : defined $html ? 'l4' : 'l1', $html // ''], - (map { - !$font{$_}->{-id} ? [l0 => "$_?"] : - $font{$_}->{$chr} ? [l4 => $font{$_}->{-id}] : [l1 => ''] - } @fontlist), - ); + 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"; } - say "
\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"; + +:>