AozoraBunko-Checkerkun

 view release on metacpan or  search on metacpan

lib/AozoraBunko/Checkerkun.pm  view on Meta::CPAN

package AozoraBunko::Checkerkun;
our $VERSION = "0.12";

use 5.008001;
use strict;
use warnings;
use utf8;

use Carp           qw//;
use File::ShareDir qw//;
use YAML::Tiny     qw//;
use Encode         qw//;
use Lingua::JA::Halfwidth::Katakana;

my $YAML_FILE = File::ShareDir::dist_file('AozoraBunko-Checkerkun', 'hiden_no_tare.yml');
my $YAML = YAML::Tiny->read($YAML_FILE)->[0];
my $ENC = Encode::find_encoding("Shift_JIS");

my %VALID_OUTPUT_FORMAT;
@VALID_OUTPUT_FORMAT{qw/plaintext html/} = ();

# [78hosetsu_tekiyo] 78互換包摂の対象となる不要な外字注記をチェックする
our $KUTENMEN_78HOSETSU_TEKIYO = $YAML->{'kutenmen_78hosetsu_tekiyo'};

# [hosetsu_tekiyo] 包摂の対象となる不要な外字注記をチェックする
our $KUTENMEN_HOSETSU_TEKIYO = $YAML->{'kutenmen_hosetsu_tekiyo'};

# 新JIS漢字で包摂基準の適用除外となる104字
our $JYOGAI = $YAML->{'jyogai'};

# 78互換文字
our $J78 = $YAML->{'j78'};

# 間違えやすい文字
# かとうかおりさんの「誤認識されやすい文字リスト」から
# http://plaza.users.to/katokao/digipr/digipr_charlist.html
our $GONIN1 = $YAML->{'gonin1'};

# 誤認2
our $GONIN2 = $YAML->{'gonin2'};

# 誤認3
# (砂場清隆さんの入力による)
our $GONIN3 = $YAML->{'gonin3'};

# 新字体・旧字体対応リスト
our $KYUJI = $YAML->{'kyuji'};

# 異体字
our $ITAIJI = $YAML->{'itaiji'};

sub _default_options
{
    return {
        'gaiji'            => 1, # JIS外字をチェックする
        'hansp'            => 1, # 半角スペースをチェックする
        'hanpar'           => 1, # 半角カッコをチェックする
        'zensp'            => 0, # 全角スペースをチェックする
        'zentilde'         => 1, # 全角チルダをチェックする
        '78hosetsu_tekiyo' => 1, # 78互換包摂の対象となる不要な外字注記をチェックする
        'hosetsu_tekiyo'   => 1, # 包摂の対象となる不要な外字注記をチェックする
        '78'               => 0, # 78互換包摂29字をチェックする
        'jyogai'           => 0, # 新JIS漢字で包摂規準の適用除外となる104字をチェックする
        'gonin1'           => 0, # 誤認しやすい文字をチェックする(1)
        'gonin2'           => 0, # 誤認しやすい文字をチェックする(2)
        'gonin3'           => 0, # 誤認しやすい文字をチェックする(3)
        'simplesp'         => 0, # 半角スペースは「_」で、全角スペースは「□」で出力する

lib/AozoraBunko/Checkerkun.pm  view on Meta::CPAN

                elsif ($output_format eq 'html')
                {
                    $checked_text .= _tag_html($char, 'gonin1', $GONIN1->{$char});
                }
            }
            elsif ($self->{'gonin2'} && $GONIN2->{$char})
            {
                if ($output_format eq 'plaintext')
                {
                    $checked_text .= $char . '[gonin2](' . $GONIN2->{$char} . ')';
                }
                elsif ($output_format eq 'html')
                {
                    $checked_text .= _tag_html($char, 'gonin2', $GONIN2->{$char});
                }
            }
            elsif ($self->{'gonin3'} && $GONIN3->{$char})
            {
                if ($output_format eq 'plaintext')
                {
                    $checked_text .= $char . '[gonin3](' . $GONIN3->{$char} . ')';
                }
                elsif ($output_format eq 'html')
                {
                    $checked_text .= _tag_html($char, 'gonin3', $GONIN3->{$char});
                }
            }
            elsif ( $self->{'gaiji'} && _is_gaiji($char) )
            {
                # 秘伝のタレに外字が含まれていないことがテストで保証されているのでこの位置で問題ない
                # コントロール文字に外字があるが、コントロール文字なら必ず 'ctrl' とタグ付けされるのでそれで良しとする。
                if ($output_format eq 'plaintext')
                {
                    $checked_text .= $char . '[gaiji]';
                }
                elsif ($output_format eq 'html')
                {
                    $checked_text .= _tag_html($char, 'gaiji', 'JIS外字');
                }
            }
            else { $checked_text .= $char; }
        }
    }

    return $checked_text;
}

