YY-BOARDを改造しよう
▼改造版のソースを簡単なコメント付きで公開します。なんかの参考にしてください。
   ・これは、YY-BOARD Plus ver 1.12 のソースです。
   ・改造した部分は赤文字で、簡単なコメントを青文字で書いています。
   ・特に何の改造もしなかったサブルーチンは省略してあります。
#!/usr/local/bin/perl
省略

#============#
#  設定項目  #
#============#
省略
↓改造版で追加した初期設定です。
# =================================
# ここから下は、改造版の設定です
# =================================
# アイコンのプレビュー機能を使う(0=no 1=yes)
# アイコンプレビューは、IE5.0、NN4.6およびNetscape6で動作確認しています。(JavaScriptが有効の時)
$preview = '1';

# 「最近の投稿」を記録するファイル
$newfile = './new.log';

# 「最近の投稿」の記録件数
$max_count = '30';

# 「最近の投稿」ページで強調する文字色
$new_color = '#7777FF';

# 親記事のタイトルの前につけるマーク(何も付けないなら'')
$mark = '☆';

# レス記事のタイトルの前につけるマーク(何も付けないなら'')
$re_mark = '◇';

# 記事のタイトルの文字サイズ(ポイント数:スタイルシートで有効)
$big_size = '11pt';

# アイコンプレビューの部分の幅と高さ
$i_width = '95';	# 幅
$i_height = '70';	# 高さ

# 記事を表示するテーブルの幅
$table_width = '85%';

# テーブルの枠の色(IEのみ、デフォルトが良いなら''でOK)
$border_color = '#BBBBFF';

# 親記事とレス記事を区切る線の色 (IEのみ)
$line_color = '#D0D0FF';

# 投稿者の名前の色(メールアドレスを記入していない場合)
$name_color = '#5555FF';

# タグ許可($tagkey = 1)のとき、次の危険なタグは使用不能にする。
@errtag = ('table','script','meta','form','!--','embed','html','body','tr','td','th','a');

# タグを禁止しているとき($tagkey = 0)、下で指定する安全なタグは使用可能にする(0=no 1=yes)
$tag = '1';

# ↑の機能を利用したとき、許可するタグを1にする。(禁止するタグは0に)
$font_tag = '1';	# <FONT>タグ
$b_tag = '1';		# <B> タグ
$i_tag = '1';		# <I> タグ
$u_tag = '1';		# <U> タグ
$s_tag = '0';		# <S> タグ
$img_tag = '0';		# <IMG> タグ

#============#
#  設定完了  #
#============#
# メイン処理
&decode;
&axs_check;
if ($mode eq "howto") { &howto; }
elsif ($mode eq "find") { &find; }
elsif ($mode eq "usr_del") { &usr_del; }
elsif ($mode eq "regist") { &regist; }
elsif ($mode eq "res") { &res_form; }
elsif ($mode eq "admin") { &admin; }
elsif ($mode eq "image") { &image; }
elsif ($mode eq "past") { &past; }
elsif ($mode eq "check") { &check; }
↓このサブルーチンに飛ぶのは、トップページで「最近の投稿」をクリックしたときです。
elsif ($mode eq "new") { &new; }
↓このサブルーチンに飛ぶのは、トップページまたは管理用ページで「修正」をクリックしたときです。
elsif ($mode eq "mod_form") { &mod_form; }
↓このサブルーチンに飛ぶのは、記事修正フォームで「記事の修正」をクリックしたときです。
elsif ($mode eq "modify") { &modify; }
&html_log;

#----------------#
#  アクセス制限  #
#----------------#
省略

