font: ?q offset by hex value or block name
[sheet.git] / font.plp
index 2af6133da08094172b381f169d80ddebd726dbf7..886792114ba97f74b23ad6c146e0e729ca22ccff 100644 (file)
--- a/font.plp
+++ b/font.plp
@@ -16,9 +16,17 @@ if (my $font = $ENV{PATH_INFO} =~ s{^/}{}r) {
        my ($fontmeta, @cover) = do "ttfsupport/$font.inc.pl";
        $fontmeta or die "Unknown font $font\n";
 
-       my $offset = $get{q} || 0;
-       $offset < 0 and $offset = 0;
+       require Unicode::UCD;
+
        my $size = 0x200;
+       my $offset = eval {
+               local $_ = $get{q} || 0;
+               return $_ if /\A\d+\z/;  # numeric
+               return hex $1 if /\A (?: 0?x | u\W* ) ([0-9a-f]+) \z/ix;  # hexadecimal
+               return $_->[0]->[0] for Unicode::UCD::charblock(ucfirst) || ();  # block
+               die "Unknown offset query '$_'\n";
+       };
+       die $@ if $@;
 
        say "<h1>Font coverage</h1>";
        say "<h2>$_</h2>" for EscapeHTML($fontmeta->{name});