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, # åè§ã¹ãã¼ã¹ã¯ã_ãã§ãå
¨è§ã¹ãã¼ã¹ã¯ãâ¡ãã§åºåãã
'kouetsukun' => 0, # æ§åä½ç½®æå¯è½ãã§ãã«ã¼ãæ ¡é²åããæå¹ã«ãã
'output_format' => 'plaintext', # plaintext ã¾ã㯠html
};
}
sub new
{
my $class = shift;
my %args = (ref $_[0] eq 'HASH' ? %{$_[0]} : @_);
my $options = $class->_default_options;
for my $key (keys %args)
{
if ( ! exists $options->{$key} ) { Carp::croak "Unknown option: '$key'"; }
else
{
if ($key eq 'output_format')
{
Carp::croak "Output format option must be 'plaintext' or 'html'" unless exists $VALID_OUTPUT_FORMAT{ $args{$key} };
}
$options->{$key} = $args{$key};
}
}
bless $options, $class;
}
sub _tag_html
{
my ($plaintext, $tag_name, $msg) = @_;
return qq|<span data-checkerkun-tag="$tag_name">$plaintext</span>| unless defined $msg;
return qq|<span data-checkerkun-tag="$tag_name" data-checkerkun-message="$msg">$plaintext</span>|;
}
# ä¾ï¼
#
# â»ï¼»ï¼ãå£ï¼äºãã第3æ°´æº1-15-8ã144-ä¸-9ï¼½
# ã
# â»ï¼»ï¼ãå£ï¼äºãã第3æ°´æº1-15-8ã144-ä¸-9ï¼½â[78hosetsu_tekiyo]ãåã
# ã«å¤æããã
#
# â»ï¼»ï¼ãã«ãã¹ãï¼æ¾ãã第3æ°´æº1-14-41ã144-ä¸-9ï¼½
# ã
# â»ï¼»ï¼ãã«ãã¹ãï¼æ¾ãã第3æ°´æº1-14-41ã144-ä¸-9ï¼½â[hosetsu_tekiyo]ãå§ã
# ã«å¤æãããã
#
sub _check_all_hosetsu_tekiyo
{
my ($self, $chars_ref, $index) = @_;
my ($replace, $usedlen);
my $rear_index = $index + 80;
$rear_index = $#{$chars_ref} if $rear_index > $#{$chars_ref};
if ( join("", @{$chars_ref}[$index .. $rear_index]) =~ /^(â»ï¼»ï¼.*?æ°´æº(\d+\-\d+\-\d+).*?ï¼½)/ )
{
my ($match, $kutenmen) = ($1, $2);
if ( $self->{'78hosetsu_tekiyo'} && exists $KUTENMEN_78HOSETSU_TEKIYO->{$kutenmen} )
{
if ($self->{'output_format'} eq 'plaintext')
{
$replace = "$matchâ[78hosetsu_tekiyo]ã$KUTENMEN_78HOSETSU_TEKIYO->{$kutenmen}ã";
}
elsif ($self->{'output_format'} eq 'html')
{
$replace = _tag_html($match, '78hosetsuTekiyo', $KUTENMEN_78HOSETSU_TEKIYO->{$kutenmen});
}
$usedlen = length $match;
}
elsif ( $self->{'hosetsu_tekiyo'} && exists $KUTENMEN_HOSETSU_TEKIYO->{$kutenmen} )
{
if ($self->{'output_format'} eq 'plaintext')
{
$replace = "$matchâ[hosetsu_tekiyo]ã$KUTENMEN_HOSETSU_TEKIYO->{$kutenmen}ã";
( run in 0.416 second using v1.01-cache-2.11-cpan-7f9471e7e0a )