X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/61b62b05f9858aa087974581df08aa9973d899b3..49069763e748ef46dcb2587647a6f5c26bf04214:/chars.plp diff --git a/chars.plp b/chars.plp index b081ac2..5b5065e 100644 --- a/chars.plp +++ b/chars.plp @@ -7,33 +7,21 @@ Html({ 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'], + 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 + mac10 => [qw( lucida garamond )], # apple android => [qw( droidsans )], # google oss => [qw( dvsans c2k unifont )], ); -my @ossel = qw( win95 oss android ); +my @ossel = qw( win95 mac10 oss android ); -my $tables = do 'unicode-table.inc.pl' or die $@ || $!; my (%font, @fontlist); for my $os (@ossel) { my $osfonts = $oslist{$os}; @@ -51,61 +39,65 @@ for my $os (@ossel) { # 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); +my ($title, $parent) = ('Character overview'); +my $query = eval { + for ($ENV{PATH_INFO} || ()) { + s{^/}{}; + return $_ if m{^[0-9 +-]+$}; + + my ($cat, $name) = split m{/}, $_, 2 or die "invalid query\n"; + if (!$name) { + ($cat, $name) = ('table', $cat); } + + my $groupinfo = do 'unicode-cover.inc.pl' or die $@ || $!; + my $row = $groupinfo->{$cat}->{$name} + or die "unknown character group $cat/$name\n"; + + $title = ucfirst EscapeHTML($name).' characters'; + $parent = $cat; + return EscapeHTML($row->{-query}); } - 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{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; @@ -142,6 +134,5 @@ for my $chr (@chars) { } say "
'.EscapeHTML(join ', ', @querydesc).'
\n"; - -:>
+say "
\n";