#--------------#
#  記事表示部  #
#--------------#
sub html_log {
	# クッキーを取得
	&get_cookie;

	# フォーム長を調整
	&get_agent;

	# ヘッダを出力
	if ($ImageView == 1) { &header('ImageUp'); }
	else { &header; }

	# カウンタ処理
	if ($counter) { &counter; }

	# タイトル部
	print "<center>\n";
	if ($banner1 ne "<!-- 上部 -->") { print "$banner1<P>\n"; }
	if ($title_gif eq '') {
		print "<font color=\"$t_color\" size=6 face=\"$t_face\"><b><SPAN>$title</SPAN></b></font>\n";
	}
	else {
		print "<img src=\"$title_gif\" width=\"$tg_w\" height=\"$tg_h\">\n";
	}

	print "<hr width='90%'>\n";
	print "[<a href=\"$homepage\" target='_top'>トップに戻る</a>] \n";
	最近の投稿を表示するためのリンクです。?mode=newとしてあるので、newサブルーチンに飛びます。
	print "[<a href=\"$script?mode=new\">最近の投稿]</a>] \n";
	print "[<a href=\"$script?mode=howto\">使い方</a>] \n";
	print "[<a href=\"$script?mode=find\">ワード検索</a>]\n";

	# 過去ログのリンク部を表示
	if ($pastkey) {	print "[<a href=\"$script?mode=past\">過去ログ</a>]\n"; }

	print <<"EOM";
[<a href="$script?mode=admin">管理用</a>]
<hr width='90%'>
アイコンのプレビュー機能を使うには、フォームに名前が付いている必要があるので。name="FoImg"を加えます
<form method="$method" action="$script" name="FoImg">
<input type=hidden name=mode value="regist">
<table border=0 cellspacing=0>
<tr>
  <td nowrap><b>おなまえ</b></td>
  <td><input type=text name=name size="$nam_wid" value="$c_name"></td>
</tr>
<tr>
  <td nowrap><b>Eメール</b></td>
  <td><input type=text name=email size="$nam_wid" value="$c_email"></td>
</tr>
<tr>
  <td nowrap><b>題  名</b></td>
  <td nowrap>
EOM
if ($show eq "re") {print "<input type=hidden name=show value=\"re\">\n";}
print <<"EOM";
    <input type=text name=sub size="$sub_wid">
   <input type=submit value="投稿する"> <input type=reset value="リセット">
  </td>
</tr>
<tr>
  <td colspan=2>
    <b>コメント</b><br>
    <textarea cols="$com_wid" rows=7 name=comment wrap="$wrap"></textarea>
  </td>
</tr>
<tr>
  <td nowrap><b>URL</b></td>
  <td><input type=text size="$url_wid" name=url value="http://$c_url"></td>
EOM
アイコンモードで、かつアイコンプレビュー機能を使う場合のみ表示
if ($icon_mode && $preview){print"<td align=\"center\">☆アイコン☆</td>";}
print"</tr>";


	# 管理者アイコンを配列に付加
	if ($my_icon) {
		push(@icon1,"$my_gif");
		push(@icon2,"管理者用");
	}

	if ($icon_mode) {
		アイコンプレビューのため、name=icon onChange='chaImgIenn5(\"FoImg\",\"icon\",\"imgIenn5\"を加えます
		print "<tr><td nowrap><b>イメージ</b></td><td><select name=icon onChange='chaImgIenn5(\"FoImg\",\"icon\",\"imgIenn5\")'>\n";
		foreach(0 .. $#icon1) {
			if ($c_icon eq "$icon1[$_]") {
				print "<option value=\"$icon1[$_]\" selected>$icon2[$_]\n";
			} else {
				print "<option value=\"$icon1[$_]\">$icon2[$_]\n";
			}
		}
		print "</select> <small>(あなたのイメージを選択して下さい)</small>\n";

		# イメージ参照のリンク
		if ($ImageView == 1) {
			print "[<a href=\"javascript:ImageUp()\">画像イメージ参照</a>]";
		} else {
			print "[<a href=\"$script?mode=image\" target=\"_blank\">画像イメージ参照</a>]";
		}
		print "</td>\n";
	}
	アイコンプレビューの場所を確保します
	if ($icon_mode && $preview){print "<TD BGCOLOR=\"$tbl_color\" WIDTH=\"$i_width\" HEIGHT=\"$i_height\" ROWSPAN=\"4\" ALIGN=\"center\" VALIGN=\"middle\">";
	        if ($c_icon){
        	クッキーにアイコンの情報があるときは、クッキーのアイコンを表示
		   print "<IMG SRC=\"$imgurl$c_icon\" name=\"imgIenn5\" ALIGN=\"CENTER\" BORDER=\"0\">";}
		else{
		クッキーにアイコンの情報が無いときは、最初のアイコンを表示
		   print "<IMG SRC=\"$imgurl$icon1[0]\" name=\"imgIenn5\" ALIGN=\"CENTER\" BORDER=\"0\">";}
	}
	print "</TD></TR>\n";

	print "<tr><td nowrap><b>削除キー</b></td>\n";
	print "<td><input type=password name=pwd size=8 maxlength=8 value=\"$c_pwd\">\n";
	print "<small>(自分の記事を削除時に使用。英数字で8文字以内)</small></td></tr>\n";
	print "<tr><td nowrap><b>題名の色</b></td><td>\n";

	オリジナルのyybbsではタイトルの色が変更できないので、タイトルの色を選択するチェックボックスを作ります
	# クッキーの色情報がない場合
	if ($c_color2 eq "") { $c_color2 = $COLORS[0]; }
	foreach (0 .. $#COLORS) {
		if ($c_color2 eq "$COLORS[$_]") {
			下と同じですが、name=color2にしてあげましょう
			print "<input type=radio name=color2 value=\"$COLORS[$_]\" checked>";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		} else {
			print "<input type=radio name=color2 value=\"$COLORS[$_]\">";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		}
	}

	print "<tr><td nowrap><b>本文の色</b></td><td>\n";
	# クッキーの色情報がない場合
	if ($c_color eq "") { $c_color = $COLORS[0]; }

	foreach (0 .. $#COLORS) {
		if ($c_color eq "$COLORS[$_]") {
			print "<input type=radio name=color value=\"$COLORS[$_]\" checked>";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		} else {
			print "<input type=radio name=color value=\"$COLORS[$_]\">";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		}
	}
	print "</td></tr></table></form>\n";
	print "<br>\n";

	# ページ区切り処理
	$start = $page + 1;
	$end   = $page + $p_log;

	# 記事を展開
	open(IN,"$logfile") || &error("Open Error : $logfile");
	$top = <IN>;

	$i=0;
	$flag=0;
	while (<IN>) {
		タイトルの色$t_colorを追加します。
		($no,$reno,$date,$name,$mail,$sub,
			$comment,$url,$host,$pw,$color,$icon,$t_color) = split(/<>/);
		
		# これでオリジナルyybbsを使っていた人も安心!?
		オリジナルyybbsには$t_colorの情報がないので、上書きしてこのスクリプトを使った場合、
		以前からあった記事のタイトルは黒になってしまいます。なので、その回避措置みたいなもの
		if ($t_color eq '\n' || $t_color eq '') { $t_color = $sub_color; }
		
		if ($reno eq "") { $i++; }
		if ($i < $start) { next; }
		if ($i > $end) { last; }

		if ($mail) { $name = "<a href=\"mailto:$mail\">$name</a>"; }
		if ($home_icon && $url) { $url = "<a href=\"http://$url\" target='_blank'><img src=\"$imgurl$home_gif\" border=0 align=top alt='HomePage' width=\"$home_wid\" height=\"$home_hei\"></a>"; }
		elsif (!$home_icon && $url) { $url = "<<a href=\"http://$url\" target='_blank'>HOME</a>>"; }
		if (!$icon_mode) { $comment = "<blockquote>$comment</blockquote>"; }

		if (!$reno && $flag) {
			print "</TD></TR></TABLE><br><br>\n";
			$flag=1;
		}
		if (!$reno) {
			テーブルの枠の色を設定しているかどうかで分岐。設定してある場合は「BORDERCOLOR」をつける
			テーブルの幅もオリジナルは90%で固定ですが、変数($table_width)にして設定項目で変更できるようにします
			if($border_color){print "<TABLE BORDER=1 WIDTH='$table_width' BGCOLOR=\"$tbl_color\" CELLSPACING=0 CELLPADDING=2 BORDERCOLOR=\"$border_color\"><TR><TD>\n";}
			else{print "<TABLE BORDER=1 WIDTH='$table_width' BGCOLOR=\"$tbl_color\" CELLSPACING=0 CELLPADDING=2><TR><TD>\n";}
			$flag=1;
		}

		color=\"$line_color\"を加えて、設定項目でラインの色を設定できるようにします
		if ($reno) { print "<hr noshade size=1 width='85%' color=\"$line_color\">\n"; }
		print "<table border=0 cellpadding=2><tr>\n";
		if ($reno) { print "<td rowspan=2 width=40><br></td>"; }

		タイトルは<BIG>タグで囲んで大きくしました。あと$markが、親記事のタイトルの前に付けるマークです
		if (!$reno) { print "<td nowrap><BIG>   $mark<font color=\"$t_color\"><b>$sub </b></font></BIG>";}
		$re_markが、レス記事のタイトルの前に付けるマークです
		else { print "<td nowrap><BIG>$re_mark<font color=\"$t_color\"><b>$sub </b></font></BIG>";}

		投稿者の名前も変更できるように変えます。リンク色と同じにしておくと、メアドを入力した人と同じ色になるので自然です。まあ、個人の好みですが…
		if (!$reno) { print "投稿者:<FONT COLOR=\"$name_color\"><b>$name</b></FONT> <small>投稿日:$date</small> "; }
		else { print "投稿者:<FONT COLOR=\"$name_color\"><b>$name</b></FONT> - <small>$date</small> "; }

		print "<font color=\"$sub_color\"><small>No\.$no</small></font></td>";
		print "<td valign=top nowrap>   $url </td><td valign=top>\n";

		if (!$reno) {
			print "<form action=\"$script\" method=$method>\n";
			print "<input type=hidden name=mode value=res>\n";
			print "<input type=hidden name=no value=$no>\n";
			print "<input type=submit value='返信'></td></form>\n";
		} else {
			print "<br></td>\n";
		}

		print "</tr></table><table border=0 cellpadding=4><tr>\n";
		if ($reno) { print "<td width=32><br></td>\n"; }

		# アイコンモード
		if ($icon_mode) { print "<td><img src=\"$imgurl$icon\"></td>"; }

		print "<td><font color=\"$color\">$comment</font>";
		print "</td></tr></table>\n";

	}
	close(IN);
	print "</TD></TR></TABLE>\n";

	$next_page = $page + $p_log;
	$back_page = $page - $p_log;

	print "<blockquote><table align=left cellpadding=0 cellspacing=0><tr>\n";
	if ($back_page >= 0) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=page value=\"$back_page\">\n";
		print "<input type=submit value=\"前の$p_log件\">\n";
		print "</td></form>\n";
	}
	if ($next_page < $i) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=page value=\"$next_page\">\n";
		print "<input type=submit value=\"次の$p_log件\">\n";
		print "</td></form>\n";
	}
	print "</tr></table>\n";
	print "<table align=right><tr>\n";
	print "<td nowrap align=center><form action=\"$script\" method=\"$method\">\n";
	print "<font color=\"$sub_color\">【記事削除・修正フォーム】</font><br>\n";
	if($modify){
	修正機能を使うときは、ラジオボタンで削除・修正を選択できるようにする
	print "<input type=radio name=mode value=\"usr_del\" checked>削除 / \n";
	print "<input type=radio name=mode value=\"mod_form\">修正<BR>\n";
	使わないときは、hiddenで必ず削除にする
	else{print "<input type=hidden name=mode value=\"usr_del\">\n"}
	}
	print "記事No<input type=text name=no size=3>\n";
	print "削除キー<input type=password name=pwd size=4 maxlength=8>\n";
	↓まあ、細かいことですが…
	if($modify){print "<input type=submit value=\"実行\">\n";}
	else{print "<input type=submit value=\"削除\">\n";}
	print "</form></td>\n";
	print "</tr></table></blockquote><br clear=all>\n";

	# 著作権表示部
	# MakiMakiさんの画像使用の有無に関わらずこの2箇所のリンク部の
	# 削除改変を禁止します
	print "$banner2<P><small><!-- $ver -->\n";
	print "- <a href='http://www.kent-web.com/' target='_top'>KENT</a> & ";
	改造版であることを分かるようにするため、Edit : k-jiを付け加えます
	print "<a href='http://village.infoweb.ne.jp/~fwhf2602/' target='_top'>MakiMaki</a> / ";
	print "Edit : <a href='http://ha5.seikyou.ne.jp/home/k-ji/' target='_top'>K-ji</a> Icon : <a href='http://www.mars.dti.ne.jp/~showkow/top.htm' target='_top'>みぃ</a> -\n";
	print "</small></center>\n";
	print "</body></html>\n";
	exit;
}

