From 36266207701530f9b615f5b06b86f29b1178fa34 Mon Sep 17 00:00:00 2001 From: Mischa POSLAWSKY Date: Wed, 29 Mar 2017 18:16:23 +0200 Subject: [PATCH] font: map option to list characters from unicode table --- font.plp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/font.plp b/font.plp index 0b58eed..d4d7deb 100644 --- a/font.plp +++ b/font.plp @@ -17,6 +17,30 @@ if ($font) { my ($fontmeta, @cover) = do "ttfsupport/$font.inc.pl"; $fontmeta or die "Unknown font $font\n"; + my $map = eval { + $get{map} or return; + + my $groupinfo = do 'unicode-cover.inc.pl' or die $@ || $!; + + my ($cat, $name) = split m{/}, $get{map}, 2 or die "invalid map\n"; + if (!$name) { + ($cat, $name) = ('table', $cat); + } + + my $row = $groupinfo->{$cat}->{$name} + or die "unknown character group $cat/$name\n"; + my $query = $row->{query}; + + my @map; + for (map { split /[^\d-]/ } $query) { + my @range = split /-/, $_, 2; + m/^[0-9]+$/ or die "Invalid code point $_ in query $query\n" for @range; + push @map, $_ for $range[0] .. ($range[1] // $range[0]); + } + return \@map; + }; + die $@ if $@; + require Unicode::UCD; my $pagerows = 0x200; @@ -78,21 +102,27 @@ if ($font) { EOT say ''; + my $offsetlink = '?' . join('&', + (map { $_ . '=' . EncodeURI($get{$_}) } grep { defined $get{$_} } qw{ map }), + 'q', + ); say "" for join(' ', grep {$_} - $offset > $pagerows && sprintf('◄', 0), + $offset > $pagerows && sprintf('◄', $offsetlink, 0), $offset > 0 && sprintf( - '', - $offset - $pagerows, + '', + $offsetlink, $offset - $pagerows, ), - sprintf('U+%04X', $offset), - Unicode::UCD::charblock($offset), - $offset + $pagerows < 0x11_0000 && sprintf( - '', - $offset + $pagerows, + sprintf('U+%04X', $map ? $map->[$offset] : $offset), + Unicode::UCD::charblock($map ? $map->[$offset] : $offset), + $offset + $pagerows < ($map ? @{$map} : 0x11_0000) && sprintf( + '', + $offsetlink, $offset + $pagerows, ), ); for my $cp ($offset .. $offset+$pagerows-1) { + $cp = $map->[$cp] or next if $map; + state $colpos; my $block = Unicode::UCD::charblock($cp); if ($block ne (state $sameblock = $block) and $block ne 'No_Block') { @@ -104,6 +134,22 @@ EOT $colpos = 0; } + if ($map) { + # compare previous code point and indicate gaps + state $lastcp = 0; + if ($cp != ++$lastcp) { + if (!$colpos or $colpos++ % $pagecols > $pagecols - 3) { + # nearly last column, start new row + $colpos = 0; + } + else { + # mark repositioning in existing row + printf '
$_
%X', $cp; + } + $lastcp = $cp; + } + } + say sprintf '
%X', $cp if $colpos++ % $pagecols == 0; my $info = $glyphs->glyph_info($cp); -- 2.30.0