1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00

Locale::PO now preserves unrecognized flags, although there is still

no documented way to access them.  It also preserves the order of
flags, if no flags are modified.
  Replaced the fuzzy, c_format, and php_format fields with _flaghash,
and renamed the _flag field to _flagstr.
  Flag-setting functions silently map unsupported values (e.g. 42) to
supported ones (e.g. 1), which they also return.
  The c_format and php_format methods treat empty strings as undef,
rather than as 0.
  Names of flags are case-sensitive, like in GNU Gettext.

POD changes:
  Unlisted the bugs that have now been fixed.
This commit is contained in:
Kalle Olavi Niemitalo 2006-02-18 20:30:40 +02:00 committed by Kalle Olavi Niemitalo
parent 4217f2c555
commit 3251644dcf

View File

@ -25,9 +25,18 @@ use fields
qw(_msgid_begin_lineno _msgstr_begin_lineno), qw(_msgid_begin_lineno _msgstr_begin_lineno),
# Multiline strings excluding the trailing newline and comment # Multiline strings excluding the trailing newline and comment
# markers, or undef if there are no such lines. # markers, or undef if there are no such lines.
qw(comment automatic reference _flag), qw(comment automatic reference),
# Flags; see the accessors with the same names. # Named flags. These are kept in two formats:
qw(fuzzy c_format php_format _obsolete); # - $self->{'_flaghash'} is undef Locale::PO has not yet parsed the flags.
# Otherwise, it refers to a hash where the keys are names of flags that
# have been set, and the values are all 1. (The hash can be empty.)
# - $self->{'_flagstr'} is undef if there are no flags; or a string in the
# same format as $self->{'automatic'}; or a reference to the same hash as
# $self->{'_flaghash'} if Locale::PO has changed a flag and not yet
# reformatted the flags as a string.
qw(_flagstr _flaghash),
# 1 if the entry is obsolete; undef if not.
qw(_obsolete);
#use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); #use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
#use locale; #use locale;
@ -156,9 +165,101 @@ sub reference {
@_ ? $self->{'reference'} = shift: $self->{'reference'}; @_ ? $self->{'reference'} = shift: $self->{'reference'};
} }
# Methods whose names begin with "_" may be changed or removed in
# future versions.
sub _update_flaghash {
my Locale::PO $self = shift;
if (!defined($self->{'_flaghash'})) {
my @flags;
@flags = split(/[\s,]+/, $self->{'_flagstr'})
if defined $self->{'_flagstr'};
$self->{'_flaghash'} = { map { $_ => 1 } @flags };
}
}
# Methods whose names begin with "_" may be changed or removed in
# future versions.
sub _update_flagstr {
my Locale::PO $self = shift;
if (ref($self->{'_flagstr'}) eq 'HASH') {
# GNU Gettext seems to put the "fuzzy" flag first.
# Do the same here, in case someone's relying on it.
# However, the other flags will be sorted differently.
my %flags = %{$self->{'_flagstr'}};
my @flags = ();
push @flags, 'fuzzy' if delete $flags{'fuzzy'};
push @flags, sort { $a cmp $b } keys %flags;
$self->{'_flagstr'} = (@flags ? join(', ', @flags) : undef);
}
}
# Methods whose names begin with "_" may be changed or removed in
# future versions.
sub _flag {
my Locale::PO $self = shift;
my $name = shift;
$self->_update_flaghash();
if (@_) { # set or clear the flag
$self->{'_flagstr'} = $self->{'_flaghash'};
if (shift) {
$self->{'_flaghash'}{$name} = 1;
return 1;
}
else {
delete $self->{'_flaghash'}{$name};
return "";
}
}
else { # check the flag
return exists $self->{'_flaghash'}{$name};
}
}
# Methods whose names begin with "_" may be changed or removed in
# future versions.
sub _tristate {
my Locale::PO $self = shift;
my $name = shift;
$self->_update_flaghash();
if (@_) { # set or clear the flags
$self->{'_flagstr'} = $self->{'_flaghash'};
my $val = shift;
if (!defined($val) || $val eq "") {
delete $self->{'_flaghash'}{"$name"};
delete $self->{'_flaghash'}{"no-$name"};
return undef;
}
elsif ($val) {
$self->{'_flaghash'}{"$name"} = 1;
delete $self->{'_flaghash'}{"no-$name"};
return 1;
}
else {
delete $self->{'_flaghash'}{"$name"};
$self->{'_flaghash'}{"no-$name"} = 1;
return 0;
}
}
else { # check the flags
return 1 if $self->{'_flaghash'}{"$name"};
return 0 if $self->{'_flaghash'}{"no-$name"};
return undef;
}
}
sub fuzzy { sub fuzzy {
my Locale::PO $self = shift; my Locale::PO $self = shift;
@_ ? $self->{'fuzzy'} = shift: $self->{'fuzzy'}; return $self->_flag('fuzzy', @_);
}
sub c_format {
my Locale::PO $self = shift;
return $self->_tristate('c-format', @_);
}
sub php_format {
my Locale::PO $self = shift;
return $self->_tristate('php-format', @_);
} }
sub obsolete { sub obsolete {
@ -166,16 +267,6 @@ sub obsolete {
@_ ? $self->{_obsolete} = shift : $self->{_obsolete}; @_ ? $self->{_obsolete} = shift : $self->{_obsolete};
} }
sub c_format {
my Locale::PO $self = shift;
@_ ? $self->{'c_format'} = shift: $self->{'c_format'};
}
sub php_format {
my Locale::PO $self = shift;
@_ ? $self->{'php_format'} = shift: $self->{'php_format'};
}
# Methods whose names begin with "_" may be changed or removed in # Methods whose names begin with "_" may be changed or removed in
# future versions. # future versions.
sub _normalize_str { sub _normalize_str {
@ -208,27 +299,15 @@ sub _normalize_str {
sub dump { sub dump {
my Locale::PO $self = shift; my Locale::PO $self = shift;
my $dump; my $dump;
$dump = $self->_dump_multi_comment( $self->comment, "# " ) $dump .= $self->_dump_multi_comment( $self->comment, "# " )
if defined( $self->comment ); if defined( $self->comment );
$dump .= $self->_dump_multi_comment( $self->automatic, "#. " ) $dump .= $self->_dump_multi_comment( $self->automatic, "#. " )
if defined( $self->automatic ); if defined( $self->automatic );
$dump .= $self->_dump_multi_comment( $self->reference, "#: " ) $dump .= $self->_dump_multi_comment( $self->reference, "#: " )
if defined( $self->reference ); if defined( $self->reference );
my $flags = ''; $self->_update_flagstr();
$flags .= ", fuzzy" if $self->fuzzy; $dump .= $self->_dump_multi_comment( $self->{'_flagstr'}, "#, " )
$flags .= ", c-format" if defined( $self->{'_flagstr'} );
if ( defined( $self->c_format )
and $self->c_format );
$flags .= ", no-c-format"
if ( defined( $self->c_format )
and !$self->c_format );
$flags .= ", php-format"
if ( defined( $self->php_format )
and $self->php_format );
$flags .= ", no-php-format"
if ( defined( $self->php_format )
and !$self->php_format );
$dump .= "#$flags\n" if length $flags;
$dump .= "msgid " . $self->_normalize_str( $self->msgid ); $dump .= "msgid " . $self->_normalize_str( $self->msgid );
$dump .= "msgid_plural " . $self->_normalize_str( $self->msgid_plural ) $dump .= "msgid_plural " . $self->_normalize_str( $self->msgid_plural )
if $self->msgid_plural; if $self->msgid_plural;
@ -349,14 +428,6 @@ sub load_file_asarray {
unless defined $po->{msgstr}; unless defined $po->{msgstr};
} }
my @flags;
@flags = split(/[\s,]+/, $po->{_flag}) if defined $po->{_flag};
$po->fuzzy(1) if grep( /^fuzzy$/i, @flags);
$po->c_format(1) if grep( /^c-format$/i, @flags);
$po->c_format(0) if grep( /^no-c-format$/i, @flags);
$po->php_format(1) if grep( /^php-format$/i, @flags);
$po->php_format(0) if grep(/^no-php-format$/i, @flags);
push( @entries, $po); push( @entries, $po);
$po = undef; $po = undef;
$last_buffer = undef; $last_buffer = undef;
@ -381,7 +452,7 @@ sub load_file_asarray {
my $comment; my $comment;
if ($1 eq "") { $comment = \$po->{comment} } if ($1 eq "") { $comment = \$po->{comment} }
elsif ($1 eq ",") { $comment = \$po->{_flag} } elsif ($1 eq ",") { $comment = \$po->{_flagstr} }
elsif ($1 eq ".") { $comment = \$po->{automatic} } elsif ($1 eq ".") { $comment = \$po->{automatic} }
elsif ($1 eq ":") { $comment = \$po->{reference} } elsif ($1 eq ":") { $comment = \$po->{reference} }
else { warn "Bug: did not recognize '$1'"; next LINE } else { warn "Bug: did not recognize '$1'"; next LINE }
@ -946,6 +1017,16 @@ Never write C<< CZ<><Locale::PO> >>; it looks bad in B<pod2text>.
Documented that C<msgstr> normally returns C<undef> if there are plurals. Documented that C<msgstr> normally returns C<undef> if there are plurals.
Documented the new methods C<msgid_begin_lineno> and C<msgstr_begin_lineno>. Documented the new methods C<msgid_begin_lineno> and C<msgstr_begin_lineno>.
=item Z<>2006-02-28 Kalle Olavi Niemitalo <kon@iki.fi>
Locale::PO now preserves unrecognized flags, although there is still no documented way to access them. It also preserves the order of flags, if no flags are modified. Replaced the C<fuzzy>, C<c_format>, and C<php_format> fields with C<_flaghash>, and renamed the C<_flag> field to C<_flagstr>.
Flag-setting functions silently map unsupported values (e.g. 42) to supported ones (e.g. 1), which they also return.
The C<c_format> and C<php_format> methods treat empty strings as C<undef>, rather than as 0.
Names of flags are case-sensitive, like in GNU Gettext.
POD changes:
Unlisted the bugs that have now been fixed.
=back =back
=head1 COPYRIGHT AND LICENSE =head1 COPYRIGHT AND LICENSE
@ -959,18 +1040,6 @@ redistribute it and/or modify it under the same terms as Perl itself.
If you C<load_file> then C<save_file>, the output file may have slight If you C<load_file> then C<save_file>, the output file may have slight
cosmetic differences from the input file (an extra blank line here or there). cosmetic differences from the input file (an extra blank line here or there).
The C<c_format> and C<php_format> methods are documented: "1 implies
c-format, 0 implies no-c-format, and blank or undefined implies
neither." However, the implementation seems to treat empty strings
the same as 0.
Locale::PO discards the "#," flags it does not recognize.
Unrecognized flags should be preserved; perhaps the order of flags
should also be preserved.
Names of flags are case-insensitive in Locale::PO but case-sensitive
in GNU Gettext.
The C<quote> and C<dequote> methods assume Perl knows the encoding The C<quote> and C<dequote> methods assume Perl knows the encoding
of the string. If it doesn't, they'll treat each 0x5C byte as a of the string. If it doesn't, they'll treat each 0x5C byte as a
backslash even if it's actually part of a multibyte character. backslash even if it's actually part of a multibyte character.