#! /usr/bin/perl #-------------------------------------------------------------------------------+ # Name : HiLink # Ver. : Ver 1.02 # Func : スキン対応リンク管理 # File : hilink.cgi # Copyright(C) 2003 Hisashi All Rights Reserved. # 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 # <更新履歴> # -Date- -Version- -Comment- # 2003.03.20 1.02 自動バックアップ時の不具合修正 # 2003.03.19 1.01 カテゴリ名変更時にデータ内のカテゴリ変更を行う修正 # 管理画面でデータ削除後のページ表示不正を修正 # データ削除時にカテゴリファイルを集計する処理追加 # 2003.03.13 1.00 公開 # 2003.03.07 0.00 新規作成 #-------------------------------------------------------------------------------+ require "./jcode.pl" ; require "./hilib.pl" ; require "./config.cgi" ; use File::Copy; #-------------------------------------------------------------------------------+ # バージョン $ver = "1.02"; #******************************************************************************** # メイン #******************************************************************************** &decode(); # デコード処理 $mode = $FORM{'mode'}; # 動作モード # バックアップ実行 if( $bkupflg ){ &bkup; } if( $mode eq "new" ){ &new; } # 新規登録画面表示 if( $mode eq "write" ){ &write; } # データ書き込み if( $mode eq "jump" ){ &jump; } # ページ移動 if( $mode eq "master" ){ &master; } # 管理画面 if( $mode eq "cate" ){ &cate; } # カテゴリ編集画面 if( $mode eq "cateedit" ){ $pass = $FORM{'pass'}; # 管理パスワード if( $pass ne $password ){ &errhtml("管理パスワードが違います。"); } $edit_cate = $FORM{'cate'}; # 編集カテゴリ名 $new_cate = $FORM{'new_cate'}; # 新カテゴリ名 &cateedit($edit_cate, $new_cate); # カテゴリ編集 &disp_page("$script?mode=cate&pass=$pass"); } if( $mode eq "catedel" ){ $pass = $FORM{'pass'}; # 管理パスワード if( $pass ne $password ){ &errhtml("管理パスワードが違います。"); } $del_cate = $FORM{'cate'}; # 削除カテゴリ名 &catedel($del_cate); # カテゴリ削除 &disp_page("$script?mode=cate&pass=$pass"); } if( $mode eq "cateadd" ){ $pass = $FORM{'pass'}; # 管理パスワード if( $pass ne $password ){ &errhtml("管理パスワードが違います。"); } $add_cate = $FORM{'cate'}; # 追加カテゴリ名 &cateadd($add_cate, 0); # カテゴリ追加 &disp_page("$script?mode=cate&pass=$pass"); } if( $mode eq "delete" ){ &delete; } # データ削除 if( $mode eq "edit" ){ &edit; } # データ編集 if( $mode eq "editwrite" ){ $act = "edit"; &write; # 編集データ書き込み } &main; # メイン画面 &ended(); #******************************************************************************** #* メイン画面表示処理 #******************************************************************************** sub main{ #------ パラメータ設定 ------------------------------------------------------------------ $pageno = $FORM{'pageno'}; # ページ番号 $pagemsg = $FORM{'pagemsg'}; # 1ページ表示データ数 $disp = $FORM{'disp'}; # 表示種別 $cate = $FORM{'cate'}; # 表示カテゴリ $rank = $FORM{'rank'}; # ランキング表示ON/OFF # ページ番号が設定されていない場合は1にする if( $pageno eq "" ){ $pageno = 1;} if( $pagemsg eq "" ){ # Cookie取得 &get_cookie; } # 1ページ表示データ数が設定されていない場合は10にする if( $pagemsg eq "" ){ $pagemsg = 10;} # Cookie保存 &set_cookie; #------ ファイルオープン ---------------------------------------------------------------- # データファイルオープン open(IN, $dataf); @filedata = ; close(IN); # カテゴリファイルオープン open(IN, $catef); @catedata = ; close(IN); # スキンファイルオープン if( $disp eq "simple" ){ open( IN, $simp_skin ) || &errend("ファイルがオープンできません( $simp_skin )", __FILE__, __LINE__); }else{ open( IN, $main_skin ) || &errend("ファイルがオープンできません( $main_skin )", __FILE__, __LINE__); } $skinhtml = join('', ); close(IN); # ここでスキンファイルのヘッダ部、データ部、フッタ部に分ける ($headhtml, $datahtml, $foothtml) = split(/$data_id/, $skinhtml); #------ 表示データ作成 ------------------------------------------------------------------ $catenum = @catedata; $sitenum = @filedata; push(@option, "\n"); foreach(@catedata){ ($wno, $wcate, $wcatenum, $dmy) = split(/<>/, $_); if( $wcate eq $cate ){ push(@option, "\n"); }else{ push(@option, "\n"); } } # カテゴリ指定があれば、そのカテゴリのデータを抽出 if( $cate ne "" ){ foreach(@filedata){ ($no,$master,$mail,$title,$url,$bnurl,$category,$other) = split(/<>/, $_); if( $category eq $cate ){ push(@filedata2, $_); } } }else{ @filedata2 = @filedata; } # ランキング表示の場合、ソートする if( $rank eq "on" ){ for( $i = 0; $i < @filedata2 -1; $i ++){ for( $j = $i + 1; $j < @filedata2; $j ++){ ($ino,$imaster,$imail,$ititle,$iurl,$ibnurl,$icategory,$icomment,$iclicknum,$other) = split(/<>/, $filedata2[$i]); ($jno,$jmaster,$jmail,$jtitle,$jurl,$jbnurl,$jcategory,$jcomment,$jclicknum,$other) = split(/<>/, $filedata2[$j]); if( $iclicknum < $jclicknum ){ $tmp = $filedata2[$i]; $filedata2[$i] = $filedata2[$j]; $filedata2[$j] = $tmp; } } } $msg = "+---+ クリックランキング +---+"; }else{ $msg = "+---+ 株式会社CAN 相互リンクサイト +---+"; } if( @filedata2 != 0 ){ $stano = ($pageno-1)*$pagemsg; $endno = $stano + $pagemsg; $total = @filedata2; if( $endno > $total ){ $endno = $total; } # 1ページに表示する記事データの抜き出し $datacnt = 0; foreach(@filedata2){ ($no,$other) = split(/<>/, $_); if( $datacnt >= $stano ){ if( $datacnt >= $endno ){ last; } push(@finddata, $_); } $datacnt = $datacnt + 1; } $num = $stano + 1; foreach(@finddata){ ($no,$master,$mail,$title,$url,$bnurl,$category,$comment,$clicknum,$editpass,$date,$dmy) = split(/<>/, $_); $html = $datahtml; $banner = "No.$no
"; if( $mail ne "" ){ $master = "$master"; } if( $disp eq "simple" ){ $title = "$title"; } $url = "$url"; if( $rank eq "on" ){ $html = "第$num位
$html"; $num ++; } # URLを自動リンクさせる if( $autolink ){ $comment =~ s/(s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/$1<\/a>/ig; } if( $disp eq "simple" ){ $date = "[No.$no]\t$date"; } &edithtml($html); push(@data, $html); } }else{ $datahtml = "現在、登録データはありません。"; } #------ ページ移動部分作成 -------------------------------------------------------------- $stapage = $stano + 1; $endpage = sprintf("%d",$total/$pagemsg); if( $total%$pagemsg != 0 ){ $endpage ++; } # 2ページ以上でなければ表示しない if( $endpage > 1 ){ # prev部分 if( $pageno > 1 ){ $pagepre = $pageno - 1; $pagemove = "prev |"; }else{ $pagemove = "prev |"; } # page部分 for( $i = 1; $i <= $endpage; $i++ ){ if( $i eq $pageno ){ $pagemove .= " $i |"; }else{ $pagemove .= " $i |"; } } # next部分 $pagenxt = $pageno + 1; if( $pagenxt > $endpage ){ $pagemove .= " next\n"; }else{ $pagemove .= " next"; } }else{ $pagemove = ""; } #------ 後処理 -------------------------------------------------------------------------- # ヘッダ部編集 &edithtml($headhtml); # フッタ部編集 &edithtml($foothtml); print "Content-type: text/html\n\n"; print <<"_HTML_"; $headhtml @data $foothtml _HTML_ exit; }# main END #******************************************************************************** #* 新規登録画面表示処理 #******************************************************************************** sub new{ $pass = $FORM{'pass'}; # 管理パスワード # 管理者のみ書き込み可? if( $writeflg ){ # パスワードが設定されているか if( $pass eq "" ){ &enter; } # パスワードチェック if( $pass ne $password ){ &errhtml("管理パスワードが違います。"); } } open(IN, $catef); @catedata = ; close(IN); if( @catedata != 0 ){ foreach(@catedata){ ($no, $cate, $other) = split(/<>/, $_); push(@option, ""); } }else{ push(option, ""); } print "Content-type: text/html\n\n"; open( IN, $new_skin ) || &errend("ファイルがオープンできません( $new_skin )", __FILE__, __LINE__); $skinhtml = join('', ); close(IN); &edithtml($skinhtml); print <<"_HTML_"; $skinhtml _HTML_ exit; }# new END #******************************************************************************** #* データ書き込み処理 #******************************************************************************** sub write{ #------ パラメータ設定 ------------------------------------------------------------------ $master = $FORM{'master'}; # 管理人名 $mail = $FORM{'mail'}; # メールアドレス $title = $FORM{'title'}; # サイトタイトル $url = $FORM{'url'}; # サイトURL $bnurl = $FORM{'bnurl'}; # バナーURL $category = $FORM{'category'}; # カテゴリ $category2 = $FORM{'category2'}; # カテゴリ2 $comment = $FORM{'comment'}; # コメント $editpass = $FORM{'editpass'}; # 編集パスワード $no = $FORM{'no'}; # 編集データ番号 #------ 入力項目チェック ---------------------------------------------------------------- if( $master eq "" ){ &errhtml("管理人名が入力されていません。");} if( $title eq "" ){ &errhtml("題名が入力されていません。");} if( $url eq "" ){ &errhtml("サイトURLが入力されていません。");} if( $category eq "" and $category2 eq "" ){ &errhtml("カテゴリが入力されていません。");} if( $editpass eq "" ){ &errhtml("編集パスワードが入力されていません。");} if( $comment eq "" ){ &errhtml("コメントが入力されていません。");} #------ 編集 ---------------------------------------------------------------------------- # コメント変換 $comment =~ s/\r\n/
/g; $comment =~ s/\r/
/g; $comment =~ s/\n/
/g; # バナーが設定されていなければバナーなし用画像を設定 if( $bnurl eq "" or $bnurl eq "http://" ){ $bnurl = $nobanner; } if( $category2 ne "" ){ $category = $category2; } #------ ファイルオープン ---------------------------------------------------------------- # データファイルオープン open(IN, $dataf); @filedata = ; close(IN); # カテゴリファイルオープン open(IN, $catef); @catedata = ; close(IN); #------ 書き込みデータ作成 -------------------------------------------------------------- &gettime; # 日付取得 $clicknum = 0; if( $act eq "" ){ ($wno, $other) = split(/<>/, $filedata[0]); $no = $wno + 1; } # 2重書き込み禁止処理 ($wno,$wmaster,$wmail,$wtitle,$wurl,$wbnurl,$wcategory,$wcomment,$wclicknum,$weditpass,$wdate,$dmy) = split(/<>/, $filedata[0]); if( $comment eq $wcomment and $title eq $wtitle and $master eq $wmaster ){ &disp_page($script); } # 書き込みデータ作成 $str = "$no<>$master<>$mail<>$title<>$url<>$bnurl<>$category<>$comment<>$clicknum<>$editpass<>$date<>\n"; if( $act eq "" ){ unshift(@filedata, $str); }else{ # 編集処理なら該当データを置き換える @tmp = @filedata; undef(@filedata); foreach(@tmp){ ($wno, $other) = split(/<>/, $_); if( $wno eq $no ){ push(@filedata, $str); }else{ push(@filedata, $_); } } } #------ ファイル書き込み ---------------------------------------------------------------- # ファイルロック &lock("${dataf}loc"); # データ書き込み open(OUT, ">$dataf"); print OUT @filedata; close(OUT); # ファイルロック解除 &unlock("${dataf}loc"); if( $category2 ne "" ){ &cateadd($category2, 1); }else{ foreach(@catedata){ ($wno, $wcate, $wcatenum, $dmy) = split(/<>/, $_); if( $wcate eq $category ){ $wcatenum ++; push(@new_catedata, "$wno<>$wcate<>$wcatenum<>\n"); }else{ push(@new_catedata, $_); } } # ファイルロック &lock("${catef}loc"); # データ書き込み open(OUT, ">$catef"); print OUT @new_catedata; close(OUT); # ファイルロック解除 &unlock("${catef}loc"); } # データ編集時はカテゴリファイルを再編成する if( $act eq "edit" ){ &make_catef; } #------ 後処理 -------------------------------------------------------------------------- &set_cookie; &disp_page($script); exit; }# write END #******************************************************************************** #* ページ移動処理 #******************************************************************************** sub jump{ #------ パラメータ設定 ------------------------------------------------------------------ $no = $FORM{'no'}; # 移動先データ番号 #------ ファイルオープン ---------------------------------------------------------------- open(IN, $dataf); @filedata = ; close(IN); #------ データ取得 ---------------------------------------------------------------------- foreach(@filedata){ ($wno,$wmaster,$wmail,$wtitle,$wurl,$wbnurl,$wcategory,$wcomment,$wclicknum,$weditpass,$wdate,$dmy) = split(/<>/, $_); if( $wno eq $no ){ $wclicknum ++; $jump = $wurl; push(@data, "$wno<>$wmaster<>$wmail<>$wtitle<>$wurl<>$wbnurl<>$wcategory<>$wcomment<>$wclicknum<>$weditpass<>$wdate<>\n"); }else{ push(@data, $_); } } #------ データ書き込み ------------------------------------------------------------------ open(OUT, ">$dataf"); print OUT @data; close(OUT); #------ ページ移動 ---------------------------------------------------------------------- &disp_page($jump); exit; }# jump END #******************************************************************************** #* カテゴリ編集処理 #******************************************************************************** sub cateedit{ local($edit_cate, $new_cate) = @_; if( $edit_cate eq "" ){ &errhtml("変更するカテゴリ名を選択してください。"); }elsif( $new_cate eq "" ){ &errhtml("新しいカテゴリ名を入力してください。"); } # カテゴリファイルオープン open(IN, $catef); @catedata = ; close(IN); # 既存カテゴリチェック foreach(@catedata){ ($wno, $wcate, $other) = split(/<>/, $_); if( $wcate eq $add_cate ){ &errhtml("カテゴリ『$new_cate』はすでに登録してあります。"); } } # 編集 foreach(@catedata){ ($wno, $wcate, $wcatenum, $dmy) = split(/<>/, $_); if( $wcate eq $edit_cate ){ push(@new_catedata, "$wno<>$new_cate<>$wcatenum<>\n"); }else{ push(@new_catedata, $_); } } # ファイル書き込み &lock("${catef}loc"); open(OUT, ">$catef"); print OUT @new_catedata; close(OUT); &unlock("${catef}loc"); # データ内のカテゴリ名を変更する &dataedit($edit_cate, $new_cate); }# cateedit END #******************************************************************************** #* カテゴリ削除処理 #******************************************************************************** sub catedel{ local($del_cate) = @_; if( $del_cate eq "" ){ &errhtml("削除するカテゴリ名を選択してください。"); } # カテゴリファイルオープン open(IN, $catef); @catedata = ; close(IN); # 削除 foreach(@catedata){ ($wno, $wcate, $wcatenum, $dmy) = split(/<>/, $_); if( $wcate eq $del_cate ){ if( $wcatenum ne "0" ){ &errhtml("データが登録されているカテゴリは削除できません。"); } }else{ push(@new_catedata, $_); } } # ファイル書き込み &lock("${catef}loc"); open(OUT, ">$catef"); print OUT @new_catedata; close(OUT); &unlock("${catef}loc"); }# catedel END #******************************************************************************** #* カテゴリ追加処理 #******************************************************************************** sub cateadd{ local($add_cate, $regnum) = @_; if( $add_cate eq "" ){ &errhtml("追加するカテゴリ名を入力してください。"); } # カテゴリファイルオープン open(IN, $catef); @catedata = ; close(IN); # 既存カテゴリチェック foreach(@catedata){ ($wno, $wcate, $other) = split(/<>/, $_); if( $wcate eq $add_cate ){ &errhtml("カテゴリ『$add_cate』はすでに登録してあります。"); } } # 追加データ作成 ($wno, $other) = split(/<>/, $catedata[@catedata]); $no = $wno + 1; push(@catedata, "$no<>$add_cate<>$regnum<>\n"); # ファイル書き込み &lock("${catef}loc"); open(OUT, ">$catef"); print OUT @catedata; close(OUT); &unlock("${catef}loc"); }# cateadd END #******************************************************************************** #* データ削除処理 #******************************************************************************** sub delete{ $no = $FORM{'no'}; # 削除する記事番号 $maspass = $FORM{'maspass'}; # 入力された管理パスワード $pass = $FORM{'pass'}; # 入力された編集パスワード open(IN, $dataf) || &errend("ファイルがオープンできません( $dataf )", __FILE__, __LINE__); @filedata = ; close(IN); # 削除データ検索 foreach(@filedata){ ($wno,$wmaster,$wmail,$wtitle,$wurl,$wbnurl,$wcategory,$wcomment,$wclicknum,$weditpass,$wdate,$dmy) = split(/<>/, $_); if( $wno eq $no ){ # 管理者による削除か? if( $maspass ne "" ){ # 管理パスワードチェック if( $maspass eq $password ){ }else{ &errhtml("管理パスワードが間違っています。"); } }else{ # 削除パスワードチェック if( $weditpass ne "" and $weditpass eq $pass ){ }else{ &errhtml("削除パスワードが間違っています。"); } } }else{ push(@data, $_); } } &lock("${dataf}loc"); # データ書き込み open(IN, ">$dataf") || &errend("ファイルがオープンできません( $dataf )", __FILE__, __LINE__); print IN @data; close(IN); &unlock("${dataf}loc"); # カテゴリファイルを再集計する &make_catef; if( $maspass ne "" ){ &disp_page("$script?mode=master&pass=$maspass"); }else{ &disp_page($script); } exit; }# delete END #******************************************************************************** #* 管理画面処理 #******************************************************************************** sub master{ $pass = $FORM{'pass'}; # 入力された削除パスワード $pageno = $FORM{'pageno'}; # ページ番号 if( $pageno eq "" ){ $pageno = 1;} if( $password ne $pass ){ &errhtml("管理パスワードが間違っています。"); } $pagemsg = 10; open(IN, $dataf); @filedata = ; close(IN); $total = @filedata; $stano = ($pageno-1)*$pagemsg; $endno = $stano + $pagemsg; if( $endno > $total ){ $endno = $total; } # 1ページに表示する記事データの抜き出し $datacnt = 0; foreach(@filedata){ ($no,$other) = split(/<>/, $_); if( $datacnt >= $stano ){ if( $datacnt >= $endno ){ last; } push(@finddata, $_); } $datacnt = $datacnt + 1; } print <<_HTML_; Content-type: text/html; charset=Shift_JIS HiLink管理画面
HiLink管理画面


 

  データ削除

