File Coverage

blib/lib/Lingua/JA/NormalizeText.pm
Criterion Covered Total %
statement 161 161 100.0
branch 58 60 96.6
condition n/a
subroutine 41 41 100.0
pod 26 27 96.3
total 286 289 98.9


line stmt bran cond sub pod time code
1             package Lingua::JA::NormalizeText;
2              
3 37     37   61144 use 5.008_001;
  37         88  
4 37     37   132 use strict;
  37         38  
  37         581  
5 37     37   111 use warnings;
  37         41  
  37         703  
6 37     37   2523 use utf8;
  37         80  
  37         139  
7              
8 37     37   687 use Carp ();
  37         51  
  37         641  
9 37     37   99 use Exporter qw/import/;
  37         38  
  37         994  
10 37     37   14979 use Sub::Install ();
  37         46726  
  37         611  
11 37     37   18040 use Unicode::Normalize ();
  37         57930  
  37         904  
12 37     37   17244 use HTML::Entities ();
  37         174114  
  37         1077  
13 37     37   17723 use HTML::Scrubber ();
  37         67183  
  37         670  
14 37     37   17339 use Lingua::JA::Regular::Unicode ();
  37         408086  
  37         1039  
15 37     37   18560 use Lingua::JA::Dakuon ();
  37         37509  
  37         720  
16 37     37   18302 use Lingua::JA::Moji ();
  37         1102055  
  37         15588  