#----------------#
#  ログ書込処理  #
#----------------#
sub regist {
	# POST限定
	if ($MethPost && !$post_flag) { &error("不正なアクセスです"); }

	# 他サイトからのアクセスを排除

	if ($base_url) {
		$ref_url = $ENV{'HTTP_REFERER'};
		$ref_url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		if ($ref_url !~ /$base_url/i) { &error("不正なアクセスです"); }
	}

	# 名前とコメントは必須
	if ($in{'name'} eq "") { &error("名前が入力されていません"); }
	if ($in{'comment'} eq "") { &error("コメントが入力されていません"); }
	if ($in{'email'} && $in{'email'} !~ /(.*)\@(.*)\.(.*)/)
		{ &error("Eメールの入力内容が正しくありません"); }
	# 題名の長さ制限
	if (length($in{'sub'}) > $sub_len * 2)
		{ &error("題名の長さは全角$sub_len文字までにして下さい"); }

	# 管理アイコンのチェック
	if ($my_icon && $in{'icon'} eq "$my_gif") {
		if ($in{'pwd'} ne "$pass") { &error("管理用アイコンは管理者専用です"); }
	}

	# 時間を取得
	&get_time;

	# クッキーを発行
	&set_cookie;

	# ファイルロック
	if ($lockkey) { &lock; }

	# ログを開く
	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);

	# 記事NO処理
	$top = shift(@lines);
	($no,$ip,$time2) = split(/<>/, $top);
	$no++;

	# 連続投稿チェック
	if ($addr eq "$ip" && $wait > $times - $time2)
		{ &error("連続投稿はもうしばらく時間をおいて下さい"); }

	# 削除キーを暗号化
	if ($in{'pwd'} ne "") { $ango = &encrypt($in{'pwd'}); }

	# URL自動リンク
	if ($autolink) { &auto_link($in{'comment'}); }

	# タグの復活
	if ($tag){
	タグの復活の下準備として、&quotに変換された"を、元に戻してあげます(コメントのみ)
	$in{'comment'} =~ s/&quot;/\"/g;
	タグの復活をするため、サブルーチンtag_changeに飛びます
	$in{'comment'} = &tag_change($in{'comment'});
	}

	# 親記事の場合
	if ($in{'reno'} eq "") {

		$i=0;
		$stop=0;
		foreach (@lines) {
			($no2,$reno2) = split(/<>/);
			$i++;
			if ($i > $max-1 && $reno2 eq "") { $stop=1; }
			if (!$stop) { push(@new,$_); }
			elsif ($stop && $pastkey) { push(@data,$_); }
		}
		タイトルの色情報は、$in{'color2'}で表されます。なのでこれを加えましょう。レス記事の場合も同じです。
		unshift(@new,"$no<><>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>$in{'color2'}<>\n");
		unshift(@new,"$no<>$addr<>$times<>\n");

		# 過去ログ更新
		if ($data[0]) { &pastlog; }

		# 更新
		open(OUT,">$logfile") || &error("Write Error : $logfile");
		print OUT @new;
		close(OUT);
	}
	# レス記事の場合:トップソートあり
	elsif ($in{'reno'} && $topsort) {

		$match=0;
		@new=();
		@tmp=();
		foreach (@lines) {
			($no2,$reno2,$date2,$name,$email,$sub) = split(/<>/);

			if ($in{'reno'} eq "$no2") {
				$match=1;
				レスの付く親記事の情報を、別の変数に保存しておきます。これは「最近の投稿」の記録の時に使います
				$new_sub = $sub;
				$new_no = $no2;
				push(@new,$_);
			}
			elsif ($in{'reno'} eq "$reno2") {
				push(@new,$_);
			}
			elsif ($match == 1 && $in{'reno'} ne "$reno2") {
				$match=2;
				push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>$in{'color2'}<>\n");
				push(@tmp,$_);
			}
			else { push(@tmp,$_); }
		}

		if ($match == 1) {
			push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>$in{'color2'}<>\n");
		}
		push(@new,@tmp);

		# 更新
		unshift(@new,"$no<>$addr<>$times<>\n");
		open(OUT,">$logfile") || &error("Write Error : $logfile");
		print OUT @new;
		close(OUT);

	}
	# レス記事の場合:トップソートなし
	else {
		$match=0;
		@new=();
		foreach (@lines) {
			($no2,$reno2,$date2,$name,$email,$sub) = split(/<>/);

			if ($match == 0 && $in{'reno'} eq "$no2") {
			$match=1;
			上と同じように、レスの付いた親記事の情報を保存しておきます
			$new_sub = $sub;
			$new_no = $no2;
			}
			elsif ($match == 1 && $in{'reno'} ne "$reno2") {
				$match=2;
				push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>$in{'color2'}<>\n");
			}
			push(@new,$_);
		}

		if ($match == 1) {
			push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>$in{'color2'}<>\n");
		}

		# 更新
		unshift(@new,"$no<>$addr<>$times<>\n");
		open(OUT,">$logfile") || &error("Write Error : $logfile");
		print OUT @new;
		close(OUT);
	}

	# ロック解除
	if ($lockkey) { &unlock; }

	# メール処理
	if ($mailing == 1 && $in{'email'} ne "$mailto") { &mail_to; }
	elsif ($mailing == 2) { &mail_to; }

