AozoraBunko-Checkerkun

 view release on metacpan or  search on metacpan

MANIFEST  view on Meta::CPAN

Build.PL
Changes
LICENSE
META.json
README.md
author/bench.pl
author/bench.txt
author/cp932-utf8.pl
author/cp932-utf8.txt
author/euc2utf8.pl
author/sjis2utf8.pl
cpanfile
lib/AozoraBunko/Checkerkun.pm
minil.toml
share/hiden_no_tare.yml
t/00_compile.t
t/01_basic.t
t/02_options.t
t/03_html_output.t
t/04_kouetsu.t
t/09_duplication.t

README.md  view on Meta::CPAN

# NAME

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

# 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 });

author/bench.pl  view on Meta::CPAN

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use Encode    qw//;
use Benchmark qw/cmpthese/;

my $ENC  = Encode::find_encoding("Shift_JIS");
my $char = '💓';

cmpthese(-1, {
    'is_gaijiA', sub { is_gaijiA($char) },
    'is_gaijiB', sub { is_gaijiB($char) },
});

author/cp932-utf8.pl  view on Meta::CPAN

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use open OUT => qw/:utf8 :std/;
use feature     qw/say/;
use Encode      qw//;

my %CP932;
my %SJIS;

my $ENC_CP932 = Encode::find_encoding("CP932");
my $ENC_SJIS  = Encode::find_encoding("Shift_JIS");

for my $dec ( hex('0') .. hex('10FFFF') ) # サロゲート文字を含んでいる

author/euc2utf8.pl  view on Meta::CPAN

#!/usr/bin/env perl

# Usage: ./euc2utf8.pl < input_filename > output_filename

use strict;
use warnings;
use Encode qw//;

local $_ = do { local $/; <> };
$_ = Encode::decode('euc-jp', $_, Encode::FB_WARN);
print Encode::encode('utf-8', $_, Encode::FB_WARN);

author/sjis2utf8.pl  view on Meta::CPAN

#!/usr/bin/env perl

# Usage: ./sjis2utf8.pl < input_filename > output_filename

use strict;
use warnings;
use Encode qw//;

local $_ = do { local $/; <> };
$_ = Encode::decode('cp932', $_, Encode::FB_WARN);
print Encode::encode('utf-8', $_, Encode::FB_WARN);

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");

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


=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 });

t/01_basic.t  view on Meta::CPAN

use strict;
use warnings;
use utf8;
use AozoraBunko::Checkerkun;
use Test::More;
use Test::Fatal;
binmode Test::More->builder->$_ => ':utf8' for qw/output failure_output todo_output/;

can_ok('AozoraBunko::Checkerkun', qw/new check/);