_HTML_ if( @finddata != 0 ){ foreach(@finddata){ ($wno,$wmaster,$wmail,$wtitle,$wurl,$wbnurl,$wcategory,$wcomment,$wclicknum,$weditpass,$wdate,$dmy) = split(/<>/, $_); print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } }else{ print "\n"; } # ページ移動部分作成 $pagepre = $pageno - 1; if( $pagepre <= 0 ){ $pageprehtml = ""; }else{ $pageprehtml = "Prev   "; } if( $total > $endno ){ $pagenxt = $pageno + 1; $pagenxthtml = "Next"; }else{ $pagenxthtml = ""; } $pagemove = $pageprehtml.$pagenxthtml; print <<_HTML_;
データ番号 サイトタイトル 管理人 メールアドレス カテゴリ クリック数 登録日 削除
$wno$wtitle$wmaster$wmail$wcategory$wclicknum$wdate
登録データはありません。

$pagemove
$copyright _HTML_ exit; }# master END #******************************************************************************** #* カテゴリ編集処理 #******************************************************************************** sub cate{ $pass = $FORM{'pass'}; # 入力された削除パスワード if( $password ne $pass ){ &errhtml("管理パスワードが間違っています。"); } open(IN, $catef); @catedata = ; close(IN); $total = @catedata; print <<_HTML_; Content-type: text/html; charset=Shift_JIS HiLink管理画面
HiLink管理画面


 

  カテゴリ名変更

  -> 新カテゴリ名:  

  カテゴリ削除

 