見ての通り、「最近の投稿」を書き込むためのサブルーチンに飛びます
# 「最近の投稿」への書き込み
&regist_new;
}


#--------------#
#  タグの復活  #
#--------------#
 ↓このように、タグの復活は下のURLを参考にしています。詳しい説明はそちらをどうぞ
# http://www2.inforyoma.or.jp/~terra/ の「CGI研究室」を参考にさせて頂きました。
sub tag_change {
	local($_) = $_[0];
	if ($font_tag){1 while s/(.*)(<(font[\s\w\=\#\"\']+)\>(.*)\<\/font\>)/$1<$3>$4<\/font>/i;}
	if ($b_tag){1 while s/(.*)(<(b)>(.*)<\/b>)/$1<b>$4<\/b>/i;}
	if ($i_tag){1 while s/(.*)(<(i)>(.*)<\/i>)/$1<i>$4<\/i>/i;}
	if ($u_tag){1 while s/(.*)(<(u)>(.*)<\/u>)/$1<u>$4<\/u>/i;}
	if ($img_tag){1 while s/(.*)(<(img([!-:A-~\s\=]+))>)/$1<img$4>/i;}
	if ($s_tag){1 while s/(.*)(<(s)>(.*)<\/s>)/$1<s>$4<\/s>/i;}
	$_;
}


#------------------------#
#  最近の投稿へ書き込み  #
#------------------------#
sub regist_new{
	# ファイルロック
	if ($lockkey) { &lock; }

	# ログを開く
	open(IN,"$newfile") || &error("Open Error : $newfile");
	@lines = <IN>;
	close(IN);

	@new=();
	$count=0;
	foreach(@lines){
	push(@new,$_);
	$count++;
	$max_countは情報の最大保存件数。これから新しい情報を追加するので、$max_count-1になったらループを抜けましょう
	if($count == $max_count - 1){last;}
	}

	# 親記事の場合
	if ($in{'reno'} eq "") {
	最初の1は、親記事だと言う意味です。
	unshift(@new,"1<>$date<>$in{'name'}<>$no<>$in{'sub'}\n");
	}

	# レス記事の場合
	else{
	レス記事の場合は0にしてあげます。$new_noや$new_subは、別に保存しておいた親記事の情報です
	unshift(@new,"0<>$date<>$in{'name'}<>$new_no<>$new_sub\n");
	}
	
	# 更新
	open(OUT,">$newfile") || &error("Write Error : $newfile");
	print OUT @new;
	close(OUT);

	# ロック解除
	if ($lockkey) { &unlock; }
}

#--------------------#
#  最近の投稿を表示  #
#--------------------#
sub new{

open (IN,"$newfile") || &error('file');
@LINES = <IN>;
close (IN);
$count = @LINES;

&header;

print <<EOM;
[<a href="$script?">掲示板にもどる</a>]
<table width="100%">
<tr><th bgcolor="#0000A0">
  <font color="#FFFFFF">最近の投稿</font>
</th></tr>
</table>
<CENTER>
<table><tr><td>
<BR>最近の投稿<b>$count件</b>を上から表\示します。
</td></tr></table>
<BR>

<TABLE CELLPADDING="4">
EOM

foreach(@LINES){
$flagが1ならば親記事、0ならレス記事なので、それにあわせてコメントを変えます
($flag,$date,$name,$no,$sub) = split(/<>/);
if($flag){print "<TR><TD>$date : </TD><TD><B><FONT COLOR=\"$new_color\">$name</FONT></B>さんが、<B><FONT COLOR=\"$new_color\">No.$no</FONT></B>の<B><FONT COLOR=\"$new_color\">$sub</FONT></B>を新しく書き込みました。</TD></TR>\n";}
else{print "<TR><TD>$date : </TD><TD><B><FONT COLOR=\"$new_color\">$name</FONT></B>さんが、<B><FONT COLOR=\"$new_color\">No.$no</FONT></B>の<B><FONT COLOR=\"$new_color\">$sub</FONT></B>にレスをつけました。</TD></TR>\n";}
}

print <<EOM;
</TABLE>
</CENTER>
</body></html>
EOM
exit;

}

#----------------#
#  返信フォーム  #
#----------------#
sub res_form {
	# フォーム長を定義
	&get_agent;

	# クッキーを取得
	&get_cookie;

	# ログを読み込み
	open(IN,"$logfile") || &error("Open Error : $logfile");
	$top = <IN>;

	# ヘッダを出力
	if ($ImageView == 1) { &header('ImageUp'); }
	else { &header; }

	# 関連記事出力
	print "- 以下は、記事NO. <B>$in{'no'}</B> に関する<a href='#RES'>返信フォーム</a>です -<hr>\n";

	while (<IN>) {
		($no,$reno,$date,$name,$mail,$sub,$com,$url) = split(/<>/);

		if ($in{'no'} eq "$no" || $in{'no'} eq "$reno") {
			if ($in{'no'} eq "$no") { $resub = $sub; }
			if ($url) { $url = "<<a href=\"http://$url\">HOME</a>>"; }
			if ($reno) { print '  '; }
			print "<font color=$sub_color><b>$sub</b></font> 投稿者:<b>$name</b> 投稿日:$date $url <font color=$sub_color>No\.$no</font><br>\n";
			print "<blockquote>$com</blockquote><hr>\n";
		}
	}
	close(IN);

	# タイトル名
	if ($resub !~ /^Re\:/) { $resub = "Re\: $resub"; }

	print <<"EOM";
<a name="RES"></a>
アイコンプレビューのため、フォームに名前を付けます
<form method="$method" action="$script" name="FoImg">
<input type=hidden name=mode value="regist">
<input type=hidden name=reno value="$in{'no'}">
<center>
<table>
<tr>
  <td nowrap><b>おなまえ</b></td>
  <td><input type=text name=name value="$c_name" size=$nam_wid></td>
</tr>
<tr>
  <td nowrap><b>Eメール</b></td>
  <td><input type=text name=email value="$c_email" size=$nam_wid></td>
</tr>
<tr>
  <td nowrap><b>タイトル</b></td>
  <td>
EOM
if ($show eq "re") {print "<input type=hidden name=show value=\"re\">\n";}
print <<"EOM";
<input type=text name=sub value="$resub" size=$sub_wid>
  <input type=submit value="返信する"><input type=reset value="リセット"></td>
</tr>
<tr>
  <td colspan=2><b>メッセージ</b><br>
  <textarea cols=$com_wid rows=5 name=comment wrap="$wrap"></textarea></td>
</tr>
<tr>
  <td nowrap><b>URL</b></td>
  <td><input type=text name=url value="http://$c_url" size=$url_wid></td>
アイコンプレビューのための改造。記事表示部と同じです
EOM
if ($icon_mode && $preview){print"<td align=\"center\">☆アイコン☆</td>";}
print"</tr>";

	# 管理者アイコンを配列に付加
	if ($my_icon) {
		push(@icon1,"$my_gif");
		push(@icon2,"管理者用");
	}

	if ($icon_mode) {
		print "<tr><td nowrap><b>イメージ</b></td><td><select name=icon onChange='chaImgIenn5(\"FoImg\",\"icon\",\"imgIenn5\")'>\n";
		foreach(0 .. $#icon1) {
			if ($c_icon eq "$icon1[$_]") {
				print "<option value=\"$icon1[$_]\" selected>$icon2[$_]\n";
			} else {
				print "<option value=\"$icon1[$_]\">$icon2[$_]\n";
			}
		}
		print "</select>\n";

		if ($ImageView == 1) {
			print "[<a href=\"javascript:ImageUp()\">画像イメージ参照</a>]";
		} else {
			print "[<a href=\"$script?mode=image\" target=\"_blank\">画像イメージ参照</a>]";
		}
		print "</td>\n";
	}
	アイコンプレビューのための改造。記事表示部と同じです
	if ($icon_mode && $preview){print "<TD BGCOLOR=\"$tbl_color\" WIDTH=\"$i_width\" HEIGHT=\"$i_height\" ROWSPAN=\"4\" ALIGN=\"center\" VALIGN=\"middle\">";
	        if ($c_icon){
        	   print "<IMG SRC=\"$imgurl$c_icon\" name=\"imgIenn5\" ALIGN=\"CENTER\" BORDER=\"0\">";}
		else{
		   print "<IMG SRC=\"$imgurl$icon1[0]\" name=\"imgIenn5\" ALIGN=\"CENTER\" BORDER=\"0\">";}
	}
	print "</TD></TR>\n";

	print "<tr><td nowrap><b>削除キー</b>";
	print "<td><input type=password name=pwd size=8 maxlength=8 value=\"$c_pwd\">\n";
	print "<small>(自分の記事を削除時に使用。英数字で8文字以内)</small></td></tr>\n";
	print "<tr><td nowrap><b>題名の色</b></td><td>\n";

	記事表示部と同じように、タイトルの色を選択するチェックボックスを作ります
	# クッキーの色情報がない場合
	if ($c_color2 eq "") { $c_color2 = $COLORS[0]; }
	foreach (0 .. $#COLORS) {
		if ($c_color2 eq "$COLORS[$_]") {
			print "<input type=radio name=color2 value=\"$COLORS[$_]\" checked>";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		} else {
			print "<input type=radio name=color2 value=\"$COLORS[$_]\">";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		}
	}

	print "<tr><td nowrap><b>本文の色</b></td><td>\n";
	# クッキーの色情報がない場合
	if ($c_color eq "") { $c_color = $COLORS[0]; }

	foreach (0 .. $#COLORS) {
		if ($c_color eq "$COLORS[$_]") {
			print "<input type=radio name=color value=\"$COLORS[$_]\" checked>";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		} else {
			print "<input type=radio name=color value=\"$COLORS[$_]\">";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		}
	}

	print "</td></tr></table></form>\n";
	print "</center>\n";
	print "</body></html>\n";
	exit;
}

#----------------#
#  デコード処理  #
#----------------#
sub decode {
	$post_flag=0;
	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		$post_flag=1;
		if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); }
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
	} else { $buffer = $ENV{'QUERY_STRING'}; }
	@pairs = split(/&/, $buffer);
	foreach (@pairs) {
		($name,$value) = split(/=/);

		if ($name eq "word") { $word = $value; }

		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

		# 文字コードをシフトJIS変換
		&jcode'convert(*value, "sjis", "", "z");

		# タグ処理
		if ($tagkey) {
			foreach ( @errtag )	{
				@errtagに登録されたタグが、$valueに含まれていないかチェック。/iをつけて大文字・小文字の区別を無くしています
				if ($value =~ /<$_(.|\n)*>/i) {	 &error("使用出来ないタグが入力されています");	}
			}
		$value =~ s/<>/&lt;&gt;/g; }
		else {
			$value =~ s/</&lt;/g;
			$value =~ s/>/&gt;/g;
			$value =~ s/\"/&quot;/g;
		}

		# 改行等処理
		if ($name eq "comment") {
			$value =~ s/\r\n/<br>/g;
			$value =~ s/\r/<br>/g;
			$value =~ s/\n/<br>/g;
		} else {
			$value =~ s/\r//g;
			$value =~ s/\n//g;
		}

		# 一括削除用
		if ($name eq "del") { push(@DEL,$value); }

		$in{$name} = $value;
	}
	$mode = $in{'mode'};
	$page = $in{'page'};
	$in{'url'} =~ s/^http\:\/\///;
	if ($in{'sub'} eq "") { $in{'sub'} = "無題"; }
}

#----------------------------#
#  掲示板の使い方メッセージ  #
#----------------------------#
sub howto {
	if ($tagkey == 0 && $tag) {
		まずは@tagを初期化
		@tag = ();
		使えるタグ(設定項目で1になっているタグ)だけ、@tagに追加していきます
		if($font_tag){push(@tag,"<FONT>");}
		if($b_tag){push(@tag,"<B>");}
		if($i_tag){push(@tag,"<I>");}
		if($u_tag){push(@tag,"<U>");}
		if($img_tag){push(@tag,"<IMG>");}
		if($s_tag){push(@tag,"<S>");}
		「@tagのみ使用できる」と書けば、上で@tagに追加したタグだけ表示されます
		$tag_msg = "投稿内容は、コメント部分に<b>@tag タグのみ使用できます。</b>\n";
		}
	elsif ($tagkey == 0 && $tag == 0) { $tag_msg = "投稿内容には、<b>タグは一切使用できません。</b>\n"; }
	else { $tag_msg = "コメント欄には、<b>タグ使用をすることができます。</b>\n"; }

	&header;
	print <<"HTML";
[<a href="$script?">掲示板にもどる</a>]
<table width="100%">
<tr><th bgcolor="#0000A0">
  <font color="#FFFFFF">掲示板の利用上の注意</font>
</th></tr>
</table>
<P><center>
<table width="90%" border=1 cellpadding=10>
<tr><td bgcolor="$tbl_color">
<OL>
<LI>この掲示板は<b>クッキー対応</b>です。1度記事を投稿いただくと、おなまえ、Eメール、URL、削除キーの情報は2回目以降は自動入力されます。(ただし利用者のブラウザがクッキー対応の場合)<P>
<LI>$tag_msg<P>
<LI>記事を投稿する上での必須入力項目は<b>「おなまえ」</b>と<b>「メッセージ」</b>です。Eメール、URL、題名、削除キーは任意です。<P>
<LI>記事には、<b>半角カナは一切使用しないで下さい。</b>文字化けの原因となります。<P>
<LI>記事の投稿時に<b>「削除キー」</b>にパスワード(英数字で8文字以内)を入れておくと、その記事は次回<b>削除キー</b>によって削除することができます。<P>
<LI>記事の保持件数は<b>最大 $max件</b>です。それを超えると古い順に自動削除されます。<P>
<LI>既存の記事に<b>「返信」</b>をすることができます。各記事の上部にある<b>「返信」</b>ボタンを押すと返信用フォームが現れます。<P>
<LI>過去の投稿記事から<b>「キーワード」によって簡易検索ができます。</b>トップメニューの<a href="$script?mode=find">「ワード検索」</a>のリンクをクリックすると検索モードとなります。<P>
<LI>管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は予\告なく削除することがあります。
</OL>
</td></tr></table>
</center>
</body></html>
HTML
	exit;
}

#------------------#
#  ワード検索処理  #
#------------------#
省略

#---------------------------------#
#  ブラウザを判断:フォーム幅調整  #
#---------------------------------#
省略

#------------------#
#  クッキーの発行  #
#------------------#
sub set_cookie {
	# クッキーは60日間有効
	local($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time+60*24*60*60);

	@month=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	$gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",
			$week[$wday],$mday,$month[$mon],$year+1900,$hour,$min,$sec);
	タイトルの色情報は、クッキーに保存する必要があります。$in{'color2'}を追加してあげましょう
	$cook="name<>$in{'name'}\,email<>$in{'email'}\,url<>$in{'url'}\,pwd<>$in{'pwd'}\,icon<>$in{'icon'}\,color<>$in{'color'}\,color2<>$in{'color2'}";
	print "Set-Cookie: YYBBS=$cook; expires=$gmt\n";
}

