############################################### # bpl2uni.pl # ############################################### ################################# ##初期設定 ################################# $virama="ฺ"; #起動パラメータ # perl tpl2uni.pl 入力ファイル 出力ファイル 定義ファイルディレクトリ スイッチ if (defined(@ARGV[0])) { $inpf=@ARGV[0]; } else { $inpf="inp.txt"; } if (defined(@ARGV[1])) { $outf=@ARGV[1]; } else { $outf="out.htm"; } if (defined(@ARGV[2])) { $deff=@ARGV[2]; } else { $deff="tp_mu.txt"; } if (defined(@ARGV[3])) { $conf=@ARGV[3]; } else { $conf=""; } #変換テーブル読み込み # データ構造 トークン,前が子音のときの出力,前が母音のときの出力,子音かどうか(1/0) # open(IN,$deff) or die "Cannot Open Code-Defined File."; %mic = (); %miv = (); %mif = (); while() { chomp; ($ky,$dc,$dv,$cn) = split(/\,/,$_); $mic{ $ky } = $dc; $miv{ $ky } = $dv; $mif{ $ky } = $cn; } close(IN); $mic{ "," } = ""; $miv{ "," } = ""; $mif{ "," } = "0"; ############### subroutines ################ #エラー処理 sub error { $error = $_[0]; if ($error eq "bat_sf") { $msg = 'No such Source File'; } elsif ($error eq "bat_of") { $msg = 'Cannot Create Object File'; } elsif ($error eq "bat_cnv") { $msg = 'Internal Error : No String Convert Table'; } print $msg; exit; } # md->uni sub md2uni { local $res,$st,$le,$ii,$nw,$nw2,$nw3,$nw4,$cons,$spc,$nc,$cv,$dt,$spstk; $res = ""; $spstk = ""; # 出力しなかったスペース類をたくわえておく $cons = 0; # 前が子音だったか $spc = 0; # 前がスペースだったか $st = 0; # 0)1byte 1)2byte-first 2)2byte-second $cv = 0; # {}カッコ内なら1, そうでなければ0 $le = length( @_[0] ); for ($ii=0 ; $ii<$le ; $ii++) { if ($ii<$le-1) {$nw2=substr(@_[0],$ii,2); } else {$nw2="**";} if ($ii<$le-2) {$nw3=substr(@_[0],$ii,3); } else {$nw3="***";} if ($ii<$le-3) {$nw4=substr(@_[0],$ii,4); } else {$nw4="****";} if ($nw2 eq '{{' && $st == 0) { $res=$res.'{'; $ii++; } elsif ($nw2 eq '}}' && $st == 0) { $res=$res.'}'; $ii++; } else { $nw = substr( @_[0], $ii, 1 ); $nc = ord( $nw ); if ((($nc>=129 && $nc<=159) || ($nc>=224 && $nc<=252)) && $st==0) { $st=1; } elsif ( ($nc!=127 && $nc>=64 && $nc<=252 ) && $st==1) { $st=2; } elsif ((($nc>=129 && $nc<=159) || ($nc>=224 && $nc<=252)) && $st==2) { $st=1; } else { $st=0; } if ($st==0 && $nc==123) { $cv=1; } elsif ($st==0 && $nc==125) { $cv=0; if($cons>0) { $res=$res.$virama; } if($spstk ne "") { $res=$res.$spstk; $spstk=""; } $cons=0; } elsif ($cv==1) { if (exists($mic{$nw4})) { if($cons>0) { $dt=$mic{$nw4}; if($dt eq $miv{$nw4}) { $res=$res.$virama; if($mif{$nw4}>0) {$spstk="";} } } else { $dt=$miv{$nw4}; if($mif{$nw4}==0 && $spstk ne "") { $res=$res.$spstk; $spstk=""; } } if($mif{$nw4}>=0) {$cons=$mif{$nw4}; } $res=$res.$dt; $ii+=3; } elsif (exists($mic{$nw3})) { if($cons>0) { $dt=$mic{$nw3}; if($dt eq $miv{$nw3}) { $res=$res.$virama; if($mif{$nw3}>0) {$spstk="";} } } else { $dt=$miv{$nw3}; if($mif{$nw3}==0 && $spstk ne "") { $res=$res.$spstk; $spstk=""; } } if($mif{$nw3}>=0) {$cons=$mif{$nw3}; } $res=$res.$dt; $ii+=2; } elsif (exists($mic{$nw2})) { if($cons>0) { $dt=$mic{$nw2}; if($dt eq $miv{$nw2}) { $res=$res.$virama; if($mif{$nw2}>0) {$spstk="";} } } else { $dt=$miv{$nw2}; if($mif{$nw2}==0 && $spstk ne "") { $res=$res.$spstk; $spstk=""; } } if($mif{$nw2}>=0) {$cons=$mif{$nw2}; } $res=$res.$dt; $ii++; } elsif (exists($mic{$nw})) { if($cons>0) { $dt=$mic{$nw}; if($dt eq $miv{$nw}) { $res=$res.$virama; if($mif{$nw}>0) {$spstk="";} } } else { $dt=$miv{$nw}; if($mif{$nw}==0 && $spstk ne "") { $res=$res.$spstk; $spstk=""; } } if($mif{nw}>=0) {$cons=$mif{$nw}; } $res=$res.$dt; } else { if($nw eq " " || $nw eq "\t" || $nw eq "_") { if($cons<=0) { if($spstk ne "") { $res=$res.$spstk; $spstk=""; } $res=$res." "; } else {$spstk=$spstk." ";} } else { if($spstk ne "") { $res=$res.$spstk; $spstk=""; } $res=$res.$nw; $cons=0; } } } else { $res=$res.$nw; $cons=0; } } } if($cons>0) { $res=$res.$virama; } if($spstk ne "") { $res=$res.$spstk; $spstk=""; } return $res; } ################################################################# # Main Routine ################################################################# if (!open(IN,"$inpf")) { &error(bad_sf); } if (!open(OUT,">$outf")) { &error(bad_of); } if($conf ne "-r") {print OUT "OUT\n";} $p_cnt=0; while() { print OUT md2uni( $_ ); $p_cnt++; } close(IN); if($conf ne "-r") {print OUT "\n";} close(OUT); exit;