#!/usr/local/bin/perl
# ************** fdiary_U.cgi V1.0(2003/7/1)*************
# 日記用のCGI本体(ユニコード用)
# Copyright (c) とまて
# 配布元URL:『fdiary.cgiのページ』http://www3.kcn.ne.jp/~tomate/o_gate/fdiary.html
# 『とまての実験室』http://www3.kcn.ne.jp/~tomate/index 内
#################################################################
# 書き込み者のパスワード設定(半角英数字10桁)
$pass_set="x";
# 日記の開始ページ番号(3桁で指定)
$start_page='000';
# ファイル名の設定
$me ="fdiary_U.cgi" ;# このCGI
$datafile ="fdiary_log.html" ;# 最新の日記を書き込むファイル
$filename_top ="fdiary_log_" ;# ログファイルの名前
$iconselfile ="fdiary_icons.txt" ;# アイコンの管理するファイル
$skinselfile ="fdiary_skins.txt" ;# スキンの管理をするファイル
$chpagefile ="fdiary_cpage.txt" ;# 改ページモードを管理するファイル
$iconwildcard="icon/*" ;# アイコンファイルのワイルドカード
$skinwildcard="skin_*.html";# スキン定義ファイルのワイルドカード
#################################################################
# ロゴの設定:最新ページにのみ下記のロゴ&LINKが付きます。改ページしたページには残りません。
$logo='<DIV ALIGN="right"><A HREF="http://www3.kcn.ne.jp/~tomate/o_gate/fdiary.html">'."\n".'<SPAN STYLE="font-size:6pt;color:white;background-color:olive">fdiary.cgi</SPAN></A></DIV>';
# フォームなどのスタイル指定
$p_style="\n".'<TABLE STYLE="background-color:#FFFFFF;color:black;border:4 white ridge"><TR>'."\n".'<TD STYLE="padding:7mm;font-size:11pt;line-height:100%">';
$p_stylee='</TD></TR></TABLE>';
# 変数名の設定
$hedder="";
$footer="";
$daystyle="";
$prevfile="";
$nextfile="";
@pagechan_mode=('手動','日曜日毎','月曜日毎','月毎','記事数毎');
@datain=();
@data=();
@styledata=();
@icons=();
# 最新ページの読み込み、もしくは作成
if(-e $datafile){
# 最新ページの読み込み
$errinp=&fileinput($datafile,"datain");
}else{
# 初期設定画面
&shokiset;
}
&datafile_read;
# 日付のセット
($sec , $min , $hour, $mday, $mon, $year ,$wday) = localtime();
$today=&dateformat($datemode,$year+1900,$mon+1,$mday,$wday);
$datenow =sprintf("<!-%04d%02d%02d%01d-->",$year + 1900, $mon + 1, $mday,$wday).$today;
$next_page=2;
if ($ENV{'REQUEST_METHOD'} eq "POST"){
%form = &read_input('sjis');
#--------------------↓フォームデータ読み込み---------------------
$next_page =$form{'next_page'};
$kpass =$form{'kpass'};
$kubun =$form{'kubun'};
$comment =$form{'comment'};
$edit_day =$form{'edit_day'};
$edit_n =$form{'edit_n'};
$skin =$form{'skin'};
$send =$form{'send'};
$pageNo =$form{'pageNo'};
$title =$form{'title'};
$iconmanein =$form{'iconmanein'};
$skinmanein =$form{'skinmanein'};
$pagechange =$form{'pagechange'};
$pagechange_no =$form{'pagechange_no'};
#--------------------↑フォームデータ読み込み---------------------
if($kpass ne $pass_set){$next_page=2;}else{
$next_page=0; #デフォルトで書き込み用フォーム表示
if($send eq "完了"){
if($iconmanein ne ""){
@iconfiles=split("\n",$iconmanein);
&fileout($iconselfile,"iconfiles",1);
}
if($skinmanein ne ""){
@skinfiles=split("\n",$skinmanein);
&fileout($skinselfile,"skinfiles",1);
}
@chpage=($pagechange,$pagechange_no);
&fileout($chpagefile,"chpage",1);
}elsif($send eq "アイコン・スキン・改ページ管理"){
$next_page=4;
if(-e $skinselfile){$errinp=&fileinput($skinselfile,"skinfiles_old");}
if(-e $iconselfile){$errinp=&fileinput($iconselfile,"iconfiles_old");}
# スキン選択ファイル検索
@skinfiles=<${skinwildcard}>;
$skinfiles_n=@skinfiles;
$apos=index $skinwildcard,"*";
$alen=length($skinwildcard)-1;
for($i=0;$i<$skinfiles_n;$i++){$skinfiles[$i]=substr($skinfiles[$i],$apos,length($skinfiles[$i])-$alen);}
# アイコン選択ファイル検索
@iconfiles=<${iconwildcard}>;
$iconfiles_n=@iconfiles;
$apos=index $iconwildcard,"*";
$alen=length($iconwildcard)-1;
for($i=0;$i<$iconfiles_n;$i++){$iconfiles[$i]=substr($iconfiles[$i],$apos,length($iconfiles[$i])-$alen);}
# スキンの古いタイトルマッチング
@skinfiles=&matching('skinfiles_old','skinfiles');
# アイコンの古い名前のマッチング
@iconfiles=&matching('iconfiles_old','iconfiles');
}elsif($send eq "スキン取り込み"){
if($kiji0==0){
$dmy=$skinwildcard;
$dmy=~s/\*/$skin/g;
$stylefile=$dmy;
# 古いデータの保存
$next_page=0;
@kiji_old=@kiji;
@ds_old=@ds;
$pageno=&pageno_get;
&hedderjoin;
if((index $hedder,$prevfile)>=0){$prevlink_on=1;}else{$prevlink_on=0;}
if((index $hedder,$nextfile)>=0){$nextlink_on=1;}else{$nextlink_on=0;}
&heddersplit;
# 新しいスタイルの読み込み
&skinin;
if($messege ne ""){$next_page=3;}else{
$hedder=$hedder."\n$day_style\n";
@kiji=();
for($i=0;$i<$kiji_n;$i++){
push(@kiji,@aday);
$kiji[$i*($ds[0]+1)+$ds[1]]=$kiji_old[$i*($ds_old[0]+1)+$ds_old[1]];
$kiji[$i*($ds[0]+1)+$ds[2]]=$kiji_old[$i*($ds_old[0]+1)+$ds_old[2]];
$date=$kiji_old[$i*($ds_old[0]+1)+$ds_old[2]];
$kiji[$i*($ds[0]+1)+$ds[2]]=substr($date,0,15).&dateformat($datemode,substr($date,3,4),substr($date,7,2),substr($date,9,2),substr($date,11,1));
$kiji[$i*($ds[0]+1)+$ds[3]]=$kiji_old[$i*($ds_old[0]+1)+$ds_old[3]];
}
$kiji[($kiji_n-1)*($ds[0]+1)]=$kiji[($kiji_n-1)*($ds[0]+1)].'<A NAME="page_bottom">';
}
}else{$send="";$next_page=3;$messege="記事が無い状態でスキンの変更はできません。仮にでも何か入力なさってから再度お試し下さい。"}
}elsif($send eq "エディット"){
$next_page=1;
$comment=&crlf($kiji[$edit_n*($ds[0]+1)+$ds[3]],0);
$title=&crlf($kiji[$edit_n*($ds[0]+1)+$ds[1]],0);
$edit_day=substr($kiji[$edit_n*($ds[0]+1)+$ds[2]],15,length($kiji[$edit_n*($ds[0]+1)+$ds[2]]));
}elsif($send eq "削除"){
if($kiji_n >1){
splice(@kiji,$edit_n*($ds[0]+1),$ds[0]+1);
if($edit_n==$kiji_n-1 && $kiji_n >0){$kiji[($kiji_n-2)*($ds[0]+1)]=$aday[0].'<A NAME="page_bottom">';}
}else{
@kiji=@aday;
unshift(@kiji,'<DIV style="VISIBILITY: hidden; POSITION: relative">');
push(@kiji,'</DIV>');
$kiji0=1;
}
$kiji_n--;
}elsif($send eq "再書き込み"){
if($edit_day eq substr($kiji[$edit_n*($ds[0]+1)+$ds[2]],15,length($kiji[$edit_n*($ds[0]+1)+$ds[2]]))){
$kiji[$edit_n*($ds[0]+1)+$ds[3]]=&crlf($comment,1);
$kiji[$edit_n*($ds[0]+1)+$ds[1]]=$title;
}else{
$next_page=3;
$messege="エディットする日記データ枠が見つかりませんでした。";
}
}elsif($send eq "書き込み" || $send eq "改ページ&書き込み"){
&chpagemode;
if($comment ne ""){$next_page=0;}else{$next_page=3;$messege="コメントを入れてください";}
if($kubun ne ""){
@dmy=split(",",$kubun);
$dmy=$iconwildcard;
$dmy=~s/\*/$dmy[0]/g;
if($dmy[0] ne $dmy[1]){$img="<IMG SRC=\"$dmy\" ALT=\"$dmy[1]\">";}else{$img="<IMG SRC=\"$dmy\">";}
}else{$img="";}
if($kiji[($kiji_n-1)*($ds[0]+1)+$ds[2]] eq $datenow){
# 今日の日付に追記
$kiji[($kiji_n-1)*($ds[0]+1)+$ds[3]]=$kiji[($kiji_n-1)*($ds[0]+1)+$ds[3]]."<BR>$img".&crlf($comment,1);
}else{
# 改めて今日のデータを書き込み
if($title eq ""){
$next_page=3;$messege="タイトルを入れてください";
}else{
# 改頁の場合の処理はここで行う!
if($kiji_n >0){
if($send eq "改ページ&書き込み"){
&page_change;# 手動
}else{
$lastday=$kiji[($kiji_n-1)*($ds[0]+1)+$ds[2]];# 前回の記事
if ($pagechange == 1 && &week_num(substr($datenow,3,8),5) != &week_num(substr($lastday,3,8),5)){
&page_change;# 日曜毎
}elsif($pagechange == 2 && &week_num(substr($datenow,3,8),4) != &week_num(substr($lastday,3,8),4)){
&page_change;# 月曜毎
}elsif($pagechange == 3 && substr($lastday,3,6) ne substr($datenow,3,6)){
&page_change;# 月毎
}elsif($pagechange == 4 && $kiji_n >= $pagechange_no){
&page_change;# 記事数毎
}
}
}
# 新しい日記データ枠の追加
if($kiji0 == 1){@kiji=();$kiji_n=0;}
push(@kiji,@aday);
$kiji0=0;
$kiji[$kiji_n*($ds[0]+1)]=$kiji[$kiji_n*($ds[0]+1)].'<A NAME="page_bottom">';
if($kiji_n > 0){$kiji[($kiji_n-1)*($ds[0]+1)]=$aday[0];}
$kiji[$kiji_n*($ds[0]+1)+$ds[3]]=$img.&crlf($comment,1);
$kiji[$kiji_n*($ds[0]+1)+$ds[1]]=$title;
$kiji[$kiji_n*($ds[0]+1)+$ds[2]]=$datenow;
$kiji_n++;
}
}
}
}
}
#--------------------↓ページの表示----------------------
print "Content-type: text/html\n\n";
if($next_page==0){
if($send eq "書き込み" || $send eq "改ページ&書き込み" || $send eq "再書き込み" || $send eq "削除"|| $send eq "スキン取り込み"){
$err1=&html_write($datafile);
if($err1 == 1){$messege="ファイル$datafileが開けませんでした。ファイル属性等をご確認ください。";$next_page=3};
}
if($next_page == 0){&page0;}
}
elsif($next_page==1){&page1;}
elsif($next_page==2){&page2;}
elsif($next_page==4){&page4;}
if($next_page==3){&page3;}
exit();
#===================↓ここからサブルーチン=============================
sub page0{
# スキン管理
if(-e $skinselfile){
# スキン管理ファイル読み込み
$errinp=&fileinput($skinselfile,"skinfiles");
}else{
# スキン選択ファイル検索
@skinfiles=<${skinwildcard}>;
$skinfiles_n=@skinfiles;
$apos=index $skinwildcard,"*";
$alen=length($skinwildcard)-1;
for($i=0;$i<$skinfiles_n;$i++){$skinfiles[$i]=substr($skinfiles[$i],$apos,length($skinfiles[$i])-$alen).",";}
&fileout($skinselfile,"skinfiles",1);
}
# アイコン管理
if(-e $iconselfile){
# アイコン管理ファイル読み込み
$errinp=&fileinput($iconselfile,"iconfiles");
}else{
# アイコン選択ファイル検索
@iconfiles=<${iconwildcard}>;
$iconfiles_n=@iconfiles;
$apos=index $iconwildcard,"*";
$alen=length($iconwildcard)-1;
for($i=0;$i<$iconfiles_n;$i++){$iconfiles[$i]=substr($iconfiles[$i],$apos,length($iconfiles[$i])-$alen).",";}
&fileout($iconselfile,"iconfiles",1);
}
&chpagemode;
print <<"HIA1";
$hedder
HIA1
print join("\n",@kiji);
print <<"HIA2";
$footer
$p_style
<SPAN STYLE="font-size:14pt;font-weight:bold">入力用フォーム</SPAN>
[(<A HREF="$datafile"><FONT COLOR="blue">◎</FONT></A>)←お客様のページへ]<BR>
<!------------------------------------------>
<FORM ACTION="$me" METHOD="POST">
<INPUT TYPE="hidden" NAME="kpass" VALUE="$kpass">
<INPUT TYPE="hidden" NAME="pageNo" VALUE="0">
今日 <INPUT TYPE="text" SIZE="30" NAME="edit_day" VALUE="$today"><BR><BR>
タイトル<INPUT TYPE="text" NAME="title" SIZE="40" MAXLENGTH="50">
HIA2
# アイコンセレクター
print " アイコンの選択\n<SELECT NAME=\"kubun\" >\n";
print " <OPTION VALUE=\"\">無し\n";
foreach $dmy (@iconfiles){
@dmy=split(",",$dmy);
$dmy[1]=~ s/\s//g; # メタ文字を削除
if($dmy[1] eq ""){$dmy[1]=$dmy[0];}
print " <OPTION VALUE=\"$dmy[0],$dmy[1]\">".$dmy[1]."\n";
}
print "</SELECT><BR>\n";
print <<"HIA3";
コメント<BR> <TEXTAREA NAME="comment" COLS="60" ROWS="10" WRAP="soft"></TEXTAREA><BR>
<INPUT TYPE="submit" NAME="send" VALUE="書き込み">
<INPUT TYPE="reset" VALUE="リセット">
<INPUT TYPE="submit" NAME="send" VALUE="再表\示">
<INPUT TYPE="submit" NAME="send" VALUE="改ページ&書き込み">
HIA3
if($pagechange==4){print "($pagechange_no記事毎)<BR><BR>";}
else{print "($pagechan_mode[$pagechange])<BR><BR>";}
if($kiji0 == 0){
print "訂正したい日付\n<SELECT NAME=\"edit_n\" >\n";
for($i=$kiji_n-1;$i>=0;$i--){
print " <OPTION VALUE=\"$i\">$kiji[$i*($ds[0]+1)+$ds[2]]\n";
}
print "</SELECT>\n";
print ' <INPUT TYPE="submit" NAME="send" VALUE="エディット"><BR><BR>'."\n";
}
# スキンセレクター
print "スキンセレクター\n<SELECT NAME=\"skin\" >\n";
foreach $dmy (@skinfiles){
@dmy=split(",",$dmy);
$dmy[1]=~ s/\s//g; # メタ文字を削除
if($dmy[1] eq ""){$dmy[1]=$dmy[0];}
print " <OPTION VALUE=\"$dmy[0]\">".$dmy[1]."\n";
}
print "</SELECT>\n";
print <<"HIA4";
<INPUT TYPE="submit" NAME="send" VALUE="スキン取り込み"><BR><BR>
<INPUT TYPE="submit" NAME="send" VALUE="アイコン・スキン・改ページ管理">
</FORM>
HIA4
&pbottom;
}
sub page1{
&phed('FREE DIARY エディット','エディット用フォーム');
print <<"HIA1";
<FORM ACTION="$me" METHOD="POST">
<INPUT TYPE="hidden" NAME="kpass" VALUE="$kpass">
<INPUT TYPE="hidden" NAME="pageNo" VALUE="1">
<INPUT TYPE="hidden" NAME="edit_n" VALUE="$edit_n">
日付 <INPUT TYPE="text" NAME="edit_day" VALUE="$edit_day"><BR>
タイトル<INPUT TYPE="text" NAME="title" SIZE="50" MAXLENGTH="50" VALUE="$title"><BR>
コメント<BR> <TEXTAREA NAME="comment" COLS="60" ROWS="10" WRAP="soft">$comment</TEXTAREA><BR>
<INPUT TYPE="submit" NAME="send" VALUE="再書き込み">
<INPUT TYPE="submit" NAME="send" VALUE="削除">
<INPUT TYPE="submit" NAME="send" VALUE="変更無し"> <INPUT TYPE="reset" VALUE="リセット"><BR>
</FORM>
HIA1
&pbottom;
}
sub page2{
&phed('FREE DIARY パスワード','パスワード入力フォーム');
print <<"HIA1";
<FORM ACTION="$me" METHOD="POST">
<INPUT TYPE="hidden" NAME="kpass" VALUE="$kpass">
<INPUT TYPE="hidden" NAME="pageNo" VALUE="2">
パスワード(10文字以内) <INPUT TYPE="password" NAME="kpass" VALUE="$kpass" SIZE="10" MAXLENGTH="10"><BR>
<INPUT TYPE="submit" NAME="send" VALUE="ENTER"><BR>
</FORM>
HIA1
&pbottom;
}
sub page3{
&phed('FREE DIARY エラー表示','エラー表示');
print <<"HIA1";
<BR><BR><SPAN STYLE="color:red;font-weight:bold">$messege</SPAN><BR><BR>
ブラウザのbackでお戻りください。<BR>
HIA1
&pbottom;
}
sub page4{
&chpagemode;
$iconmane=join("\n",@iconfiles);
$skinmane=join("\n",@skinfiles);
&phed('FREE DIARY 設定画面','アイコン・スキン・改ページ管理');
print <<"HIA1";
<FORM ACTION="$me" METHOD="POST">
<INPUT TYPE="hidden" NAME="kpass" VALUE="$kpass">
アイコンマネージャ<BR>
<TEXTAREA NAME="iconmanein" COLS="60" ROWS="10" WRAP="soft">
$iconmane
</TEXTAREA><BR>
スキンマネージャ<BR>
<TEXTAREA NAME="skinmanein" COLS="60" ROWS="10" WRAP="soft">
$skinmane
</TEXTAREA><BR>
改頁設定<BR>
<SELECT NAME="pagechange" >
<OPTION VALUE="0" $chpage_sel[0]>$pagechan_mode[0]
<OPTION VALUE="1" $chpage_sel[1]>$pagechan_mode[1]
<OPTION VALUE="2" $chpage_sel[2]>$pagechan_mode[2]
<OPTION VALUE="3" $chpage_sel[3]>$pagechan_mode[3]
<OPTION VALUE="4" $chpage_sel[4]>$pagechan_mode[4]
</SELECT>
記事数<INPUT TYPE="text" NAME="pagechange_no" SIZE="5" MAXLENGTH="5" VALUE="$pagechange_no">
<BR><BR>
<INPUT TYPE="submit" NAME="send" VALUE="完了">
<INPUT TYPE="submit" NAME="send" VALUE="変更無し">
<INPUT TYPE="reset" VALUE="リセット"><BR>
</FORM>
HIA1
&pbottom;
}
sub phed{
print <<"HIA1";
<HTML>
<HEAD>
<TITLE>$_[0]</TITLE>
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=UTF-8" >
</HEAD>
<BODY STYLE="line-height:150%;margin:1.5cm" BGCOLOR="#FFEEEE">
$p_style
<SPAN STYLE="font-size:14pt;font-weight:bold">$_[1]</SPAN><BR><BR>
<!---------------------------------------------->
HIA1
}
sub pbottom{
print <<"HIA1";
<!---------------------------------------------->
$logo
$p_stylee
</BODY></HTML>
HIA1
}
sub pageno_get{
local $dmy1=index $hedder,"<!-page_NO-->";
if($dmy1 <= 0){
$dmy1=index $footer,"<!-page_NO-->";
}
$pageno=substr($hedder,$dmy1+13,3);
$prevfile=$filename_top.sprintf("%03d",$pageno-1).".html";
$nextfile=$filename_top.sprintf("%03d",$pageno+1).".html";
return $pageno;
}
sub html_write{
local $newfilename=$_[0];
$err=0;
if ( !open (FILE_IO,">${newfilename}") ){
$err=1;
}else{
select(FILE_IO);
print $hedder;
print join("\n",@kiji);
print $footer;
if($newfilename eq $datafile){print $logo;}
print "</BODY></HTML>";
close(FILE_IO);
select(STDOUT);
}
return $err;
}
sub datafile_read{
$datain_n=@datain;
$daydata_p1=&linepos("datain","<!-day_data-->");
$daydata_p2=&linepos("datain","<!-/day_data-->",$daydata_p1);
# hedderの分離
$dmy=join("\n",@datain);
@dmy=split("<!-day_data-->",$dmy);
$hedder=$dmy[0]."<!-day_data-->";
$rem=$dmy[1];
# footerの分離
@dmy=split("<!-/day_data-->",$rem);
$footer="\n<!-/day_data-->".$dmy[1];
$footer=~s/<\/BODY>//g;
$footer=~s/<\/HTML>//g;
$footer=~s/${logo}//g;
# データの分離
if($datain[$daydata_p1+2] ne '<DIV style="VISIBILITY: hidden; POSITION: relative">'){
$kijitop=$daydata_p1+2;
$kijibottom=$daydata_p2;
$kiji0=0;
}else{
$kijitop=$daydata_p1+3;
$kijibottom=$daydata_p2-1;
$kiji0=1;
}
$j=0;
for($i=$kijitop;$i<$kijibottom;$i++){
$kiji[$j]=$datain[$i];
$j++;
}
$hedder=$hedder."\n$datain[$daydata_p1+1]\n";
# スタイルデータ(@aday)を学習する
$dmy=substr($datain[$daydata_p1+1],13,length($datain[$daydata_p1+1])-13);
@dmy=split(/\)/,$dmy);
@ds=split(/\,/,$dmy[0]);
$j=0;
for($i=0;$i<$ds[0];$i++){
$aday[$j]=$kiji[$i];
$j++;
}
$aday[0]=~ s/<A NAME=\"page_bottom\">//g;
$aday[$ds[1]]="";
$aday[$ds[2]]="";
$aday[$ds[3]]="";
$aday[$ds[0]]="";
$dmy1=index $datain[$daydata_p1+1],'"';
$dmy2=index $datain[$daydata_p1+1],'"',$dmy1+1;
$datemode=substr($datain[$daydata_p1+1],$dmy1+1,$dmy2-$dmy1-1);
$kiji_n=@kiji/($ds[0]+1);#記事の個数
if($kiji0==1){$kiji_n=0;}
}
sub shokiset{
# 日付のセット
($sec , $min , $hour, $mday, $mon, $year ,$wday) = localtime();
$today=&dateformat("y1/m1/d1(w1)",$year+1900,$mon+1,$mday,$wday);
$datenow =sprintf("<!-%04d%02d%02d%01d-->",$year + 1900, $mon + 1, $mday,$wday).$today;
$datain = <<"HIA1";
<HTML>
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=UTF-8" >
<HEAD>
<TITLE>FREE DIARY</TITLE>
<STYLE>
<!--
.title{font-size:110%;color:blue}
.date{font-size:90%;color:green;text-align:right}
HR{color:C00000;height:5px}
-->
</STYLE>
</HEAD>
<BODY STYLE="line-height:150%;margin-left:1.5cm;margin-right:1.5cm;margin-top:1.5cm">
<B><!-page_NO-->$start_page</B> <A HREF="#page_bottom">[最新]</A><BR>
<DIV STYLE="text-align:center;font-size:170%">FREE DIARY</DIV>
<!-A HREF="prev_page">前頁へ</A--> <!-A HREF="next_page">次頁へ</A--><BR><BR><HR>
<!-day_data-->
<!-day_style(7,1,5,3)"y1/m1/d1(w1)"-->
<SPAN CLASS="title"><A NAME="page_bottom">
初期データ
</SPAN><BR>
コメント:日記CGIの立ち上げ時、もしくは書き込みページ"$datafile"が見つからなかったため、初期データを表\示しています。<BR>問題が無ければ、skinのチェンジ→初期データの消去へお進み下さい。
<BR><DIV CLASS="date">
$datenow
</DIV><HR>
<!-/day_data-->
</BODY></HTML>
HIA1
@datain=split("\n",$datain);
$datain="";
}
sub page_change{
$next_page=0;
$pageno=&pageno_get;
# 新しいファイルネームを設定する
$newfilename=$filename_top."$pageno.html";
&hedderjoin;
$hedder_old=$hedder;
# 現在のページの内容をLOGファイルに移行する-----------------------
#次ページのLINKを設定
for($i=0;$i<2;$i++){
$hedder=&linkchange($hedder,'<!-A HREF="next_page">','</A-->',"<A HREF=\"$datafile\">",'</A>',2);
}
&heddersplit;
$err1=&html_write($newfilename);
# 一つ古いLOGファイルのLINKを変更----------------------------------
if(-e $prevfile){
$errinp=&fileinput($prevfile,"dmys");
$dmy1=join("\n",@dmys);
$dmy2="<A HREF=\"$datafile\">";
$dmy3="<A HREF=\"$newfilename\">";
$dmy1=~s/${dmy2}/${dmy3}/g;
@dmys=($dmy1);
&fileout($prevfile,"dmys",1);
}
# 表紙のページを新しく作成する-------------------------------------
$hedder=$hedder_old;
$dmy1=index $hedder,'<!-A HREF="prev_page"';
if($dmy1 >= 0){
# 前ページのLINKを設定
for($i=0;$i<2;$i++){
$hedder=&linkchange($hedder,'<!-A HREF="prev_page">','</A-->',"<A HREF=\"$newfilename\">",'</A>',2);
}
}else{
$hedder=~s/<A HREF=\"$prevfile\">/<A HREF=\"$newfilename\">/g;
}
$dmy1="<!-page_NO-->".$pageno;
$dmy2="<!-page_NO-->".sprintf("%03d",$pageno+1);
$hedder=~s/${dmy1}/${dmy2}/g;
&heddersplit;
@kiji=();
@kiji=@aday;
unshift(@kiji,'<DIV style="VISIBILITY: hidden; POSITION: relative">');
push(@kiji,"</DIV>");
$kiji0=1;
$err1=&html_write($datafile);
if($err1 == 1){$messege="ファイル$datafileが開けませんでした。ファイル属性等をご確認ください。";$next_page=3};
}
sub skin_icon_set{
#-------------------------------------------------------------
# スキン管理
if(-e $skinselfile){
# スキン管理ファイル読み込み
$errinp=&fileinput($skinselfile,"skinfiles");
}else{
# スキン選択ファイル検索
$wildcard="skin*.html";# スキンファイルのワイルドカード
@skinfiles=<${wildcard}>;
# スキン実数チェック
$skinfiles_n=@skinfiles;
for($i=0;$i<$skinfiles_n;$i++){
$skinfiles[$i]=$skinfiles[$i].",";
}
&fileout($skinselfile,"skinfiles",1);
}
# アイコン管理
if(-e $iconselfile){
# アイコン管理ファイル読み込み
$errinp=&fileinput($iconselfile,"iconfiles");
}else{
# アイコン選択ファイル検索
$wildcard="./icon/*";# アイコンファイルのワイルドカード
@iconfiles=<${wildcard}>;
# アイコン実数チェック
$iconfiles_n=@iconfiles;
for($i=0;$i<$iconfiles_n;$i++){
$iconfiles[$i]=substr($iconfiles[$i],7,length($iconfiles[$i])-7).",";
}
&fileout($iconselfile,"iconfiles",1);
}
}
sub chpagemode{
$errinp=&fileinput($chpagefile,"chpage");
$pagechange=$chpage[0];
$chpage_sel[$pagechange]="SELECTED";
$pagechange_no=$chpage[1];
}
sub matching{
# 2行2列のデータベースのマッチングの様なサブルーチン
# $_[0]に(key_word,その情報)という形のデータの配列名、$_[1]に新しいデータ名を読み込んでいる。
local $old_dataname=$_[0];
local $new_keyname=$_[1];
local @key=();
local @info=();
local $info;
local @dmy=();
# データ(csv)をカンマで分離する
local $data_o_n=@$old_dataname;
for($i=0;$i<$data_o_n;$i++){
@dmy=split(",",$$old_dataname[$i]);
$key[$i]=$dmy[0];
$info[$i]=$dmy[1];
}
# 新しいkey_wordに古いkeyと一致するものがあれば、情報を付け加える
local $data_n_n=@$new_keyname;
for($i=0;$i<$data_n_n;$i++){
$info="";
for($j=0;$j<$data_o_n;$j++){
if($$new_keyname[$i] eq $key[$j]){$info=$info[$j];last;}
}
$$new_keyname[$i]=$$new_keyname[$i].",".$info;
}
return @$new_keyname;
}
#-------------------------------------------------------------
sub skinin{
# スキンファイルの入力
$errinp=&fileinput($stylefile,"styledata");
if($errinp==1){$messege=$messege."スキン定義ファイル$stylefileが開けません。<BR>"
}else{
$styledata_n=@styledata;
$styledata=join("\n",@styledata);
# スキン定義ファイルの外観チェック
$dmy1=index $styledata,'<!-day_data-->';
$dmy2=index $styledata,'<!-/day_data-->',$dmy1;
$dmy3=index $styledata,'$page_NO';
$dmy4=index $styledata,'<A HREF="prev_page">';
$dmy5=index $styledata,'<A HREF="next_page">';
if($dmy1<0){$messege=$messege."スキン定義ファイル$stylefileに<!-day_data-->が有りません。<BR>"}
if($dmy2<0){$messege=$messege."スキン定義ファイル$stylefileに<!-/day_data-->が有りません。<BR>"}
if($dmy3<0){$messege=$messege."スキン定義ファイル$stylefileに\$page_NOが有りません。<BR>"}
if($dmy4<0){$messege=$messege."スキン定義ファイル$stylefileに<A HREF=\"prev_page\">が有りません。<BR>"}
if($dmy5<0){$messege=$messege."スキン定義ファイル$stylefileに<A HREF=\"next_page\">が有りません。<BR>"}
if($messege eq ""){
# hedderの分離
@dmy=split("<!-day_data-->",$styledata);
$hedder=$dmy[0]."<!-day_data-->";
$rem=$dmy[1];
# footerの分離
@dmy=split("<!-/day_data-->",$rem);
$footer="\n<!-/day_data-->".$dmy[1];
$footer=~s/<\/BODY>//g;
$footer=~s/<\/HTML>//g;
$adaystyle=$dmy[0];
$adaystyle=~s/\n//g;
# 複数連続した半角スペースを1つに減らす
$sp2=" ";$sp=" ";
while((index $adaystyle,$sp2)>=0){$adaystyle=~s/${sp2}/${sp}/g;}
&hedderjoin;
# ページ番号位置のマークをつける(ページ番号は頁内に2箇所まで)
$hedder=~s/\$page_NO/<!-page_NO-->$pageno/g;
# 前頁リンクと次頁リンクはヘッダもしくはフッタどちらかに2つずつ置ける。
# 前頁へのリンクの書式を変更する
if($prevlink_on==0){
for($i=0;$i<2;$i++){
$hedder=&linkchange($hedder,'<A HREF="prev_page">','</A>','<!-A HREF="prev_page">','</A-->',1);
}
}else{
$hedder=~s/prev_page/${prevfile}/g;
}
# 次頁へのリンクの書式を変更する
if($nextlink_on==0){
for($i=0;$i<2;$i++){
$hedder=&linkchange($hedder,'<A HREF="next_page">','</A>','<!-A HREF="next_page">','</A-->',1);
}
}else{
$hedder=~s/next_page/${nextfile}/g;
}
&heddersplit;
# adayの作成
# $title,$date"...",$commentの前後で行を分離する
$dmy1=index $styledata,'$title';
$dmy2=index $styledata,'$date"';
$dmy3=index $styledata,'"',$dmy2;
$dmy4=index $styledata,'$comment';
if($dmy1<0){$messege=$messege."スキン定義ファイル$stylefileに\$titleが有りません。<BR>";}
if($dmy2<0){$messege=$messege."スキン定義ファイル$stylefileに\$date\"が有りません。<BR>";}
if($dmy3<0){$messege=$messege."スキン定義ファイル$stylefileで\$date\"のダブルコーテーションが閉じていません。<BR>";}
if($dmy4<0){$messege=$messege."スキン定義ファイル$stylefileに\$commentが有りません。<BR>";}
$dmy1=index $adaystyle,"\$date\"";
$dmy2=index $adaystyle,'"',$dmy1+7;
$datemode=substr($adaystyle,$dmy1+6,$dmy2-$dmy1-6);
if((index $datemode,"\$comment")>=0||(index $datemode,"\$title")>=0||$dmy2<0){$messege=$messege."スキン定義ファイル$stylefileで\$date\"のダブルコーテーションが閉じていません。<BR>";}
$adaystyle=substr($adaystyle,0,$dmy1)."<>".substr($adaystyle,$dmy1,$dmy2-$dmy1+1)."<>".substr($adaystyle,$dmy2+1,length($adaystyle)-$dmy2-1);
$adaystyle=~s/\$title/<>\$title<>/g;
$adaystyle=~s/\$comment/<>\$comment<>/g;
@aday=split(/<>/,$adaystyle);
# @dsを作成する
$ds[0]=@aday;
$ds[1]=&linepos("aday",'$title');
$ds[3]=&linepos("aday",'$comment');
for($i=0;$i<$ds[0];$i++){
if(substr($aday[$i],0,5) eq '$date'){$ds[2]=$i;}
}
$aday[$ds[1]]="";
$aday[$ds[2]]="";
$aday[$ds[3]]="";
$aday[$ds[0]]="";
# 一日分データの位置と日付の表示スタイルを書式に書き出す。
$day_style="<!-day_style($ds[0],$ds[1],$ds[2],$ds[3])\"$datemode\"-->";
}
}
}
sub linkchange{
# LINKのチェンジ用サブルーチン。$_[0]を$_[1]と$_[2]で挟まれた部分を$_[3]と$_[4]で挟んだものに置き換える。間の部分は、タグの括弧の置き換えを行う。
# 置き換えの方法は、$_[5]が0で不変、1で<>から<>、2で<>から<>へ
local $dmy=$_[0];
local $pos1=index $dmy,$_[1];
if($pos1>=0){
local $pos2=index $dmy,$_[2],$pos1;
local $dmy0=substr($dmy,0,$pos1);
local $dmy2=substr($dmy,$pos1+length($_[1]),$pos2-$pos1-length($_[1]));
local $dmy4=substr($dmy,$pos2+length($_[2]),length($dmy)-$pos2-length($_[2]));
if($_[5]==1){
$dmy2=~s/>/>/g;
$dmy2=~s/</</g;
}elsif($_[5]==2){
$dmy2=~s/>/>/g;
$dmy2=~s/</</g;
}
$dmy=$dmy0.$_[3].$dmy2.$_[4].$dmy4;
}
return $dmy;
}
sub hedderjoin{
$hedder=$hedder."hedderfooterjoint".$footer;
}
sub heddersplit{
local @dmy=split("hedderfooterjoint",$hedder);
$hedder=$dmy[0];
$footer=$dmy[1];
}
sub linepos{
$hensuumei=$_[0];
$findwords=$_[1];
$start_position=$_[2];
$end_position=$_[3];
$subout=-1;
if($start_position eq ""){$start_position=0;}
if($end_position eq ""){$end_position=@$hensuumei;}
if($findwords ne ""){
for($i=$start_position;$i<$end_position;$i++){
if($$hensuumei[$i] eq $findwords){$subout=$i;last;}
}
}
return $subout;
}
sub dateformat{
# 日付表示をモードの書式によって切り替えるためのサブルーチンです。
#
# コード表
# y1:"2003",y2:"03",y3:"2003",y4:"03",y5:"二〇〇三"
# m1:"04",m2:"4",m3:"04",m4:"4",m5:"April",m6:"Apr",m7:"四"
# d1:"06",d2:"6",d3:"06",d4:"6",d5:"六"
# w1:"日",w2:"Sunday",w3:"Sun"
#
# 例)y1/m1/d1(w1)→2003/04/06(日) | w2 d1 m5,y1→Sunday 06 April,2003 | y5年 m7月 d5日(w1曜日)→二〇〇三年 四月 六日(日曜日)|等
@big=("0","1","2","3","4","5","6","7","8","9");
@kanji=("〇","一","二","三","四","五","六","七","八","九");
@April=("","January","February","March","April","May","June","July","August","September","November","October","December");
@Apr=("","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Nov","Oct","Dec");
@nichi=("日","月","火","水","木","金","土");
@Sunday=("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
@Sun=("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
local $datehyouji=$_[0];# コードによる日付表示の指示
local $year=$_[1];
local $month=$_[2];
local $day=$_[3];
local $week=$_[4];
local $pos;
local $mode;
local $hyouji;
local $i;
$pos=index $datehyouji,"y";
if($pos>=0){
$mode=substr($datehyouji,$pos+1,1);
if($mode==2){$hyouji=substr($year,2,2);}
elsif($mode==3){$hyouji=&baikaku_num($year);}
elsif($mode==4){$hyouji=&baikaku_num(substr($year,2,2));}
elsif($mode==5){$hyouji=&kanji_num($year);}
else{$hyouji=$year;}
$datehyouji=substr($datehyouji,0,$pos).$hyouji.substr($datehyouji,$pos+2,length($datehyouji)-$pos-2);
}
$pos=index $datehyouji,"m";
if($pos>=0){
$month=sprintf("%02d",$month);
$mode=substr($datehyouji,$pos+1,1);
if($mode==2){
if(substr($month,0,1) eq "0"){$hyouji=substr($month,1,1);}else{$hyouji=$month;}
}
elsif($mode==3){$hyouji=&baikaku_num($month);}
elsif($mode==4){
if(substr($month,0,1) eq "0"){$month=substr($month,1,1);}
$hyouji=&baikaku_num($month);
}
elsif($mode==5){$hyouji=$April[$month];}
elsif($mode==6){$hyouji=$Apr[$month];}
elsif($mode==7){
if(substr($month,0,1) eq "0"){$month=substr($month,1,1);}
$hyouji=&kanji_num($month);
}
else{$hyouji=$month;}
$datehyouji=substr($datehyouji,0,$pos).$hyouji.substr($datehyouji,$pos+2,length($datehyouji)-$pos-2);
}
$pos=index $datehyouji,"d";
if($pos>=0){
$day=sprintf("%02d",$day);
$mode=substr($datehyouji,$pos+1,1);
if($mode==2){
if(substr($day,0,1) eq "0"){$hyouji=substr($day,1,1);}else{$hyouji=$day;}
}
elsif($mode==3){$hyouji=&baikaku_num($day);}
elsif($mode==4){
if(substr($day,0,1) eq "0"){$day=substr($day,1,1);}
$hyouji=&baikaku_num($day);
}
elsif($mode==5){
if(substr($day,0,1) eq "0"){$day=substr($day,1,1);}
$hyouji=&kanji_num($day);
}
else{$hyouji=$day;}
$datehyouji=substr($datehyouji,0,$pos).$hyouji.substr($datehyouji,$pos+2,length($datehyouji)-$pos-2);
}
$pos=index $datehyouji,"w";
if($pos>=0){
$mode=substr($datehyouji,$pos+1,1);
if($mode==2){$hyouji=$Sunday[$week];}
elsif($mode==3){$hyouji=$Sun[$week];}
else{$hyouji=$nichi[$week];}
$datehyouji=substr($datehyouji,0,$pos).$hyouji.substr($datehyouji,$pos+2,length($datehyouji)-$pos-2);
}
return $datehyouji;
}
sub baikaku_num{
local $num=$_[0];
local $len=length($num);
local $output="";
local $i;
for($i=0;$i<$len;$i++){$output=$output.$big[substr($num,$i,1)]}
return $output;
}
sub kanji_num{
local $num=$_[0];
local $len=length($num);
local $output="";
local $i;
for($i=0;$i<$len;$i++){$output=$output.$kanji[substr($num,$i,1)]}
return $output;
}
sub week_num{
# 週番号を計算するプログラム
# $_[0]:yyyymmdd,$_[1]:4で月曜日切り替え、5で日曜日切り替え
use Time::Local;
return int(( ( timelocal(0, 0, 0, substr($_[0],6,2), substr($_[0],4,2)-1, substr($_[0],0,4)) -54000)/86400+$_[1] )/7);
}
sub crlf{
$dmy = $_[0] ;
# 改行制御(1:書き込み側 \r\n等→<BR>、2:エディット側<BR>→\n)
if($_[1] == 1){
$dmy =~ s/\r\n/\n/g; # Windows系(CR,LF)->LF
$dmy =~ s/\r/\n/g; # Mac 系(CR)->LF
$dmy =~ s/\n/<BR>/g; # LF -> <BR>
}else{
$dmy =~ s/<BR>/\n/g; # <BR> -> LF
}
return $dmy;
}
#*****************************************************************
#=================================================================
# ファイル入力サブルーチン__ &fileinput(入力ファイル名,変数名)
# ※サブルーチンを呼ぶ前に、@変数名=();など、配列をあらかじめ作っておく必要があります。
sub fileinput{
$err=0;
$filename=$_[0];
$hensuumei=$_[1];
if ( !open (FILE_IO, $filename) ){
$err=1;
}
else{
@$hensuumei = <FILE_IO>;
close(FILE_IO);
}
$cntend=@$hensuumei-1;
for ($i=0;$i<=$cntend;$i++){
$$hensuumei[$i]=~s/\r//g;
$$hensuumei[$i]=~s/\n//g;
}
return($err);
}
#====================================================================
# ファイル出力サブルーチン__ &fileout(出力ファイル名,変数名,書き込みモード,start,end)
# ※書き込みモードは、0:追加書き込み、1:上書き保存
sub fileout{
$err=0;
$filename=$_[0];
$hensuumei=$_[1];
$overwrite=$_[2];
$istart=$_[3];
$iend=$_[4];
$cntend=@$hensuumei-1;
if($istart eq "" && $iend eq ""){
$istart=0;
$iend=$cntend;
}
if($istart<0 || $istart>$iend || $iend>$cntend){
$err=1;
}else{
if($overwrite==1){
$openname=">".$filename;
}else{
$openname=">>".$filename;
}
# ファイルに格納する。
if ( !open (FILE_IO, $openname) ){
$err=1;
}else{
for ($i=$istart;$i<=$iend;$i++){
print FILE_IO $$hensuumei[$i]."\n";
}
close (FILE_IO);
}
}
return($err);
}
##############################################################
# # # read_input : フォームからのデータを分解し # # $form{'xxxx'} で返す。
# # # # 引数 1: 'euc' or 'jis' or 'sjis' # # #
##############################################################
sub read_input {
$charset = $_[0];
$charset = 'euc' if ( $charset eq '' );
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else{ $buffer = $ENV{'QUERY_STRING'};}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# &jcode'convert(*value, $charset);
$FORM{$name} = $value;
}
%FORM;
}
__END__