1;

__END__

=encoding utf-8

=head1 NAME

AozoraBunko::Checkerkun - 青空文庫の工作員のための文字チェッカー(作:結城浩)をライブラリ化したもの

=head1 SYNOPSIS

  use AozoraBunko::Checkerkun;
  use utf8;

  my $checker1 = AozoraBunko::Checkerkun->new;
  $checker1->check('森※[#「區+鳥」、第3水準1-94-69]外💓'); # => '森※[#「區+鳥」、第3水準1-94-69]→[78hosetsu_tekiyo]【鴎】外💓[gaiji]'
  $checker1->check('森鷗外'); # => '森鷗[gaiji]外'
  $checker1->check('森鴎外'); # => '森鴎外'

  my $checker2 = AozoraBunko::Checkerkun->new({ output_format => 'html', gonin1 => 1, gonin2 => 1, gonin3 => 1 });
  $checker2->check('桂さんが柱を壊した。'); # => '<span data-checkerkun-tag="gonin3" data-checkerkun-message="かつら">桂</span>さんが<span data-checkerkun-tag="gonin3" data-checkerkun-message="はしら">柱</span>を壊した。'

  my $checker3 = AozoraBunko::Checkerkun->new({ kouetsukun => 1 });
  $checker3->check('薮さん'); # => '▼薮藪籔▲さん'

=head1 DESCRIPTION

AozoraBunko::Checkerkun は、青空文庫工作員のための文字チェッカーで、結城浩氏が作成したスクリプトを私がライブラリ化したものです。

大野裕・結城浩・ゼファー生の各氏による旧字体置換可能チェッカー「校閲君」もこのライブラリに組み込まれています。

=head1 METHODS

=head2 $checker = AozoraBunko::Checkerkun->new(\%option)

新しい AozoraBunko::Checkerkun インスタンスを生成します。

  my $checker = AozoraBunko::Checkerkun->new(
      'gaiji'            => 1, # JIS外字をチェックする
      'hansp'            => 1, # 半角スペースをチェックする
      'hanpar'           => 1, # 半角カッコをチェックする
      'zensp'            => 0, # 全角スペースをチェックする
      'zentilde'         => 1, # 全角チルダをチェックする
      '78hosetsu_tekiyo' => 1, # 78互換包摂の対象となる不要な外字注記をチェックする
      'hosetsu_tekiyo'   => 1, # 包摂の対象となる不要な外字注記をチェックする
      '78'               => 0, # 78互換包摂29字をチェックする
      'jyogai'           => 0, # 新JIS漢字で包摂規準の適用除外となる104字をチェックする
      'gonin1'           => 0, # 誤認しやすい文字をチェックする(1)
      'gonin2'           => 0, # 誤認しやすい文字をチェックする(2)
      'gonin3'           => 0, # 誤認しやすい文字をチェックする(3)
      'simplesp'         => 0, # 半角スペースは「_」で、全角スペースは「□」で出力する
      'kouetsukun'       => 0, # 旧字体置換可能チェッカー「校閲君」を有効にする(html出力時は kyuji か itaiji のチェッカー君タグ情報が付きます。)
      'output_format'    => 'plaintext', # 出力フォーマット(plaintext または html)
  );

上記のコードで設定されている値がデフォルト値です。

=head2 $checked_text = $checker->check($text)

new で指定したオプションでテキストをチェックします。戻り値はチェック後のテキストです。

=head1 秘伝のタレ(文字チェック用ハッシュリファレンス)へのアクセス

このモジュールを use すると以下の文字チェック用ハッシュリファレンスへアクセス可能になります。

  # 78互換包摂の対象となる不要な外字注記をチェックする
  $AozoraBunko::Checkerkun::KUTENMEN_78HOSETSU_TEKIYO;

  # 包摂の対象となる不要な外字注記をチェックする
  $AozoraBunko::Checkerkun::KUTENMEN_HOSETSU_TEKIYO;

  # 新JIS漢字で包摂基準の適用除外となる104字
  $AozoraBunko::Checkerkun::JYOGAI;



( run in 1.114 second using v1.01-cache-2.11-cpan-aadc1410aed )