X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/3f105ae3161afb8bfc16cb0b6fee0faa2e43cc55..57f9cfa126a76ddeaac15fd55e05277afdcba98f:/font.plp diff --git a/font.plp b/font.plp index 22479b4..b081ac2 100644 --- a/font.plp +++ b/font.plp @@ -52,37 +52,60 @@ for my $os (@ossel) { # parse input my @chars; +my @querydesc; -for ($ENV{PATH_INFO} || $get{q} || ()) { +my $query = $ENV{PATH_INFO} || $get{q} || 'ipa'; +for ($query) { s{^/}{}; - when ('') { - next; + 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{/}) { - push @{ $get{'@g'} }, $_; + 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"; } } -$get{'@g'} //= ['latin/sample']; - -for (map { split / / } @{ $get{'@g'} }) { - my ($tablegroup, $tablename) = split m{/}, $_, 2; - my $table = $tables->{$tablegroup}->{$tablename}; - - for (@{$table}) { - m/^[.]/ .. 1 or next; - next if /^[.-]/; - next if $_ eq '>' or $_ eq '='; - push @chars, $_; - } -} +@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; @@ -95,7 +118,7 @@ printf ''; print '
'.EscapeHTML(join ', ', @querydesc).'
%s fonts', scalar @{ $oslist{$_} }, $_ print '
unicode'; print 'name'; -print 'dihtml'; +print 'dihtml'; printf '%s', $font{$_}->{-name}, $font{$_}->{-id} // $_ for @fontlist; say ''; @@ -107,9 +130,9 @@ for my $chr (@chars) { print "
$chr\n"; my $info = $glyphs->glyph_info($codepoint); my ($class, $name, $mnem, $html, $string) = @$info; - print "$_" for sprintf('%X', $codepoint), EscapeHTML($name); + print "$_" for sprintf('%X', $codepoint), EscapeHTML($name || '?'); printf '%s', @$_ for ( - [$ascii ? 'l0' : defined $mnem ? 'l4' : 'l1', $mnem // ''], + [$ascii ? 'l0' : defined $mnem ? $class =~ /\bu-di\b/ ? 'l4' : 'l3' : 'l1', $mnem // ''], [$ascii ? 'l0' : defined $html ? 'l4' : 'l1', $html // ''], (map { !$font{$_}->{-id} ? [l0 => '?'] :