font: file ids and os grouping
authorMischa POSLAWSKY <perl@shiar.org>
Sun, 24 Apr 2011 15:44:04 +0000 (17:44 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Tue, 10 Apr 2012 01:03:24 +0000 (03:03 +0200)
font.plp
tools/convert-ttf.pl

index 9faa9c1..1e1732b 100644 (file)
--- a/font.plp
+++ b/font.plp
@@ -25,15 +25,29 @@ use 5.010;
 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'],
+);
+my @ossel = qw(win95 oss);
+
 my $tables = do 'unicode-table.inc.pl' or die $@ || $!;
 my (%font, @fontlist);
-for my $fontid (qw(d tnr a dv dvs c2k u)) {
-       my ($fontmeta, @fontrange) = do "ttfsupport/$fontid.inc.pl";
-       push @fontlist, $fontid;
-       $font{$fontid} = {
-               -name => $fontmeta->{name},
-               map { (chr $_ => 1) } @fontrange
-       };
+for my $os (@ossel) {
+       my $osfonts = $oslist{$os};
+       for my $fontid (@{$osfonts}) {
+               push @fontlist, $fontid;
+               my ($fontmeta, @fontrange) = do "ttfsupport/$fontid.inc.pl";
+               $fontmeta or next;
+               $font{$fontid} = {
+                       -id   => $fontmeta->{id} || $fontid,
+                       -name => $fontmeta->{name},
+                       map { (chr $_ => 1) } @fontrange
+               };
+       }
 }
 
 my @config = qw(
@@ -47,9 +61,23 @@ $_ and m{/*+(.+)} and @config = split /[ ]/, $1 for $ENV{PATH_INFO}, $get{q};
 for (@config) {
        my ($tablegroup, $tablename) = split m{/}, $_, 2;
 
-       print '<table>';
+       print '<table class=mapped>';
        printf '<caption>%s</caption>', "$tablegroup: $tablename";
        say '';
+       print '<col>' x 3;
+       print "<colgroup span=$_>" for 2, map { scalar @{$oslist{$_}} } @ossel;
+       print '<thead><tr>';
+       print '<td colspan=2>char';
+       print '<td>name';
+       print '<td>di<td>html';
+       printf('<td colspan=%d title="%s">%s',
+               (map {
+                       scalar @{$_},
+                       join(', ', map { $_->{-name} } @font{ @{$_} }),
+               } $oslist{$_}),
+               $_,
+       ) for @ossel;
+       say '</thead>';
        my $table = $tables->{$tablegroup}->{$tablename};
 
        for my $chr (@$table) {
@@ -71,12 +99,14 @@ for (@config) {
                print "<tr><th>$chr\n";
                my $info = $glyphs->glyph_info($codepoint);
                my ($class, $name, $mnem, $html, $string) = @$info;
-               print "<td>$_" for $codepoint, EscapeHTML($name);
+               print "<td>$_" for sprintf('%X', $codepoint), EscapeHTML($name);
                printf '<td class="%s">%s', @$_ for (
                        [$ascii ? 'l0' : defined $mnem ? 'l4' : 'l1', $mnem // ''],
                        [$ascii ? 'l0' : defined $html ? 'l4' : 'l1', $html // ''],
-                       (map { $font{$_}->{$chr} ? [l4 => $font{$_}->{-name}] : [l1 => ''] }
-                               @fontlist),
+                       (map {
+                               !$font{$_}->{-id} ? [l0 => "$_?"] :
+                               $font{$_}->{$chr} ? [l4 => $font{$_}->{-id}] : [l1 => '']
+                       } @fontlist),
                );
        }
        say "</table>\n";
index 3a7cc0e..95b26a0 100755 (executable)
@@ -6,7 +6,8 @@ use warnings;
 use Data::Dump 'pp';
 use Font::TTF::Font;
 
-my ($ttfname, $outfile) = @ARGV;
+my ($ttfuri, $outfile) = @ARGV;
+$ttfuri or die "usage error\n";
 
 for ($outfile || ()) {
        !-e $_ or die "Output file $outfile already exists\n";
@@ -14,12 +15,23 @@ for ($outfile || ()) {
        select $output;
 }
 
+my %FONTID = (
+       'Times New Roman' => 'times',
+       'DejaVu Sans'     => 'dv ss',
+       'DejaVu Serif'    => 'dv serif',
+       'Code2000'        => 'c2k',
+       'GNU Unifont'     => 'guf',
+       'Droid Sans'      => 'droid',
+       'Droid Serif'     => 'droid serif',
+);
+
 {
-       my $ttf = Font::TTF::Font->open($ttfname)
-               or die "Cannot open truetype in $ttfname: $!";
+       my $ttf = Font::TTF::Font->open($ttfuri)
+               or die "Cannot open truetype in $ttfuri: $!";
 
+       my $ttfname = ($ttfuri =~ m{([^/.]+) (?:[.]ttf)? \z}msx)[0];
        my %meta = (
-               filename => $ttfname,
+               source   => $ttfuri,
                name     => $ttf->{name}->read->find_name(4) || $ttfname,
                version  => $ttf->{head}->{fontRevision},
                date     => (map {
@@ -29,6 +41,7 @@ for ($outfile || ()) {
                        }
                } $ttf->{head}->getdate),
        );
+       $meta{id} = $FONTID{ $meta{name} } // lc $ttfname;
        say pp(\%meta), ',';
 
        my $support = $ttf->{cmap}->find_ms->{val};