prefer $@ for eval errors
[sheet.git] / tools / mkttfinfo
1 #!/usr/bin/env perl
2 use 5.010;
3 use strict;
4 use warnings;
5
6 use Data::Dump 'pp';
7 use Font::TTF::Font;
8
9 my ($ttfuri, $outfile) = @ARGV;
10 $ttfuri or die "usage error\n";
11
12 for ($outfile || ()) {
13         open my $output, '>', $_ or die "Cannot write to $outfile: $!\n";
14         select $output;
15 }
16
17 my %FONTID = (
18         'Times New Roman' => 'times',
19         'DejaVu Sans'     => 'dv ss',
20         'DejaVu Serif'    => 'dv serif',
21         'DejaVu Sans Mono'=> 'dv mono',
22         'Code2000'        => 'c2k',
23         'GNU Unifont'     => 'guf',
24         'Droid Sans'      => 'droid',
25         'Droid Serif'     => 'droid serif',
26         'Droid Sans Mono' => 'droid mono',
27 );
28
29 {
30         my $ttf = Font::TTF::Font->open($ttfuri)
31                 or die "Cannot open truetype in $ttfuri: $!";
32
33         my $ttfname = ($ttfuri =~ m{([^/.]+) (?:[.]ttf)? \z}msx)[0];
34         my $ttfmeta = $ttf->{name}->read;
35         my %meta = (
36                 source   => $ttfuri =~ m{(^/usr/.+ | [^/]+) \z}msx,
37                 name     => $ttfmeta->find_name(4) || $ttfname,
38                 revision => $ttf->{head}->{fontRevision},
39                 version  => scalar $ttfmeta->find_name(5),
40                 copyright=> scalar $ttfmeta->find_name(0),
41                 license  => $ttfmeta->find_name(14) || undef,
42                 date     => (map {
43                         $_ && eval {
44                                 require Time::Piece;
45                                 Time::Piece->new($_)->datetime;
46                         }
47                 } $ttf->{head}->getdate),
48         );
49         $meta{id} = $FONTID{ $meta{name} } // lc $ttfname;
50         say pp(\%meta), ',';
51
52         my $support = $ttf->{cmap}->find_ms->{val};
53         warn scalar keys %$support, " characters read from $ttfname\n";
54         say pp(sort { $a <=> $b } keys %$support);
55 }
56
57 __END__
58
59 =head1 NAME
60
61 mkttfinfo - Extract character coverage and metadata in TrueType font
62
63 =head1 SYNOPSIS
64
65     mkttfinfo <font.ttf> [<output.inc.pl>]
66
67 =head1 AUTHOR
68
69 Mischa POSLAWSKY <perl@shiar.org>
70
71 =head1 LICENSE
72
73 Licensed under the GNU Affero General Public License version 3.
74