po: Modularisation of the diff_po.pl script

This commit is contained in:
Kornel Benko 2013-04-27 17:23:58 +02:00
parent 418e884680
commit 2bf7f8c4da
2 changed files with 196 additions and 69 deletions

View File

@ -24,14 +24,22 @@
# License along with this software; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Copyright (c) 1010-2011 Kornel Benko, kornel@lyx.org
# Copyright (c) 2010-2013 Kornel Benko, kornel@lyx.org
#
# TODO:
# 1.) Check for ".git" or ".svn" to decide about revisioning
# 2.) Search for good correlations of deleted <==> inserted string
# using Text::Levenshtein or Algorithm::Diff
BEGIN {
use File::Spec;
my $p = File::Spec->rel2abs( __FILE__ );
$p =~ s/[\/\\]?diff_po\.pl$//;
unshift(@INC, "$p");
}
use strict;
use parsePoLine;
use Term::ANSIColor qw(:constants);
use File::Temp;
@ -74,6 +82,7 @@ if ($ARGV[0] =~ /^-r(.*)/) {
print $tmpfile $l;
}
close(FI);
$tmpfile->seek( 0, SEEK_END ); # Flush()
push(@args, $tmpfile->filename, $argf);
print "===================================================================\n";
&diff_po(@args);
@ -241,74 +250,6 @@ sub printIfDiff($$$)
}
}
sub parse_po_file($$)
{
my ($file, $rMessages) = @_;
if (open(FI, '<', $file)) {
$status = "normal";
$fuzzy = 0;
my $lineno = 0;
while (my $line = <FI>) {
$lineno++;
&parse_po_line($line, $lineno, $rMessages);
}
&parse_po_line("", $lineno + 1, $rMessages);
close(FI);
}
}
sub parse_po_line($$$)
{
my ($line, $lineno, $rMessages) = @_;
chomp($line);
if ($status eq "normal") {
if ($line =~ /^#, fuzzy/) {
$fuzzy = 1;
}
elsif ($line =~ s/^msgid\s+//) {
$foundline = $lineno;
$status = "msgid";
$msgid = "";
&parse_po_line($line);
}
}
elsif ($status eq "msgid") {
if ($line =~ /^\s*"(.*)"\s*/) {
$msgid .= $1;
}
elsif ($line =~ s/^msgstr\s+//) {
$status = "msgstr";
$msgstr = "";
&parse_po_line($line);
}
}
elsif ($status eq "msgstr") {
if ($line =~ /^\s*"(.*)"\s*/) {
$msgstr .= $1;
}
else {
if ($msgid ne "") {
$rMessages->{$msgid}->{line} = $foundline;
$rMessages->{$msgid}->{fuzzy} = $fuzzy;
$rMessages->{$msgid}->{msgstr} = $msgstr;
}
$fuzzy = 0;
$status = "normal";
}
}
else {
die("invalid status");
}
}
sub getLineSortedKeys($)
{
my ($rMessages) = @_;
return sort {$rMessages->{$a}->{line} <=> $rMessages->{$b}->{line};} keys %{$rMessages};
}
sub printExtraMessages($$)
{
my ($type, $rExtra) = @_;

186
po/parsePoLine.pm Normal file
View File

@ -0,0 +1,186 @@
package parsePoLine;
use strict;
our(@EXPORT, @ISA);
BEGIN {
use Exporter ();
@ISA = qw(Exporter);
@EXPORT = qw(parse_po_file getLineSortedKeys);
}
my ($status, $foundline, $msgid, $msgstr, $fuzzy);
my $alternative = 0;
my @entry = ();
my %entries = ();
sub parse_po_file($$)
{
$alternative = 0;
@entry = ();
%entries = ();
my @result = ();
my $resindex = 0;
my ($file, $rMessages) = @_;
if (open(FI, '<', $file)) {
$status = "normal";
$fuzzy = 0;
my $lineno = 0;
while (my $line = <FI>) {
$lineno++;
&parse_po_line($line, $lineno, $rMessages, \@result, \$resindex);
push(@entry, $line);
}
&parse_po_line("", $lineno + 1, $rMessages, \@result, \$resindex);
my @entr1 = @entry;
$result[$resindex] = ["zzzzzzzzzzzz", \@entr1];
close(FI);
}
return(@result);
}
sub parse_po_line($$$$$)
{
my ($line, $lineno, $rMessages, $rresult, $rresindex) = @_;
chomp($line);
if ($status eq "normal") {
if ($line =~ /^#, fuzzy/) {
$fuzzy = 1;
}
elsif ($line =~ s/^msgid\s+//) {
die("line alternate") if ($alternative);
$foundline = $lineno;
$status = "msgid";
$msgid = "";
&parse_po_line($line, $lineno, $rMessages, $rresult, $rresindex);
}
elsif ($line =~ s/^\#\~ msgid\s+//) {
$alternative = 1;
$foundline = $lineno;
$status = "msgid";
$msgid = "";
&parse_po_line($line, $lineno, $rMessages, $rresult, $rresindex);
}
}
elsif ($status eq "msgid") {
if ($line =~ /^\s*"(.*)"\s*/) {
$msgid .= $1;
}
elsif ($line =~ /^\#\~\s*"(.*)"\s*/) {
die("line not alternate") if (! $alternative);
$msgid .= $1;
}
elsif ($line =~ s/^msgstr\s+//) {
$alternative = 0;
$status = "msgstr";
$msgstr = "";
&parse_po_line($line, $lineno, $rMessages, $rresult, $rresindex);
}
elsif ($line =~ s/^\#\~ msgstr\s+//) {
$alternative = 1;
$status = "msgstr";
$msgstr = "";
&parse_po_line($line, $lineno, $rMessages, $rresult, $rresindex);
}
}
elsif ($status eq "msgstr") {
if ($line =~ /^\s*"(.*)"\s*/) {
$msgstr .= $1;
}
elsif ($line =~ /^\#\~\s+"(.*)"\s*/) {
die("line not alternate") if (! $alternative);
$msgstr .= $1;
}
else {
if (!defined($entries{$msgid})) {
my @entr1 = @entry;
$rresult->[${$rresindex}] = [$msgid, \@entr1];
$entries{$msgid} = $msgstr;
}
else {
if ($alternative) {
print "duplicated alternate entry: \"$msgid\"\n";
}
else {
print "duplicated entry: \"$msgid\"\n";
}
print " on line: $foundline\n";
print " original on line: $rMessages->{$msgid}->{line}\n\n";
}
@entry = ();
$rMessages->{$msgid}->{line} = $foundline;
$rMessages->{$msgid}->{fuzzy} = $fuzzy;
$rMessages->{$msgid}->{msgstr} = $msgstr;
$rMessages->{$msgid}->{alternative} = $alternative;
$rMessages->{$msgid}->{entryidx} = ${$rresindex};
${$rresindex} = ${$rresindex}+1;
$fuzzy = 0;
$status = "normal";
}
}
else {
die("invalid status");
}
}
sub getLineSortedKeys($)
{
my ($rMessages) = @_;
return sort {$rMessages->{$a}->{line} <=> $rMessages->{$b}->{line};} keys %{$rMessages};
}
1;
__END__
=pod
=encoding utf8
=head1 NAME
parsePoLine
=head1 SYNOPSIS
use parsePoLine; #imports functions 'parse_po_file() and getLineSortedKeys()'
my %Messages = ();
my @entries = parse_po_file("sk.po", \%Messages);
=head1 DESCRIPTION
This is used to parse a single po-file.
Results:
%Messages The keys in this hash are the msgid-strings
the value is reference to a hash wit following values:
msgstr: the translated string
line: the line-no in the po-file
fuzzy: boolean, if the string is fuzzy
alternative: if set, so this entry is part of help-strings
entryidx: The index in the correspondig @entries array
@entries List of references to 2-valued arrays
[0]: msgid-string
[1]: The sequence of lines from the po-file
belonging to this entry.
To print the whole po-file:
for my $entry (@entries) {
print @{$entry->[1]};
}
To get the index to a known $msgid:
my $entriesidx = $Messages{$msgid}->{entryidx};
=head1 AUTHOR
Kornel Benko <Kornel.Benko@berlin.de>