17              
18             our $VERSION = '0.33_01';
19             our @EXPORT = qw();
20             our @EXPORT_OK = qw(nfkc nfkd nfc nfd decode_entities strip_html
21             alnum_z2h alnum_h2z space_z2h space_h2z katakana_z2h katakana_h2z
22             katakana2hiragana hiragana2katakana wave2tilde tilde2wave
23             wavetilde2long wave2long tilde2long fullminus2long dashes2long
24             drawing_lines2long unify_long_repeats nl2space unify_long_spaces
25             unify_whitespaces unify_nl trim ltrim rtrim old2new_kana old2new_kanji
26             tab2space remove_controls remove_spaces dakuon_normalize
27             handakuon_normalize all_dakuon_normalize
28             square2katakana circled2kana circled2kanji
29             remove_DFC);
30              
31             our %EXPORT_TAGS = ( all => [ @EXPORT, @EXPORT_OK ] );
32              
33             my %AVAILABLE_OPTS;
34             @AVAILABLE_OPTS{ (qw/lc uc/, @EXPORT_OK) } = ();
35              
36             our $SCRUBBER = HTML::Scrubber->new;
37              
38             # This does not work on Perl 5.8.8
39             # - couldn't find subroutine named lc in package CORE
40             # - Undefined subroutine &CORE::lc called
41             #Sub::Install::install_sub({ code => 'lc', from => 'CORE', as => 'lc' });
42             #Sub::Install::install_sub({ code => 'uc', from => 'CORE', as => 'uc' });
43             #Sub::Install::install_sub({ code => \&CORE::lc, as => 'lc' });
44             #Sub::Install::install_sub({ code => \&CORE::uc, as => 'uc' });
45              
46             Sub::Install::install_sub({ code => 'NFKC', from => 'Unicode::Normalize', as => 'nfkc' });
47             Sub::Install::install_sub({ code => 'NFKD', from => 'Unicode::Normalize', as => 'nfkd' });
48             Sub::Install::install_sub({ code => 'NFC', from => 'Unicode::Normalize', as => 'nfc' });
49             Sub::Install::install_sub({ code => 'NFD', from => 'Unicode::Normalize', as => 'nfd' });
50             Sub::Install::install_sub({ code => 'decode_entities', from => 'HTML::Entities', as => 'decode_entities' });
51             Sub::Install::install_sub({ code => 'alnum_z2h', from => 'Lingua::JA::Regular::Unicode', as => 'alnum_z2h' });
52             Sub::Install::install_sub({ code => 'alnum_h2z', from => 'Lingua::JA::Regular::Unicode', as => 'alnum_h2z' });
53             Sub::Install::install_sub({ code => 'space_z2h', from => 'Lingua::JA::Regular::Unicode', as => 'space_z2h' });
54             Sub::Install::install_sub({ code => 'space_h2z', from => 'Lingua::JA::Regular::Unicode', as => 'space_h2z' });
55             Sub::Install::install_sub({ code => 'katakana_z2h', from => 'Lingua::JA::Regular::Unicode', as => 'katakana_z2h' });
56             Sub::Install::install_sub({ code => 'katakana_h2z', from => 'Lingua::JA::Regular::Unicode', as => 'katakana_h2z' });
57             Sub::Install::install_sub({ code => 'katakana2hiragana', from => 'Lingua::JA::Regular::Unicode', as => 'katakana2hiragana' });
58             Sub::Install::install_sub({ code => 'hiragana2katakana', from => 'Lingua::JA::Regular::Unicode', as => 'hiragana2katakana' });
59             Sub::Install::install_sub({ code => 'dakuon_normalize', from => 'Lingua::JA::Dakuon', as => 'dakuon_normalize' });
60             Sub::Install::install_sub({ code => 'handakuon_normalize', from => 'Lingua::JA::Dakuon', as => 'handakuon_normalize' });
61             Sub::Install::install_sub({ code => 'all_dakuon_normalize', from => 'Lingua::JA::Dakuon', as => 'all_dakuon_normalize' });
62             Sub::Install::install_sub({ code => 'square2katakana', from => 'Lingua::JA::Moji', as => 'square2katakana' });
63             Sub::Install::install_sub({ code => 'circled2kana', from => 'Lingua::JA::Moji', as => 'circled2kana' });
64             Sub::Install::install_sub({ code => 'circled2kanji', from => 'Lingua::JA::Moji', as => 'circled2kanji' });
65              
66             sub new
67             {
68 50     50 1 9384 my $class = shift;
69              
70 50 100       261 my @opts = (ref $_[0] eq 'ARRAY' ? @{$_[0]} : @_);
  5         14  
71              
72 50 100       274 Carp::croak("at least one option required") unless scalar @opts;
73              
74 49         100 my $self = bless {}, $class;
75              
76 49         227 $self->{converters} = [];
77              
78 49         64 my @unavailable_opts;
79              
80 49         92 for my $opt (@opts)
81             {
82 115 100       182 if (ref $opt ne 'CODE')
83             {
84 114 100       203 if ( exists $AVAILABLE_OPTS{$opt} )
85             {
86 111         129 push( @{ $self->{converters} }, $opt );
  111         214  
87             }
88 3         4 else { push(@unavailable_opts, $opt); }
89             }
90             else
91             {
92             # external function
93 1         1 push( @{ $self->{converters} }, $opt );
  1         3  
94             }
95             }
96              
97 49 100       283 Carp::croak( "unknown option(s): " . join(', ', @unavailable_opts) ) if scalar @unavailable_opts;
98              
99 47         414 return $self;
100             }
101              
102             sub normalize
103             {
104 220     220 1 38050 my ($self, $text) = @_;
105              
106 220 100       518 return undef unless defined $text;
107              
108 37     37   305 no strict 'refs';
  37         47  
  37         5953  
109 214         186 $text = $_->($text) for @{ $self->{converters} };
  214         710  
110              
111 214         1448 return $text;
112             }
113              
114 5 50   5 1 22 sub lc { return defined $_[0] ? CORE::lc $_[0] : undef; }
115 4 50   4 1 75 sub uc { return defined $_[0] ? CORE::uc $_[0] : undef; }
116              
117 10     10 1 59 sub strip_html { $SCRUBBER->scrub(shift); }
118              
119 13 100   13 1 402 sub wave2tilde { local $_ = shift; return undef unless defined $_; tr/\x{301C}\x{3030}/\x{FF5E}/; $_; }
  13         39  
  11         54  
  11         38  
120 13 100   13 1 22 sub tilde2wave { local $_ = shift; return undef unless defined $_; tr/\x{FF5E}/\x{301C}/; $_; }
  13         37  
  11         46  
  11         42  
121 7 100   7 1 73 sub wavetilde2long { local $_ = shift; return undef unless defined $_; tr/\x{301C}\x{3030}\x{FF5E}/\x{30FC}/; $_; }
  7         28  
  5         22  
  5         16  
