#!/usr/bin/perl use CGI; require 'jcode.pl'; use Time::Local; ############################################################################## # # EasyBBS PX ver 1.0.2 # Copyright(C) 2001 by Junnama Noda(junnama@alfasado.net). # # This Program is FREE to use, but I Don't support about this prgram at all. # # Original Version(for Mac OS) are witten by Motoyuki Tanaka. # http://mtlab.ecn.fpu.ac.jp/ # # このBBSは、田中求之氏のEasyBBS DX IIIを野田純生がPerlに移植したものです。 # 再配布、公開、改造等自由に行って構いませんが、このプログラムを実行した # 結果生じたいかなる問題についても作者は責任を負いません。 # ################################# 更新履歴 ################################# # Friday, August 17, 2001 1.0.0 # Sunday, August 19, 2001 1.0.1 # Monday, August 20, 2001 1.0.2 ################################# 初期設定 ################################# # 改行コードはデフォルトではCR、文字コードはsjisになっています。 # 環境によってLF,EUC等に変更する必要があるかもしれません。 # FTPクライアントやエディタによっては変換する機能があると思います。 # その場合、各発言やRecent関係のファイル、テンプレートについても変更するように # して下さい。 # top_recent でファイル名を決めておきます。ここで決めたのと同じ名前のファイルを # bbs.acgi と同じフォルダーの中に作っておく必要があります。 # ファイル名を _ で始めると、BBS の Recent は未公開として処理します # (マニュアルで URL を指定しないとアクセスできない) $top_recent = "BBS_recent"; # Recent ページを呼び出すためのコマンドを決めておきます。 # BBS の Recent を未公開にしたときには、ここで決めたコマンドを # 含めた URL を使ってアクセスすることになります。 # たとえば以下のように "myRecent" にしたときには # http://your.host/BBS/bbs.cgi?myRecent # というのが URL になります。つまり bbs.cgi?<コマンド名> # で呼び出すわけです。 # オリジナルソース:$recent_cmd = "myRecent"; $recent_cmd = "http://www.powerbook.org/rikibon/bbs/bbs.cgi?BBS_recent"; # CGI.pmを利用して得たデータをjcode.plで文字コード統一 # デフォルトはsjis $query=new CGI; &jcode'convert($query,'sjis'); # パスの取得 $myInfomation=$ENV{'PATH_INFO'}; $myHost=$ENV{'SERVER_NAME'}; # BBSのパス(自動的に取得) # うまく得られない場合は環境に合わせて設定(例 $myLocation="http://youehost/bbs/bbs.acgi") # オリジナルソース:$myLocation="http://$myHost$myInfomation"; $myLocation="http://www.powerbook.org/rikibon/bbs/bbs.cgi"; # BBSのフォルダ(自動的に取得) # うまく得られない場合は環境に合わせて設定(例 $myFLocation="http://youehost/bbs/") # オリジナルソース:$myFLocation=replaceAll($myLocation,"bbs.cgi",""); $myFLocation=replaceAll($myLocation,"http://www.powerbook.org/rikibon/bbs/bbs.cgi",""); ########################## ここからが CGI 処理の本番 ######################### $http_search_args = $ENV{'QUERY_STRING'}; $http_if_mod = $ENV{'HTTP_IF_MODIFIED_SINCE'};#Conditional GETのチェック if ($http_search_args eq ""){ #### 指定が空の場合--全体のトップページ $myModDateRFC_1123= pickFileModGMT("$top_recent"); $http_if_mod_Str = getDateString($http_if_mod); $myModDateStr=getDateString($myModDateRFC_1123); if ($http_if_mod eq "" or $http_if_mod_Str < $myModDateStr){ print "Status: 200 OK\n"; print "Last-modified: $myModDateRFC_1123\n"; print "content-type: text/html\n\n"; print BBS_top(); }else{ print "Status: 304 Not Modified\n\n"; } }elsif($http_search_args eq $recent_cmd){ #### 会議室全体のリーセント $myModDateRFC_1123= pickFileModGMT("$top_recent"); $http_if_mod_Str = getDateString($http_if_mod); $myModDateStr=getDateString($myModDateRFC_1123); if ($http_if_mod eq "" or $http_if_mod_Str < $myModDateStr){ print "Status: 200 OK\n"; print "Last-modified: $myModDateRFC_1123\n"; print "content-type: text/html\n\n"; print BBS_Recent(); }else{ print "Status: 304 Not Modified\n\n"; } }else{ $myKind=""; if ($http_search_args =~ /r=/){ $myRoom="$'" if ($http_search_args =~ /r=/); $myRoom="$`" if ($myRoom =~ /&/); $myKind="show"; }elsif($http_search_args =~ /rx=/){ $myRoom="$'" if ($http_search_args =~ /rx=/); $myKind="post_new"; } $BBS_param="$'" if ($http_search_args =~ /&/); $BBS_File="$'" if ($BBS_param =~ /_/); $BBS_File="$`" if ($BBS_param =~ /_/); $AD_File="$'" if ($BBS_param =~ /_/); $PickUpExs=getEx($BBS_param); $CheckRO=substr($myRoom,0,2); $myExs=$PickUpExs; if($BBS_param eq "" and $myKind eq "show"){ #### ファイル指定が空の場合--各会議室トップページ $myModDateRFC_1123= pickFileModGMT("./$myRoom/ROOM_recent"); $http_if_mod_Str = getDateString($http_if_mod); $myModDateStr=getDateString($myModDateRFC_1123); if ($http_if_mod eq "" or $http_if_mod_Str < $myModDateStr){ print "Status: 200 OK\n"; print "Last-modified: $myModDateRFC_1123\n"; print "content-type: text/html\n\n"; print ROOM_Top($myRoom); }else{ print "Status: 304 Not Modified\n\n"; } }elsif($BBS_File eq "BBS"){ #### 各発言 if ($CheckRO eq "R_"){ #リードオンリー $myRDPath="$myFLocation$myRoom/$BBS_param"; print "Location: $myRDPath \n\n"; }else{ $myModDateRFC_1123= pickFileModGMT("./$myRoom/$BBS_param"); $http_if_mod_Str = getDateString($http_if_mod); $myModDateStr=getDateString($myModDateRFC_1123); if ($http_if_mod eq "" or $http_if_mod_Str < $myModDateStr){ print "Status: 200 OK\n"; print "Last-modified: $myModDateRFC_1123\n"; print "content-type: text/html\n\n"; print show_page($myRoom,$BBS_param); }else{ print "Status: 304 Not Modified\n\n"; } } }elsif($BBS_param eq "recent"){ #### 各会議室リーセント $myModDateRFC_1123= pickFileModGMT("./$myRoom/ROOM_recent"); $http_if_mod_Str = getDateString($http_if_mod); $myModDateStr=getDateString($myModDateRFC_1123); if ($http_if_mod eq "" or $http_if_mod_Str < $myModDateStr){ print "Status: 200 OK\n"; print "Last-modified: $myModDateRFC_1123\n"; print "content-type: text/html\n\n"; print ROOM_recent($myRoom); }else{ print "Status: 304 Not Modified\n\n"; } }elsif($BBS_param eq "post"){ #### 新規発言 print "content-type: text/html\n\n"; if ($CheckRO eq "R_"){ #リードオンリー my($roomTitle)=pickTitle("./$myRoom/ROOM_header"); $myErrMsg="Error\n\n

