blob: 123de3614755f5a8f982ee2c3e449d9c0f29d39f [file] [log] [blame]
#!/usr/bin/perl -w
##################
# * __________ __ ___.
# * Open \______ \ ____ ____ | | _\_ |__ _______ ___
# * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
# * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
# * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
# * \/ \/ \/ \/ \/
# * Copyright (C) 2020 Solomon Peachy
# *
# * This program is free software; you can redistribute it and/or
# * modify it under the terms of the GNU General Public License
# * as published by the Free Software Foundation; either version 2
# * of the License, or (at your option) any later version.
# *
# * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# * KIND, either express or implied.
# *
##################################
use strict;
use feature 'unicode_strings';
binmode(STDOUT, ":utf8");
my @langs;
my @fonts;
my %fontchars;
my %langchars;
my %missing;
sub fontcoverage($) {
my ($font) = @_;
open(FILE, "<rockbox/fonts/$font") || die ("can't open $font!\n");
while(<FILE>) {
if (/^ENCODING\s+(\d+)\s*/) {
$fontchars{$font}{chr($1)} = $1;
}
}
close(FILE);
}
sub langcoverage($) {
my ($lang) = @_;
open(FILE, "<rockbox/apps/lang/$lang") || die ("can't open $lang!\n");
binmode(FILE, ":utf8");
my $indest = 0;
while(<FILE>) {
if (/^\s*<dest>\s*$/) {
$indest = 1;
} elsif (/^\s*<\/dest>\s*$/) {
$indest = 0;
} elsif ($indest) {
if (/\s*\S*\s*:\s*"(\S*)"\s*/u) {
next if ($1 eq "none");
foreach my $char (split(//, $1)) {
if (!defined($langchars{$lang}{$char})) {
$langchars{$lang}{$char} = 0;
}
$langchars{$lang}{$char}++;
}
}
}
}
close(FILE);
}
sub calccoverage($$) {
my ($lang, $font) = @_;
my $total = 0;
my $covered = 0;
my $str = "";
foreach my $l (sort(keys(%{$langchars{$lang}}))) {
next if ($l eq " ");
$str .= $l;
$total++;
#$total += $langchars{$lang}{$l};
if (defined($fontchars{$font}{$l})) {
$covered++;
#$covered += $langchars{$lang}{$l};
} else {
$missing{$font}{$lang}{$l} = 1;
}
}
# return "$covered/$total - '$str'";
return $covered/$total;
}
###################
# Populate font and language lists
opendir(DIR, "rockbox/apps/lang");
@langs = grep(/\.lang$/,readdir(DIR));
closedir(DIR);
opendir(DIR, "rockbox/fonts");
@fonts = grep(/\.bdf$/,readdir(DIR));
closedir(DIR);
# Generate coverage maps
foreach my $x (@fonts) {
fontcoverage($x);
}
foreach my $x (@langs) {
langcoverage($x);
}
# Geneate INI files
# (standard summary)
foreach my $lang (sort(@langs)) {
$lang =~ /(.*)\.lang/;
print "[$1]\n";
foreach my $font (sort(@fonts)) {
my $coverage = calccoverage($lang, $font);
$font =~/(.*).bdf/;
printf " $1 = %1.6f\n", $coverage;
}
}
# (missing)
#foreach my $lang (sort(@langs)) {
# print "[missing|$lang]\n";
# foreach my $font (sort(@fonts)) {
# my $str = "";
# foreach my $missing (keys(%{$missing{$font}{$lang}})) {
# $str .= "'$missing' (u+".ord($missing).") ";
# }
# print " $font = $str\n" if ($str);
# }
#}