my %option = (
    'gaiji'            => 1, # JIS外字をチェックする
    'hansp'            => 1, # 半角スペースをチェックする
    'hanpar'           => 1, # 半角カッコをチェックする
    'zensp'            => 0, # 全角スペースをチェックする
    'zentilde'         => 1, # 全角チルダをチェックする
    '78hosetsu_tekiyo' => 1, # 78互換包摂の対象となる不要な外字注記をチェックする

t/02_options.t  view on Meta::CPAN

use strict;
use warnings;
use utf8;
use AozoraBunko::Checkerkun;
use Encode qw//;
use Test::More;
use Test::Fatal;
binmode Test::More->builder->$_ => ':utf8' for qw/output failure_output todo_output/;

my %option = (
    'gaiji'            => 0, # JIS外字をチェックする
    'hansp'            => 0, # 半角スペースをチェックする
    'hanpar'           => 0, # 半角カッコをチェックする
    'zensp'            => 0, # 全角スペースをチェックする
    'zentilde'         => 0, # 全角チルダをチェックする
    '78hosetsu_tekiyo' => 0, # 78互換包摂の対象となる不要な外字注記をチェックする
    'hosetsu_tekiyo'   => 0, # 包摂の対象となる不要な外字注記をチェックする
    '78'               => 0, # 78互換包摂29字をチェックする

t/03_html_output.t  view on Meta::CPAN

use strict;
use warnings;
use utf8;
use AozoraBunko::Checkerkun;
use Test::More;
binmode Test::More->builder->$_ => ':utf8' for qw/output failure_output todo_output/;

my %option = (
    'gaiji'            => 0, # JIS外字をチェックする
    'hansp'            => 0, # 半角スペースをチェックする
    'hanpar'           => 0, # 半角カッコをチェックする
    'zensp'            => 0, # 全角スペースをチェックする
    'zentilde'         => 0, # 全角チルダをチェックする
    '78hosetsu_tekiyo' => 0, # 78互換包摂の対象となる不要な外字注記をチェックする
    'hosetsu_tekiyo'   => 0, # 包摂の対象となる不要な外字注記をチェックする
    '78'               => 0, # 78互換包摂29字をチェックする

t/04_kouetsu.t  view on Meta::CPAN

use strict;
use warnings;
use utf8;
use AozoraBunko::Checkerkun;
use Test::More;
binmode Test::More->builder->$_ => ':utf8' for qw/output failure_output todo_output/;

my %option = (
    'gaiji'            => 0, # JIS外字をチェックする
    'hansp'            => 0, # 半角スペースをチェックする
    'hanpar'           => 0, # 半角カッコをチェックする
    'zensp'            => 0, # 全角スペースをチェックする
    '78hosetsu_tekiyo' => 0, # 78互換包摂の対象となる不要な外字注記をチェックする
    'hosetsu_tekiyo'   => 0, # 包摂の対象となる不要な外字注記をチェックする
    '78'               => 0, # 78互換包摂29字をチェックする
    'jyogai'           => 0, # 新JIS漢字で包摂規準の適用除外となる104字をチェックする

t/09_duplication.t  view on Meta::CPAN

use strict;
use warnings;
use utf8;
use AozoraBunko::Checkerkun;
use Test::More;
binmode Test::More->builder->$_ => ':utf8' for qw/output failure_output todo_output/;

subtest 'duplication check for all hiden_no_tare chars' => sub {
    plan skip_all => 'duplications are allowed'; # 複数のタグをつけることで対処する

    my @key_list = (
        keys %{$AozoraBunko::Checkerkun::JYOGAI}
      , keys %{$AozoraBunko::Checkerkun::J78}
      , keys %{$AozoraBunko::Checkerkun::GONIN1}
      , keys %{$AozoraBunko::Checkerkun::GONIN2}
      , keys %{$AozoraBunko::Checkerkun::GONIN3}

t/10_control_chars_not_gaiji.t  view on Meta::CPAN

use strict;
use warnings;
use utf8;
use AozoraBunko::Checkerkun;
use Test::More;
binmode Test::More->builder->$_ => ':utf8' for qw/output failure_output todo_output/;

my @codepoint_list = (
      hex('0000') .. hex('0009')
    , hex('000B') .. hex('000C')
    , hex('000E') .. hex('001F')
    , hex('007F') .. hex('009F')
);

subtest 'check gaiji' => sub {
    plan skip_all => 'control chars are allowd since they are marked as "ctrl"';

t/20_jis_x_0208.t  view on Meta::CPAN

use strict;
use warnings;
use utf8;
use AozoraBunko::Checkerkun;
use Test::More;
binmode Test::More->builder->$_ => ':utf8' for qw/output failure_output todo_output/;

subtest 'JIS X 0208-1983' => sub {
    ok( ! AozoraBunko::Checkerkun::_is_gaiji('é´Ž') );
    ok(   AozoraBunko::Checkerkun::_is_gaiji('é·—') );
};

subtest 'JIS X 0208:1990' => sub {
    ok( ! AozoraBunko::Checkerkun::_is_gaiji('熙') );
    ok( ! AozoraBunko::Checkerkun::_is_gaiji('凜') );
};



( run in 0.311 second using v1.01-cache-2.11-cpan-a5abf4f5562 )