Lingua-Phonology
view release on metacpan or search on metacpan
Phonology/Symbols.pm view on Meta::CPAN
# Sort diacritics by number of keys.
$self->{DCRINDEX} = [
sort
{
my %a = $self->{DIACRITS}->{$a}->all_values;
my %b = $self->{DIACRITS}->{$b}->all_values;
return keys(%b) <=> keys(%a);
}
keys %{$self->{DIACRITS}}
];
# Also add diacritics to VALINDEX
for (keys %{$self->{DIACRITS}}) {
my %feats = $self->{DIACRITS}->{$_}->all_values;
$self->{VALINDEX}->{$_} = \%feats;
}
return 1;
}
sub loadfile {
my ($self, $file) = @_;
my $parse;
# Loading default symbols
if (not defined $file) {
my $start = tell DATA;
my $string = join '', <DATA>;
eval { $parse = _parse_from_string($string, 'symbols') };
return err $@ if $@;
seek DATA, $start, 0;
}
# Loading an actual file
else {
eval { $parse = _parse_from_file($file, 'symbols') };
if (!$parse) {
return $self->old_loadfile($file);
}
}
$self->_load_from_struct($parse);
}
sub old_loadfile {
my ($self, $file) = @_;
eval { $file = _to_handle($file, '<') };
return err $@ if $@;
err "Deprecated method";
while (<$file>) {
s/#.*$//; # Remove comments
if (/^\s*(\S*)\t+(.*)/) { # General line format
my $symbol = $1;
my @desc = split(/\s+/, $2);
my $proto = Lingua::Phonology::Segment->new( $self->features );
for (@desc) {
if (/(\S+)=(\S+)/) { # Feature defs like coronal=1
$proto->value($1, $2);
}
elsif (/([*+-])?(\S+)/) { # Feature defs like +feature or feature
my $val = $1 ? $1 : 1;
$proto->value($2, $val);
}
}
$self->symbol($symbol => $proto);
}
}
close $file;
$self->{REINDEX} = 1;
}
sub _load_from_struct {
my ($self, $parse) = @_;
while ( my ($sym, $val) = each %$parse ) {
my $proto = new Lingua::Phonology::Segment($self->{FEATURES},
{ map { $_ => $val->{feature}->{$_}->{value} } keys %{$val->{feature}} } );
$self->symbol($sym => $proto);
}
$self->{REINDEX} = 1;
}
sub _to_str {
my $self = shift;
my $href = {};
for ($self->{SYMBOLS}, $self->{DIACRITS}) {
for my $sym (keys %$_) {
my %h = $_->{$sym}->all_values;
for (keys %h) {
$h{$_} = '*' if not defined $h{$_};
$href->{$sym}->{feature}->{$_} = { value => $h{$_} };
}
}
}
return eval { _string_from_struct({ symbols => { symbol => $href } }) };
}
sub spell {
my $self = shift;
my @return = ();
for my $comp (@_) {
return err("Bad argument to spell()") unless _is_seg($comp);
my $winner = $self->score($comp);
push (@return, $winner ? $winner : '_?_');
}
local $" = '';
return wantarray ? @return : "@return";
}
sub score {
my $self = shift;
( run in 4.030 seconds using v1.01-cache-2.11-cpan-54e63673c56 )