##
##　　txt2tex.pl V3.05 (2009/04/18)
##　　txt2tex.pl V3.04 (2007/07/18)
##　　txt2tex.pl V3.03 (2007/07/12)
##　　txt2tex.pl V3.02 (2007/06/20)
##　　txt2tex.pl V3.01 (2007/06/08)
##　　txt2tex.pl V3.00 (2007/05/26)
##　　txt2tex.pl V2.02 (2007/05/15)
##　　txt2tex.pl V2.01 (2002/04/14)
##　　txt2tex.pl V2.0  (2001/03/15)
##　　txt2tex.pl V1.0  (1998/06)
##
##　台本テキストファイル-->台本TeXファイル変換
##
##　Copyright(C) OfficeBanno 1998-2007
##　http://officebanno.com/

#--- [仕様] -----------------------------------------------------#
#　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　#
#　　　perl txt2tex.pl 台本ソース名 [l|p]　　　　　　　　　　　　#
#　　　　　　l　オプション : A4横置き一段組(省略時デフォルト)　　#
#            p　オプション : A4縦置き二段組　　　　　　　　　　　#
#　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　#
#----------------------------------------------------------------#
#　改訂履歴
#
#　V3.05 2009/04/18　(daihons.styのみ更新)
#　　・いつの間にか行間が広くなっていたので、とりあえず調整
#　　　セリフ行間(横一段)　デフォルト→0.94
#
#　V3.04 2007/07/18
#　　・「\\＋改行」を許容する処理を追加
#　　　行末が\\の行は、次行と結合してから処理する方式に変更
#　　　これにより「あいう\\えお」と「あいう\\[改行]えお」は同等となる
#　　　(セリフ行、ト書き行ともに、\\の箇所で改行されて出力される)
#　　・QUATATION(前付け)処理を改善
#　　　キーワードQUOTATION:のみでも、出力を可とした
#　　　(QLOC:の各数値は0がセットされる)
#　　　QLOC:の指定がなくても、SOURCE:が下寄せになるように修正
#
#　V3.03 2007/07/13
#　　・引用ページではヘッダー罫線を消す
#　　　罫線太さを0ptにすることで対応
#　　・daihon*.sty(横一段組と縦二段組)を統合（スタイルファイルレベル）
#　　　これにより、呼び出しのstyファイルは、daihons.styに一本化した
#　　　オプションは横一段＝[a4land] 縦二段＝[a4port2c]で、
#　　　perl処理時の、パラメータ [l|p] に対応して自動セットされる
#　　・円マークなどの記号出力のため、textcomp.styを追加
#　　・画像張り込み対応の準備として、graphicx.styを追加
#
#　V3.02 2007/06/20
#　　・連数字変換の組み込み
#　　　書式→＾連数字対象文字列＾
#
#　V3.01 2007/06/08
#　　・文字コード対策
#　　　shift-jisソースが文字化けしないようにコード変換を導入
#　　・ルビ変換対応
#　　　書式→＜漢字｜ルビ＞
#　　・傍点変換対応
#　　　書式→’傍点対象’
#　　・太字（\textbf）変換対応
#　　　書式→＿太字対象＿
#
#　V3.00 2007/05/26
#　　・daihon*.styの全面見直し、ブラッシュアップ
#　　　daihon.sty → daihon3.sty
#　　　daihon2.sty → daihon4.sty
#
#　V2.02 2007/05/15
#　　・NOTE出力位置修正
#　　・QUOTATION(前付け)出力位置の指定機能追加
#　　　キーワード　QUOTATION:　 引用句等内容
#　　　　　　　　　SOURCE:　　　出典等
#　　　　　　　　　QLOC:a,b,c　 引用出力位置指定
#　　　　　　　　　　　　　　　 a=上余白調整値
#　　　　　　　　　　　　　　　 b=右余白調整値
#　　　　　　　　　　　　　　　 c=出典上余白調整値
#
#　V2.01 2002/06/14
#　　・コメント行処理　先頭が#の行を無視
#　　・未完セリフ行処理　
#　　　人物名+全角スペースの形のものはセリフ未完行とみなし
#　　　\sr{人物名}{　} のように全角スペースを補完する
#
#　V2.00 2001/03/15
#　　・横一段組と縦二段組を統合(perlスクリプトレベルで)
#　　　呼び出しのstyファイルはそれぞれ、
#　　　横一段→daihon.sty　縦二段→daihon2.sty
#
#　V1.00 1998/06
#
#====================#
#　初期処理　　　　　#
#====================#
#　文字コード対策
#------------------　ソースはshiftjisで書く。
#　　　　　　　　　　内部処理はutf8。
#　　　　　　　　　　ファイル名もshiftjis扱いだが、
#　　　　　　　　　　2バイト文字を使わないほうが確実かもしれない。
#　　　　　　　　　　strictを生かすとエラーが出る（原因不明）。
#
#use strict;
use encoding 'shiftjis';
use open IN  => ":encoding(shiftjis)";
use open OUT => ":encoding(shiftjis)";
use open ":std";
use Encode;
use Encode::JP;
#　パラメータチェック
#------------------　実行時パラメータが、配列 $ARGV[] に入ってくる。
#　　　　　　　　　　パラメータがないとき、警告する。
#
if (@ARGV < 1) { die "処理する台本名を指定してください。"; }
#
#　用紙方向モードチェック
#------------------　用紙モード（第二パラメータ）がブランクの場合は"l"とする
#　　　　　　　　　　用紙モードによって、リテラルをセットする
#
$ARGV[1] = $ARGV[1] || "l";
if ($ARGV[1] eq "l"){
	$mode_literal = "横一段組";
	$style_literal = "a4land";
	$docclass_literal = "11pt,landscape,a4j";
	$cindent_literal = "-5zw";
} elsif ($ARGV[1] eq "p") {
	$mode_literal = "縦二段組";
	$style_literal = "a4port2c";
	$docclass_literal = "10pt,twocolumn,a4j";
	$cindent_literal = "0zw";
} else {
	die "サポートしている用紙モード（ p=Ａ４縦二段組 l=Ａ４横一段組 ）"; 
}
##print "用紙モード        ： $ARGV[1]\n"; # for debug
##print "                     $mode_literal\n"; # for debug
##print "使用スタイル      ： $style_literal\n"; # for debug
##print "ドキュメントクラス： $docclass_literal\n"; # for debug
##print "表紙インデント値  ： $cindent_literal\n\n"; # for debug
#====================#
#　メインルーチン　　#
#====================#
#　台本ソースファイルオープン
#------------------　第一パラメータに"_input.txt"を付加して
#　　　　　　　　　　ファイル名を作り、IN としてそれを開く。
#　　　　　　　　　　ァイルがカレントフォルダにないとき警告する。
#
open(IN, "$ARGV[0]_input.txt") || die "$ARGV[0] : $!";
#
#　固定文字列を要素配列にセットする
#------------------　要素配列 @const に
#　　　　　　　　　　　COVER  --> [第一パラメータ]+[第二パラメータ]_cover
#　　　　　　　　　　　　(TeX表紙ファイルのファイル名生成)
#　　　　　　　　　　　SCRIPT --> [第一パラメータ]+[第二パラメータ]_script
#　　　　　　　　　　　　(TeX本文ファイルのファイル名生成)
#　　　　　　　　　　　PAPERMODE --> $mode_literalの値
#　　　　　　　　　　　STYLE --> $style_literalの値
#　　　　　　　　　　　DOCCLASS --> $docclass_literalの値
#　　　　　　　　　　　CINDENT --> $cindent_literalの値
#　　　　　　　　　　を仕込む。
#
push (@const ,("COVER" , "$ARGV[0]$ARGV[1]_cover" , "SCRIPT" , "$ARGV[0]$ARGV[1]_script" , "PAPERMODE" , $mode_literal , "STYLE" , $style_literal , "DOCCLASS" , $docclass_literal , "CINDENT" , $cindent_literal ));
##print "固定文字列(".'@const'.")初期セット：@const\n\n";	#for debug
#
#　TeX表紙ファイル用キーワード抽出
#--------------------------------
#------------------　台本ソースファイルの、SCRIPT: より前の部分を
#　　　　　　　　　　一行ずつ読み込む。
#　　　　　　　　　　「:」が含まれる行なら
#　　　　　　　　　　「:」の左側と右側をペアとして @const に追加する
#　　　　　　　　　　（ただし、CAST: 行は除く）
#　　　　　　　　　　「:」が含まれない行は、登場人物行とみなし、
#　　　　　　　　　　全行を配列 @tj へ格納する
#
$cflg = 0;	#CASTS行処理中フラグ
$qflg = 0;	#QUOTATION有無フラグ
$lflg = 0;	#QLOC有無フラグ
while(<IN>) {
	next if (/^#/);	#先頭「＃」の行はコメント行として読み飛ばす
	last if (/SCRIPT:/);	#表紙領域終わり
	&markup;	#制御記号置換サブ
	if (/:/) {
		$cflg++ if ( $cflg == 1 || $` eq "CASTS" );	#CASTS:の出現、または出現後別キーワード出現
		$qflg++ if ( $` eq "QUOTATION" );	#QUOTATION:の出現
		chomp($right = $') , $left = $` ;
		if ( $left eq "QLOC" && $right ne "" ) {	#QLOC:行は「,」で分割して格納する
			$lflg++;	#QLOC:あり（キーワードのみの場合はここには入らない）
			push (@const ,( "QUPPER" , (split(/\,/, $right))[0] ));	#上余白調整値
			push (@const ,( "QRIGHT" , (split(/\,/, $right))[1] ));	#右余白調整値
			push (@const ,( "QSUP" , (split(/\,/, $right))[2] ));	#出典上余白調整値
		} else {
			push (@const ,( $left , $right ) );
		}	#「CAST」行から下、次のキーワード出現までは一括して@tjへ格納
	} elsif ( $cflg == 1 ) {
		push (@tj , $_);
	}
}
if ( $qflg > 0 && $lflg == 0 ) {	#QUOTATION:があってQLOC:がない場合
	push (@const ,( "QUPPER" , 0 ));	#上余白調整値をゼロに
	push (@const ,( "QRIGHT" , 0 ));	#右余白調整値をゼロに
	push (@const ,( "QSUP" , 0 ));	#出典上余白調整値をゼロに
}
#
#　抽出キーワードをハッシュへ移す
#-------------------------------
#------------------　要素配列 @const に格納した、
#　　　　　　　　　　「キーワード」:「内容」の組み合わせを
#　　　　　　　　　　要素ハッシュ %const_h へ移す。
#
%const_h = @const;
##print "固定文字列(".'@const'.")抽出後：@const\n\n";	#for debug
#
#　TeX元ファイル・TeX表紙ファイルオープン
#------------------　OUT1 として
#　　　　　　　　　　[第一パラメータ]+[第二パラメータ].tex
#　　　　　　　　　　を開く。(TeX元ファイル)
#　　　　　　　　　　OUT2 として
#　　　　　　　　　　[第一パラメータ]+[第二パラメータ]_cover.tex
#　　　　　　　　　　を開く。(TeX表紙ファイル)
#
open(OUT1, ">$ARGV[0]$ARGV[1].tex") || die "$ARGV[0] : $!";
open(OUT2, ">$ARGV[0]$ARGV[1]_cover.tex") || die "$ARGV[0] : $!";
#
#　TeX元ファイルとTeX表紙ファイルへの書き込み
#------------------　このファイル下の DATA 行を全て一行ずつ読み込む。
#　　　　　　　　　　「キーワード」が出てきたらそれを対応する「内容」に
#　　　　　　　　　　書き換えながら、
#　　　　　　　　　　　先頭「data1」の行は TeX元ファイルへ書き出す
#　　　　　　　　　　　先頭「data2」の行は TeX表紙ファイルへ書き出す
#　　　　　　　　　　　先頭「data3」の行に来たら、
#　　　　　　　　　　　　登場人物処理ルーチンに飛ばす
#　　　　　　　　　　　NOTEキーワードの内容が空でない場合
#　　　　　　　　　　　　先頭「data4」の行（注記部分）を
#　　　　　　　　　　　　TeX表紙ファイルに書き出す
#　　　　　　　　　　　先頭「data5」の行を TeX表紙ファイルに書き出す
#　　　　　　　　　　　QUOTATIONキーワードの内容が空でない場合
#　　　　　　　　　　　　先頭「data6」の行最後までを TeX表紙ファイルに書き出す
#
while (<DATA>) {
	s/(COVER|SCRIPT|TITLE|SUB|AUTHOR|PRESENTS|YEAR|CASTS|NOTE|QUOTATION|SOURCE|QUPPER|QRIGHT|QSUP|PAPERMODE|STYLE|DOCCLASS|VERSION|CINDENT)/$const_h{$&}/;
	if (/^data1/) {
		print OUT1 "$'";
	} elsif (/^data2/) {
		print OUT2 "$'";
	} elsif (/^data3/) {
		print OUT2 "$'";
		&tj_set;
	} elsif ( ( $const_h{NOTE} ne '' ) && (/^data4/) ) {
		print OUT2 "$'";
	} elsif (/^data5/) {
		print OUT2 "$'";
	} elsif ( ( $const_h{QUOTATION} ne '' ) &&(/^data6/) ) {
		print OUT2 "$'";
	}
}
#
#　出力ファイルクローズ
#------------------　TeX元ファイルを閉じる
#　　　　　　　　　　TeX表紙ファイルを閉じる
#
close(OUT1);
close(OUT2);
#
#　TeX本文ファイルオープン
#------------------　OUT として
#　　　　　　　　　　[第一パラメータ]+[第二パラメータ]_script.tex
#　　　　　　　　　　を開く。(TeX本文ファイル)
#
open(OUT, ">$ARGV[0]$ARGV[1]_script.tex") || die "$ARGV[0] : $!";
#
#　シーン番号( $actcnt )カウンタリセット
#--------------------------------------
#
$actcnt = 0;
#
#　台本ソースファイルを一行ずつ処理し、TeX本文ファイルへ書き出す
#--------------------------------------------------------------
#
$stack = "";	#「￥￥＋改行」を結合するための退避領域
while(<IN>) {
	next if (/^#/);	#先頭「＃」の行はコメント行として読み飛ばす
	&markup;	#制御記号置換サブ
	$stack .= $_;	#読み込んだ行を $stack の後ろへ追加
	if (/\\{2}$/){	#「￥￥＋改行」の行であれば、次の行を読みに行く
		next;
	}
	$_ = $stack;	#「￥￥＋改行」でなければ $stack を $_ に書き戻す
	$stack = "";	# $stack をクリアする
	if (/^ACT:/){	#シーン区切り
		s//\\act{/;
		s/$/}/;
		$actcnt++;
	} elsif (/^(.+?)　/){	#セリフ
		s//\\sr{$1}{/;
		s/$/}/;
		s/{}/{　}/;	#空セリフ対処
	} elsif (!/^$/){	#ト書き
		s/\n//;
		s/\t//;
		$tg_stk = "\\tg{" . $_;
		&tg_set;
	}
	print OUT "$_";
	&pre_act1 if ($actcnt == 1);	#最初のシーンなら先頭処理サブへ
}
#
#　台本ソースファイル・TeX本文ファイルクローズ
#--------------------------------------------
#
close(IN);
close(OUT);
#=====================#
#　サブルーチン　　　 #
#=====================#
#
#　登場人物書き出しサブ
#---------------------
#
## print "登場人物配列(".'@tj'.")の内容：@tj\n";	#for debug
sub tj_set {
	foreach $tj (@tj){
		if ($tj =~ /　/) {
			$tj =~ s/^(.+)　/\\tj{$1}{/;
			$tj =~ s/$/}/;
		} elsif ($tj eq "\n") {
			$tj = "\\vspace{1zw}\n";
		} else {
			$tj =~ s/^/\\small\\textbf{ /;
			$tj =~ s/$/}/;
		}
		$tj =~ s/tj{(.)}/tj{$1　}/;
		$tj =~ s/{}$/{　}/;
		print OUT2 "$tj";
	}
}
#
#　台本本文ファイルの先頭処理サブ
#-------------------------------
#
sub pre_act1{
	print OUT "\\setcounter{page}{1}\n";
#　fancyplain -> fancy に変更 (fancyhdr.styの仕様変更？)	20070620
	print OUT "\\pagestyle{fancy}\n";
#　print OUT "\\pagestyle{fancyplain}\n";
#　↓add ヘッダー罫線を0.4ptにリセットする処理 20070620
#　　これを入れないと本文以降でヘッダ罫線が消える
	print OUT "\\renewcommand{\\headrulewidth}{.4pt}\n";
#
	print OUT "\\rhead{\\textbf{\\large " . $const_h{TITLE} . "}\\textbf{\\normalsize " . $const_h{SUB} . "}}\n";
	print OUT "\\chead{}\n";
	print OUT "\\lhead{\\thepage}\n";
	print OUT "\\lfoot{\\texttt{\\theactpage\\stepcounter{actpage} of Act\\theactnum}}\n";
	print OUT "\\cfoot{\\tiny{Version $const_h{VERSION}}}\n";
	print OUT "\\rfoot{\\texttt{\\number\\year/\\number\\month/\\number\\day\\  \\number\\hour:\\number\\minute}}\n";
	$actcnt++;
}
#
#　ト書きブロック用サブ
#---------------------
#
sub tg_set{
	while(<IN>) {
		next if (/^#/);	#先頭「＃」の行はコメント行として読み飛ばす
		&markup;	#制御記号置換サブ
		$stack .= $_;	#読み込んだ行を $stack の後ろへ追加
		if (/\\{2}$/){	#「￥￥＋改行」の行であれば、次の行を読みに行く
			next;
		}
		$_ = $stack;	#「￥￥＋改行」でなければ $stack を $_ に書き戻す
		$stack = "";	# $stack をクリアする
		if (/^ACT:/){
			$tg_stk = $tg_stk . "}\n";
			print OUT "$tg_stk";
			s//\\act{/;
			s/$/}/;
			last;
		} elsif (/^(.+?)　/){
			$tg_stk = $tg_stk . "}\n";
			print OUT "$tg_stk";
			s//\\sr{$1}{/;
			s/$/}/;
			last;
		} elsif (/^$/){
			$tg_stk = $tg_stk . "}\n";
			print OUT "$tg_stk";
			last;
		} else {
			s/\n//;
			s/\t//;
			$tg_stk = $tg_stk ."\\\\\n" . $_;
		}
	}
}
#
#　制御記号置換
#---------------------
#
sub markup {
	$_ =~ s/＜([^｜＞]*)｜([^＞]*)＞/\\kana[1]{$1}{$2}/g;	#＜対象文字｜よみかな＞をフリガナとする
	$_ =~ s/’([^’]*)’/\\bou{$1}/g;	#’対象文字’を傍点とする
	$_ =~ s/＿([^＿]*)＿/\\textbf{$1}/g;	#＿対象文字＿をboldとする
	$_ =~ s/＾([^＾]*)＾/\\rensuji{$1}/g;	#＾対象文字＾を連数字とする
}
#=====================#
#　固定データ　　　　 #
#=====================#
__DATA__
data1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data1%%  『TITLE』
data1%%   (Ａ４PAPERMODE・台本レイアウト)
data1%%   by Hiroshi Banno OCT/1998 - 2007
data1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data1\documentclass[DOCCLASS]{tarticle}
data1\usepackage{plext}
data1\usepackage{furikana}
data1\usepackage{indent}
data1\usepackage{graphicx}
data1\usepackage{textcomp}
data1\usepackage[STYLE]{daihons}
data1\usepackage{fancyhdr}
%
% 縦組みにおけるfancyhdｒ.styの不具合に対処する 2007/07
data1\setlength{\headwidth}{\textheight}
%
data1\begin{document}
data1\input{COVER}
data1\input{SCRIPT}
data1\end{document}

