use FileHandle;
use Data::Dumper;
+use List::Util qw(first);
+
$| = 1;
$basedir = "../..";
$bindir = "$basedir/bin/mozilla";
$dbupdir = "$basedir/sql/Pg-upgrade";
+$dbupdir2 = "$basedir/sql/Pg-upgrade2";
$menufile = "menu.ini";
$submitsearch = qr/type\s*=\s*[\"\']?submit/i;
+%referenced_html_files = ();
+
+# Arguments:
+# -v verbose
+# -n no custom files
+# -h extended checks on HTML templates
+
foreach $item (@ARGV) {
$item =~ s/-//g;
$arg{$item} = 1;
}
opendir DIR, "$bindir" or die "$!";
-@progfiles = grep { /\.pl/; !/(_|^\.)/ } readdir DIR;
+@progfiles = grep { /\.pl$/ && !/(_|^\.)/ } readdir DIR;
seekdir DIR, 0;
@customfiles = grep /_/, readdir DIR;
closedir DIR;
@dbplfiles = grep { /\.pl$/ } readdir DIR;
closedir DIR;
+opendir DIR, $dbupdir2 or die "$!";
+@dbplfiles2 = grep { /\.pl$/ } readdir DIR;
+closedir DIR;
+
# slurp the translations in
if (-f 'all') {
require "all";
}
+my %old_texts = %{ $self->{texts} };
+
# Read HTML templates.
#%htmllocale = ();
#@htmltemplates = <../../templates/webpages/*/*_master.html>;
map({ handle_file($_, $bindir); } @progfiles);
map({ handle_file($_, $dbupdir); } @dbplfiles);
+map({ handle_file($_, $dbupdir2); } @dbplfiles2);
sub handle_file {
my ($file, $dir) = @_;
open FH, ">$file" or die "$! : $file";
- print FH q|$self->{texts} = {
+ print FH q|#!/usr/bin/perl
+
+$self->{texts} = {
|;
foreach $key (sort keys %locale) {
open FH, ">all" or die "$! : all";
-print FH q|# These are all the texts to build the translations files.
+print FH q|#!/usr/bin/perl
+
+# These are all the texts to build the translations files.
# The file has the form of 'english text' => 'foreign text',
# you can add the translation in this file or in the 'missing' file
# run locales.pl from this directory to rebuild the translation files
if (@missing) {
open FH, ">missing" or die "$! : missing";
- print FH q|# add the missing texts and run locales.pl to rebuild
+ print FH q|#!/usr/bin/perl
+
+# add the missing texts and run locales.pl to rebuild
$missing = {
|;
}
+@lost = ();
+
+if (-f "lost") {
+ require "lost";
+ unlink "lost";
+}
+
+while (($text, $translation) = each %old_texts) {
+ next if ($alllocales{$text});
+
+ push @lost, { 'text' => $text, 'translation' => $translation };
+}
+
+if (scalar @lost) {
+ splice @lost, 0, (scalar @lost - 50) if (scalar @lost > 50);
+
+ open FH, ">lost";
+ print FH "#!/usr/bin/perl\n\n" .
+ "# The last 50 texts that have been removed.\n" .
+ "# This file will be auto-generated by locales.pl. Do not edit it.\n\n" .
+ "\@lost = (\n";
+
+ foreach $entry (@lost) {
+ $entry->{text} =~ s/\'/\\\'/;
+ $entry->{translation} =~ s/\'/\\\'/;
+ print FH " { 'text' => '$entry->{text}', 'translation' => '$entry->{translation}' },\n";
+ }
+
+ print FH ");\n\n1;\n";
+ close FH;
+}
+
open(FH, "LANGUAGE");
@language = <FH>;
close(FH);
$trlanguage = $language[0];
chomp $trlanguage;
+if ($arg{h}) {
+ search_unused_htmlfiles();
+ search_translated_htmlfiles_wo_master();
+}
+
$per = sprintf("%.1f", ($count - $notext) / $count * 100);
print "\n$trlanguage - ${per}%";
print " - $notext missing" if $notext;
} elsif (($cur_char eq '"') || ($cur_char eq '\'')) {
$inside_string = $cur_char;
- } elsif ($cur_char eq ")") {
+ } elsif (($cur_char eq ")") || ($cur_char eq ',')) {
return ($text, substr($line, $pos + 1));
}
if (/require\s+\W.*\.pl/) {
my $newfile = $&;
$newfile =~ s/require\s+\W//;
- $newfile =~ s/\$form->{path}\///;
+ $newfile =~ s|bin/mozilla||;
# &scanfile("$bindir/$newfile", 0, $scanned_files);
$cached{$file}{scan}{"$bindir/$newfile"} = 1;
} elsif (/use\s+SL::(.*?);/) {
+ my $module = $1;
+ $module =~ s|::|/|g;
# &scanfile("../../SL/${1}.pm", 1, $scanned_files);
- $cached{$file}{scannosubs}{"../../SL/${1}.pm"} = 1;
+ $cached{$file}{scannosubs}{"../../SL/${module}.pm"} = 1;
}
# is this a template call?
- if (/parse_html_template\s*\(\s*[\"\']([\w\/]+)/) {
+ if (/parse_html_template2?\s*\(\s*[\"\']([\w\/]+)\s*[\"\']/) {
my $newfile = "$basedir/templates/webpages/$1_master.html";
+ if (/parse_html_template2/) {
+ print "E: " . strip_base($file) . " is still using 'parse_html_template2' for " . strip_base($newfile) . ".\n";
+ }
if (-f $newfile) {
# &scanhtmlfile($newfile);
# &converthtmlfile($newfile);
$cached{$file}{scanh}{$newfile} = 1;
print "." if $arg{v};
+ } elsif ($arg{h}) {
+ print "W: missing HTML template: " . strip_base($newfile) . " (referenced from " . strip_base($file) . ")\n";
}
}
map { &scanfile($_, 0, $scanned_files) } keys %{$cached{$file}{scan}};
map { &scanfile($_, 1, $scanned_files) } keys %{$cached{$file}{scannosubs}};
map { &scanhtmlfile($_) } keys %{$cached{$file}{scanh}};
+
+ @referenced_html_files{keys %{$cached{$file}{scanh}}} = (1) x scalar keys %{$cached{$file}{scanh}};
}
sub scanmenu {
my $fh = new FileHandle;
open $fh, "$file" or die "$! : $file";
- my @a = grep /^\[/, <$fh>;
+ my @a = grep m/^\[/, <$fh>;
close($fh);
# strip []
sub scanhtmlfile {
local *IN;
-
+
if (!defined $cached{$_[0]}) {
-
+ my %plugins = ( 'loaded' => { }, 'needed' => { } );
+
open(IN, $_[0]) || die $_[0];
my $copying = 0;
while (my $line = <IN>) {
chomp($line);
+ while ($line =~ m/\[\%[^\w]*use[^\w]+(\w+)[^\w]*?\%\]/gi) {
+ $plugins{loaded}->{$1} = 1;
+ }
+
+ while ($line =~ m/\[\%[^\w]*(\w+)\.\w+\(/g) {
+ my $plugin = $1;
+ $plugins{needed}->{$plugin} = 1 if (first { $_ eq $plugin } qw(HTML LxERP JavaScript MultiColumnIterator));
+ }
+
while ("" ne $line) {
if (!$copying) {
if ($line =~ m|<translate>|i) {
}
close(IN);
+
+ foreach my $plugin (keys %{ $plugins{needed} }) {
+ next if ($plugins{loaded}->{$plugin});
+ print "E: " . strip_base($_[0]) . " requires the Template plugin '$plugin', but is not loaded with '[\% USE $plugin \%]'.\n";
+ }
+
&converthtmlfile($_[0]);
}
close(IN);
close(OUT);
}
+
+sub search_unused_htmlfiles {
+ my @unscanned_dirs = ('../../templates/webpages');
+
+ while (scalar @unscanned_dirs) {
+ my $dir = shift @unscanned_dirs;
+
+ foreach my $entry (<$dir/*>) {
+ if (-d $entry) {
+ push @unscanned_dirs, $entry;
+
+ } elsif (($entry =~ /_master.html$/) && -f $entry && !$referenced_html_files{$entry}) {
+ print "W: unused HTML template: " . strip_base($entry) . "\n";
+
+ }
+ }
+ }
+}
+
+sub search_translated_htmlfiles_wo_master {
+ my @unscanned_dirs = ('../../templates/webpages');
+
+ while (scalar @unscanned_dirs) {
+ my $dir = shift @unscanned_dirs;
+
+ foreach my $entry (<$dir/*>) {
+ if (-d $entry) {
+ push @unscanned_dirs, $entry;
+
+ } elsif (($entry =~ /_[a-z]+\.html$/) && ($entry !~ /_master.html$/) && -f $entry) {
+ my $master = $entry;
+ $master =~ s/[a-z]+\.html$/master.html/;
+ if (! -f $master) {
+ print "W: translated HTML template without master: " . strip_base($entry) . "\n";
+ }
+ }
+ }
+ }
+}
+
+sub strip_base {
+ my $s = "$_[0]"; # Create a copy of the string.
+
+ $s =~ s|^../../||;
+ $s =~ s|templates/webpages/||;
+
+ return $s;
+}