※登録データがあるカテゴリは削除できません。

  カテゴリ追加

 
$copyright _HTML_ exit; }# cate END #******************************************************************************** #* データ編集画面表示処理 #******************************************************************************** sub edit{ #------ パラメータ設定 ------------------------------------------------------------------ $editno = $FORM{'no'}; # データ番号 $pass = $FORM{'pass'}; # 入力された編集パスワード #------ ファイルオープン ---------------------------------------------------------------- open(IN, $catef) || &errend("ファイルがオープンできません( $catef )", __FILE__, __LINE__); @catedata = ; close(IN); open(IN, $dataf) || &errend("ファイルがオープンできません( $dataf )", __FILE__, __LINE__); @filedata = ; close(IN); #------ ファイルオープン ---------------------------------------------------------------- foreach(@filedata){ ($no,$master,$mail,$title,$url,$bnurl,$category,$comment,$clicknum,$editpass,$date,$dmy) = split(/<>/, $_); if( $no eq $editno ){ if( $pass ne $editpass ){ &errhtml("編集パスワードが違います。"); } # コメント変換 $comment =~ s/
/\n/g; last; } } foreach(@catedata){ ($no2, $cate, $other) = split(/<>/, $_); if( $cate eq $category ){ push(@option, ""); }else{ push(@option, ""); } } print "Content-type: text/html\n\n"; open( IN, $edit_skin ) || &errend("ファイルがオープンできません( $edit_skin )", __FILE__, __LINE__); $skinhtml = join('', ); close(IN); &edithtml($skinhtml); print <<"_HTML_"; $skinhtml _HTML_ exit; }# edit END #******************************************************************************** #* 管理パスワード入力画面表示処理 #******************************************************************************** sub enter{ print <<_HTML_; Content-type: text/html; charset=Shift_JIS 管理パスワード入力