#------------------#
#  クッキーを取得  #
#------------------#
sub get_cookie {
	local($key, $val);
	@pairs = split(/;/, $ENV{'HTTP_COOKIE'});
	foreach (@pairs) {
		($key,$val) = split(/=/);
		$key =~ s/\s//g;
		$GET{$key} = $val;
	}
	@pairs = split(/,/, $GET{'YYBBS'});
	foreach (@pairs) {
		($key,$val) = split(/<>/);
		$COOK{$key} = $val;
	}
	$c_name  = $COOK{'name'};
	$c_email = $COOK{'email'};
	$c_url   = $COOK{'url'};
	$c_pwd   = $COOK{'pwd'};
	$c_icon  = $COOK{'icon'};
	$c_color = $COOK{'color'};
	タイトルの色も上と同じように…
	$c_color2 = $COOK{'color2'};

	if ($in{'name'})  { $c_name  = $in{'name'}; }
	if ($in{'email'}) { $c_email = $in{'email'}; }
	if ($in{'url'})   { $c_url   = $in{'url'}; }
	if ($in{'pwd'})   { $c_pwd   = $in{'pwd'}; }
	if ($in{'icon'})  { $c_icon  = $in{'icon'}; }
	if ($in{'color'}) { $c_color = $in{'color'}; }
	同じく、上のまねです…
	if ($in{'color2'}) { $c_color2= $in{'color2'}; }
}

