原稿用紙かうんたぁ

1・JavaScript部

<SCRIPT LANGUAGE="javascript">
<!--
function main(flg){
	bunsho=document.genko.screen.value;
	tate=document.genko.tate.value-0;
	yoko=document.genko.yoko.value-0;

	if(flg==1){
		kekka4=outstr(bunsho, tate);
		document.write(tate+" × "+yoko);
		document.write("<BR><BR>"+kekka4);
	}
	else{
		kekka1=cntmoji(bunsho);
		kekka2=cntline(bunsho, tate);
		kekka3=cntpage(kekka2, yoko);

		document.write("<BR>文字数"+kekka1);
		document.write("<BR>行数"+kekka2);
		document.write("<BR>枚数"+kekka3);
	}
}

/////////文字数を数える//////////////////////////
function cntmoji(str){
	crlf=0;
	len=str.length;
	cnt=0;

	while(1){
		crlf=str.indexOf(unescape("%0D%0A"), crlf);
		if(crlf<0)	break;
		cnt=cnt+2;
		crlf=crlf+2;
	}
	len=len-cnt;
	return len;
}

////////ページ数を数える//////////////////////////
function cntpage(gyou, yoko){
	amari=gyou%yoko;
	pagesu=(gyou-amari)/yoko;
	mes=pagesu+"枚と"+amari+"行";
	return mes;
}

////////行数を数える///////////////////////////////
function cntline(str, tate){
	thisstr="";	//今調べ中の文字列
	cursol=0;	//カーソル(thisstrの先頭)
	crlf=0;		//改行、thisstrのcrlf文字目に発見
	maxline=0;	//最後に返すトータル行数
	len=str.length;	//文字列の長さ

	while(cursol<len){
		//cursolからtate文字取得
		thisstr=bunsho.substr(cursol, tate);

		//禁則処理
		if(thisstr.charAt(0)==unescape("%0A")
		|| thisstr.charAt(0)=="」"
		|| thisstr.charAt(0)==")"
		|| thisstr.charAt(0)=="』"
		|| thisstr.charAt(0)=="。"
		|| thisstr.charAt(0)=="、"
		|| thisstr.charAt(0)==" "){
			cursol++;
			continue;
		}

		//tate+1文字目が改行ならそれは無視
		if(thisstr.charAt(0)==unescape("%0D")){
			if(cursol!=0
			&& bunsho.charAt(cursol-1)!=unescape("%0A")){
				cursol=cursol+2;
				continue;
			}
		}

		//改行があったら改行の次までカーソルを動かして
		crlf=thisstr.indexOf(unescape("%0D"));
		if(crlf>=0){
			cursol=cursol+crlf+2;
		}

		//改行がなかったら最後までカーソルを動かして
		else	cursol=cursol+tate;
		maxline++;
	}
	return maxline;
}


////////改行した文字列出力///////////////////////////
function outstr(str, tate){
	thisstr="";	//今調べ中の文字列
	cursol=0;	//カーソル(thisstrの先頭)
	crlf=0;		//改行、thisstrのcrlf文字目に発見
	len=str.length;	//文字列の長さ

	rtnstr="";	//原稿用紙サイズで折り返した文字列
	br=0;		//<BR>の位置

	while(cursol<len){
		//cursolからtate文字取得
		thisstr=bunsho.substr(cursol, tate);

		//禁則処理
		if(thisstr.charAt(0)==unescape("%0A")
		|| thisstr.charAt(0)=="」"
		|| thisstr.charAt(0)==")"
		|| thisstr.charAt(0)=="』"
		|| thisstr.charAt(0)=="。"
		|| thisstr.charAt(0)=="、"
		|| thisstr.charAt(0)==" "){
			cursol++;
			br=rtnstr.lastIndexOf("<BR>", rtnstr.length);
			if(br>=0){
				rtnstr=rtnstr.substring(0, br);
				rtnstr=rtnstr+thisstr.charAt(0)+"<BR>";
			}
			continue;
		}

		//tate+1文字目が改行ならそれは無視
		if(thisstr.charAt(0)==unescape("%0D")){
			if(cursol!=0
			&& bunsho.charAt(cursol-1)!=unescape("%0A")){
				cursol=cursol+2;
				continue;
			}
		}

		//改行があったら改行の次までカーソルを動かして
		crlf=thisstr.indexOf(unescape("%0D"));
		if(crlf>=0){
			rtnstr=	rtnstr
				+str.substring(cursol, cursol+crlf+2)
				+"<BR>";
			cursol=cursol+crlf+2;
		}

		//改行がなかったら最後までカーソルを動かして
		else{
			rtnstr=	rtnstr
				+str.substring(cursol, cursol+tate)
				+"<BR>";
			cursol=cursol+tate;
		}
	}
	rtnstr="<FONT FACE=\"MS ゴシック\">"+rtnstr+"<FONT>";
	return rtnstr;
}
//-->
</SCRIPT>



2・FORM部

<FORM NAME="genko">
縦<INPUT TYPE="text" NAME="tate" SIZE="4" VALUE=20>
×
横<INPUT TYPE="text" NAME="yoko" SIZE="4" VALUE=20>
<BR>
<TEXTAREA NAME="screen" COLS="50" ROWS="7">
</TEXTAREA>
<BR>
<INPUT TYPE="button" value="計算" onClick="main()">
<INPUT TYPE="button" value="出力" onClick="main(1)">
 <INPUT TYPE="reset" value="クリア">
</FORM>


● 設置方法
1・JavaScript部を設置したいHTMLの<HEAD>〜</HEAD>に、
2・FORM部を<BODY>〜</BODY>の中のお好きなところに貼り付けて下さい。

● 本日のテーマ
目指せ高速処理。きっと普通に組んでたら文章出力のほうは泣けるほど重いんじゃないだろーか。
でもこれも一回考えてから不都合が続出したため、途中からいろんな処理加えちゃったので
実は全然速くないかもしれない。でも今の私にはこれが精一杯。

● 今回の反省
似て非なる関数がある……。何とは言わんが、
cntline(str, tate)outstr(str, tate)だ(言ってる)。
どうにかなんないのか? これ、すごくどうにかしたいんだがどうにかならんのか?
いや、なるな……だが今となってはめんどくさい。ので放置。

ワードの文字数カウントでテストしつつ作成したのですが、
ワードと禁則処理の仕方が違うから、数合わないんだよね。あってんのかな。これ。

【実行結果】 【戻る】