mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 21:21:32 +00:00
po: Modularisation of the diff_po.pl script
This commit is contained in:
parent
418e884680
commit
2bf7f8c4da
@ -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
186
po/parsePoLine.pm
Normal 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>
|
Loading…
Reference in New Issue
Block a user