#--------------#
#  エラー処理  #
#--------------#
省略


#--------------#
#  管理モード  #
#--------------#
sub admin {
	if ($in{'pass'} ne "" && $in{'pass'} ne "$pass") {
		&error("パスワードが違います");
	}

	&header;
	print "[<a href=\"$script?\">掲示板に戻る</a>]\n";
	print "<table width='100%'><tr><th bgcolor=\"#800080\">\n";
	print "<font color=\"#FFFFFF\">管理モード</font>\n";
	print "</th></tr></table>\n";

	if ($in{'pass'} eq "") {
		print "<P><center><h4>パスワードを入力して下さい</h4>\n";
		print "<form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=hidden name=action value=\"del\">\n";
		print "<input type=password name=pass size=8>";
		print "<input type=submit value=\" 認証 \"></form>\n";
	}
	else {
		# 削除処理
		if ($DEL[0]) {

			# ロック処理
			if ($lockkey) { &lock; }

			# 削除情報をマッチングし更新
			@new=();
			open(IN,"$logfile") || &error("Open Error : $logfile");
			$top = <IN>;
			while (<IN>) {
				$flag=0;
				($no,$reno,$date) = split(/<>/);
				foreach $del (@DEL) {
					if ($no eq "$del" || $reno eq "$del") {
						$flag=1; last;
					}
				}
				if ($flag == 0) { push(@new,$_); }
			}
			close(IN);

			# 更新
			unshift(@new,$top);
			open(OUT,">$logfile") || &error("Write Error : $logfile");
			print OUT @new;
			close(OUT);

			# ロック解除
			if ($lockkey) { &unlock; }
		}

		# 管理を表示
		if ($page eq "") { $page = 0; }
		print "<P><center><table><tr><td>\n";
		print "・削除する記事のチェックボックスにチェックを入れ、削除ボタンを押して下さい。<BR>\n";
		print "・親記事を削除するとレス記事も一括して削除されます。<BR>\n";
		記事の修正ができることのメッセージを表示
		print "・記事の修正は、下のフォームに記事NOを入力して「記事の修正」をクリックしてください。<BR>\n";
		print "</td></tr></table>\n";

		print "<form action=\"$script\" method=\"$method\">\n";
		管理ページで修正したとき、また管理ページに戻ってこれるように、次の行を加えます
		print "<input type=hidden name=pass value=\"$in{'pass'}\">\n";
		次の行があるため、mod_formサブルーチンに飛びます
		print "<input type=hidden name=mode value=\"mod_form\">\n"
		管理ページで修正したことを記憶するために$mode2=1とします。今思えば、$passがあることでもよかったような…;
		print "<input type=hidden name=mode2 value=\"1\">\n";
		print "修正する記事No<input type=text name=no size=3>\n";
		print "<input type=submit value=\"記事の修正\"><BR><BR>\n";
		print "</form>\n";

		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=hidden name=page value=\"$page\">\n";
		print "<input type=hidden name=pass value=\"$in{'pass'}\">\n";
		print "<input type=hidden name=action value=\"$in{'action'}\">\n";
		print "<input type=submit value=\"記事の削除\">";
		print "<input type=reset value=\"リセット\">\n";
		print "<P><table border=0 cellspacing=1>\n";
		print "<tr><th>削除</th><th>記事NO</th><th>投稿日</th><th>タイトル</th>";
		print "<th>投稿者</th><th>URL</th><th>コメント</th><th>ホスト名</th></tr>\n";

		# ページ区切り処理
		$start = $page + 1;
		$end   = $page + $p_log;

		open(IN,"$logfile") || &error("Open Error : $logfile");
		$top = <IN>;
		$i=0;
		while (<IN>) {
			($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw)
								 = split(/<>/);
			if ($reno eq "") { $i++; }
			if ($i < $start) { next; }
			if ($i > $end) { last; }

			if ($mail) { $name="<a href=\"mailto:$mail\">$name</a>"; }
			($date,$dmy) = split(/\(/, $date);

			if ($url) { $url = "<<a href=\"http://$url\" target='_top'>Home</a>>"; }
			else { $url = '-'; }

			$com =~ s/<br>//ig;
			$com =~ s/</</g;
			$com =~ s/>/>/g;
			if (length($com) > 40) {
				$com = substr($com,0,38);
				$com .= "...";
			}

			if ($reno eq "") { print "<tr><th colspan=8><hr></th></tr>\n"; }

			# 削除チェックボックス
			print "<tr><th><input type=checkbox name=del value=\"$no\"></th>";
			print "<td align=center>$no</td>";
			print "<td><small>$date</small></td><th>$sub</th><th>$name</th>";
			print "<td align=center>$url</td><td><small>$com</small></td>";
			print "<td><small>$host</small></td></tr>\n";

		}
		close(IN);

		print "<tr><th colspan=8><hr></th></tr>\n";
		print "</table></form>\n";
	}

	$next_page = $page + $p_log;
	$back_page = $page - $p_log;

	print "<P><table cellspacing=0 cellpadding=0><tr>\n";
	if ($back_page >= 0) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=page value=\"$back_page\">\n";
		print "<input type=hidden name=pass value=\"$in{'pass'}\">\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=hidden name=action value=\"$in{'action'}\">\n";
		print "<input type=submit value=\"前の$p_log組\">\n";
		print "</form></td>\n";
	}
	if ($next_page < $i) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=page value=\"$next_page\">\n";
		print "<input type=hidden name=pass value=\"$in{'pass'}\">\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=hidden name=action value=\"$in{'action'}\">\n";
		print "<input type=submit value=\"次の$p_log組\">\n";
		print "</form></td>\n";
	}
	print "</tr></table></center>\n";
	print "</body></html>\n";
	exit;
}

