Files
Twan van Laarhoven 4ebf0c51ee Build resource file.
Generate expected_locale_keys from cmakefile
2020-04-10 14:23:54 +02:00

106 lines
2.8 KiB
Perl

#! /usr/bin/perl
# Determine the keys that should be in the locale file,
# and the number of arguments the keys should have
use strict;
use File::Find;
if (scalar @ARGV != 2) {
die("Usage: $0 <SRCDIR> <OUTFILE>")
}
my $indir = $ARGV[0];
my $outfile = $ARGV[1];
our %found;
find(\&doit, $indir);
sub arg_count {
return scalar split(/,/,$_[0]);
}
sub make_comment {
my $input = $_[0];
$input =~ s/(_[A-Z])/_COMMENT$1/g;
return $input;
}
# for each .cpp/.hpp file, collect locale calls
sub doit {
my $file = $File::Find::name;
if (!($file =~ /\..pp$/)) {
return;
}
# relative filename
#print "$file\n";
$file =~ s@.*/@@;
# Read file
open F, "< $file";
my $body = join('',<F>);
close F;
# Custom argument expansion
my $inparen;
$inparen = qr/[^()]|\((??{$inparen})*\)/; # recursive paren matching
$body =~ s/format_string\((_[A-Z]+)(_\([^)]+\)),($inparen+)/
$1 . "_" . arg_count($3) . $2
/ge;
$body =~ s/action_name_for[(][^,]*,\s*(_[A-Z]+)(_\([^)]+\))/$1_1$2/g;
# Drop comments, mark found items as 'optional'
$body =~ s@//[^\n]*@ find_locale_calls($&, 1)@ge;
$body =~ s@/\*.*?\*/@find_locale_calls($&, 1)@ge;
find_locale_calls($body, 0);
}
sub find_locale_calls {
my $body = $_[0];
my $in_comment = $_[1];
# Find calls to locale functions
while ($body =~ /_(COMMENT_)?(MENU|HELP|TOOL|TOOLTIP|LABEL|BUTTON|TITLE|TYPE|ACTION|ERROR)_(?:([1-9])_)?\(\s*\"([^\"]+)\"/g) {
my $argc = $3 ? $3 : 0;
if (defined($found{$2}{$4}{'argc'}) && $found{$2}{$4}{'argc'} != $argc) {
print "ERROR: key _$2_($4) used with different arities";
}
$found{$2}{$4}{'opt'} = defined($found{$2}{$4}{'opt'}) ? ($found{$2}{$4}{'opt'} && $in_comment) : $in_comment;
$found{$2}{$4}{'argc'} = $argc;
}
# Also translated:
while ($body =~ m@
( addPanel \((?:[^,]+,){6} # gui/set/window.cpp
)
\s* _ \(\" ([^\"]+) \"\)
@xg
) {
my $key;
($key = $2) =~ s/_/ /g;
foreach my $type ("MENU","HELP","TOOL","TOOLTIP") {
$found{$type}{$key}{'opt'} = $in_comment;
$found{$type}{$key}{'argc'} = 0;
}
}
}
# Now process the items we found, write thea list in MSE reader format
open my $fh, "> $outfile";
print $fh "# This file contains the keys expected to be in MSE locales\n";
print $fh "# It was automatically generated by tools/locale/locale.pl\n";
print $fh "# Generated on " . localtime . "\n\n";
my @types = sort keys %found;
foreach my $type (@types) {
print $fh lc($type) . ":\n";
my @keys = sort keys %{$found{$type}};
foreach my $key (@keys) {
my $argc = $found{$type}{$key}{'argc'};
my $opt = $found{$type}{$key}{'opt'} ? 'optional, ' : '';
print $fh "\t$key: $opt$argc\n";
}
}