require './jacode.pl';
#------------------------------------------
$ver="Child Search v8.92";# (ツリー式掲示板)
#------------------------------------------
# Copyright(C) りゅういち
# E-Mail:ryu@cj-c.com
# W W W :http://www.cj-c.com/
#------------------------------------------
#---[設定ファイル]-------------------------
# 同じようにいくつでも増やせます。
# [ ]内の数字を使いCGIにアクセスするとその設定ファイルで動作します。
# $set[12] の設定ファイルを使う場合: http://www.---.com/cgi-bin/srch.cgi?no=12
$set[0]="./set.cgi";
$set[1]="./set1.cgi";
$set[2]="./set2.cgi";
$set[3]="./set3.cgi";
$set[4]="./set4.cgi";
$set[5]="./set5.cgi";
$set[6]="./set6.cgi";
# ---[設定ここまで]--------------------------------------------------------------------------------------------------
&d_code_;
if($no eq ""){$no=0;}
if($set[$no]){unless(-e $set[$no]){&er_('設定ファイルが無いです!');}else{$SetUpFile="$set[$no]"; require"$SetUpFile";}}
else{&er_('設定ファイルがCGIに設定されてません!');}
# ---[フォームスタイルシート設定等]----------------------------------------------------------------------------------
$ag=$ENV{'HTTP_USER_AGENT'};
if($fss && $ag =~ /IE|Netscape6/){
$fm=" onmouseover=\"this.style.$on\" onmouseout=\"this.style.$off\"";
$ff=" onFocus=\"this.style.$on\" onBlur=\"this.style.$off\"";
$fsi="$fst";
}
if($logs){unless(($logs eq "$log" || $logs=~ /^[\d]+\.txt$/ || $logs eq "all")){&er_("そのファイルは閲覧できません!");}}
$nf="\n";
$SL="$klog_d\/1.txt";
# ---[簡易パスワード制限関連]----------------------------------------------------------------------------------------
if($s_ret){$P=$FORM{"P"}; $pf="\n"; $pp="&P=$P";}else{$pf=""; $pp="";}
if($s_ret && $P eq ""){&er_("認証してください!");}
if($P ne "R"){if($s_ret && $P ne "$s_pas"){&er_("パスワードが違います!");}}
if($s_ret==2 && $P eq "R"){&er_("パスワードが違います!");}
# ---[サブルーチンの読み込み/表示確定]-------------------------------------------------------------------------------
if($mode eq "log"){&log_;}
if($mode eq "del"){&del_;}
if($mode eq "dl"){&dl_;}
&srch_;
exit;
#--------------------------------------------------------------------------------------------------------------------
# [フォームコード]
# -> フォーム入力内容を解釈する(d_code_)
#
sub d_code_ {
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,'sjis');
$value =~ s/&/&\;/g;
$value =~ s/\<\;/g;
$value =~ s/>/\>\;/g;
$value =~ s/\"/\"\;/g;
$value =~ s/<>/\<\;\>\;/g;
$value =~ s///g;
$FORM{$name} = $value;
if ($name eq 'del') { push(@d_,$value); }
}
$word= $FORM{'word'};
$andor=$FORM{'andor'};
$mode= $FORM{'mode'};
$logs =$FORM{'logs'};
$no =$FORM{'no'};
}
#--------------------------------------------------------------------------------------------------------------------
# [ヘッダ表示]
# -> HTMLヘッダを出力する(hed_)
#
sub hed_ {
print "Content-type: text/html; charset=Shift_JIS\n\n";
print <<"_HTML_";
$STYLE
$fsi
$title [$_[0]]
_HTML_
print"\n";}elsif($back eq ""){print">\n";}
print <<"_HTML_";
_HTML_
if($t_img){print"\n";}
else{print"$title\n";}
$BG=" bgcolor=$t_back";
if($mode eq "log"){$T1="$BG";}else{$T2="$BG";}
if($klog_s){$klog_link="過去ログ | \n";}
if($M_Rank){$rank_link="発言ランク | \n";}
if($topok){$New_link="新規作成 | \n";}
if($TrON){$TrL="ツリー表\示 | \n";}
if($TpON){$TpL="トピック表\示 | \n";}
if($ThON){$ThL="スレッド表\示 | \n";}
if($i_mode){$FiL="ファイル一覧 | \n";}
$HEDF= <<"_HTML_";
_HTML_
print"$HEDF";
}
#--------------------------------------------------------------------------------------------------------------------
# [フッタ表示]
# -> HTMLフッタを出力する(foot_)
#
sub foot_ {
print <<"_HTML_";
$HEDF
- Child Tree -
_HTML_
exit;
}
#--------------------------------------------------------------------------------------------------------------------
# [検索機能&表示]
# -> 検索フォームの表示と、検索結果の表示をおこなう(srch_)
#
sub srch_ {
if($FORM{"PAGE"}){$klog_h=$FORM{"PAGE"};}else{$klog_h=$klog_h[0];}
if($logs && $logs=~ /txt$/){
$logn=$logs; $C="";
$logn=~ s/\.//g; $logn=~ s/txt//; $logn=~ s/\///g;
$nowlog="
過去ログ$logn を検索
";
}elsif($logs && $logs eq "$log"){$nowlog="
現在のログを検索
";
}elsif($logs && $logs eq "all"){$nowlog="
全過去ログを検索
";}
if($FORM{"ALL"}){$nowlog="
No.$word の関連記事表\示
"; $KNS=" checked";}
&hed_("Search:$word");
if($klog_s){$klog_msg="(*過去ログは表\示されません)
・過去ログから探す場合は検索範囲から過去ログを選択。";}
if($andor eq "or"){$OC=" selected";}else{$OC="";}
print <<"_STOP_";
・キーワードを複数指定する場合は 半角スペース で区切ってください。
・検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
・[返信]をクリックすると返信ページへ移動します。
$klog_msg
|
$nowlog
_SS_
if($word ne "") {
$word =~ s/ / /g;
$word =~ s/\t/ /g;
@key_ws= split(/ /,$word);
if($logs eq "all"){
$Stert=0; if($FORM{'N'}){($N,$S)=split(/\,/,$FORM{'N'}); $Stert=$N;} $End=$n-1;
if($klog_a==0){&er_("全過去ログ検索は使用不可");}}
else{$Stert=0; $End=0;}
@new=(); $Next=0;
foreach ($Stert..$End) {
if($logs eq "all"){$I=$_+1; $IT="$I\.txt"; $Log="$klog_d\/$IT";}
elsif($logs eq $log){$Log=$log;}
else{$Log="$klog_d\/$logn\.txt";}
open(DB,$Log) || &er_("Can't open $Log");
while ($Line=) {
$hit = 0;
if($FORM{"ALL"}){
($nam,$date,$name,$email,$d_may,$comment,
$url,$font,$ico,$type,$del,$ip) = split(/<>/,$Line);
if($word==$nam || $word==$type){$hit=1;}
}else{
foreach $key_w (@key_ws){
if($key_w =~ /[\x80-\xff]/){$jflag = 1;}else{$jflag = 0;}
$key_w=~ s/^&$/&\;/g;
$key_w=~ s/^<$/\<\;/g;
$key_w=~ s/^>$/\>\;/g;
$key_w=~ s/^\"$/\"\;/g;
if ($jflag) {
if(index($Line, $key_w) >= 0){$hit=1;}else{$hit=0;}
} else {
if($BM){if($Line =~ /$key_w/i){$hit=1;}else{$hit=0;}}
else{if($Line =~ /$key_w/){$hit=1;}else{$hit=0;}}
}
if($hit){if($andor eq "or"){last;}}else{if($andor eq "and"){$hit=0; last;}}
}
}
if($hit){push(@new,"$IT<>$Line");}
if($#new+1 >= 200 && $logs eq "all"){$Next=$I+1;}
}
close(DB);
if($Next){last;}
}
}
$count=@new;
if($logs eq "$log"){@new=reverse(@new);}
if($count > 0){
$word=~ s/([^0-9A-Za-z_])/"%".unpack("H2",$1)/ge;
$word=~ tr/ /+/;
$total=@new;
$page_=int(($total-1)/$klog_h);
if($FORM{'page'} eq ""){$page=0;}else{$page=$FORM{'page'};}
$end_data=@new-1;
$page_end=$page+($klog_h-1);
if($page_end >= $end_data){$page_end=$end_data;}
$Pg=$page+1; $Pg2=$page_end+1;
print"ヒット / $count件 ($Pg-$Pg2 を表\示)";
if($Next || $N){
$NLog="
ヒット件数が多いので";
if($N){$N++; $NLog.="過去ログ$N";}else{$NLog.="過去ログ1";}
$NLog.="〜$I までの検索結果 / ";
$NLog.="";
$NLog.="過去ログ$Nextからさらに検索→\n";
}
print"$NLog
\n";
$nl=$page_end + 1;
$bl=$page - $klog_h;
if($bl >= 0){
$Bl ="";
$Ble="";
}
if($page_end ne $end_data){
$Nl ="";
$Nle="";
}
$Plink="$Bl\<\;\<\;$Ble\n";
$a=0;
for($i=0;$i<=$page_;$i++){
$af=$page/$klog_h;
if($i != 0){$Plink.="| ";}
if($i eq $af){$Plink.="$i\n";}
else{
$Plink.="$i\n";
}
$a+=$klog_h;
}
$Plink.="$Nl\>\;\>\;$Nle\n";
print <<"_KT_";
$Plink
パスワード/
_KF_
}elsif($count == 0 && $word){print"該当する記事はありませんでした。";}
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [過去ログリンク表示]
# -> 過去ログを表示するリンク表示(log_)
#
sub log_ {
&hed_("Past Log");
if($logs){
$logn=$logs;
$logn=~ s/\.//; $logn=~ s/txt//; $logn=~ s/\///;
$nowlog="過去ログ$logn を表\示
";
}
if($FORM{"KLOG_H"}){$klog_h[0]=$FORM{"KLOG_H"};}
print <<"_LTOP_";
過去ログ表\示 |
- 過去ログの検索は 検索 より行えます。
- 過去ログの表\示はトピック表\示となります。
|
表\示ログ |
_LTOP_
if(-e $SL){
open(NO,"$klog_c");
$n = ;
close(NO);
$br=0;
for ($i=1;$i<=$n;$i++) {
print"過去ログ$i\n";
$br++; if($br==5){print" ";$br=0;}
}
}else{print"現在表\示できる過去ログはありません。\n";}
print" |
---|
";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [過去ログ削除]
# -> 過去ログ内のいらない記事を削除(del_)
#
sub del_ {
if($FORM{'pas'} ne "$pass"){ &er_("パスワードが違います!"); }
if($logs eq $log){&er_("現在ログは$cgi_f管理モードより削除下さい。");}
$logs="$klog_d/$logs";
open(DB,"$logs") || &er_("Can't open $logs");
@mens = ;
close(DB);
@CAS = ();
foreach $mens (@mens) {
$castam=0;
$mens =~ s/\n//g;
($nam,$date,$name,$email,$d_may,$comment,$url,
$sp,$e,$type,$del,$ip) = split(/<>/,$mens);
foreach $word (@d_) {if($word eq "$nam"){$mens=""; $castam=1;}}
if($mens eq ""){ $n=""; }else{ $n="\n"; }
push (@CAS,"$mens$n");
}
open (DB,">$logs");
print DB @CAS;
close(DB);
&log_;
}
#--------------------------------------------------------------------------------------------------------------------
# [URLをリンク等]
# -> コメント内、リンク・文字色など処理(auto_)
#
sub auto_ {
if($_[0]=~/<\/pre>/){$_[0]=~ s/(>|\n)((>|>|>)[^\n]*)/$1$2<\/font>/g;}
else{$_[0]=~ s/>((>|>|>)[^<]*)/>$1<\/font>/g;}
$_[0]=~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1$2<\/a>/g;
$_[0]=~ s/([^\w^\.^\~^\-^\/^\?^\&^\+^\=^\:^\%^\;^\#^\,^\|]+)(No|NO|no|No.|NO.|no.|>>|>>|>>)([0-9\,\-]+)/$1$2$3<\/a>/g;
}
#--------------------------------------------------------------------------------------------------------------------
# [エラー表示]
# -> エラーの内容を表示する(er_)
#
sub er_ {
&hed_("Error");
print "ERROR - $_[0]
\n";
&foot_;
}