「$roomTitle」はリードオンリーの会議室です

"; $myErrMsg.="メッセージを投稿することはできません

"; $myErrMsg.="「$roomTitle」のトップページへ戻る"; print $myErrMsg; }else{ print ROOM_new_page($myRoom) } }elsif($BBS_param =~ /=/){ #### 検索処理 $myRes = room_search($myRoom,$BBS_param); if ($myRes eq "Error"){ print "Location: $myLocation?r=$myRoom \n\n"; }else{ print "content-type: text/html\n\n"; print $myRes; } }elsif($myKind eq "post_new"){ $myPostTitle=$query->param('title'); $myPostName=$query->param('name'); $myPostComment=$query->param('comment'); $myPostRef=$query->param('Ref'); $myPostURL=$query->param('URL'); if ($CheckRO eq "R_"){ #リードオンリー my($roomTitle)=pickTitle("./$myRoom/ROOM_header"); print "content-type: text/html\n\n"; $myErrMsg="Error\n\n

「$roomTitle」はリードオンリーの会議室です

"; $myErrMsg.="メッセージを投稿することはできません

"; $myErrMsg.="「$roomTitle」のトップページへ戻る"; print $myErrMsg; }else{ if ($myPostName eq "" or $myPostTitle eq "" or $myPostComment eq ""){ print "Location: $myLocation?r=$myRoom \n\n"; }else{ $myResult = Post_new_msg($myRoom,$myPostTitle,$myPostName,$myPostComment,$myPostRef,$myPostURL);#投稿 print "Location: $myLocation?r=$myRoom&$myResult \n\n"; } } }elsif($BBS_File eq "ADD"){ ####コメントの追加 $myPostName=$query->param('name'); $myPostComment=$query->param('comt'); $myPostRef=$query->param('Ref'); $myPostURL=$query->param('URL'); $AddRoomName = "$`" if ($http_search_args =~ /&/); $AddRoomName = "$'" if ($AddRoomName =~ /=/); if ($CheckRO eq "R_"){ #リードオンリー my($roomTitle)=pickTitle("./$AddRoomName/ROOM_header"); print "content-type: text/html\n\n"; $myErrMsg="Error\n\n

「$roomTitle」はリードオンリーの会議室です

"; $myErrMsg.="メッセージを投稿することはできません

"; $myErrMsg.="「$roomTitle」のトップページへ戻る"; print $myErrMsg; }else{ if ($myPostName eq "" or $myPostComment eq ""){ print "Location: $myLocation?r=$AddRoomName&$AD_File \n\n"; }else{ ####投稿 $myResult = Add_comment($AddRoomName,$myPostName,$myPostComment,$myPostRef,$myPostURL,$AD_File); print "Location: $myLocation?r=$AddRoomName&$myResult \n\n"; } } }else{ if ($CheckRO eq "R_"){ #リードオンリー $myRDPath="$myFLocation$myRoom/$BBS_param"; print "Location: $myRDPath \n\n"; }else{ #### デバック用 print "content-type: text/html\n\n"; print "$http_search_args
\n"; print "$myRoom
\n"; print "$BBS_param
\n"; print "$BBS_File
\n"; print "$AD_File
\n"; print "$PickUpExs\n"; } } } ####### 以下、処理内容毎に分けられたハンドラー ###### #### コメント追加 sub Add_comment{ my($theRoom,$PostName,$PostComment,$PostRef,$PostURL,$myTfile)=@_; my($myTtitle)=pickUpRoomName($theRoom); my($myFtitle)=pickTitle("./$theRoom/$myTfile"); my($cDate)=dateToString(); $cDate=substr($cDate,2,12); $PostComment=replaceToHTML($PostComment); $PostComment=replaceToBR($PostComment); $PostName=replaceToHTML($PostName); $PostURL=replaceToHTML($PostURL); $PostRef=replaceToHTML($PostRef); my($CreDate)=dateToJPString(); my($ShortDate)=dateToJString(); # ページに書き込むデータを作成する my($myText)="$PostName さんからのコメント
$CreDate

$PostComment"; if ($PostRef ne "" and $PostURL ne "http://" and $PostURL ne ""){ $myText.="\n

$PostRef
\n"; } $myText.="


"; $WResult=writeAddFile("./$theRoom/$myTfile",$myText); my($myBBSReacent)="$ShortDate 「$myTtitle」で $PostName さんが
\n

\n"; my($myReacentMessage)="$ShortDate $PostName さんが
\n

\n"; # 保存 open(TEMPFILERR, "<./$theRoom/ROOM_recent") || die "Error."; my(@myTextRR)=; close(TEMPFILERR); unshift(@myTextRR,$myReacentMessage); foreach (@myTextRR){ $CountArray++; } if ($CountArray > 80){ pop(@myTextRR);#40以上あれば古いものを消去 pop(@myTextRR); } open(TEMPFILERR, ">./$theRoom/ROOM_recent") || die "Error."; flock(TEMPFILERR,2); print TEMPFILERR @myTextRR; flock(TEMPFILERR,8); close(TEMPFILERR); open(TEMPFILEBR, "<$top_recent") || die "Error."; my(@myTextBR)=; close(TEMPFILEBR); unshift(@myTextBR,$myBBSReacent); $CountArray=0; foreach (@myTextBR){ $CountArray++; } if ($CountArray > 80){ pop(@myTextBR);#40以上あれば古いものを消去 pop(@myTextBR); } open(TEMPFILEBR, ">$top_recent") || die "Error."; flock(TEMPFILEBR,2); print TEMPFILEBR @myTextBR; flock(TEMPFILEBR,8); close(TEMPFILEBR); return "$myTfile#$cDate"; } #### 新規投稿 sub Post_new_msg{ my($theRoom,$PostTitle,$PostName,$PostComment,$PostRef,$PostURL)=@_; my($myTtitle)=pickUpRoomName($theRoom); my($cDate)=dateToString(); $PostComment=replaceToHTML($PostComment); $PostComment=replaceToBR($PostComment); $PostTitle=replaceToHTML($PostTitle); $PostName=replaceToHTML($PostName); $PostURL=replaceToHTML($PostURL); $PostRef=replaceToHTML($PostRef); $cDate=substr($cDate,2,12); my($cFileName)="BBS_MSG_$cDate.html"; my($CreDate)=dateToJPString(); my($ShortDate)=dateToJString(); # ページに書き込むデータを作成する my($myText)="$PostTitle\n"; $myText.="\n"; $myText.="会議室:「$myTtitle」

\n"; $myText.="

$PostTitle

\n"; $myText.="

発言者:$PostName

\n"; $myText.="$CreDate


\n"; $myText.="$PostComment"; if ($PostRef ne "" and $PostURL ne "http://" and $PostURL ne ""){ $myText.="\n

$PostRef
\n" } $myText.="


\n"; my($myBBSReacent)="$ShortDate 「$myTtitle」で $PostName さんが
\n

\n"; my($myReacentMessage)="$ShortDate $PostName さんが
\n

\n"; # 保存 $CountArray=0; $WResult=writeToFile("./$theRoom/$cFileName",$myText); open(TEMPFILERR, "<./$theRoom/ROOM_recent") || die "Error."; my(@myTextRR)=; close(TEMPFILERR); unshift(@myTextRR,$myReacentMessage); foreach (@myTextRR){ $CountArray++; } if ($CountArray > 80){ pop(@myTextRR);#40以上あれば古いものを消去 pop(@myTextRR); } open(TEMPFILERR, ">./$theRoom/ROOM_recent") || die "Error."; flock(TEMPFILERR,2); print TEMPFILERR @myTextRR; flock(TEMPFILERR,8); close(TEMPFILERR); open(TEMPFILEBR, "<$top_recent") || die "Error."; my(@myTextBR)=; close(TEMPFILEBR); unshift(@myTextBR,$myBBSReacent); $CountArray=0; foreach (@myTextBR){ $CountArray++; } if ($CountArray > 80){ pop(@myTextBR);#40以上あれば古いものを消去 pop(@myTextBR); } open(TEMPFILEBR, ">$top_recent") || die "Error."; flock(TEMPFILEBR,2); print TEMPFILEBR @myTextBR; flock(TEMPFILEBR,8); close(TEMPFILEBR); return $cFileName; } #### トップページへのアクセス sub BBS_top{ my($myText)=readFromFile("BBS_header"); $myText.="

以下の会議室が開催されています。

    "; #@farray=("room_2","R_room_3","room_1"); opendir( DIR, ".") or die "opendir $path失敗: $!\n"; while($entry =readdir DIR){ my($type)= -d "./$entry" ? "Dir" : "File"; if ($type eq "Dir" and $entry ne "." and $entry ne ".."){ #### 配列に読み込ませないでそのまま処理 #my($Title)=pickUpRoomName($entry); #my($msgNum)=countMsgNum($entry); #$myText.= "
  1. "; #$myText.= "$Title<\/a> (発言数:$msgNum)

    \n"; #### #### 配列に一度読み込んでソートしてから表示 push(@farray,$entry); } } @farray = sort @farray; foreach $value(@farray){ my($Title)=pickUpRoomName($value); my($msgNum)=countMsgNum($value); $myText.= "

  2. "; $myText.= "$Title<\/a> (発言数:$msgNum)

    \n"; } #### $myText.="

"; if (substr($top_recent,0,1) ne "_"){ $myText.="


"; } $myText.=readFromFile("BBS_footer"); return $myText } #### BBS 全体の Recent ページの表示 sub BBS_Recent{ my($myText)=readFromFile("BBS_header"); $myText.="

最近の発言状況です

\n"; $myText.=readFromFile("$top_recent"); $myText.="\n


"; $myText.=readFromFile("BBS_footer"); return $myText; } #### 各会議室の Recent ページの表示 sub ROOM_recent{ my($myTdir)=@_; my($myTtitle)=pickUpRoomName($myTdir); my($myText)=readFromFile("BBS_header"); $myText.="

最近の発言状況です

\n"; $myText.=readFromFile("./$myTdir/ROOM_recent"); $myText.="\n


"; return $myText; } #### 各会議室のトップページ sub ROOM_Top{ my($myTdir)=@_; my($CheckReadOnly)=substr($myTdir,0,2); # ヘッダとフッタの読み込み my($myHead)=readFromFile("./$myTdir/ROOM_header"); my($myFoot)=readFromFile("./$myTdir/ROOM_footer"); if ($CheckReadOnly eq "R_"){# リードオンリーの処理 # 登録されているメッセージの数を調べる my($myCount)=countMsgNum($myTdir); my($pickUpMessage)=pickAllMessages($myTdir,"RO"); my($TopDate)=dateToTPString(); my($myReturnString) = "$myHead

$TopDate

現在$myCountのメッセージが登録されています

"; $myReturnString.="*** この会議室はリードオンリーです ***

以下のメッセージが登録されています

$myFoot"; $myReturnString = replaceAll($myReturnString,"<\@R>",$myTdir); }else{ my($myCount)=countMsgNum($myTdir); my($pickUpMessage)=pickMessages($myTdir); my($TopDate)=dateToTPString(); if ($myCount == 0 ){ $myReturnString = "$myHead

$TopDate

現在$myCountのメッセージが登録されています

最近7日間に投稿/コメントされたものはありません

$myFoot"; }else{ $myReturnString = "$myHead

$TopDate

現在$myCountのメッセージが登録されています

最近7日間に投稿/コメントされたメッセージ:

$myFoot"; } $myReturnString = replaceAll($myReturnString,"<\@R>",$myTdir); } } #### 新規投稿ページ sub ROOM_new_page{ my($myTdir)=@_; my($myTtitle) = pickUpRoomName($myTdir); my($myReturnString) = readFromFile("post_base"); $myReturnString = replaceAll($myReturnString,"<\@RN>",$myTtitle); $myReturnString = replaceAll($myReturnString,"<\@R>",$myTdir); return $myReturnString; } #### 各ページ表示 sub show_page{ my($theRoom,$theFile)=@_; my($myTtitle)=pickUpRoomName($theRoom); my($myReturnString)=readFromFile("./$theRoom/$theFile"); $myReturnString.=readFromFile("coment_base"); $myReturnString.="\n


"; my($myFormTag)="
"; $myReturnString=replaceAll($myReturnString,"",$myFormTag); return $myReturnString; } #### 会議室メッセージの抽出(検索文字列を含むメッセージの抽出) sub pickSearch{ my($myTdir,$myKeyword)=@_; $myFIleCounter=0; my($myTtitle)=pickUpRoomName($myTdir); opendir( mDIR, $myTdir) or die "Error."; @files=readdir( mDIR ); closedir( mDIR ); my($myReturn)="\n"; chdir("./$myTdir"); foreach(@files){ my($myFileName)="$_"; if ("$_" =~ /.html/){ my($SearchTarget)=readFromFile($myFileName); if ($SearchTarget =~ /$eucpre\Q$myKeyword\E$eucpost/) { my($fileT)=pickUpFileTitle($myFileName); my($fileDate)=pickFileModDate($myFileName); $myReturn="$myReturn
  • $fileT
    ($fileDate)

    \n"; $myFIleCounter=$myFIleCounter+1; } } } $myReturn.="\n"; if ($myFIleCounter == 0){ $myReturn="False"; } return $myReturn; } #### 会議室メッセージの抽出(最近7日に更新されたメッセージの抽出) sub pickMessages{ my($myTdir)=@_; opendir( mDIR, $myTdir) or die "Error."; @files=readdir( mDIR ); closedir( mDIR ); my($myReturn)="\n"; chdir("./$myTdir"); foreach(@files){ my($myFileName)="$_"; if ("$_" =~ /.html/){ if((-M "$_") < 7){ my($fileT)=pickUpFileTitle($myFileName); my($fileDate)=pickFileModDate($myFileName); $myReturn="$myReturn

  • $fileT
    ($fileDate)

    \n"; } } } $myReturn.="


    "; return $myReturn; } #### 会議室メッセージの抽出(最近X日に更新されたメッセージの抽出) sub pickAfterMessages{ $myFIleCounter=0; my($myTdir,$myDay)=@_; opendir( mDIR, $myTdir) or die "Error."; @files=readdir( mDIR ); closedir( mDIR ); my($myReturn)=""; if ($myFIleCounter == 0){ $myReturn="False"; } return $myReturn; } #### 会議室メッセージの抽出(全てのメッセージ) sub pickAllMessages{ my($myTdir,$myFlag)=@_; $myFIleCounter=0; my($myTtitle)=pickUpRoomName($myTdir); opendir( mDIR, $myTdir) or die "Error."; @files=readdir( mDIR ); closedir( mDIR ); my($myReturn)="\n"; chdir("./$myTdir"); foreach(@files){ my($myFileName)="$_"; if ("$_" =~ /.html/){ my($fileT)=pickUpFileTitle($myFileName); my($fileDate)=pickFileModDate($myFileName); $myReturn="$myReturn
  • $fileT
    ($fileDate)

    \n"; $myFIleCounter=$myFIleCounter+1; } } $myReturn.="\n"; if ($myFIleCounter == 0){ $myReturn="False"; } if ($myFlag eq "RW"){ $myReturn.="


    "; }else{ } return $myReturn; } #### 検索処理 sub room_search{ my($theRoom,$Key)=@_; my($PickParam)="$`" if ($Key =~ /=/); if ($Key eq "ALL=ALL"){ #### すべてのメッセージのリスト my($myReturnString)=readFromFile("./$theRoom/ROOM_header"); my($myTst)=pickUpRoomName($theRoom); my($myCheckRes)=pickAllMessages($theRoom,"RW"); if (substr($myCheckRes,0,5) eq "False"){ $myReturnString .= "

    メッセージはありません

    \n"; $myReturnString.="


    "; }else{ $myReturnString .= "メッセージ一覧:

      \n"; $myReturnString .=$myCheckRes; } return $myReturnString; }elsif($PickParam eq "days"){ #### 最近のメッセージ my($PickDay)="$'" if ($Key =~ /=/); if ( $PickDay =~ /\D/ or $PickDay eq "") { # 数値判定 return "Error"; }else{ my($myReturnString)=readFromFile("./$theRoom/ROOM_header"); my($myTst)=pickUpRoomName($theRoom); my($myCheckRes)=pickAfterMessages($theRoom,$PickDay); if (substr($myCheckRes,0,5) eq "False"){ $myReturnString .="

      最近$PickDay日間に投稿/コメントされたメッセージはありません

      "; }else{ $myReturnString .= "最近$PickDay日間に投稿/コメントされたメッセージ一覧:

      "; $myReturnString .=$myCheckRes } $myReturnString .="


      "; return $myReturnString; } }elsif($PickParam eq "key"){ $mySearchKey=$query->param('key'); #### 文字列検索 my($myReturnString)=readFromFile("./$theRoom/ROOM_header"); my($myTst)=pickUpRoomName($theRoom); if ($mySearchKey eq ""){ return "Error"; }else{ my($myCheckRes)=pickSearch($theRoom,$mySearchKey); if (substr($myCheckRes,0,5) eq "False"){ $myReturnString .="

      キーワード " $mySearchKey " を含むメッセージはありません

      \n" }else{ $myReturnString .= "キーワード " $mySearchKey " を含むメッセージ一覧:

        \n"; $myReturnString .=$myCheckRes; } $myReturnString .="


        "; } }elsif($PickParam eq "xYEAR" or $PickParam eq "xStamp"){ #### 日付による絞り込み my($myReturnString)=readFromFile("./$theRoom/ROOM_header"); if ($PickParam eq "xYEAR"){ $PickParam1="$'" if ($Key =~ /xYEAR=/); $myYear="$`" if ($PickParam1 =~ /&xMONTH=/); $PickParam2="$'" if ($Key =~ /&xMONTH=/); $myMonth="$`" if ($PickParam2 =~ /&xDAY=/); $PickParam3="$'" if ($Key =~ /&xDAY=/); $myDay="$`" if ($PickParam3 =~ /&COND=/); $myHour=0; $myMin=0; $mySec=0; $myKey="$'" if ($Key =~ /&COND=/); }elsif($PickParam eq "xStamp"){ #### タイムスタンプ $PickParam1="$'" if ($Key =~ /xStamp=/); $myYear=substr($PickParam1,0,2); if ($myYear > 40 ){ $myYear = "19$myYear"; }else{ $myYear = "20$myYear"; } $myMonth=substr($PickParam1,2,2); $myDay=substr($PickParam1,4,2); $myHour=substr($PickParam1,6,2); $myMin=substr($PickParam1,8,2); $mySec=substr($PickParam1,10,2); $myKey=1; #### } $myFIleCounter=0; if ($myDay eq ""){ $myDay="01"; } if ($myMonth eq "" or $myYear =~ /\D/ or $myMonth =~ /\D/ or $myDay =~ /\D/ or $myDay > 30 or $myMonth > 12){ return "Error"; } if($myKey eq "1"){ $myKSt="以後"; }elsif($myKey eq "2"){ $myKSt="以前"; } # ファイルチェック my($myTtitle)=pickUpRoomName($theRoom); opendir( mDIR, $theRoom) or die "Error."; @files=readdir( mDIR ); closedir( mDIR ); my($myReturn)="\n"; chdir("./$theRoom"); foreach(@files){ my($myFileName)="$_"; if ("$_" =~ /.html/){ my($myCkeck)=date_Check((-M "$_"),$myYear,$myMonth,$myDay,$myHour,$myMin,$mySec); #my($myCkeck)=date_Check((-M "$_"),$myYear,$myMonth,$myDay,0,0,0); if($myKey eq "1"){ if($myCkeck eq "True"){ my($fileT)=pickUpFileTitle($myFileName); my($fileDate)=pickFileModDate($myFileName); $myReturn="$myReturn
      • $fileT
        ($fileDate)

        \n"; $myFIleCounter=$myFIleCounter+1; } }elsif($myKey eq "2"){ if($myCkeck eq "False"){ my($fileT)=pickUpFileTitle($myFileName); my($fileDate)=pickFileModDate($myFileName); $myReturn="$myReturn

      • $fileT
        ($fileDate)

        \n"; $myFIleCounter=$myFIleCounter+1; } } } } $myReturn.="\n

      "; $myEndReturn="

      "; $myD_to_Week=dayToWeek($myYear,$myMonth,$myDay); if (length($myHour)==1){ $myHour="0$myHour"} if (length($myMin)==1){ $myMin="0$myMin"} if (length($mySec)==1){ $mySec="0$mySec"} if ($myFIleCounter == 0){ return "$myReturnString

      $myYear年 $myMonth月 $myDay日 $myD_to_Week曜日 $myHour:$myMin:$mySec $myKStに投稿/コメントされたページはありません


      $myEndReturn"; }else{ return "$myReturnString $myYear年 $myMonth月 $myDay日 $myD_to_Week曜日 $myHour:$myMin:$mySec $myKStに投稿/コメントされたページ一覧:

        $myReturn
        $myEndReturn"; } } } #### ファイルタイトルのピックアップ sub pickTitle{ my($myTdir)=@_; my($myFile)=readFromFile($myTdir); my($myTitle)= "$'" if ($myFile =~ //); $myTitle = "$`" if ($myTitle =~ /<\/TITLE>/); return "$myTitle"; } #### 会議室タイトルのピックアップ sub pickUpRoomName{ my($myTdir)=@_; my($myFile)=readFromFile("./$myTdir/ROOM_header"); my($myTitle)= "$'" if ($myFile =~ /<TITLE>/); $myTitle = "$`" if ($myTitle =~ /<\/TITLE>/); return "$myTitle"; } #### HTMLタイトルとコメント数のピックアップ sub pickUpFileTitle{ my($myFile)=@_; my($myTitle)=readFromFile("$myFile"); my($SearchT)=$myTitle; $myTitle= "$'" if ($myTitle =~ /<TITLE>/); $myTitle = "$`" if ($myTitle =~ /<\/TITLE>/); my($Searchings)="a name"; $count=0; while (grep /$Searchings/g,$SearchT) { $count++; } if (length($count)==1){ $count="0$count"; } return "$myTitle</a></B><TT> \[$count\]</TT>"; } #### 会議室メッセージ数のカウント sub countMsgNum{ my($myTdir)=@_; opendir( mDIR, $myTdir) or die "Error."; @files=readdir( mDIR ); closedir( mDIR ); my($myCounter)=0; foreach(@files){ if ("$_" =~ /.html/){ $myCounter=$myCounter+1; } } return $myCounter; } ################################## ライブラリ ################################ #### 日付比較 sub date_Check{ my($ModSec,$reqYear,$reqMonth,$reqDay,$reqHour,$reqMin,$reqSec)=@_; $ModSec=$ModSec * 86400; ($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime(time()); $time = &timelocal($sec,$min,$hour,$mday,$mon,$year); ($sec, $min, $hour, $mday, $mon, $year) = localtime($time-$ModSec); $time0 = timelocal($sec,$min,$hour,$mday,$mon,$year+1900);#現在日から更新経過秒を引いたもの $time1 = timelocal($reqSec,$reqMin,$reqHour,$reqDay,$reqMonth-1,$reqYear);#要求のあった日付 $diff = $time0 - $time1; $minusDate=("%d %d %d %d",$diff/(24*60*60)); if($minusDate > 0){ return "True"; }else{ return "False"; } } #### ファイル更新日 sub pickFileModDate{ my($myTFile)=@_; @stat= stat $myTFile; return scalar localtime($stat[9]); } #### ファイル書き込み(writeToFile("ファイル名")) sub writeToFile{ my($myTFile,$myString)=@_; open(TEMPFILE, ">$myTFile") || die "Error."; flock(TEMPFILE,2); print TEMPFILE $myString; flock(TEMPFILE,8); close(TEMPFILE); return "true"; } #### ファイル追記書き込み(writeAddFile("ファイル名")) sub writeAddFile{ my($myTFile,$myString)=@_; open(TEMPFILE, ">>$myTFile") || die "Error."; flock(TEMPFILE,2); print TEMPFILE $myString; flock(TEMPFILE,8); close(TEMPFILE); return "true"; } #### ファイル読み込み(readFromFile("ファイル名")) sub readFromFile{ my($myTFile)=@_; open(TEMPFILE, "<$myTFile") || die "Error."; my(@myTextStream)=<TEMPFILE>; close(TEMPFILE); my($myTemplate)=""; foreach $value(@myTextStream){ $myTemplate="$myTemplate$value"; } return $myTemplate; } #### 日付文字列取得ルーチン(例:20010629112905) sub dateToString{ ($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime(time()); $mon=$mon+1; if (length($mon)==1){ $mon="0$mon"} if (length($mday)==1){ $mday="0$mday"} if (length($hour)==1){ $hour="0$hour"} if (length($min)==1){ $min="0$min"} if (length($sec)==1){ $sec="0$sec"} $year=$year+1900; return "$year$mon$mday$hour$min$sec"; } #### 日付文字列取得ルーチン(例:( Date: 2001年 08月 09日 木曜日 17:35:30)) sub dateToJPString{ ($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime(time()); $mon=$mon+1; if (length($mon)==1){ $mon="0$mon"} if (length($mday)==1){ $mday="0$mday"} if (length($hour)==1){ $hour="0$hour"} if (length($min)==1){ $min="0$min"} if (length($sec)==1){ $sec="0$sec"} $year=$year+1900; $dayofWeek=("日","月","火","水","木","金","土")[$wday]; return "( Date: $year年 $mon月 $mday日 $dayofWeek曜日 $hour:$min:$sec)"; } #### 日付文字列取得ルーチン(2001年 8月 9日 木曜日 11:24:42) sub dateToTPString{ ($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime(time()); $mon=$mon+1; if (length($hour)==1){ $hour="0$hour"} if (length($min)==1){ $min="0$min"} if (length($sec)==1){ $sec="0$sec"} $year=$year+1900; $dayofWeek=("日","月","火","水","木","金","土")[$wday]; return "$year年 $mon月 $mday日 $dayofWeek曜日 $hour:$min:$sec"; } #### 日付文字列取得ルーチン(例:08/09 15:42) sub dateToJString{ ($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime(time()); $mon=$mon+1; if (length($mon)==1){ $mon="0$mon"} if (length($mday)==1){ $mday="0$mday"} if (length($hour)==1){ $hour="0$hour"} if (length($min)==1){ $min="0$min"} return "$mon/$mday $hour:$min"; } #### 文字列置換ルーチン sub replaceAll{ my($myString,$mySearchString,$myReplaceString)=@_; $myString=~s/$mySearchString/$myReplaceString/g; return $myString; } #### 拡張子抽出ルーチン sub getEx{ my($fileName)=@_; $sileEx="$'" if ($fileName=~/\./); return $sileEx; } #### HTML実体参照文字変換ルーチン sub replaceToHTML{ my($myString)=@_; $myString=~s/\</</g; $myString=~s/\>/>/g; $myString=~s/\"/"/g; return $myString; } #### 改行-><br>変換 sub replaceToBR{ my($myString)=@_; my($myReturn)=chr(13); my($myLReturn)=chr(10); $myString=~s/$myReturn$myLReturn/$myReturn/g; $myString=~s/$myLReturn/$myReturn/g; $myString=~s/$myReturn/\<br\>/g; return $myString; } #### 改行削除 sub deleteCR{ my($myString)=@_; my($myReturn)=chr(13); $myString=~s/\n//g; $myString=~s/\"//g; $myString=~s/$myReturn//g; $myString=~s/\t//g; return $myString; } #### タブ削除 sub deleteTAB{ my($myString)=@_; $myString=~s/\"//g; $myString=~s/\t//g; return $myString; } #### 曜日抽出 sub dayToWeek{ my($y,$m,$d)=@_; if ($m < 3) {--$y; $m+=12;} $w=($y+int($y/4)-int($y/100)+int($y/400)+int((13*$m+8)/5)+$d)%7; my(@wday_array) = ('日','月','火','水','木','金','土'); return @wday_array[$w]; } #### ファイル更新日をRFC1123スタイルで返す sub pickFileModGMT{ my($myTFile)=@_; @stat= stat $myTFile; return get_times_1123(($stat[9])); } #### RFC1123スタイルの日付を返す(get_times_1123(time);) sub get_times_1123 { local $_ = shift; @monthList=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); @_ = gmtime $_; return ( sprintf("%s, %02d $monthList[$_[4]] %04d %02d:%02d:%02d GMT", (qw(Sun Mon Tue Wed Thu Fri Sat))[$_[6]], $_[3], $_[5]+1900, $_[2], $_[1], $_[0]) ); } #### RFC1123 or 850を文字列変換 sub getDateString{ my($theDate)=@_; $theDate = replaceAll($theDate,"-"," "); $theDate = $' if ($theDate=~ /, /); $theDate = $` if ($theDate=~ / GMT/); @theDateStr=split(/\s+/,$theDate); $theMonth=$theDateStr[1]; $theMonth=monthToStr($theMonth); $theDay=$theDateStr[0]; if (length($theDay)==1){ $theDay="0$theDay"; } #$theDayStr="$theDateStr[2]$theMonth$theDay$theDateStr[3]"; $theDayStr= replaceAll("$theDateStr[2]$theMonth$theDay$theDateStr[3]",":",""); return $theDayStr; } #### 月を数字変換 sub monthToStr{ my($myM)=@_; @monthList=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); for($i = 0;$i < @monthList; $i++){ if($myM eq $monthList[$i]){ $mNum=$i; last; } } $mNum=$mNum+1; if (length($mNum)==1){ $mNum="0$mNum"; } return $mNum; }