ロゴ  かなtoBSE.Dr.plのソース


かなtoBSE.Dr.plのソース

・かなtoBSE.Dr.pl(MacJPerl)のソースを<PRE>〜</PRE>タグで囲んで、表示しています。

点字関連に戻る

# かなtoBSEトランスレータ

# ダブルクリックされた時の処理
unless (@ARGV){
&MacPerl'Answer(<<'mess');
このPerlスクリプトは、ドロップレット形式です。
 仮名で分かち書きされた、テキストファイルを、
 ドラッグ&ドロップして下さい。
       〜 m(_ _)m“I am very sory.” 〜
           Ver.2001.04.30. 02:08 PM
mess
exit;
}

# ▼ # 初期設定 # ▼ # --------------------------------------------------------------------------- ここから ▼
# 全角2字→BSE対応リスト(ハッシュ)作成
%zentwo = qw{
きゃ	_@*_	きゅ	_@%_	きょ	_@[_	キャ	_@*_	キュ	_@%_	キョ	_@[_
ぎゃ	_^*_	ぎゅ	_^%_	ぎょ	_^[_	ギャ	_^*_	ギュ	_^%_	ギョ	_^[_
しゃ	_@:_	しゅ	_@?_	しょ	_@W_	シャ	_@:_	シュ	_@?_	ショ	_@W_
じゃ	_^:_	じゅ	_^?_	じょ	_^W_	ジャ	_^:_	ジュ	_^?_	ジョ	_^W_
ちゃ	_@O_	ちゅ	_@N_	ちょ	_@T_	チャ	_@O_	チュ	_@N_	チョ	_@T_
ぢゃ	_^O_	ぢゅ	_^N_	ぢょ	_^T_	ヂャ	_^O_	ヂュ	_^N_	ヂョ	_^T_
にゃ	_@K_	にゅ	_@M_	にょ	_@S_	ニャ	_@K_	ニュ	_@M_	ニョ	_@S_
ひゃ	_@U_	ひゅ	_@X_	ひょ	_@!_	ヒャ	_@U_	ヒュ	_@X_	ヒョ	_@!_
びゃ	_^U_	びゅ	_^X_	びょ	_^!_	ビャ	_^U_	ビュ	_^X_	ビョ	_^!_
ぴゃ	_.U_	ぴゅ	_.X_	ぴょ	_.!_	ピャ	_.U_	ピュ	_.X_	ピョ	_.!_
みゃ	_@Z_	みゅ	_@Y_	みょ	_@)_	ミャ	_@Z_	ミュ	_@Y_	ミョ	_@)_
りゃ	_@E_	りゅ	_@D_	りょ	_@J_	リャ	_@E_	リュ	_@D_	リョ	_@J_
いぇ	_@F_	しぇ	_@]_	ちぇ	_@Q_	イェ	_@F_	シェ	_@]_	チェ	_@Q_
じぇ	_^]_	ジェ	_^]_
うぃ	_5B_	うぇ	_5F_	うぉ	_5I_	ウィ	_5B_	ウェ	_5F_	ウォ	_5I_
くぁ	_5*_	くぃ	_5<_	くぇ	_5$_	くぉ	_5[_	クァ	_5*_	クィ	_5<_	クェ	_5$_	クォ	_5[_
つぁ	_5O_	つぃ	_5R_	つぇ	_5Q_	つぉ	_5T_	ツァ	_5O_	ツィ	_5R_	ツェ	_5Q_	ツォ	_5T_
ふぁ	_5U_	ふぃ	_5V_	ふぇ	_5&_	ふぉ	_5!_	ファ	_5U_	フィ	_5V_	フェ	_5&_	フォ	_5!_
ぐぁ	_4*_	グァ	_4*_
hぁ	_4U_	hぃ	_4V_	hぇ	_4&_	hぉ	_4!_	ヴァ	_4U_	ヴィ	_4V_	ヴェ	_4&_	ヴォ	_4!_
てぃ	_@R_	とぅ	_5N_	てゅ	_.N_	ふゅ	_.+_	ティ	_@R_	トゥ	_5N_	テュ	_.N_	フュ	_.+_
でぃ	_^R_	どぅ	_4N_	でゅ	__N_	ぶゅ	__+_	ディ	_^R_	ドゥ	_4N_	デュ	__N_	ブュ	__+_
きぇ	_@$_	にぇ	_@P_	ひぇ	_@&_	キェ	_@$_	ニェ	_@P_	ヒェ	_@&_
ぐぃ	_4<_	ぐぇ	_4$_	ぐぉ	_4[_	グィ	_4<_	グェ	_4$_	グォ	_4[_
すぃ	_@¥_	ずぃ	_^¥_	ふょ	_.>_	hょ	__>_	スィ	_@¥_	ズィ	_^¥_	フョ	_.>_	ヴョ	__>_
引開	8	引閉	0	濁音	"	半濁	,	拗音	@	拗濁	^	拗半	.
――	_33_	……	_111_	波線	_--_	←→	_[33O_
右矢	_33O_	左矢	_[33_	両矢	_[33O_	空欄	__XXL_
伏◯	_"Z_	伏△	_"(_	伏□	_"Y_	伏数	_"=_	伏他	_")_
位取	'	小数	1	小英	.
};
# 全角2字の変換キーワード(keys)を配列に用意
@twokey = keys(%zentwo);

# 全角1字→BSE対応リスト(ハッシュ)作成
%zenone = qw{
あ	A	い	B	う	C	え	F	お	I	ア	A	イ	B	ウ	C	エ	F	オ	I
か	*	き	<	く	%	け	$	こ	[	カ	*	キ	<	ク	%	ケ	$	コ	[
が	_"*_	ぎ	_"<_	ぐ	_"%_	げ	_"$_	ご	_"[_	ガ	_"*_	ギ	_"<_	グ	_"%_	ゲ	_"$_	ゴ	_"[_
さ	:	し	¥	す	?	せ	]	そ	W	サ	:	シ	¥	ス	?	セ	]	ソ	W
ざ	_":_	じ	_"¥_	ず	_"?_	ぜ	_"]_	ぞ	_"W_	ザ	_":_	ジ	_"¥_	ズ	_"?_	ゼ	_"]_	ゾ	_"W_
た	O	ち	R	つ	N	て	Q	と	T	タ	O	チ	R	ツ	N	テ	Q	ト	T
だ	_"O_	ぢ	_"R_	づ	_"N_	で	_"Q_	ど	_"T_	ダ	_"O_	ヂ	_"R_	ヅ	_"N_	デ	_"Q_	ド	_"T_
な	K	に	L	ぬ	M	ね	P	の	S	ナ	K	ニ	L	ヌ	M	ネ	P	ノ	S
は	U	ひ	V	ふ	X	へ	&	ほ	!	ハ	U	ヒ	V	フ	X	ヘ	&	ホ	!
ば	_"U_	び	_"V_	ぶ	_"X_	べ	_"&_	ぼ	_"!_	バ	_"U_	ビ	_"V_	ブ	_"X_	ベ	_"&_	ボ	_"!_
ぱ	_,U_	ぴ	_,V_	ぷ	_,X_	ぺ	_,&_	ぽ	_,!_	パ	_,U_	ピ	_,V_	プ	_,X_	ペ	_,&_	ポ	_,!_
ま	Z	み	(	む	Y	め	=	も	)	マ	Z	ミ	(	ム	Y	メ	=	モ	)
や	/	ゆ	+	よ	>	ヤ	/	ユ	+	ヨ	>
ら	E	り	H	る	D	れ	G	ろ	J	ラ	E	リ	H	ル	D	レ	G	ロ	J
わ	'	ゐ	2	ゑ	6	を	9	ワ	'	ヰ	2	ヱ	6	ヲ	9
っ	1	ー	3	ん	0	ッ	1	ー	3	ン	0
h	_"C_	ヴ	_"C_
ぁ	_^A_	ぃ	_^B_	ぅ	_^C_	ぇ	_^F_	ぉ	_^I_	ァ	_^A_	ィ	_^B_	ゥ	_^C_	ェ	_^F_	ォ	_^I_
ゃ	_^/_	ゅ	_^+_	ょ	_^>_	ゎ	_^'_	ャ	_^/_	ュ	_^+_	ョ	_^>_	ヮ	_^'_
。	4	、	;	・	"	?	5	!	6	「	-	」	-	(	7	)	7	“	8	”	0	゛	"	゜	,	:	3	;	2
[	_;'_	]	_,2_	『	_;-_	』	_-2_	<	_"7_	>	_71_	《	_;7_	》	_72_
―	_33_	…	_111_	〜	_--_	→	_33O_	←	_[33_
疑	5	感	6	数	#	外	;	大	,	英	;	伊	.	詩	_	継	-
波	_--_	空	__XXL_
点	1	.	1
加	5	減	9	乗	*		分	/	+	5	−	9	×	*	/	/
除	_//_	等	_33_	比	_"1_	対	_"1_	÷	_//_	=	_33_
%	P	&	&	#	%	*	*
‘	_,8_	’	_0'_
};
# 全角1字の変換キーワード(keys)を配列に用意
@onekey = keys(%zenone);

# ギリシャ文字→BSE対応リスト(ハッシュ)作成
%girisya = qw{
Α	_.A_	Β	_.B_	Γ	_.G_	Δ	_.D_	Ε	_.E_	Ζ	_.Z_	Η	_.:_	Θ	_.?_	Ι	_.I_	Κ	_.K_
Λ	_.L_	Μ	_.M_	Ν	_.N_	Ξ	_.X_	Ο	_.O_	Π	_.P_	Ρ	_.R_	Σ	_.S_	Τ	_.T_	Υ	_.U_
Φ	_.F_	Χ	_.&_	Ψ	_.Y_	Ω	_.W_
α	_@A_	β	_@B_	γ	_@G_	δ	_@D_	ε	_@E_	ζ	_@Z_	η	_@:_	θ	_@?_	ι	_@I_	κ	_@K_
λ	_@L_	μ	_@M_	ν	_@N_	ξ	_@X_	ο	_@O_	π	_@P_	ρ	_@R_	σ	_@S_	τ	_@T_	υ	_@U_
φ	_@F_	χ	_@&_	ψ	_@Y_	ω	_@W_
};

$henkanseikou = 0;      # ファイル変換が成功した回数をセットする変数
$henkansippai = 0;      # ファイル変換が失敗した回数をセットする変数
$syuuryou = 0;          # 問題が起きた時に、ダイアログで“終了”ボタンが押されたらセットする変数
$dropfilesu = @ARGV;    # このスクリプトにドラッグされたファイルの数をセットする変数
# ▲ # 初期設定 # ▲ # --------------------------------------------------------------------------- ここまで ▲


# ▽ # ファイル変換作業 # ▽ # ------------------------------------------------------------------- ここから ▽
FILELOOP: foreach $file (@ARGV) {               # ▽ ドロップされたファイルのフルパスを$fileに代入

  ## ▼▼ ## データ読み込み ## ▼▼ ## ----------------------------------------------------------- ここから ▼▼
  ## ドロップされたファイルの、タイプとクリエータを取得
   ($creator, $type) = &MacPerl'GetFileInfo($file);
   
  ## ドロップされたファイル($file)から、ファイル名とそこまでのパス名を取得する
    $karifile = $file;                          #-# $fileを保存
    @karifullpath = split (/:/, $karifile);     #-# フルパスを配列で保存
    $karifilename = pop @karifullpath;          #-# ファイル名(配列の最後の要素)を取得
    $karipath = join(':', @karifullpath);      #-# パス名を(配列を:で繋いで)取得
   
  #▼#####< S T D O U T : ファイルタイプをチェック >#####▼################################
    if ($type ne 'TEXT'){                                                                          #
      print "\n\n",'〜〜〜〜〜 Caution! 〜〜〜〜〜',"\n\n";                                #
      print '『',$karipath,'』に有る、',"\n";                                                      #
      print '“',$karifilename,'”は、テキストファイルでは有りません!!',"\n";                    #
      print ' テキストファイルをドロップして下さい。',"\n";                                       #
      print "\n",'〜〜〜〜〜 Caution! 〜〜〜〜〜',"\n\n";                                  #
      ## ▼▼ ダイアログを表示して、残りのファイルを処理するか尋ねる                               #
      $comment = "注意!“$karifilename”は、テキストファイルでは無かった為、処理を中止しました。\n 〜 テキストファイルをドロップして下さい。 〜\n\n";
      &errdialog;
      ## ▲▲                                                                                      #
    }                                                                                              #
  #▲#####< S T D O U T : ファイルタイプをチェック >#####▲################################
  
  #▼#####< S T D O U T : ファイル拡張子をチェック >#####▼################################
    @dotsplit = split(/\./, $karifilename);
    if ($dotsplit[$#dotsplit] eq "BSE") {
      print "\n\n",'〜〜〜〜〜 Caution! 〜〜〜〜〜',"\n\n";                                #
      print '『',$karipath,'』に有る、',"\n";                                                      #
      print '“',$karifilename,'”は、BSE形式(拡張子が.BSE)のファイルの様です。',"\n";           #
      print ' かなで分かち書きされた、テキストファイルをドロップして下さい。',"\n";               #
      print "\n",'〜〜〜〜〜 Caution! 〜〜〜〜〜',"\n\n";                                  #
      ## ▼▼ ダイアログを表示して、残りのファイルを処理するか尋ねる                               #
      $comment = "注意!“$karifilename”は、BSE形式のファイルだった為、処理を中止しました。\n 〜 “かな”で分かち書きされたファイルを、ドロップして下さい。 〜\n";
      &errdialog;
      ## ▲▲
    }
  #▲#####< S T D O U T : ファイル拡張子をチェック >#####▲################################

  #▼#####< S T D O U T : ファイル名の長さをチェック >#####▼##############################
   if ((length $karifilename) > 27){                                                               #
   ++$henkansippai;                                                                                #
     print "\n\n",'〜〜〜〜〜 I am very sorry. 〜〜〜〜〜',"\n\n";                 #
     print '【警告!!】『',$karifilename,'』は、ファイル名が長過ぎます。',"\n";                     #
     print ' Macで扱えるファイル名の長さは、半角で 31文字までです。',"\n";                        #
     print ' 変換が成功した場合、ファイル名の後ろに『.BSE』を付加したファイルを、',"\n";          #
     print ' 新規に作成しますので、ファイル名の後ろには、半角4文字分の余裕が必要です。',"\n";    #
     print '  例:『',$karifilename,'.BSE』(31文字を超えています)',"\n";                       #
     print ' ※ ファイル名『',$karifilename,'』を、半角27文字以下に修正して下さい。',"\n";        #
     print ' (全角1文字は、半角2文字分になります。)',"\n\n";                                  #
     print '***** 『',$karifilename,'』の変換・整形を中止しました。 *****',"\n";                   #
     print '〜〜〜〜〜 I am very sorry. 〜〜〜〜〜',"\n\n";                        #
     ## ▼▼ ダイアログを表示して、残りのファイルを処理するか尋ねる                                #
     $comment = "注意!“$karifilename”\nは、ファイル名が長過ぎる為、処理を中止しました。\n※変換成功時に“ファイル名.BSE”で保存しますので、\nファイル名は半角で、27文字以下にして下さい。\n";
     &errdialog;
     ## ▲▲                                                                                       #
   }                                                                                               #
  #▲#####< S T D O U T : ファイル名の長さをチェック >#####▲##############################

  ## ▼▼ドロップされたファイル($file)を、ファイルハンドルINでオープン
  @mototext = ();                      #-# ファイルから読み込んだテキストが、行単位で入る配列
  open (IN, $file) or die "ファイルを開く事が出来ませんでした。:$!";
    while() {                      #-# ▽▽ 行単位でファイルの終わり迄繰り返す
      chomp;                           ##-# $_の行末に有る改行文字(\n)を削除
      if ($_ =~ /\r/){$_ =~ tr/\r//d;}  ##-# テキストがDOS(LFCR)の時、行頭の\r(CR)を削除
      $_ =~ s/[ \s]/ /g;              ##-# $_の全角のスペースと空白文字を、全て半角スペースに変換する
      push @mototext, $_;              ##-# 配列@mototextに読み込んだテキストを追加
    }                                  #-# △△ 
  close (IN);                          ## INでオープンされた元ファイルを閉じる
  ## ▲▲ 

  #-# BSE形式ファイルのヘッダ情報作成
   $headtext = ' ' x 504;              #-# ヘッダ変数の宣言と、504個の半角スペースの代入
   $pagesuu = '1';                     #-# 変換した時の総ページ数。初期値は1
   $gyoumoji = '32';                   #-# 1行の文字数を設定(標準(B5片面)は32文字)
   $pagegyou = '22';                   #-# 1頁の行数を設定(標準(B5片面)は頁行を入れて22行)
   
  #-# カスタム『書式』設定 ####################▼ここから
   print "\n〜〜〜〜〜 Welcome to かな to BSE 〜〜〜〜〜\n";
   print "『$karipath』の\n『$karifilename』の変換を行います。\n\n";
   print "『$karifilename』の変換後の書式を設定して下さい。\n";

do {
  do {
  $gyoumoji = &MacPerl'Ask("質問1・1行の文字数を入力して下さい。 (10 〜 65 文字)","32");
  } until $gyoumoji >= 10 and $gyoumoji <= 65;
  $gyoumoji = abs($gyoumoji);
  print "質問1・1行 $gyoumoji文字 に設定されました。\n";

  do {
  $pagegyou = &MacPerl'Ask("質問2・1ページの行数を入力して下さい。 (5 〜 99 行)","22");
  } until $pagegyou >= 5 and $pagegyou <= 99;
  $pagegyou = abs($pagegyou);
  print "質問2・1ページ $pagegyou行 に設定されました。\n";

  $pageprint = &MacPerl'Answer("質問3-1・ページ番号を付けますか?

注)ページ番号は1〜 9999ページまで付ける
事が出来ますが、9999ページを超えると、1
ページに戻ります。","はい","いいえ");
  if ($pageprint) {
    do {
      $kaisipage = &MacPerl'Ask("質問3-2・開始ページ番号を入力して下さい。 (1 〜 9999 ページ)","1");
    } until $kaisipage >= 1 and $kaisipage <= 9999;
    $kaisipage = abs($kaisipage);
        $donopageprint = &MacPerl'Answer("質問3-3・どのページにページ番号を付けますか?

注)ページ番号は通常、片面印刷の場合、全ページに
  両面印刷の場合には、奇数ページに付けます。","全ページ","奇数ページ","偶数ページ");

      if ($donopageprint == 0) {$q32ans = "偶数ページに付ける";}
      elsif ($donopageprint == 1) {$q32ans = "奇数ページに付ける";}
      elsif ($donopageprint == 2) {$q32ans = "全ページに付ける";}

    $pagecomment = "ページ番号 $kaisipage ページから$q32ans";
	    print "質問3・ページ番号 $kaisipage ページから$q32ansに設定されました。\n";
  } else {
    $pagecomment = "ページ番号を付けない";
     print "質問3・ページ番号を付けないに設定されました。\n";
  }

  $settei = &MacPerl'Answer("【確認】 以下の様に設定されました。
 この設定で作業を開始してもよろしいですか?\n
 ・1行  $gyoumoji 文字   ・1ページ  $pagegyou 行
 ・$pagecomment","はい","やり直す");
} until $settei;
print "決定された設定: 1行 $gyoumoji文字  1ページ $pagegyou行
         $pagecomment で作業します。\n\n";
  $pagegyou = sprintf("%0.2d", $pagegyou);             #-# 頁数の桁を2桁に整形する(ex.05)
  #-# カスタム『書式』設定 ####################▲ここまで
     
  #-# その他の変数の宣言と初期化
   @bsetext = ();                      #-# BSE文字列に変換されたテキストが、行単位で入る配列
   @bseerrtext = ();                   #-# BSE文字列に変換中に起きたエラーメッセージが入る配列
   @seikeigyou = ();                   #-# BSE形式に整形されたテキストが、行単位で入る配列
   
   #-# カスタム設定 ####################▼ここから▼#####################
   if ($pageprint) {                                                     #▼-# 頁行を設定する時
     $bsesuuji = $kaisipage;                                               #-# BSE形式に変換する為に頁行を代入
     $bsesuuji =~ tr/[1-9]0/[A-I]J/;                                       #-# ページを数値からBSE文字列に変換する
     
     if ($donopageprint == 0) {                                            #▽-# 『偶数ページ』のみに付ける場合
       unless ($kaisipage % 2) {                                             ##▼# $kaisipageを2で割った余りが0なら
         push @seikeigyou, ' ' x ($gyoumoji - 5) . '#' . $bsesuuji;             ## 最初の頁行の$bsesuujiを配列@seikeigyouに追加
       } else {                                                              ##▲▼# 余りが出たら
         push @seikeigyou, '';                                                  ## 最初の頁行として、空行を配列@seikeigyouに追加
       }                                                                     ##▲#
     } elsif ($donopageprint == 1) {                                       #△▽-# 『奇数ページ』のみに付ける場合
       if ($kaisipage % 2) {                                                 ##▼# $kaisipageを2で割った余りが1なら
         push @seikeigyou, ' ' x ($gyoumoji - 5) . '#' . $bsesuuji;             ## 最初の頁行の$bsesuujiを配列@seikeigyouに追加
       } else {                                                              ##▲▼# 余りが出なかったら
         push @seikeigyou, '';                                                 #-# 最初の頁行として、空行を配列@seikeigyouに追加
       }                                                                     ##▲#
     } elsif ($donopageprint == 2) {                                       #△▽-# 『全てのページ』に付ける場合
       push @seikeigyou, ' ' x ($gyoumoji - 5) . '#' . $bsesuuji;            #-# 最初の頁行の$bsesuujiを配列@seikeigyouに追加
     }                                                                     #△-#
     ++$kaisipage;                                                         #-# 頁行を1増やす
   } else {                                                              #▲▼-# 頁行を設定しない時
     push @seikeigyou, '';                                                 #-# 最初の頁行として、空行を配列@seikeigyouに追加
   }                                                                     #▲-#
   #-# カスタム設定 ####################▲ここまで▲#####################   

   $keikokupage = '150';               #-# @seikeigyouがこの頁数に達したら警告する(BSE形式では150頁を超えると問題が有る)
   $gyousuu = 1;                       #-# @seikeigyouの行数処理に使う変数の、初期値を設定
   $counter = 0;                       #-# @mototext,@bsetextの処理で、各配列の何要素目かを示すのに使う

  #▼#####< S T D O U T : 文字数から予想されるページ数を割り出し警告する >#####▼#####################################
   my ($motomojisuu,$mototextcounter,$errkeikoku,$yosougyousuu);                   # 変数の宣言                               #
   OVERKEIKOKU: foreach (@mototext){                                               # ▽ @mototextが有る間、ループ             # ▽
     ++$mototextcounter;                                                           ## 行数カウンタに1足す                    ##
     $motomojisuu = $_ =~ s/./$&/g;                                                ## 文字数/行を変数に入れる                 ##
     $motomojisuu = int($motomojisuu * 1.1);                                       ## BSEもじに変換後増えるので係数を掛ける   ##
     if ($motomojisuu <= $gyoumoji){                                               ## ▼▼ 文字数が$gyoumoji以下の時、        ## ▼▼
       $yosougyousuu += 1;                                                         #-# $yosougyousuuに1を足す                #-#
     }                                                                             ## ▲▲                                    ## ▲▲
     elsif ($motomojisuu > $gyoumoji){                                             ## ▼▼ 文字数が$gyoumojiを超える時、      ## ▼▼
       $yosougyousuu += int($motomojisuu / $gyoumoji);                             #-# 割った値の整数値を加算                 #-#
       if ($motomojisuu % $gyoumoji){ $yosougyousuu += 1;}                         #-# 割った時余りが出たら1を足す           #-#
     }                                                                             ## ▲▲                                    ## ▲▲
     if (($yosougyousuu / ($pagegyou - 1)) >= $keikokupage){                       ## ▼▼ 変換後の予想頁数が基準を超えたら   ## ▼▼
       $errkeikoku = 1;                                                            #-# 警告用の変数をセット                   #-#
       last OVERKEIKOKU ;                                                          #-# 直ちに、このループを抜ける             #-#
     }                                                                             ## ▲▲                                    ## ▲▲
   }                                                                               # △                                       # △
   if ($errkeikoku){                                                               # ▼ エラーが起きた時、                    # ▼
     ++$henkansippai;                                                              # エラー回数カウンタに1を足す             #
     print "\n\n",'〜〜〜〜〜 I am very sorry. 〜〜〜〜〜',"\n\n"; ##                                         ##
     print '【警告!!】『',$karifilename,'』をBSE形式に変換・整形すると、',"\n";    ##                                         ##
     print 'およそ ',$mototextcounter,'行目で、変換後のファイルが ',$keikokupage,'頁を超える事が予想されますので、',"\n";     ##
     print '『',$karifilename,'』の ',$mototextcounter,'行目より、数行手前でファイルの分割をして下さい。',"\n\n";             ##
     print '***** 『',$karifilename,'』の変換・整形を中止しました。 *****',"\n";   ##                                         ##
     print '〜〜〜〜〜 I am very sorry. 〜〜〜〜〜',"\n\n";        ##                                         ##
     ## ▼▼ ダイアログを表示して、残りのファイルを処理するか尋ねる                                                           ##
     $comment = "注意!“$karifilename”を、BSE形式に変換すると、$mototextcounter行辺りで、$keikokupage頁を超える事が予想されます。\n$mototextcounter行より、数行前でファイルを分割して下さい。\n";
     &errdialog;
     ## ▲▲                                                                       ##     
   }                                                                               # ▲                                       # ▲
  #▲#####< S T D O U T : 文字数から予想されるページ数を割り出し警告する >#####▲#####################################
  ## ▲▲ ## データ読み込み ## ▲▲ ## ----------------------------------------------------------- ここまで ▲▲
  

  ## ▼▼ ## てきすと to BSE文字列への変換作業 ## ▼▼ ## ---------------------------------------- ここから ▼▼
  #▼#####< S T D O U T >#####▼##############################################
   print "***** 『$karifilename』をBSE文字列へデータ変換処理中です…  *****\n";     #
  #▲#####< S T D O U T >#####▲##############################################

  foreach $text(@mototext){                                                     # ▽ @mototextの要素(行)数だけ、ループ
    #▼####< S T D O U T >#####▼##############################
     ++$counter;                                                      # 変換中の行数が入る変数
     $counter = sprintf("%0.3d", $counter);                           # 行数の書式を3桁にする
     if ($text =~ /^\s+$/){                                           # ▼ $textに空白文字しか無い時、
       print "行$counter には、空白文字しか有りませんでした。\n";     ## 
       $text = '';                                                    ## $textを空行にする
     }                                                                # ▲
     elsif ($text =~ /^$/){                                           # $textが空行の時、
       print "行$counter には、文字が有りませんでした。\n";}          #
     if ($text){ $text =~ s/\s+$//; }                                 # $textが真の時、行末の空白文字を削除する
     my $countb = 0;                                                  # 文節の初期値を設定
    #▲#####< S T D O U T >#####▲#############################

    if ($text) {                                                                # ▼ 読み込んだ行($text)が、真の時、以下を実行
      #▼####< S T D O U T >#####▼#
       print "行",$counter,':';           #
      #▲####< S T D O U T >#####▲#
      $text =~ s/ +|[^ ]+/$&斬/g;                                               ## 半角スペースと文字列の間に“斬”を付加する
      @gyou = split(/斬/, $text);                                               ## 1行を、“斬”(文節)で区切り、配列に入れる

      foreach $bunsetu (@gyou) {                                                ## ▼▼ 文節の数だけループする
      my $motobunsetu = $bunsetu;                                               ## エラー処理の為、$bunsetuを$motobunsetuに保存
        if ($bunsetu =~ /[^ ]+/){                                               #-# ▼-▼ 文節(文字)が有る(空白以外の)時、以下を実行
          #-## ▼-▼▼ 1文節中の、英・数字・英記号を変換する --------------------------------------- # ▼-▼▼ 
          if ($bunsetu =~ /%/){$bunsetu =~ tr/%/P/;}                                                          # 半角%をPに変換する
          if ($bunsetu =~ /[a-z]/){$bunsetu =~ tr/a-z/A-Z/;}                                                  # 半角英小文字の変換(大文字はそのまま)
          if ($bunsetu =~ /[A-Za-z]/){$bunsetu =~ tr/A-Za-z/A-ZA-Z/;}                                 # 全角英字の変換
          if ($bunsetu =~ /[0-9|\d]/){$bunsetu =~ tr/[1-9]0[1-9]0/[A-I]J[A-I]J/;}                        # 数字を変換する
          if ($bunsetu =~ /^\"(.+)\"$/){$bunsetu =~ s/^\"(.+)\"$/8${1}0/;}                                    # 半角の"で囲まれた文字列の変換 ex. "abc" 8abc0
          if ($bunsetu =~ /^\"(.+)$/){$bunsetu =~ s/^\"(.+)$/8$1/;}                                           # 半角の"で始まる、文字列の変換 ex. "abc 8abc
          if ($bunsetu =~ /(.+)\"$/){$bunsetu =~ s/(.+)\"$/${1}0/;}                                           # 半角の"で終わる、文字列の変換 ex. abc" abc0
          if ($bunsetu =~ /[\!\#\(\)\,\.\:\;\?\+]/){$bunsetu =~ tr/[\,\;\:\.\+\!\(\)\?\#]/[123456778%]/;}     # 半角記号を変換する
          if ($bunsetu =~ /\[/){$bunsetu =~ s/\[/_\,7_/g;}                                                  # 半角[を変換する
          if ($bunsetu =~ /\]/){$bunsetu =~ s/\]/_7\'_/g;}                                                  # 半角]を変換する
          if ($bunsetu =~ /\=/){$bunsetu =~ s/\=/_33_/g;}                                                   # 半角=を変換する
          #-## ▲-▲▲ 1文節中の、英・数字・英記号を変換する --------------------------------------- # ▲-▲▲ 
          #-## ▼-▼▼ 1文節中の、全角文字を変換する ------------------------- # ▼-▼▼ 
          my $henkanzumi = $bunsetu;                                                    # 文節を変数に入れ、BSE文字を削除する
          $henkanzumi =~ s/[A-Z0-9\!\"\#\$\%\&\'\(\)\-\=\^\@\[\;\+\:\*\]\,\<\.\>\/\?_¥_]//g;
          if ($henkanzumi){                                                             # もし、文字が残っていたら、全角2字の変換を実行
            foreach $check (@twokey) {$bunsetu =~ s/$check/$zentwo{$check}/g;}          # 全角2文字を変換
          }
          $henkanzumi = $bunsetu;                                                       # 文節を変数に入れ、BSE文字を削除する
          $henkanzumi =~ s/[A-Z0-9\!\"\#\$\%\&\'\(\)\-\=\^\@\[\;\+\:\*\]\,\<\.\>\/\?_¥_]//g;
          if ($henkanzumi){                                                             # もし、文字が残っていたら、全角1字の変換を実行
            foreach $check (@onekey) {$bunsetu =~ s/$check/$zenone{$check}/g;}          # 全角1文字を変換
          }
          if ($bunsetu =~ /[Α-ω]/){$bunsetu =~ s/[Α-ω]/$girisya{$&}/g;}             # ギリシャ文字を変換
          #-## ▲-▲▲ 1文節中の、全角文字を変換する ------------------------- # ▲-▲▲ 
       }                                                                        #-# ▲-▲ 文節(文字)が有る時 終わり
       #▼####< S T D O U T >#####▼#####################################
        if ($bunsetu =~ /[^ ]+/){                                               # ▼ 文節(スペース以外の文字)が有る時、
          ++$countb;                                                            # 文節の変数に1を足す
          $countb = sprintf("%0.2d", $countb);                                  # 文節の書式を2桁にする
          my $mihenkan = $bunsetu;                                              ## 文節を変数に入れ、BSE文字を削除する
          $mihenkan =~ s/[A-Z0-9\!\"\#\$\%\&\'\(\)\-\=\^\@\[\;\+\:\*\]\,\<\.\>\/\?_¥_]//g;
          if ($mihenkan){                                                       ## ▼▼ それでも文字が残っていたら、その文字と警告を表示
            if ($countb > 1 and ($countb % 10) == 1){ print "\n",'     ';}    ##-# 11文節毎に改行を入れる
            print $countb,'=× ';                                               #-# 文節の元テキストの変換が失敗している時、×を表示
            my $errmojiretu = ' ・'.$counter.'行目:文節 '.$countb.'『'.$motobunsetu.'』の『'.$mihenkan.'』が変換できません。';
            push @bseerrtext, $errmojiretu;                                     #-# エラーの内容を、配列に追加保存
          }                                                                     ## ▲▲ 
          else {                                                                ## ▼▼
            if ($countb > 1 and ($countb % 10) == 1){ print "\n",'     ';}    ##-# 11文節毎に改行を入れる
            print $countb,'=◯ ';                                               ## 文節の元テキストの変換が成功している時、◯を表示
          }                                                                     ## ▲▲ 
        }                                                                       # ▲
       #▲####< S T D O U T >#####▲#####################################
      }                                                                         ## ▲▲ 文節の数だけループ 終わり
      #▼####< S T D O U T >#####▼#
       print "\n";                         #
      #▲####< S T D O U T >#####▲#
    $text = join('', @gyou);                                                    # 文節ごとに分けた1行を繋いで元に戻す
    push @bsetext, $text;                                                       # 元に戻した1行($text)を配列@bsetextに追加
    }                                                                           # ▲ 読み込んだ行($text)が、真の時の処理 終わり
    else { push @bsetext, $text;}                                               # 読み込んだ行($text)が、偽(空白行)の時の処理
  }                                                                             # △ @mototextの要素(行)数だけ、ループ 終わり
  
  #▼####< S T D O U T : BSE文字列に変換出来ない文字が有った時、警告 >#####▼##############
   if (@bseerrtext){                                                                               #
                                                                                                   #
     ++$henkansippai;                                                                              # エラー回数カウンタに1を足す
     print "\n",'【警告!!】『',$karifilename,'』の中に変換出来ない文字が見付かりました。',"\n";    ##
     foreach (@bseerrtext){ print $_,"\n"; }                                                       ##
     print ' ※『',$karifilename,'』を確認後、修正して下さい。',"\n\n";                           ##
     print '***** BSE文字列へのデータ変換を中止しました。 *****',"\n";                             ##
     print '〜〜〜〜〜 I am very sorry. 〜〜〜〜〜',"\n\n";                        ##
     ## ▼▼ ダイアログを表示して、残りのファイルを処理するか尋ねる                                ## 
     $comment = "注意!“$karifilename”の中に、変換出来ない文字が見付かりました。\n“MacJPerl”ウィンドウに表示された、エラー箇所を参照して、ファイルを修正して下さい。\n";
     &errdialog;
     ## ▲▲                                                                                       ## 
   } else {                                                                                        #
     print '***** BSE文字列へのデータ変換は、全て問題無く終わりました。 *****',"\n\n";             #
   }                                                                                               #
  #▲####< S T D O U T : BSE文字列に変換出来ない文字が有った時、警告 >#####▲##############
  undef @mototext;                                                                # @mototextをクリア
  undef $counter;                                                                 # $counterをクリア
  ## ▲▲ ## てきすと to BSE文字列への変換作業 ## ▲▲ ## ---------------------------------------- ここまで ▲▲

  ## ▼▼ ## BSE形式(行数/頁、文字数/行)に整形 ## ▼▼ ## -------------------------------------- ここから ▼▼
  #▼####< S T D O U T >##################################▼#
   print '***** BSE形式でデータを整形中です………… *****',"\n";    #
  #▲####< S T D O U T >##################################▲#

  foreach $text(@bsetext){                                         # ▽ @bsetextが有る間、ループ
    ++$counter;                                                    # 変換中の行数が入る変数($keikokupage頁以上になった時の元ファイルの何行目に当たるかを知る為)
    #▼####< S T D O U T >#####▼################
     my $karicounter = $counter;                        # $counterを$karicounterに保存
     $karicounter = sprintf("%0.3d", $karicounter);     # 行数の桁を3桁に整形する(ex.001)
     print '行',$karicounter;                           # 変換中の行の表示
    #▲####< S T D O U T >#####▲################
  #####---▼▼▼---### 1行が$gyoumoji文字数以下の時の変換作業   ###---▼▼▼---#####
    my $karitext = $text;                                          # $textを保存
    $karitext =~ tr/_//d;                                         # $karitextから全角_アンダーバーを削除
    $karitext =~ tr/¥/\\/;                                        # 全角¥を半角\に変換する
    if (($karitext =~ s/./$&/g) <= $gyoumoji){                     # ▼ BSE変換後の文字列$karitextが、$gyoumoji文字以下の時、
      ++$gyousuu;                                                  ## 行数に1を足す
      if ($gyousuu <= $pagegyou){                                  ## ▼▼ 行数が$pagegyou以下の時、
        push @seikeigyou, $karitext;                               ##-# 文字列$karitextを配列@seikeigyouに追加
      }                                                            ## ▲▲ 
      elsif ($gyousuu > $pagegyou){                                ## ▼▼ 行数が$pagegyouを超えた時、
        $gyousuu = 1;                                              #-# 行数をリセット
        ++$pagesuu;                                                #-# ページ数に1を足す
        #▼####< S T D O U T : 頁数が$keikokupage頁を超えた時、警告 >#####▼
          &overkeikoku;
        #▲####< S T D O U T : 頁数が$keikokupage頁を超えた時、警告 >#####▲
        #-# カスタム設定 ####################▼ここから▼#####################
          &custompageadd;
        #-# カスタム設定 ####################▲ここまで▲#####################
        ++$gyousuu;                                                #-# 行数に1を足す
        push @seikeigyou, $karitext;                               #-# 文字列を配列@seikeigyouに追加
      }                                                            ## ▲▲
    }                                                              # ▲
  #####---▲▲▲---### 1行が$gyoumoji文字数以下の時の変換作業   ###---▲▲▲---#####
  #####---▼▼▼---### 1行が$gyoumoji文字数より上の時の変換作業 ###---▼▼▼---#####
    elsif (($karitext =~ s/./$&/g) > $gyoumoji) {                  # ▼ 変換後の文字列$karitextが、$gyoumojiを超える時、
      if ($text =~ / / and $text =~ /_/){                         # ▼ $textに半角“スペース”,全角“_”の両方が有る時、
        $text =~ s/ +|[^ ]+/$&斬/g;                                ## $textに“[半角スペースかそれ以外の文字列]”に“斬”を追加
        $text =~ s/斬$//;                                          ## 行末の“斬”を削除する
        $text =~ tr/_/区/;                                        ## 全角“_”を“区”に変換
        $text =~ tr/区//s;                                         ## 連続する“区”を1つにまとめる
        $text =~ s/区$//;                                          ## 行末の“区”を削除する
        $text =~ tr{!"#$%&'()=^@[];+:*,<.>/?_}{!”#$%&’()=^@「」;+:*,<.>/?_};   ## BSEをBSEに変換
        $text =~ tr/-/‐/;                                         ## 半角BSEを、全角BSEに変換
        $text =~ tr/A-Z0-9/A-Z0-9/;                            ## 半角BSEを、全角BSEに変換
        $text =~ tr/ / /;                                         ## 半角スペースを、全角スペースに変換
        
        my @kariover = split(/斬/, $text);                         ## “斬”で$textを分割し、@karioverに入れる
        foreach (@kariover){                                       ## ▽▽ @karioverが有る間、ループ
          if ($_ =~ /区/){                                         #-# ▼-▼“区”が含まれている時、
            my $kariovertext = $_;                                 #-## $kariovertextに値を保存
            $kariovertext =~ tr/区//d;                             #-## $kariovertextから“区”を削除
            if (($kariovertext =~ s/./$&/) > $gyoumoji){           #-## ▼-▼▼ $kariovertextが$gyoumojiより大きい時、
              my @kugiri = split(/区/, $_);                        #-#-# $_を“区”で区切って、配列@kugiriに入れる
              push @overgyou, @kugiri;                             #-#-# @overgyouに@kugiriを追加
            }                                                      #-## ▲-▲▲ 
            elsif (($kariovertext =~ s/./$&/) <= $gyoumoji){       #-## ▼-▼▼ $kariovertextが$gyoumoji以下の時、
              push @overgyou, $kariovertext;                       #-#-# @overgyouに$kariovertextを追加
            }                                                      #-## ▲-▲▲ 
          }                                                        #-# ▲-▲
          else {                                                   #-# ▼-▼ “区”が含まれていない時、
            push @overgyou, $_;                                    #-## @overgyouに$_を追加
          }                                                        #-# ▲-▲ 
        }                                                          ## △△ ループ 終わり
      }                                                            # ▲
      elsif ($text =~ / / and $text !~ /_/){                      # ▼ $textに半角“スペース”が有り、全角“_”が無い時、
        $text =~ s/ +|[^ ]+/$&斬/g;                                ## $textに“[半角スペースかそれ以外の文字列]”に“斬”を付加
        $text =~ s/斬$//;                                          ## 行末の斬を削除する
        $text =~ tr{!"#$%&'()=^@[];+:*,<.>/?_}{!”#$%&’()=^@「」;+:*,<.>/?_};    ## BSEをBSEに変換
        $text =~ tr/-/‐/;                                         ## 半角BSEを、全角BSEに変換
        $text =~ tr/A-Z0-9/A-Z0-9/;                            ## 半角BSEを、全角BSEに変換
        $text =~ tr/ / /;                                         ## 半角スペースを、全角スペースに変換
        @overgyou = split(/斬/, $text);                            ## “斬”で$textを分割し、@overgyouに入れる
      }                                                            # ▲
      elsif ($text !~ / / and $text =~ /_/){                      # ▼ $textに半角“スペース”が無く、全角“_”が有る時、
        $text =~ tr/_/斬/;                                        ## 全角“_”を“斬”に変換
        $text =~ tr/斬//s;                                         ## 連続する“斬”を1つにまとめる
        $text =~ s/斬$//;                                          ## 行末の“斬”を削除する
        $text =~ tr{!"#$%&'()=^@[];+:*,<.>/?_}{!”#$%&’()=^@「」;+:*,<.>/?_};    ## BSEをBSEに変換
        $text =~ tr/-/‐/;                                         ## 半角BSEを、全角BSEに変換
        $text =~ tr/A-Z0-9/A-Z0-9/;                            ## 半角BSEを、全角BSEに変換
        @overgyou = split(/斬/, $text);                            ## “斬”で$textを分割し、@overgyouに入れる
      }                                                            # ▲
      elsif ($text !~ / / and $text !~ /_/){                      # ▼ $textに半角“スペース”,全角“_”の両方が無い時、
        $text =~ tr{!"#$%&'()=^@[];+:*,<.>/?_}{!”#$%&’()=^@「」;+:*,<.>/?_};    ## BSEをBSEに変換
        $text =~ tr/-/‐/;                                         ## 半角BSEを、全角BSEに変換
        $text =~ tr/A-Z0-9/A-Z0-9/;                            ## 半角BSEを、全角BSEに変換
        push @overgyou, $text;                                     ## $textを@overgyouに入れる
      }                                                            # ▲

        
      OVERLOOP: while (@overgyou){                                 # ▽@overgyouに値の有る間、ループ
        $mae = shift @overgyou;                                    ## $maeに@overgyouから要素を1つ取り込む
        if (@henkangyou){                                          ## ▼▼@henkangyouは真?(2行目以降?)
          if ($mae =~ /^ +/){ $mae =~ s/^ +//; }                 #-# $maeの行頭空白が有れば削除する
          unless ($mae){ next OVERLOOP;}                           #-# 空白を削除して$maeが無くなった時、OVERLOOPへ抜ける
        }                                                          ## ▲▲
        if (($mae =~ s/./$&/g) >= $gyoumoji){                      ## ▼▼$maeが$gyoumoji以上の時
          while (($mae =~ s/./$&/g) >= $gyoumoji){                 #-# ▽-▽$maeが$gyoumoji以上の間、ループ
            my $karioki = substr($mae, 0, ($gyoumoji)*2);          #-## $maeから$gyoumoji×2バイト分を取り出し、
            push @henkangyou, $karioki;                            #-## 取り出した文字列$kariokiを@henkangyouに追加
            $mae =~ s/^$karioki//;                                 #-## $maeから取り出した文字列$kariokiを$maeから削除
          }                                                        #-# △-△
        }                                                          ## ▲▲
        if ($mae =~ /./){                                          ## ▼▼$maeに文字が有る時、
          if (@overgyou){                                          #-# ▼-▼@overgyouは真?
            $ato = shift @overgyou;                                #-# $atoに@overgyouから要素を1つ取り込む
            if (($ato =~ s/./$&/g) > $gyoumoji){                   #-## ▼-▼▼$atoが$gyoumojiより大きい時
              $mae .= $ato;                                        #-## $maeに$atoを連結
              my $kariplus = substr($mae, 0, ($gyoumoji)*2);       #-## $maeから$gyoumoji×2バイト分を取り出し、
              push @henkangyou, $kariplus;                         #-## 連結した文字列$kariplusを@henkangyouに追加
              $mae =~ s/^$kariplus//;                              #-## $maeから、取り出した文字列を$maeから削除
              unshift @overgyou, $mae;                             #-## 残りの文字列を@overgyouの先頭に戻す
              undef $mae;                                          #-## $maeをクリアする
              next OVERLOOP;                                       #-## OVERLOOPへ抜ける
            }                                                      #-## ▲-▲▲
            elsif (($ato =~ s/./$&/g) == $gyoumoji){               #-## ▼-▼▼ $atoが$gyoumojiと同じ長さの時
              if (@henkangyou){                                    #-#-# ▼▼@henkangyouは真?(2行目以降か?)
                if ($mae =~ /^ +/){ $mae =~ s/^ +//; }           #-#-## $maeの行頭空白が有れば削除する
              }                                                    #-#-# ▲▲
              $mae =~ s/ +$//;                                     #-#-# $maeの行末の空白を削除
              push @henkangyou, $mae;                              #-#-# $maeを@henkangyouに追加
              push @henkangyou, $ato;                              #-#-# $atoを@henkangyouに追加
              undef $mae;                                          #-#-# $maeをクリアする
              undef $ato;                                          #-#-# $atoをクリアする
              next OVERLOOP;                                       #-#-# OVERLOOPへ抜ける
            }                                                      #-## ▲-▲▲
            elsif (($ato =~ s/./$&/g) < $gyoumoji) {               #-## ▼-▼▼$atoが$gyoumojiより小さい時
              $renketu = $mae.$ato;                                #-## $maeと$atoを仮に連結
              if (($renketu =~ s/./$&/g) > $gyoumoji){             #-#-# ▼-▼-▼仮連結文字列が$gyoumojiより大きい時
                if ($mae =~ / +$/){ $mae =~ s/ +$//; }           #-#-## $maeに行末空白が有れば削除する
                push @henkangyou, $mae;                            #-#-## $maeを@henkangyouに追加
                undef $mae;                                        #-#-## $maeをクリアする
                unshift @overgyou, $ato;                           #-#-## $atoを@overgyouの先頭に入れる
                undef $ato;                                        #-#-## $atoをクリアする
                next OVERLOOP;                                     #-#-## OVERLOOPへ抜ける
              }                                                    #-#-# ▲-▲-▲
              elsif (($renketu =~ s/./$&/g) == $gyoumoji){         #-#-# ▼-▼-▼仮連結文字列が$gyoumojiと同じ長さの時、
                $mae .= $ato;                                      #-#-## $maeに$atoを連結
                if ($mae =~ / +$/){ $mae =~ s/ +$//; }           #-#-## $maeに行末空白が有れば削除する
                push @henkangyou, $mae;                            #-#-## $maeを@henkangyouに追加
                undef $mae;                                        #-#-## $maeをクリアする
                next OVERLOOP;                                     #-#-## OVERLOOPへ抜ける
              }                                                    #-#-# ▲-▲-▲
              elsif (($renketu =~ s/./$&/g) < $gyoumoji){          #-#-# ▼-▼-▼仮連結文字列が$gyoumojiより小さい時、
                $mae .= $ato;                                      #-#-## $maeに$atoを連結
                unshift @overgyou, $mae;                           #-#-## 連結した$maeを@overgyouの先頭に戻す
                undef $mae;                                        #-#-## $maeをクリアする
                next OVERLOOP;                                     #-#-## OVERLOOPへ抜ける
              }                                                    #-#-# ▲-▲-▲
            }                                                      #-## ▲-▲▲
          }                                                        #-# ▲-▲
          else {                                                   #-# ▼-▼@overgyouの中身が無くなっている時、
            if (@henkangyou){                                      #-## ▼-▼▼@henkangyouは真?(2行目以降?)
              $mae =~ s/^ +//;                                    #-#-# $maeの行頭空白を削除
              $mae =~ s/ +$//;                                    #-#-# $maeの行末空白を削除
              push @henkangyou, $mae;                              #-#-# $maeを@henkangyouに追加
              undef $mae;                                          #-#-# $maeをクリアする
            }                                                      #-## ▲-▲▲
            else {                                                 #-## ▼-▼▼
              $mae =~ s/ +$//;                                    #-#-# $maeの行末空白を削除
              push @henkangyou, $mae;                              #-#-# $maeを@henkangyouに追加
              undef $mae;                                          #-#-# $maeをクリアする
            }                                                      #-## ▲-▲▲
          }                                                        #-# ▲-▲
        }                                                          ## ▲▲
      }                                                            # △ @overgyouがある間、ループ
      foreach $hentxt(@henkangyou){                                # ▽ @henkangyouがある間、ループ
      ++$gyousuu;                                                  # 行数に1を足す
        if ($gyousuu <= $pagegyou){                                ## ▼▼ 行数が$pagegyou以下の時、
          $hentxt =~ tr{!”#$%&’()=^@「」;+:*,<.>/?_}{!"#$%&'()=^@[];+:*,<.>/?_};     #-# BSEをBSEに変換
          $hentxt =~ tr/‐/-/;                                     #-# 全角のBSEを半角のBSEに変換
          $hentxt =~ tr/¥/\\/;                                    #-# 全角のBSEを半角のBSEに変換
          $hentxt =~ tr/A-Z0-9/A-Z0-9/;                        #-# 全角のBSEを半角のBSEに変換
          $hentxt =~ tr/ / /;                                     #-# 全角スペースを半角スペースに変換
          push @seikeigyou, $hentxt;                               #-# 文字列を配列@seikeigyouに追加
        }                                                          ## ▲▲ 
        elsif ($gyousuu > $pagegyou){                              ## ▼▼ 行数が$pagegyouを超えた時、
          $gyousuu = 1;                                            #-# 行数をリセット
          ++$pagesuu;                                              #-# ページ数に1を足す
          #▼####< S T D O U T : 頁数が$keikokupage頁を超えた時、警告 >#####▼
            &overkeikoku;
          #▲####< S T D O U T : 頁数が$keikokupage頁を超えた時、警告 >#####▲
          #-# カスタム設定 ####################▼ここから▼#####################
            &custompageadd;
          #-# カスタム設定 ####################▲ここまで▲#####################
          ++$gyousuu;                                              #-# 行数に1を足す
          $hentxt =~ tr{!”#$%&’()=^@「」;+:*,<.>/?_}{!"#$%&'()=^@[];+:*,<.>/?_};     #-# BSEをBSEに変換
          $hentxt =~ tr/‐/-/;                                     #-# 全角のBSEを半角のBSEに変換
          $hentxt =~ tr/¥/\\/;                                    #-# 全角のBSEを半角のBSEに変換
          $hentxt =~ tr/A-Z0-9/A-Z0-9/;                        #-# 全角のBSEを半角のBSEに変換
          $hentxt =~ tr/ / /;                                     #-# 全角スペースを半角スペースに変換
          push @seikeigyou, $hentxt;                               #-# 文字列を配列@seikeigyouに追加
        }                                                          ## ▲▲
      }                                                            # △ @henkangyouがある間、ループ
      undef @henkangyou;                                           # @henkangyouをクリアする
    }                                                              # ▲ 
  #####---▲▲▲---### 1行が$gyoumoji文字数より上の時の変換作業 ###---▲▲▲---#####
  #▼####< S T D O U T >#####▼#########################
   print '=◯ ';                                               # ここまで処理が来ていると言う事は、処理が成功しているので◯
   if ($counter > 1 and ($counter % 5) == 0){print "\n";}      # 5行毎に改行を入れる
  #▲####< S T D O U T >#####▲#########################
  }                                                                # △ @bsetextがある間、ループ
  #▼####< S T D O U T >#####▼##################################################################
   print "\n",' 『',$karifilename,'』は整形後、',$pagesuu,'頁と ',$gyousuu,'行になりました。',"\n";     #
   print '***** BSE形式でデータを整形 が終了しました *****',"\n\n";                                     #
  #▲####< S T D O U T >#####▲##################################################################
  undef @bsetext;                                                  # @bsetextをクリア
  undef $counter;                                                  # $counterをクリア
  ## ▲▲ ## BSE形式(行数/頁、文字数/行)に整形 ## ▲▲ ## -------------------------------------- ここまで ▲▲

  ## ▼▼ ## データ書き込み ## ▼▼ ## ----------------------------------------------------------- ここから ▼▼
  #▼####< S T D O U T : 出力形式の選択・クリエータの設定 >#####▼##########################
    print '〜〜〜〜〜 “',$karifilename,'.BSE”の出力形式を選択して下さい… 〜〜〜〜〜',"\n\n";     #
    print "【Mac】:Mac(改行コード:CR)形式で保存します。\n";                               #
    print "    “$karifilename”を作成した時と同じソフトで編集できます。\n";                    #
    print "    “$karifilename”のクリエータは、“$creator”です。\n";                          #
    print "【DOS】:MS-DOS, Windows形式(改行コード:CRLF)で保存します。\n";                    #
    print '     MS-DOS, Windowsのワープロ・テキストエディタで編集できます。',"\n";             #
    print '     Macで開くと、行の先頭に一つ余分な記号が表示されます。',"\n";                   #
    print "    “$karifilename",'.BSE”のクリエータ“',"$creator”を、Macの“PC Exchange”\n";     #
    print '     が使う、“dosa”に変更します。(書類のアイコンに“PC”が付いた絵になります)',"\n";     #
    print "【Jedit3】:Mac(改行コード:CR)形式で、“Jedit3”で編集できる様に保存します。\n";           #
    print '    “Jedit3”のインストールされたMacで、ダブルクリックすると“Jedit3”が起動します。',"\n";     #
    print "    “$karifilename",'.BSE”をクリエータ“JED3”で保存します。',"\n\n";              #
   ## ▼▼ ダイアログを表示して、ファイルの保存形式を尋ねる                                         #
   my $kaigyoucode = &MacPerl'Answer(
   "“$karifilename.BSE”の保存形式を選んで下さい。
【Mac】:Mac形式(CR),“$creator”で保存。
【DOS】:MS-DOS, Windows形式(CRLF)で保存。
【Jedit3】:エディタを“Jedit3”にして保存。",
    "Mac","Dos","Jedit3");
    ## ▲▲                                                                                         #
    print '“',$karifilename.BSE,'”を、',"\n";                                                     #
    if    ($kaigyoucode == 2){                                                                      #
      print "Mac(改行コード:CR)形式で保存します。\n\n";                                       ##
    }                                                                                               #
    elsif ($kaigyoucode == 1){                                                                      #
      print "MS-DOS, Windows形式(改行コード:LFCR)で保存します。\n";                              ##
      print "“$karifilename”のクリエータは、元“$creator”でした。\n\n";                          ##
      $creator = 'dosa';                                                                            ##
    }                                                                                               #
    elsif ($kaigyoucode == 0){                                                                      #
      print "Mac(改行コード:CR)のJedit3形式で保存します。\n";                                    ##
      print "※“Jedit3”を使うと、他の様々なテキスト形式への、変換が可能です。\n";                 ##
      print "“$karifilename”のクリエータは、元“$creator”でした。\n\n";                          ##
      $creator = 'JED3';                                                                            ##
    }                                                                                               #
    print '***** ファイルの出力中です………… *****',"\n";                                          #
  #▲####< S T D O U T : 出力形式の選択・クリエータの設定 >#####▲##########################
  
  ## ▼▼ 変換先ファイル($file.BSE)を、ファイルハンドルOUT(保存ファイル)でオープン
  open (OUT, ">$file.BSE") or die "ファイルを保存する事が出来ません。:$!";
    #-# 変換先ファイル($file.BSE)のタイプとクリエータをセット
    &MacPerl'SetFileInfo("$creator", "$type", "$file.BSE");
    #-# 変換先ファイルにヘッダ情報と整形されたテキストを書き込む
    $pagesuu = sprintf("%0.4d", $pagesuu);             #-# 頁数の桁を4桁に整形する(ex.0012)
    $headtext .= $pagesuu.$gyoumoji.$pagegyou;         #-# 総頁数、文字数、行数をヘッダ変数に追加する
    if ($kaigyoucode == 1){                            #-# ▼-▼ MS-DOS(LFCR)形式が選ばれた時、
      print OUT $headtext,"\n\r";                      ##-# ファイルにヘッダ情報を書き込む
      foreach (@seikeigyou){ print OUT $_,"\n\r";}     ##-# BSE形式に変換・整形されたテキストを書き込む
    }                                                  #-# ▲-▲
    else {                                             #-# ▼-▼ Mac,Jedit形式が選ばれた時、
      print OUT $headtext,"\n";                        ##-# ファイルにヘッダ情報を書き込む
      foreach (@seikeigyou){ print OUT $_,"\n";}       ##-# BSE形式に変換・整形されたテキストを書き込む
    }                                                  #-# ▲-▲
  close (OUT);                                         ## OUTでオープンした保存ファイルを閉じる
  ## ▲▲
  
  #▼####< S T D O U T >#####▼###################################
   print '『',$karipath,"』の中に\n";                                    #
   print 'ファイル名『',$karifilename,'.BSE』で保存しました。',"\n";     #
   print '***** ファイルの出力が終了しました *****',"\n";                #
   print "〜〜〜〜〜 Thank you. 〜〜〜〜〜\n\n";                #
  #▲####< S T D O U T >#####▲###################################
  ## ▲▲ ## データ書き込み ## ▲▲ ## ----------------------------------------------------------- ここまで ▲▲
  
  ++$henkanseikou;                    # 変換成功回数カウンタに1を足す
  --$dropfilesu;                      # ドロップされたファイル数を1減らす
}                                     # △ foreach $file (@ARGV) このループ 終わり
# △ # ファイル変換作業 # △ # ------------------------------------------------------------------- ここまで △

if ($henkanseikou > 0){$seikoumoji = '成功:'.$henkanseikou.' ';}
else {$seikoumoji = '成功:なし';}
if ($henkansippai > 0){$sippaimoji = '失敗:'.$henkansippai.' ';}
else {$sippaimoji = '失敗:なし';}

if ($syuuryou == 0){                                     # ▼ 自然終了又は、“続ける”ボタンで処理を続けていた時、
  if ($henkanseikou > 0){                                ## ▼▼ 変換が1回でも成功した事が有る時、
    if ($henkansippai < 1){                              #-# ▼-▼ 失敗が無かった時、
    &MacPerl'Answer(
"ドロップされた、ファイルの変換は、全て成功しました。

        ───『かなtoBSE』を終わります。
      〜  \(^o^)/“Thank you.” 〜
","終了");
    exit;
    }                                                     #-# ▲-▲ 失敗が無かった時、
    else {                                                #-# ▼-▼ 失敗が有った時、
      &MacPerl'Answer(
"ドロップされた、ファイルの変換が、全て終わりました。 処理結果“$seikoumoji,$sippaimoji”

        ───『かなtoBSE』を終わります。
       〜 (;_;)/“I am sorry.” 〜
","終了");
      exit;
    }                                                     #-# ▲-▲ 失敗が有った時
  }                                                       ## ▲▲ 変換が1回でも成功した時
  else {                                                  ## ▼▼ 変換が1回も成功し無かった時、
    &MacPerl'Answer(
"ドロップされた、ファイルの変換は、全て失敗に終わりました。

        ───『かなtoBSE』を終わります。
     〜 (ToT)/“I am very sorry.” 〜
","終了");
    exit;
  }                                                       ## ▲▲ 変換が1回も成功し無かった時、
}                                                         # ▲ 自然終了叉は、“続ける”ボタンで処理を続けていた時、
else {                                                    # ▼ 終了ボタンが押されてループを終了した時、
  if ($henkanseikou > 0){                                 ## ▼▼ 変換が1回でも成功した事が有る時、
    &MacPerl'Answer(
"“終了”ボタンが押されたので、処理を終わります。 処理結果“$seikoumoji,$sippaimoji”

        ───『かなtoBSE』を終わります。
       〜 (;_;)/“I am sorry.” 〜
","終了");
    exit;
  }                                                        ## ▲▲ 変換が1回でも成功した事が有る時、
  else {                                                   ## ▼▼ 変換が全く成功しなかった時、
    &MacPerl'Answer(
"“終了”ボタンが押されたので、処理を終わります。 ファイルの変換は、全て失敗しました。

        ───『かなtoBSE』を終わります。
     〜 (ToT)/“I am very sorry.” 〜
","終了");
    exit
  }                                                         ## ▲▲ 変換が全く成功しなかった時、
}                                                           # ▲ 終了ボタンが押されてループを終了した時


##-## サブルーチン ##-##
#▼####< S T D O U T : 頁数が$keikokupage頁を超えた時、警告 >#####▼
sub overkeikoku {                                                           #
  if ($pagesuu >= $keikokupage){                                            # ▼
    ++$henkansippai;                                                        ## エラー回数カウンタに1を足す
    print "\n\n",'【警告!!】『',$karifilename,'』の ',$counter,'行目を整形中に、',$keikokupage,'頁を超えました。',"\n";     ##
    print ' BSE形式では、',$keikokupage,'頁を超えるファイルで、問題が起きる可能性が有ります。',"\n";                        ##
    print ' 『',$karifilename,'』を ',$counter,'行目より前で、分割して下さい。',"\n\n";                                     ##
    print '***** BSE形式でデータを整形を中止しました。 *****',"\n";                                                         ##
    print '〜〜〜〜〜 I am very sorry. 〜〜〜〜〜',"\n\n";                                                  ##
    ## ▼▼ ダイアログを表示して、残りのファイルを処理するか尋ねる                                                          ##
    $comment = "注意!“$karifilename”の$counter行目を整形中に、$keikokupage頁を超えました。 $counter行目より数行手前で、分割して下さい。\n※ BSE形式では、$keikokupage頁以降が欠落する事が有ります。";
    &errdialog;                                                             ##
    ## ▲▲                                                                 ##
  }                                                                         # ▲
}                                                                           #
#▲####< S T D O U T : 頁数が$keikokupage頁を超えた時、警告 >#####▲

#▼-# カスタム設定 ページ数追加 #-##################################▼#
sub custompageadd {                                                    #▼ここから▼#
  if ($pageprint) {                                                     #▼-# 頁行を設定する時
    if ($kaisipage > 9999) {                                              #▽-# 頁行が9999頁を超えた時
      $kaisipage = 1;                                                       #-# 頁行を1に戻す
      ++$pagesuu;                                                           #-# ページ数に1を足して白紙の0ページを作る
      for ($i = 1; $i <= $pagegyou; $i++) {                                 #▼-# 1ページの行数$pagegyouの分
        push @seikeigyou, '';                                                  ## 空行を追加する
      }                                                                     #▲-# 
    }                                                                     #△-#
    $bsesuuji = $kaisipage;                                               #-# BSE形式に変換する為に頁行を代入
    $bsesuuji =~ tr/[1-9]0/[A-I]J/;                                       #-# ページを数値からBSE文字列に変換する
    if ($donopageprint == 0) {                                            #▽-# 『偶数ページ』のみに付ける場合
      unless ($kaisipage % 2) {                                             ##▼# $kaisipageを2で割った余りが0なら偶数ページなので
        push @seikeigyou, ' ' x ($gyoumoji - 5) . '#' . $bsesuuji;             ## 頁行の$bsesuujiを配列@seikeigyouに追加
      } else {                                                              ##▲▼# 余りが出たら
        push @seikeigyou, '';                                                  ## 頁行として、空行を配列@seikeigyouに追加
      }                                                                     ##▲#
    } elsif ($donopageprint == 1) {                                       #△▽-# 『奇数ページ』のみに付ける場合
      if ($kaisipage % 2) {                                                 ##▼# $kaisipageを2で割った余りが1なら奇数ページなので
        push @seikeigyou, ' ' x ($gyoumoji - 5) . '#' . $bsesuuji;             ## 頁行の$bsesuujiを配列@seikeigyouに追加
      } else {                                                              ##▲▼# 余りが出なかったら
        push @seikeigyou, '';                                                 #-# 頁行として、空行を配列@seikeigyouに追加
      }                                                                     ##▲#
    } elsif ($donopageprint == 2) {                                       #△▽-# 『全てのページ』に付ける場合
      push @seikeigyou, ' ' x ($gyoumoji - 5) . '#' . $bsesuuji;            #-# 頁行の$bsesuujiを配列@seikeigyouに追加
    }                                                                     #△-# 
    ++$kaisipage;                                                         #-# 頁行を1増やす
  } else {                                                              #▲▼-# 頁行を設定しない時
    push @seikeigyou, '';                                                 #-# 頁行として、空行を配列@seikeigyouに追加
  }                                                                     #▲-#
}                                                                      #▲ここまで▲#
#▲-# カスタム設定 ページ数追加 #-##################################▲#

#▼▼# エラー時にダイアログを表示して、残りのファイルを処理するか尋ねる #▼▼#
sub errdialog {                                                              #
  --$dropfilesu;                                                              # ドロップされたファイル数から1を引く
  if ($dropfilesu >= 1) {                                                     # 1を引いてもまだファイルが残っていたら、
    my $selectbuton = &MacPerl'Answer("$comment"."    ―― 残りのファイルの処理を、続けますか?","続ける","終了");
    if ($selectbuton == 1){next FILELOOP;}                                     ## “続ける”を押した時、$selectbuton = 1
    else {$syuuryou = 1; last FILELOOP;}                                       ## “終了”を押した時、 $selectbuton = 0
  } else {                                                                    # ファイルが残っていなかったら、
    &MacPerl'Answer($comment,"終了");                                          ## 終了する
    last FILELOOP;                                                             ##
  }                                                                           #
}                                                                            #
#▲▲# エラー時にダイアログを表示して、残りのファイルを処理するか尋ねる #▲▲#
E-mail:ei3k-iwt@asahi-net.or.jp