122 7 100   7 1 11 sub wave2long { local $_ = shift; return undef unless defined $_; tr/\x{301C}\x{3030}/\x{30FC}/; $_; }
  7         24  
  5         17  
  5         14  
123 7 100   7 1 10 sub tilde2long { local $_ = shift; return undef unless defined $_; tr/\x{FF5E}/\x{30FC}/; $_; }
  7         27  
  5         14  
  5         14  
124 7 100   7 1 19 sub fullminus2long { local $_ = shift; return undef unless defined $_; tr/\x{FF0D}/\x{30FC}/; $_; }
  7         30  
  5         26  
  5         21  
125 8 100   8 1 11 sub dashes2long { local $_ = shift; return undef unless defined $_; tr/\x{2012}\x{2013}\x{2014}\x{2015}/\x{30FC}/; $_; }
  8         25  
  6         22  
  6         20  
126 7 100   7 0 32 sub drawing_lines2long { local $_ = shift; return undef unless defined $_; tr/\x{2500}\x{2501}\x{254C}\x{254D}\x{2574}\x{2576}\x{2578}\x{257A}/\x{30FC}/; $_; }
  7         26  
  5         26  
  5         19  
127 7 100   7 1 16 sub unify_long_repeats { local $_ = shift; return undef unless defined $_; tr/\x{30FC}/\x{30FC}/s; $_; }
  7         27  
  5         24  
  5         14  
128 15 100   15 1 739 sub unify_long_spaces { local $_ = shift; return undef unless defined $_; tr/\x{0020}/\x{0020}/s; tr/\x{3000}/\x{3000}/s; s/[\x{0020}\x{3000}]{2,}/\x{0020}/g; $_; }
  15         38  
  13         36  
  13         72  
  13         70  
  13         46  
129 83 100   83 1 6115 sub unify_whitespaces { local $_ = shift; return undef unless defined $_; tr/\x{000B}\x{000C}\x{0085}\x{00A0}\x{1680}\x{180E}\x{2000}-\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}/\x{0020}/; $_; }
  83         143  
  81         168  
  81         166  
130 7 100   7 1 13 sub trim { local $_ = shift; return undef unless defined $_; s/^\s+//; s/\s+$//; $_; }
  7         29  
  5         15  
  5         19  
  5         15  
131 11 100   11 1 16 sub ltrim { local $_ = shift; return undef unless defined $_; s/^\s+//; $_; }
  11         29  
  9         33  
  9         27  
132 11 100   11 1 16 sub rtrim { local $_ = shift; return undef unless defined $_; s/\s+$//; $_; }
  11         32  
  9         49  
  9         25  
133 11 100   11 1 672 sub nl2space { local $_ = shift; return undef unless defined $_; s/\x{000D}\x{000A}/\x{0020}/g; tr/\x{000D}\x{000A}/\x{0020}/; $_; }
  11         34  
  9         32  
  9         28  
  9         30  
134 7 100   7 1 23 sub unify_nl { local $_ = shift; return undef unless defined $_; s/\x{000D}\x{000A}/\n/g; tr/\x{000D}\x{000A}/\n/; $_; }
  7         30  
  5         15  
  5         11  
  5         15  
135 8 100   8 1 17 sub tab2space { local $_ = shift; return undef unless defined $_; tr/\x{0009}/\x{0020}/; $_; }
  8         30  
  6         10  
  6         17  
136 7 100   7 1 14 sub old2new_kana { local $_ = shift; return undef unless defined $_; tr/ゐヰゑヱ/いイえエ/; s/ヸ/イ\x{3099}/g; s/ヹ/エ\x{3099}/g; $_; }
  7         23  
  5         26  
  5         13  
  5         7  
  5         16  
137 274 100   274 1 15972 sub remove_controls { local $_ = shift; return undef unless defined $_; tr/\x{0000}-\x{0008}\x{000B}\x{000C}\x{000E}-\x{001F}\x{007F}-\x{009F}//d; $_; }
  274         432  
  272         253  
  272         481  
138 7 100   7 1 19 sub remove_spaces { local $_ = shift; return undef unless defined $_; tr/\x{0020}\x{3000}//d; $_; }
  7         27  
  5         22  
  5         20  
139 9 100   9 1 12825 sub remove_DFC { local $_ = shift; return undef unless defined $_; tr/\x{061C}\x{2066}-\x{2069}\x{200E}\x{200F}\x{202A}-\x{202E}//d; $_; }
  9         34  
  7         33  
  7         20  
140              
141             sub old2new_kanji
142             {
143 8     8 1 14 local $_ = shift;
144 8 100       26 return undef unless defined $_;
145 6         5907 tr/亞惡壓圍爲醫壹逸稻飮隱營榮衞驛謁圓緣艷鹽奧應橫歐毆黃溫穩假價禍畫會壞悔懷海繪慨槪擴殼覺學嶽樂喝渴褐勸卷寬歡漢罐觀關陷顏器既歸氣祈龜僞戲犧舊據擧虛峽挾狹鄕響曉勤謹區驅勳薰徑惠揭溪經繼莖螢輕鷄藝擊缺儉劍圈檢權獻硏縣險顯驗嚴效廣恆鑛號國穀黑濟碎齋劑櫻册殺雜參慘棧蠶贊殘祉絲視齒兒辭濕實舍寫煮社者釋壽收臭從澁獸縱祝肅處暑緖署諸敍奬將涉燒祥稱證乘剩壤孃條淨狀疊讓釀囑觸寢愼眞神盡圖粹醉隨髓數樞瀨聲靜齊攝竊節專戰淺潛纖踐錢禪曾祖僧雙壯層搜插巢爭瘦總莊裝騷增憎臟藏贈卽屬續墮體對帶滯臺瀧擇澤單嘆擔膽團彈斷癡遲晝蟲鑄著廳徵懲聽敕鎭塚遞鐵轉點傳都黨盜燈當鬭德獨讀突屆繩難貳惱腦霸廢拜梅賣麥發髮拔繁晚蠻卑碑祕濱賓頻敏甁侮福拂佛倂塀竝變邊勉辨瓣辯舖步穗寶襃豐墨沒飜每萬滿免麵默餠戾彌藥譯豫餘與譽搖樣謠來賴亂欄覽隆龍虜兩獵綠壘淚類勵禮隸靈齡曆歷戀練鍊爐勞廊朗樓郞錄灣堯巖晉槇渚猪琢瑤祐祿禎穰聰遙/亜悪圧囲為医壱逸稲飲隠営栄衛駅謁円縁艶塩奥応横欧殴黄温穏仮価禍画会壊悔懐海絵慨概拡殻覚学岳楽喝渇褐勧巻寛歓漢缶観関陥顔器既帰気祈亀偽戯犠旧拠挙虚峡挟狭郷響暁勤謹区駆勲薫径恵掲渓経継茎蛍軽鶏芸撃欠倹剣圏検権献研県険顕験厳効広恒鉱号国穀黒済砕斎剤桜冊殺雑参惨桟蚕賛残祉糸視歯児辞湿実舎写煮社者釈寿収臭従渋獣縦祝粛処暑緒署諸叙奨将渉焼祥称証乗剰壌嬢条浄状畳譲醸嘱触寝慎真神尽図粋酔随髄数枢瀬声静斉摂窃節専戦浅潜繊践銭禅曽祖僧双壮層捜挿巣争痩総荘装騒増憎臓蔵贈即属続堕体対帯滞台滝択沢単嘆担胆団弾断痴遅昼虫鋳著庁徴懲聴勅鎮塚逓鉄転点伝都党盗灯当闘徳独読突届縄難弐悩脳覇廃拝梅売麦発髪抜繁晩蛮卑碑秘浜賓頻敏瓶侮福払仏併塀並変辺勉弁弁弁舗歩穂宝褒豊墨没翻毎万満免麺黙餅戻弥薬訳予余与誉揺様謡来頼乱欄覧隆竜虜両猟緑塁涙類励礼隷霊齢暦歴恋練錬炉労廊朗楼郎録湾尭巌晋槙渚猪琢瑶祐禄禎穣聡遥/;
146 6         19 return $_;
147             }
148              
149             1;
150              
151             __END__