File Coverage

blib/lib/Lingua/JA/NormalizeText.pm
Criterion Covered Total %
statement 164 164 100.0
branch 60 62 96.7
condition n/a
subroutine 41 41 100.0
pod 27 28 96.4
total 292 295 98.9


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