Re: new util method proposition for Maketext

[email protected] (Guillaume Rousse) Thu, 5 Sep 2002 15:31:18 +0200
Newsgroups perl.i18n
Organization Université Pierre et Marie Curie
Message-ID <[email protected]>
I forgot the attachment, sorry :-(

-- 
Guillaume Rousse <[email protected]>
GPG key http://lis.snv.jussieu.fr/~rousse/gpgkey.html
Extended.pm (text/x-perl, 2.1 KB)
# $Id: Extended.pm,v 1.2 2002/09/05 12:15:24 rousse Exp $

package Locale::Maketext::Extended;

use base 'Locale::Maketext';
use Carp;
use strict;

BEGIN {
    unless(defined &DEBUG) {
	*DEBUG = sub () {0}
    }
}

my %genders_cache = ();

# return correct spelling for words before nouns beginning with vowel
sub liaison {
    my ($self, $noun, @alternatives) = @_;

    return $noun unless @alternatives;

    if (@alternatives == 1) {
	return $alternatives[0] . $noun;
    } else {
	return $noun =~ /^[aeiouy]/i ?  $alternatives[1] . $noun : $alternatives[0] . $noun;
    }

}

# return correct spelling for words subject to gender according
sub accord {
    my ($self, $gender, %alternatives) = @_;

    return $gender unless %alternatives;

    return $alternatives{$gender};

}

# return gender for a noun
sub gender {
    my ($self, $noun) = @_;
    croak("genders requires at least one parameter") unless $noun;

    my $class = ref($self);

    $self->_scan_genders() unless (exists $genders_cache{$class});

    my $gender;
    foreach my $genders (@{$genders_cache{$class}}) {
	print "* Looking up \"$noun\" in $genders\n" if DEBUG;
	if (exists $genders->{$noun}) {
	    print "  Found \"$noun\" in $genders\n" if DEBUG;
	    $gender = $genders->{$noun};
	    last;
	} 
    }

    return $gender;
}

# scan all class hierarchy to find genders hashes
sub _scan_genders {
    my $class = ref($_[0]) || $_[0];
    my $seen  = ref($_[1]) ? $_[1] : {};
    print "Genders hashes lookup on $class\n" if DEBUG > 1;
    return $genders_cache{$class} if exists $genders_cache{$class};

    my @list;
    no strict 'refs';

    if( defined( *{$class . '::Genders'}{'HASH'} )) {
	push @list, *{$class . '::Genders'}{'HASH'};
	print "%" . $class . "::Genders contains ", scalar(keys %{$class . '::Genders'}), " entries\n" if DEBUG;
    }

    foreach my $superclass (@{$class . "::ISA"}) {
	print " Super-class search into $superclass\n" if DEBUG;
	next if $seen->{$superclass}++;
	push @list, @{&_scan_genders($superclass, $seen)};
    }

    $genders_cache{$class} = \@list;
    return \@list;
}

sub clear_genders_cache {
    %genders_cache = ();
    return;
}

1;