[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug#514755: po4a: enhance --previous with wdiff script



Hi,

(Javier, embedded question for you)

On Sat, Feb 14, 2009 at 06:44:12PM +0900, osamu@debian.org wrote:
> Hi,
> 
> On Wed, Feb 11, 2009 at 12:43:10AM +0100, Nicolas François wrote:
> > Hello,
> > 
> > On Wed, Feb 11, 2009 at 01:04:50AM +0900, Osamu Aoki wrote:
> > 
> > [talking about Javier's script which allows to see differences based on
> > the strings added by --previous]
> > 
> > > I think this should be inclided as an example helper script or even integrated
> > > into additional --previous functionality.  wdiff makes good sense in many
> > > cases!  
> > I would prefer this feature to be included in PO editors.
> > I also know that editors are working on supporting the previous string
> > (lokalize does it, it is planned for virtaal, see also
> > http://techbase.kde.org/Localization/Tools/Pology/PO_Embedded_Diffing)
> 
> That is certainly clean and nice approach but old furt like me are stack
> with using vim to edit po files :-)  Please do not forget us.
> 
> > Also, it is not directly related to po4a.
> 
> Well it is directly related to data generated and used by po4a.

It is not only po4a, because it's a gettext feature. It could be used by
any PO file generated by gettext (just add --previous to msgmerge).

But since it's useful, let's package it.

> > On the other hand, if this script is useful for others, I can package it
> > (either in po4a, po-debconf, or translate-toolkit)
> 
> This may be part of translate-toolkit if this can be integrated into it.
> (but I think this is not something you ship as normal Debian command and
> more appropriate as user script)

I will try to hack something in pofilter.
It might be even more useful (I mean for old furt who use vim;), since you
will see this in your editor while editing the message.

> This is po4a specific and appropriate as example script for user. 

Let's package it as an example (and this will probably be much faster than
my pofilter patch)


I made some changes to the last Javier's script:

 * Add a Copyright and GPL header

   Javier, do you agree?

 * Support plurals (well, not really useful for po4a, but it's not so
   difficult).
   (Note that context may also have to be diffed)

 * Use File::Temp

 * Support single lines (mesage on the msgid line)

 * Do not output the translation. (Was it intended?)

 * Do not send the diff to less (should I allow passing options to wdiff,
   like -a ?)

New version attached.

Best Regards,
-- 
Nekral
#!/usr/bin/perl -w
use strict;
use warnings;

# Copyright 2009 by Javier Fernández-Sanguino Peña <jfs@debian.org>
#
# 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 program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA



# Quick and dirty script to compare two msgids (when using PO files
# generated with --previous) with wdiff to find the differences between
# them.
# Usage: perl compare-msgids.pl < XX.po


use File::Temp;

my $DIFF1 = new File::Temp(TEMPLATE => "compare-msgids.XXXXXX");
my $DIFF2 = new File::Temp(TEMPLATE => "compare-msgids.XXXXXX");

my $fileh="";

my $diffblock = 0; # Does the current block has a --previous string?
my $nowrap = 0;    # Can the current be rewrapped?
my $ref = "";      # Line reference for the current block

while (my $line = <STDIN>) {
    $fileh="";
    chomp $line;

    $ref .= $line."\n" if $line =~ /^#: /;
    $ref = "" if ($line eq "");

    if ( $diffblock and $line =~ /^msgstr/ ) {
        $diffblock = 0;
        $nowrap = 0;
        print $DIFF1 "\n\n";
        print $DIFF2 "\n\n";
    }
    $diffblock = 1 if ( $line =~ /^\#\| msgid/ ) ;
    $nowrap = 1 if ( $line =~ /^#,.*no-wrap/ ) ;

    if ($diffblock) {
        if (length $ref) {
            print $DIFF1 $ref."\n";
            print $DIFF1 $ref."\n";
            print $DIFF2 $ref."\n";
            $ref = "";
        }
        $fileh = $DIFF1 if ( $line =~ /^\#\| msgid/ ) ;
        $fileh = $DIFF1 if ( $line =~ /^\#\| "/ ) ;
        $fileh = $DIFF2 if ( $line =~ /^msgid/ ) ;
        $fileh = $DIFF2 if ( $line =~ /^"/ ) ;

        if ($fileh ne "") {
            $line =~ s/^\#\| //;

            print $fileh "\n" if ( $line =~ /^msgid_plural "/);

            $line =~ s/^"//;
            $line =~ s/^msgid "//;
            $line =~ s/^msgid_plural "//;
            $line =~ s/"$//;

            print $fileh $line;
            print $fileh "\n" if ($nowrap and $line =~ m/\\n$/);
        }
    }
}

close $DIFF1; close $DIFF2;

system ("wdiff", "-3", $DIFF1->filename, $DIFF2->filename)
    or die "Failed to run wdiff.";


exit;

Reply to: