#!/usr/bin/perl #-------------------------------------------------------------------------------------------------- # 自由レイアウト日記帳 ver1.01.00 # # ※再配布不可/改造可です。 # # date: 2001/07 # by : megumi.sano # mail: webmaster@ace-cgi.jp # url : http://www.ace-cgi.jp/ #-------------------------------------------------------------------------------------------------- require './jcode.pl'; ########## 固定項目 ########## $cgif = "./index.cgi"; #このファイル $dataf = "./data/"; #データフォルダ $formf = "./index.html"; #レイアウトフォームファイル @week1=('SUN','MON','TUE','WED','THU','FRI','SAT'); @week2=('日','月','火','水','木','金','土'); ########## 設定項目 ########## $pass = "owner"; #管理者パスワード $back_text = "Back"; #前月へのリンク $next_text = "Next"; #後月へのリンク ########## 処理はここから ########## &form_get; #フォーム解析 &form_ana; #レイアウトフォーム解析 &day_get; #表示付き設定 $fnam = &fnam_get; #ファイル名作成 if($FORM{'mode'} eq "master"){ &master_in; } elsif($FORM{'mode'} eq "form"){ &form_disp($fnam); } elsif($FORM{'mode'} eq "read"){ &form_disp($fnam); } elsif($FORM{'mode'} eq "msg"){ &data_save($fnam); } #----表示 &head_disp; &cont_disp($fnam); &foot_disp; exit; #------------# # 表示月設定 # #------------# sub day_get { $ENV{'TZ'} = "JST-9"; local($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(); if($FORM{'mon'} < 1){ $FORM{'year'} = $year+1900; $FORM{'mon'} = $mon+1; $FORM{'day'} = $mday; } } #----------------# # ファイル名作成 # #----------------# sub fnam_get { local($fnam) = "$dataf" . "$FORM{'year'}" . "_" . "$FORM{'mon'}" . ".dat"; return $fnam; } #------------------------# # レイアウトファイル解析 # #------------------------# sub form_ana { if(!open(IN,"$formf")){ &error("レイアウトフォームファイルが読み込めません"); } local(@lines)=; close(IN); @head_lines=(); @foot_lines=(); @cont_lines=(); local($flg)=0; foreach $line (@lines){ if(index($line,"JIYUDIARY KUGIRI1") >= 0){ $flg=1; next; } if(index($line,"JIYUDIARY KUGIRI2") >= 0){ $flg=2; next; } if($flg == 0){ push(@head_lines, $line); } elsif($flg == 1){ push(@cont_lines, $line); } else{ push(@foot_lines, $line); } } if(!@head_lines || !@foot_lines || !@cont_lines){ &error("レイアウトフォームが未完成です"); } } #--------------------# # ヘッダ部分書き出し # #--------------------# sub head_disp { print "Content-type: text/html\n\n"; foreach $line (@head_lines){ $line =~ s//$FORM{'year'}/g; $line =~ s//$FORM{'mon'}/g; print "$line"; } } sub head_disp2 { print "Content-type: text/html\n\n"; print <
EOM } #--------------------# # フッタ部分書き出し # #著作権の表示です。書き換えないで下さい。 #--------------------# sub foot_disp { local($y,$m); $y=$FORM{'year'}; $m=$FORM{'mon'}; $m--; if($m < 1){ $m=12; $y--; } local($back)="$back_text"; $y=$FORM{'year'}; $m=$FORM{'mon'}; $m++; if($m > 12){ $m=1; $y++; } local($next)="$next_text"; foreach $line (@foot_lines){ $line =~ s//$FORM{'year'}/g; $line =~ s//$FORM{'mon'}/g; $line =~ s//$back/g; $line =~ s//$next/g; if(index($line,"") >= 0 || index($line, "") >= 0){ print "\n"; } print "$line"; } } sub foot_disp2 { print < EOM exit; } #----------# # 内容表示 # #----------# sub cont_disp { local($fnam)=$_[0]; local(@lines)=(); if(-e $fnam){ if(!open(IN,"$fnam")){ &error("データファイルが読み込めません"); } @lines=; close(IN); } foreach $line (@lines){ local($day,$comment,$item1,$item2,$item3,$item4,$item5,$tim)=split(/<>/,$line); if($comment eq ""){ next; } local($t)=&time_set($tim); $weekno = &get_start($FORM{'year'},$FORM{'mon'},$day); $we1 = $week1[$weekno]; $we2 = $week2[$weekno]; foreach $line (@cont_lines){ $line2 = $line; $line2 =~ s//$FORM{'year'}/g; $line2 =~ s//$FORM{'mon'}/g; $line2 =~ s//$day/g; $line2 =~ s//$we1/g; $line2 =~ s//$we2/g; $line2 =~ s//$t/g; $line2 =~ s//$comment/g; print "$line2"; } } } #--------# # 投稿欄 # #--------# sub form_disp { if($FORM{'pass'} ne $pass){ &error("パスワードが違います"); } local($fnam)=$_[0]; local($comment)=""; if(-e $fnam){ if(!open(IN,"$fnam")){ &error("データファイルが読み込めません"); } local(@lines)=; close(IN); foreach $line (@lines){ local($day,$com,$item1,$item2,$item3,$item4,$item5,$tim)=split(/<>/,$line); if($day eq $FORM{'day'}){ $comment=$com; last; } } $comment =~ s/
/\n/g; } local($ua) = $ENV{'HTTP_USER_AGENT'}; local($a) = ($ua =~ /MSIE/i) ? 1.5 : 1.0; local($w) = 38*$a; local($i); &head_disp2; print "
\n"; print "
\n"; print "\n"; print "\n"; print "修正したい場合は、その日付のデータを読み込んで下さい\n"; print "\n"; print "\n"; print "
\n"; print "年 \n"; print "月\n"; print "日\n"; print "\n"; print "
\n"; print "
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "削除したい場合は、カラで書き込みボタンを押して下さい\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "年 \n"; print "月\n"; print "日\n"; print "\n"; print "
\n"; print "\n"; print "
\n"; print "
\n"; &foot_disp2; } #------------------# # 投稿データを記録 # #------------------# sub data_save { if($FORM{'year'} == 0 || length($FORM{'year'}) != 4){ &error("年が不正です"); } if($FORM{'mon'} == 0){ &error("月が不正です"); } if($FORM{'day'} == 0){ &error("日が不正です"); } local($fnam)=$_[0]; if(length($fnam) < 7 ){ &error("ファイル名が不正です"); } local($t)=&time_get; local($val)="$FORM{'day'}<>$FORM{'comment'}<><><><><><>$t<>\n"; local(@lines)=(); if(-e $fnam){ if(!open(IN,"$fnam")){ &error("ファイルが読み込めません"); } @lines=; close(IN); } local(@new)=(); foreach $line (@lines){ local($day,$com,$item1,$item2,$item3,$item4,$item5,$tim)=split(/<>/,$line); if($day eq $FORM{'day'}){ next; } push(@new, $line); } @lines=@new; @new=(); local($flg)=0; # foreach $line (@lines){ # local($day,$com,$item1,$item2,$item3,$item4,$item5,$tim)=split(/<>/,$line); # if($day > $FORM{'day'} && $flg == 0){ # $flg = 1; # push(@new, $val); # } # push(@new, $line); # } # if($flg == 0){ push(@new, $val); } foreach $line (@lines){ local($day,$com,$item1,$item2,$item3,$item4,$item5,$tim)=split(/<>/,$line); if($day < $FORM{'day'} && $flg == 0){ $flg = 1; push(@new, $val); } push(@new, $line); } if($flg == 0){ push(@new, $val); } if(!open(OUT,">$fnam")){ &error("ファイルがオープン出来ません"); } print OUT @new; close(OUT); } #----------------# # 投稿データ取得 # #----------------# sub form_get { local($pair,$buff); if($ENV{'REQUEST_METHOD'} eq "POST"){ if($ENV{'CONTENT_LENGTH'} > 51200){ &error("サイズオーバー",""); } read(STDIN, $buff, $ENV{'CONTENT_LENGTH'}); } else{ $buff = $ENV{'QUERY_STRING'}; } local(@pairs) = split(/&/,$buff); foreach $pair(@pairs){ local($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'h2z_sjis(*value); $value =~ s/<>/<>/g; if($name eq "comment"){ $value =~ s/\r\n/
/g; $value =~ s/\r/
/g; $value =~ s/\n/
/g; } else{ $value =~ s/\r//g; $value =~ s/\n//g; } $FORM{$name} = $value; } } #----------------# # パスワード入力 # #----------------# sub master_in { &head_disp2; print < ここは管理者用です

パスワード
EOM &foot_disp2; } #------------# # 自動リンク # #------------# sub auto_link { if(!($_[0] =~ /<\/a>/)){ $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/a>/g; } } #----------# # 現在時刻 # #----------# sub time_get { $ENV{'TZ'} = "JST-9"; return time(); } sub time_set { $ENV{'TZ'} = "JST-9"; local($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($_[0]); # $year = $year + 1900; # $mon = $mon+1; $sec = "0$sec" if $sec < 10; $min = "0$min" if $min < 10; $hour = "0$hour" if $hour < 10; # $mday = "0$mday" if $mday < 10; # $mon = "0$mon" if $mon < 10; # $wday = ('sun','mon','tue','wed','thu','fri','sat')[$wday]; # local($date) = "$year/$mon/$mday $hour:$min:$sec"; local($date) = "$hour:$min:$sec"; return $date; } #----------# # 曜日取得 # #----------# sub get_start { local($y,$m,$d) = @_; if( $m < 3 ){ $y--; $m+=12; } return(($y+int($y/4)-int($y/100)+int($y/400)+int((13*$m+8)/5)+$d)%7); } #------------# # エラー処理 # #------------# sub error { print "Content-type: text/html\n\n"; print < ERROR
$_[0]
EOM exit; }