%----- 表紙 -----------------------------------------------------
% fancyplain->fancyに変更 (fancyhdr.styの仕様変更？) 20070620
data2\thispagestyle{fancy}
% data2\thispagestyle{fancyplain}
data2\lhead{}
data2\chead{}
data2\rhead{}
data2\lfoot{\copyright\textbf{Hiroshi Banno YEAR}}
data2\cfoot{\tiny{Version VERSION}}
data2\rfoot{\texttt{\number\year/\number\month/\number\day\  \number\hour:\number\minute}}
data2\begin{indentation}{CINDENT}{0pt}
data2\textbf{PRESENTS}\\
data2\vspace{0.5zw}\\
data2\textbf{\huge TITLE}
data2\hspace{1zw}\textbf{\small SUB}\\
data2\vspace{0.5zw}\\
data2\textbf{\large AUTHOR}\\
data2\vspace{1zw}\\

data3\textbf{\Large CASTS}\\

data4\begin{indentation}{1zw}{2zw}
data4\vspace{\fill}\small{【注記】NOTE}
data4\end{indentation}
data5\end{indentation}
%----- QUOTATION -------------------------------------------
data6\pagebreak
% fancyplain->fancyに変更 (fancyhdr.styの仕様変更？) 20070620
% さらに、ここが\pagestyleだったのを\thispagestyleに変更 20070620
data6\thispagestyle{fancy}
% data6\pagestyle{fancyplain}
%
% add↓ 引用文ページでヘッダー罫線を消す処理 20070620
data6\renewcommand{\headrulewidth}{0pt}
%
data6\lhead{}
data6\chead{}
data6\rhead{}
data6\lfoot{}
data6\cfoot{}
data6\rfoot{}
data6\begin{indentation}{CINDENT}{0zw}
data6\begin{indentation}{QUPPERzw}%
data6{QUPPERzw}
data6\vspace*{\fill}\vspace{QRIGHTzh}
%data6\hspace*{\fill}QUOTATION\hspace{\fill}\\
data6QUOTATION
data6\end{indentation}
data6\begin{indentation}{0mm}{QSUPzw}
data6\hspace{\fill}\small{SOURCE}\\
data6\end{indentation}
data6\vspace{\fill}
data6\end{indentation}
data6\pagebreak