#------------------#
#  ユーザ記事削除  #
#------------------#
省略

#--------------------#
#  記事修正フォーム  #
#--------------^^----#
sub mod_form {
	このあたりは、記事の削除をコピー&ペースト
	# POST限定
	if ($MethPost && !$post_flag) { &error("不正なアクセスです"); }

	if($in{'mode2'}){
		 if($in{'no'} eq ''){ &error("記事Noが入力モレです"); }
	}
	else{
		if($in{'no'} eq '' || $in{'pwd'} eq ''){ &error("記事Noまたは削除キーが入力モレです"); }
	}

	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);
	$top = shift(@lines);
	$flag=0;
	foreach (@lines) {
		($no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,$pw,$color,$icon,$t_color) = split(/<>/);
		if ($flag == 0 && $in{'no'} eq "$no") {
			$flag=1;
			if(!$in{mode2}){
			if ($pw eq '') { &error("該当記事には削除キーが設定されていません"); }
			# 削除キーを照合
			$match = &decrypt("$in{'pwd'}","$pw");

			if ($match ne 'yes') { &error("削除キーが違います"); }
			}

		# フォーム長を定義
		&get_agent;

		# ヘッダを出力
		if ($ImageView == 1) { &header('ImageUp'); }
		else { &header; }

		このあたりは、返信フォームを参考に…
		# 関連記事出力
		print "- 以下は、記事NO. <B>$no</B> に関する修正フォームです -<hr>\n";
		if ($url) { $url2 = "<<a href=\"http://$url\">HOME</a>>"; }
		print "<font color=$sub_color><b>$sub</b></font> 投稿者:<b>$name</b> 投稿日:$date $url2 <font color=$sub_color>No\.$no</font><br>\n";
		print "<blockquote>$comment</blockquote><hr>\n";

自動URLリンクで付いたリンクを消すために、サブルーチンに飛びます
if ($autolink) {$comment = &un_link($comment); }
テキストエリアに表示するため、<br>を\nに戻してあげます
$comment =~ s/<br>/\n/g;

print "<form method=\"$method\" action=\"$script\" name=\"FoImg\">\n";
管理用ページから修正しているときには、管理用ページに戻れるように次の行を加えます
if($in{'mode2'}){
print "<input type=hidden name=pass value=\"$in{'pass'}\">\n";
print "<input type=hidden name=mode2 value=\"1\">\n";
}

print <<"EOM";
記事番号の情報も送ります
<input type=hidden name=no value=$no>
サブルーチンmodifyに飛ぶように、次の行を加えます
<input type=hidden name=mode value=modify>
<center>
ここから下は、返信フォームとほとんど同じですが、フォームには修正前の値が入力されているようにします
<table>
<tr>
修正前の情報が入力されているように、value="$name"とすればOK。その下も同じ
  <td nowrap><b>おなまえ</b></td>
  <td><input type=text name=name value="$name" size=$nam_wid></td>
</tr>
<tr>
  <td nowrap><b>Eメール</b></td>
  <td><input type=text name=email value="$mail" size=$nam_wid></td>
</tr>
<tr>
  <td nowrap><b>タイトル</b></td>
  <td>
EOM
if ($show eq "re") {print "<input type=hidden name=show value=\"re\">\n";}
print <<"EOM";
<input type=text name=sub value="$sub" size=$sub_wid>
  <input type=submit value="修正する"><input type=reset value="リセット"></td>
</tr>
<tr>
  <td colspan=2><b>メッセージ</b><br>
テキストエリアの場合は、value=ではなく、次の行のようにします
  <textarea cols=$com_wid rows=5 name=comment wrap="$wrap">$comment</textarea></td>
</tr>
<tr>
  <td nowrap><b>URL</b></td>
  <td><input type=text name=url value="http://$url" size=$url_wid></td>
EOM
if ($icon_mode && $preview){print"<td align=\"center\">☆アイコン☆</td>";}
print"</tr>";

ここから下も同じ。今まではクッキーの情報を表示していたけど、今回は修正前の情報を表示します
	# 管理者アイコンを配列に付加
	if ($my_icon) {
		push(@icon1,"$my_gif");
		push(@icon2,"管理者用");
	}

	if ($icon_mode) {
		print "<tr><td nowrap><b>イメージ</b></td><td><select name=icon onChange='chaImgIenn5(\"FoImg\",\"icon\",\"imgIenn5\")'>\n";
		foreach(0 .. $#icon1) {
			if ($icon eq "$icon1[$_]") {
				print "<option value=\"$icon1[$_]\" selected>$icon2[$_]\n";
			} else {
				print "<option value=\"$icon1[$_]\">$icon2[$_]\n";
			}
		}
		print "</select>\n";

		if ($ImageView == 1) {
			print "[<a href=\"javascript:ImageUp()\">画像イメージ参照</a>]";
		} else {
			print "[<a href=\"$script?mode=image\" target=\"_blank\">画像イメージ参照</a>]";
		}
		print "</td>\n";
	}
	if ($icon_mode && $preview){print "<TD BGCOLOR=\"$tbl_color\" WIDTH=\"$i_width\" HEIGHT=\"$i_height\" ROWSPAN=\"3\" ALIGN=\"center\" VALIGN=\"middle\">";
        	   print "<IMG SRC=\"$imgurl$icon\" name=\"imgIenn5\" ALIGN=\"CENTER\" BORDER=\"0\">";
	}
	print "</TD></TR>\n";
	print "<tr><td nowrap><b>題名の色</b></td><td>\n";

	# タイトルの色情報がない場合
	if ($t_color eq "") { $t_color = $COLORS[0]; }

	foreach (0 .. $#COLORS) {
		if ($t_color eq "$COLORS[$_]") {
			print "<input type=radio name=color2 value=\"$COLORS[$_]\" checked>";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		} else {
			print "<input type=radio name=color2 value=\"$COLORS[$_]\">";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		}
	}

	print "<tr><td nowrap><b>本文の色</b></td><td>\n";
	# 本文の色情報がない場合
	if ($color eq "") { $color = $COLORS[0]; }

	foreach (0 .. $#COLORS) {
		if ($color eq "$COLORS[$_]") {
			print "<input type=radio name=color value=\"$COLORS[$_]\" checked>";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		} else {
			print "<input type=radio name=color value=\"$COLORS[$_]\">";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		}
	}

	print "</td></tr></table></form>\n";
	print "</center>\n";
	print "</body></html>\n";
		}
	}
	if ($flag == 0) { &error("該当記事が見当たりません"); }
