読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

Acme::SuddenlyDeathのリファクタリング

拙作モジュールAcme::SuddenlyDeathを, 複数行の文字列に対応すべくいろいろ書き直していました.

suddenly_death("Acme::SuddenlyDEath\n突然の死");

で,

_人人人人人人人人人人_
> Acme::SuddenlyDeath <
>       突然の死      <
 ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

こういうのが出せるようになります. 多分.

それに伴い, 従来はsuddenly_deathとsuddenly_death_singleの両方に書かれていたAA生成部を, _geneartorという関数に括りだしてみた... んですが, なんか微妙な感じに.

sub _generator {
    my $decoded_str = shift;
    my @decoded_lines = split /\n/, $decoded_str;

    my $max_length = 0;
    $max_length = $_ > $max_length ? $_ : $max_length
        for map {Text::VisualWidth::UTF8::width($_)} @decoded_lines;

    my $ascii = [];
    my $frame_length = ($max_length + 2) / 2;
    push @{$ascii}, '_' . '人' x $frame_length . '_';
    for my $line (@decoded_lines) {
        my $str_length = $max_length - Text::VisualWidth::UTF8::width($line);
        my ($left, $right) = map{' ' x $_} ($str_length / 2, $str_length / 2);

        $left = $str_length % 2 != 0 ? $left . ' ' : $left;
        push @{$ascii}, '> ' . $left . $line . $right . ' <';
    }
    push @{$ascii}, ' ̄' . '^Y' x ($frame_length - 1) . '^ ̄';

    return $ascii;
}

うーん... とりあえず, いい感じの変数名を付けるセンスが欲しいです.

あと, テストがコケまくってるのも対処しないといけませんね...!