Acme-Shukugawa-Atom

 view release on metacpan or  search on metacpan

lib/Acme/Shukugawa/Atom.pm  view on Meta::CPAN

            } elsif ($yomi) {
                $ret .= $self->atomize($yomi) || $surface;
            } else {
                $ret .= $surface;
            }
        }
    }
    $$strref = $ret;
}

sub postprocess {}

# シースールール
# 寿司→シースー
# ン、が最後だったらひっくり返さない
sub apply_shisu_rule
{
    my ($self, $yomi) = @_;
    return $yomi if $yomi =~ s{^($RE_SYLLABLE)($RE_SYLLABLE)$}{
        my ($a, $b) = ($1, $2);
        $a =~ s/ー$//;
        $b =~ s/ー$//;
        "${b}ー${a}ー";
    }e;
    return;
}

# ワイハールール
# ハワイ→ワイハー
sub apply_waiha_rule
{
    my ($self, $yomi) = @_;

# warn "WAIHA $yomi";
    if ($yomi =~ s/^(${RE_SYLLABLE}[$RE_NBAR]?)([^$RE_NBAR].)$/$2$1/) {
        $yomi =~ s/(^.[^ー].*[^ー])$/$1ー/;
        return $yomi;
    }
    return;
}

# クリビツルール
# びっくり→クリビツ
sub apply_kuribitsu_rule
{
    my ($self, $yomi) = @_;

# warn "KURIBITSU $yomi";
    if ($yomi =~ s/^(${RE_SYLLABLE}.)([^$RE_NBAR]${RE_SYLLABLE}$)/$2$1/) {
        return $yomi;
    }
    return;
}

sub atomize
{
    my ($self, $yomi) = @_;
    $yomi =~ s/ー+/ー/g;

    # Length
    my $word_length = length($yomi);
    my $length = $word_length - ($yomi =~ /$RE_SMALL/g);
    if ($length == 3 && $yomi =~ s/^(${RE_SYLLABLE})ッ/${1}ツ/) {
# warn "Special rule!";
        $length = 4;
    }
    my $done = 0;

# warn "$yomi LENGTH: $length";
    if ($length == 2) {
        my $tmp = $self->apply_shisu_rule($yomi);
        if ($tmp) {
            $yomi = $tmp;
            $done = 1;
        }
    }

    if ($length == 3) {
        my $tmp = $self->apply_waiha_rule($yomi);
        if ($tmp) {
            $yomi = $tmp;
            $done = 1;
        }
    }

    if ($length == 4) { # 4 character words tend to have special xformation
        my $tmp = $self->apply_kuribitsu_rule($yomi);
        if ($tmp) {
            $yomi = $tmp;
            $done = 1;
        }
    }

    if (! $done) {
        $yomi =~ s/(.(?:ー+)?)$//;
        $yomi = $1 . $yomi;
    }

    $yomi =~ s/ッ$/ツ/;
    return $yomi;
}


1;

__END__

=encoding UTF-8

=head1 NAME

Acme::Shukugawa::Atom - ギロッポンにテッペンでバミった

=head1 SYNOPSIS

  use Acme::Shukugawa::Atom;
  my $newstring = Acme::Shukugawa::Atom->translate($string);

  # By default, share/config.yaml is used (via File::ShareDir) for custom
  # fixed replacements. You can however override this by specifying the
  # alternate config filename at load time
  BEGIN
  {
    $Acme::Shukugawa::Atom::CONFIG = '/path/to/config.yaml';
  }
  use Acme::Shukugawa::Atom;
  
  # Or you can specify them (on top of the default words) at run time
  my $atom = Acme::Shukugawa::Atom->new(
    # The default values are stored in @Acme::Shukugawa::Atom::DEFAULT_WORDS
    custom_words => [
      'regexp1' => 'replacement1'
      'regexp2' => 'replacement2'
      'regexp3' => 'replacement3'
      'regexp4' => 'replacement4'
      ....
    ]
  );
  my $newstring = $atom->translate($string);

  # shorter way
  my $newstring = Acme::Shukugawa::Atom->translate($string,
    custom_words => [ ... ]
  );

=head1 DESCRIPTION



( run in 1.269 second using v1.01-cache-2.11-cpan-364913b4093 )