exit;
}


#--------------#
#  記事の修正  #
#--------------#
sub modify {
ログ書き込み処理を参考に…
	# POST限定
	if ($MethPost && !$post_flag) { &error("不正なアクセスです"); }

	# 名前とコメントは必須
	if ($in{'name'} eq "") { &error("名前が入力されていません"); }
	if ($in{'comment'} eq "") { &error("コメントが入力されていません"); }
	if ($in{'email'} && $in{'email'} !~ /(.*)\@(.*)\.(.*)/)
		{ &error("Eメールの入力内容が正しくありません"); }

	# 題名の長さ制限
	if (length($in{'sub'}) > $sub_len * 2)
		{ &error("題名の長さは全角$sub_len文字までにして下さい"); }

	# 管理アイコンのチェック
	if ($my_icon && $in{'icon'} eq "$my_gif") {
		if ($in{'pwd'} ne "$pass") { &error("管理用アイコンは管理者専用です"); }
	}

	# ファイルロック
	if ($lockkey) { &lock; }

	# ログを開く
	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);

	# 記事NO処理
	$top = shift(@lines);

	# 連続投稿チェック
	if ($addr eq "$ip" && $wait > $times - $time2)
		{ &error("連続投稿はもうしばらく時間をおいて下さい"); }

	# URL自動リンク
	if ($autolink) { &auto_link($in{'comment'}); }

	# タグの復活
	if ($tag){
	$in{'comment'} =~ s/&quot;/\"/g;
	$in{'comment'} = &tag_change($in{'comment'});
	}
	ここまでは、ほとんどログ書き込み処理と同じ

	@new = ();
	$flag = 0;
	foreach(@lines) {
		($no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,$pw,$color,$icon,$t_color)=split(/<>/);
		if ($in{'no'} eq "$no") {
			パスワードの変更を認めると面倒になるので、パスワードはそのまま
			push(@new,"$no<>$reno<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pw<>$in{'color'}<>$in{'icon'}<>$in{'color2'}<>\n");
			$flag = 1;
		}
		else{
			push(@new,"$_");
		}
	}
	まあ、修正ページを表示する時に引っかかるので、0になることはないけど念のため…
	if ($flag == 0) { &error("該当記事が見当たりません"); }

	# 更新
	unshift(@new,$top);
	open(OUT,">$logfile") || &error("Write Error : $logfile");
	print OUT @new;
	close(OUT);

	# ロック解除
	if ($lockkey) { &unlock; }

# 管理用ページで修正した場合
mode2が1の時は、管理フォームに戻ります。そうでないときは、普通に記事が表示されます
if($in{'mode2'}){&admin;}
}
この下ず〜っと省略


#------------------#
#  HTMLのヘッダー  #
#------------------#
sub header {
	$head_flag=1;
	print "Content-type: text/html\n\n";
	print <<"EOM";
<html>
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<STYLE type="text/css">
<!--
body,tr,td,th { font-size: $b_size }
a:hover { color: $alink }
span { font-size: $t_size }
<BIG>タグの大きさも、設定項目で変更できるようにします
big  { font-size: $big_size }
small { font-size: 9pt }
-->
</STYLE>
EOM

# アイコンプレビュー
アイコンプレビューを使うときには、サブルーチンに飛びます
if ($icon_mode && $preview){&preview;}

	# JavaScriptヘッダー
	if ($ImageView == 1 && $_[0] eq "ImageUp") {
		print "<SCRIPT LANGUAGE=\"JavaScript\">\n";
		print "<!--\n";
		print "function ImageUp() {\n";
		print "window.open(\"$script?mode=image\",\"window1\",\"width=$img_w,height=$img_h,scrollbars=1\");\n";
		print "}\n";
		print "//-->\n";
		print "</SCRIPT>\n";
	}

	print "<title>$title</title></head>\n";
	print "<body background=\"$backgif\" bgcolor=\"$bgcolor\" text=\"$text\" link=\"$link\" vlink=\"$vlink\" alink=\"$alink\">\n";
}


#----------------------------------#
#  アイコンプレビューのスクリプト  #
#----------------------------------#
sub preview{
print <<"EOM";
<Script Language="JavaScript">
<!-- 
見ての通り、CULBとむやん君のスクリプトを参考にしているので、詳しい説明はできないです…
// その他 No.5 Produced by「CLUB とむやん君」
// URL http://www2s.biglobe.ne.jp/~club_tom/

// プルダウンメニューで画像を変更する部分です。
function chaImgIenn5(foName,elName,imgName) {
	if (document.images) {
		var p=document.forms[foName].elements[elName];
		var v=p.options[p.selectedIndex].value;
		if (v!="defult") {
			var img=new Image();
			img.src=v;
			document.images[imgName].src=img.src;
		}
	}
}
// End -->
</Script>
EOM
}


#-----------------#
#  自動URLリンク  #
#-----------------#
省略

#-------------------#
#  逆自動URLリンク  #
#-------------------#
sub un_link {
	local($_) = $_[0];
	<a herf(文字列1)>(文字列2)</a>を(文字列2)に置き換えます。簡単に言えば、リンクをはずします。
	1 while s/(.*)((<a href[\s\w\=\#\"\'\:\/\-\~\.\>\+\?\&\=\@\%\;\#]+)>(.*)(<\/a>))/$1$4/i;
	$_;
}
これ以降は変更無し
BACK