現在、新規登録は管理者のみ可\能\です。
管理パスワードを入力してください。


Password: 
$copyright _HTML_ exit; }# enter END #******************************************************************************** #* カテゴリファイル再編成処理 #******************************************************************************** sub make_catef{ local(@new_catedata); #------ ファイルオープン ---------------------------------------------------------------- # データファイル open(IN, $dataf); @filedata = ; close(IN); # カテゴリファイル open(IN, $catef); @catedata = ; close(IN); #------ カテゴリ毎の登録数集計 ---------------------------------------------------------- foreach $cdat (@catedata){ $num = 0; ($cno, $ccate, $ccatenum, $dmy) = split(/<>/, $cdat); foreach $ddat (@filedata){ ($wno,$wmaster,$wmail,$wtitle,$wurl,$wbnurl,$wcategory,$wcomment,$wclicknum,$weditpass,$wdate,$dmy) = split(/<>/, $ddat); if( $ccate eq $wcategory ){ $num ++; } } push(@new_catedata, "$cno<>$ccate<>$num<>\n"); } #------ ファイル書き込み ---------------------------------------------------------------- &lock("${catef}loc"); open(OUT, ">$catef"); print OUT @new_catedata; close(OUT); &unlock("${catef}loc"); }# make_catef END #******************************************************************************** #* データ編集(カテゴリ)処理 #******************************************************************************** sub dataedit{ local($edit_cate, $new_cate) = @_; # データファイルオープン open(IN, $dataf); @filedata = ; close(IN); # カテゴリ変更 foreach(@filedata){ ($wno,$wmaster,$wmail,$wtitle,$wurl,$wbnurl,$wcategory,$wcomment,$wclicknum,$weditpass,$wdate,$dmy) = split(/<>/, $_); if( $wcategory eq $edit_cate ){ push(@new_data, "$wno<>$wmaster<>$wmail<>$wtitle<>$wurl<>$wbnurl<>$new_cate<>$wcomment<>$wclicknum<>$weditpass<>$wdate<>\n"); }else{ push(@new_data, $_); } } # ファイル書き込み &lock("${dataf}loc"); open(OUT, ">$dataf"); print OUT @new_data; close(OUT); &unlock("${dataf}loc"); }# dataedit END #******************************************************************************** #* ワード検索処理 #******************************************************************************** sub search{ $pageno = $FORM{'pageno'}; # ページ番号 $log = $FORM{'log'}; # ログ種類 $word = $FORM{'word'}; # ワード検索文字列 # ページ番号が設定されていない場合は1にする if( $pageno eq "" ){ $pageno = 1;} # データファイルオープン if( $log eq "old" ){ open(IN, $olddataf); }else{ open(IN, $dataf); } @filedata = ; close(IN); if( $word ne "" ){ # 検索ワードを半角スペースで分割 @searchword = split(/ /, $word); # 検索に引っかかった記事番号を抽出 foreach $sdt (@filedata){ foreach $swd (@searchword){ $findflg = index $sdt, $swd; if( $findflg == -1 ){ }else{ ($sno, $other) = split(/<>/, $sdt); if( $sno eq $slastno ){ }else{ push(@searchno, $sno); $slastno = $sno; } last; } } } # 抽出した記事番号のデータをすべて抽出する foreach $sno (@searchno){ foreach $dt (@filedata){ ($sno2, $other) = split(/<>/, $dt); if( $sno eq $sno2 ){ push(@searchdata, $dt); } } } }else{ @searchdata = @filedata; } # 全記事数を数える $total = &count_data(*searchdata); # スキンファイルオープン open( IN, $search_skin ) || &errend("ファイルがオープンできません( $search_skin )", __FILE__, __LINE__); $skinhtml = join('', ); close(IN); # ここでスキンファイルのヘッダ部、データ部、フッタ部に分ける ($headhtml, $datahtml, $foothtml) = split(/$data_id/, $skinhtml); # ここでデータ部の本文ヘッダ部、レス部、本文フッタ部に分ける ($resheadhtml, $resdatahtml, $resfoothtml) = split(/$resdata_id/, $datahtml); undef($datahtml); if( @searchdata != 0 ){ $stano = ($pageno-1)*$pagemsg + 1; $endno = $stano + $pagemsg - 1; if( $endno > $total ){ $endno = $total; } # 1ページに表示する記事データの抜き出し $datacnt = 1; foreach(@searchdata){ ($no,$resno,$other) = split(/<>/, $_); if( $datacnt >= $stano ){ if( $datacnt >= $endno + 1 ){ last; } push(@finddata, $_); } if( $resno == 0 ){ $datacnt = $datacnt + 1;} } foreach(@finddata){ ($no,$resno,$name,$url,$mail,$title,$message,$color,$date,$delpass,$dmy) = split(/<>/, $_); if( $url eq "http://" ){ $homelink = ""; }else{ if( $homeimg eq "" ){ $homelink = "HOME"; }else{ $homelink = ""; } } if( $mail eq "" ){ $maillink = ""; }else{ if( $mailimg eq "" ){ $maillink = "MAIL"; }else{ $maillink = ""; } } if( $resimg eq "" ){ $reslink = "返信"; }else{ $reslink = ""; } if( $resno != 0 ){ $resdatatmp = $resdatahtml; &edithtml($resdatatmp); unshift(@tmp, $resdatatmp); }else{ $resdatatmp = join("", @tmp); $resheadtmp = $resheadhtml; &edithtml($resheadtmp); $resfoottmp = $resfoothtml; &edithtml($resfoottmp); $datahtml .= $resheadtmp.$resdatatmp.$resfoottmp; undef(@tmp); } } }else{ $datahtml = "一致する記事は見つかりませんでした。
"; } # ページ移動部分作成 $stapage = $stano + 1; $endpage = sprintf("%d",$total/$pagemsg); if( $total%$pagemsg != 0 ){ $endpage ++; } # 2ページ以上でなければ表示しない if( $endpage >= 2 ){ # prev部分 if( $pageno > 1 ){ $pagepre = $pageno - 1; $pagemove = "prev |"; }else{ $pagemove = "prev |"; } # page部分 for( $i = 1; $i <= $endpage; $i++ ){ if( $i eq $pageno ){ $pagemove .= " $i |"; }else{ $pagemove .= " $i |"; } } # next部分 $pagenxt = $pageno + 1; if( $pagenxt > $endpage ){ $pagemove .= " next\n"; }else{ $pagemove .= " next"; } }else{ $pagemove = ""; } # ヘッダ部編集 &edithtml($headhtml); if( $total == 0 ){ $headhtml =~ s/0件の記事が見つかりました。//ig; $headhtml =~ s/〜 件目の記事を表\示しています。//ig; } # フッタ部編集 &edithtml($foothtml); print "Content-type: text/html\n\n"; print <<"_HTML_"; $headhtml $datahtml $foothtml _HTML_ exit; }# search END #******************************************************************************** #* スキンファイル編集処理($〜$変換処理) #******************************************************************************** sub edithtml{ $_[0] =~ s/\$script\$/$script/ig; $_[0] =~ s/\$method\$/$method/ig; $_[0] =~ s/\$home\$/$home/ig; $_[0] =~ s/\$msg\$/$msg/ig; $_[0] =~ s/\$no\$/$no/ig; $_[0] =~ s/\$master\$/$master/ig; $_[0] =~ s/\$mail\$/$mail/ig; $_[0] =~ s/\$title\$/$title/ig; $_[0] =~ s/\$comment\$/$comment/ig; $_[0] =~ s/\$date\$/$date/ig; $_[0] =~ s/\$url\$/$url/ig; $_[0] =~ s/\$bnurl\$/$bnurl/ig; $_[0] =~ s/\$banner\$/$banner/ig; $_[0] =~ s/\$category\$/$category/ig; $_[0] =~ s/\$clicknum\$/$clicknum/ig; $_[0] =~ s/