#!/usr/local/bin/perl # # index.cgi as i system and i search system # 2000/02/23 0.4.2 masato-3 patched(smarten,plan bug,search print) # yar-3 support {jis|sjis} hnf # 2000/02/22 0.4.1 masato-3 patched(sort,todo,dayoftheweek) # 2000/02/22 0.4.0 yar-3 brush up # see below... # このcgiは改造自由、再配布自由ですが、無保証です。 # このcgiは chizuware です。 # このファイルとconfig.phはEUCコード、改行LFで使用してください。 use Time::Local; # timelocal関数を利用するため $out = ""; # いわゆる出力buffer $ver = "0.4.2[stable] 00/2/23 (C)yar-3"; #$ver = "current (based on 0.4.2) 00/02/23 (C)yar-3"; # 改造したひとは、↑ここらへんを書きかえるとオリジナリティup require './config.ph'; #設定ファイルです。 if ($nkf == 2) { require './jcode.pl'; #jcode.plは最新を推奨 # ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/ から入手できます } @week = ("日","月","火","水","木","金","土"); #日本語 #@week = ("Su","Mo","Tu","We","Th","Fr","Sa"); #English $ua = $ENV{'HTTP_USER_AGENT'}; #$ua = "PDXGW"; # for testing (PDXGW) if ($ua =~ /^DoCoMo/) { #iMODE端末 $imode = 1; } elsif ($ua =~ /^PDXGW/) { #いわゆるPmailDX $pdx = 1; $section = "ALL"; #PmailDXのときは15KBくらい取得できるので1日分を一気に } #引数の解釈 masato-3 if ($ARGV[0] eq '-t') { # デバック用オプション引数を使った実行 # 使用例 : ./index.cgi -t word=system $query_string = $ARGV[1]; $log = 0; # ログは取らない splice(@ARGV, 0, 2); # オプション引数を除去 } elsif ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'}); } else { $query_string = $ENV{'QUERY_STRING'}; } @a = split(/&/, $query_string); foreach $a (@a) { ($name, $value) = split(/=/, $a); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $FORM{$name} = $value; } #$log = 1;でログ採取。0で採取しない。動かないときは0にして if ($log) { # logger on # print "logging\n"; &logging; } open(STDOUT, "|nkf -s") if ($nkf == 1); #表示する日記の日付 $day = $FORM{'d'} || $ARGV[0]; # ?20001031 という感じ。 $tt = time; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($tt); $year += 1900; $mon++; if ($mon < 10 ) { $mon = "0$mon"; } #0suppress if ($mday < 10 ) { $mday = "0$mday"; } $today = "$year$mon$mday"; #19991231 format if ($day eq 'J') { #日付移動 &print_jump_form; exit 0; } if ($day eq 'E') { #検索メニュー &print_search_form; exit 0; } if (length($day) > 8) { # ?20001031S2 というかんじ if ($day =~ /P$/i) { # 末尾がP : planモード $day =~ /(\d{8})P/i; #20001031 P に分ける $day = $1; $plan = 1; } elsif ($day =~ /T$/i) { # 末尾がT : todoモード $day =~ /(\d{8})T/i; #20001031 P に分ける $day = $1; $todo = 1; $todof = "$diarydir/todo"; } else { $day =~ /(\d{8})s(.+)/i; #20001031 S2 に分ける $day = $1; $section = $2; } } if ($day eq "") { # today $day = $today; } else { ($year, $mon, $mday) = unpack("A4A2A2", $day); } $hnf = "$diarydir$year/d$day.hnf"; #/home/hoge/diary/1999/d19991231.hnf のような感じ $newcount = 0; #いくつめのNEWか $subcount = 0; #いくつめのSUBか NEWが変わるとreset $ok = 0; # header識別 OK までの部分はユーザー変数 i systemでは無視 if ($FORM{'word'}) { # 検索文字列あり &search_word($FORM{'word'}); exit 0; } $plan1f = "$diarydir$year/y$year$mon"; #予定ファイル名作成 /home/hoge/diary/1999/y199902 $mon2 = $mon + 1; #翌月の予定ファイル名作成 if ($mon2 > 12) { $year2 = $year + 1; $mon2 = 1; } else { $year2 = $year; } $mon2 = "0$mon2" if ($mon2 < 10 ); $plan2f = "$diarydir$year2/y$year2$mon2"; #前日と翌日の日記ファイルを探す masato-3 { my $y, $i; foreach $y ($year-1..$year+1) { push(@ddays, sort map(/d(\d+)\.hnf$/, <$diarydir$y/d*.hnf>)); } for ($i = 0; $i <= $#ddays; $i++) { if ($ddays[$i] eq $day) { $prevday = $ddays[$i-1] if ($i > 0); $nextday = $ddays[$i+1] if ($i < $#ddays); last; } } $prevday = $ddays[-1] if ($prevday eq ''); } #$out .= "content-type: text/html\n\n"; print "content-type: text/html\n\n"; # content-typeを出力 $out .= "\n\n"; print "\n" if (!$nkf); #nkfやjcode.plが使えないときは「や」テク #「や」テクとは、iMODE携帯でEUCのサイトを表示する技術(謎) # tnx 2 masato-3, ari-3 $out .= "$title\n"; $out .= "\n"; #print "day=$day\n"; if ($imode) { #iMODE携帯でアクセスするとiMODE markがでる $head = "略$head"; # iMODE mark } #ほかの環境でiMODE絵文字を表示すると文字化けします if (!$section) { # titleモードのときだけタイトルを表示 if ($head eq ""){ # h1に要素を埋め込む $out .= "

$title

\n"; } else { $out .= "

$head

\n"; } $out .= "
\n"; } $out .= "$head\n" if ($pdx); #PmailDXの時は$headを表示 $out .= "$header\n"; #文頭 if ($section) { #セクション表示のときに &fileprint($confdir . $headfile) if ($headfile); } else { #タイトルモード &fileprint($confdir . $titleheadfile) if ($titleheadfile); } &dayprint; #日付を表示 open(IN, $hnf); #当該hnfを開く if ($section) { #いわゆるtitle表示ではない while($tmp = ) { jcode::convert(\$tmp, "euc") if ($hnfconv and $nkf == 2); #hnfがEUC以外で書かれている時 chomp($tmp); #改行を落とす &parse($tmp); #解釈する if ($section eq "ALL") { # 全セクション表示 $out .= "$o\n"; } elsif ($newcount == $section) { #表示すべきsectionなら $out .= "$o\n"; } } # 表示終わり $out .= "
\n"; #区切り §ion_jump() if ($section ne "ALL"); #全部表示の時以外はjump先一覧を表示 } else { # いわゆるtitle表示 if ($plan) { &planprint(); #予定 } elsif ($todo) { &todoprint(); #TODO } else { &title(); #タイトル一覧 } } close(IN); if ($footfile ne ""){ $path = $confdir . $footfile; &fileprint($path); #文末の何か } if ($address ne "") { $out .= "
$address
\n"; #メイルアドレス } $out .= "\n"; #html生成終わり &jcode::convert(\$out, "sjis") if ($nkf == 2); #jcode.pl使用時はsjis変換 print $out; #出力 ################################################################ # # おしまい # # あとはsubroutine # ################################################################ # ファイルを読み出して表示 sub fileprint { open(IN, $_[0]); while() { $out .= "$_\n"; } } #日付を表示 sub dayprint { #if ($i != 0) { # $out .= "\n"; #} $day =~ /(\d\d\d\d)(\d\d)(\d\d)/; # $out .= "
$1年$2月$3日\n"; $out .= "$1年$2月$3日\n"; # brを取った } #解析 sub parse { $t = $_[0]; $o = ""; chomp($t); #これは実はいらない? if ($t =~ /~$/) { #末尾の改行を変換 $t =~ s/~$/
/; } if ( $t =~ /^OK$/ ) { #header識別 $ok = 1; return; } if ($ok == 0) { #header処理中 # ユーザー変数は非表示にする return; } if ($grp > 0) { #GRP機能対応 kenji-3 if ($t =~ /^(NEW|LNEW|GRP)\s.*/) { # GRPの内部は非表示にする } else { return; } } if ($t =~ /^CAT\s(.+)/) { # CAT hoge $cat = $cat . $1; #複数行のCATに対応 } elsif ( $t =~ /^GRP/ ) { # GRP機能 $grp = 1; # grp mode on } elsif ( $t =~ /^NEW(.*)/) { # NEW hogehoge $newtopic = $1; # searchで使うためにnewの中身を保存 if ($grp == 1) { # GRPの内部は非表示にする $grp = 2; return; } elsif ($grp == 2) { $grp = 0; } $newcount++; #if ( $newcount != 1 and $imode != 1) { if ( $imode != 1) { #常時 $newlineで区切ってみる $o .= "$newline"; } else { #iMODEのときは $o .= "
"; #とりあえず改行 } $subcount = 1; $o .= "$newmark$newcount:"; #$o .= "$new1$1; $o .= "$new1$1"; if ($cat) { #$o .= "[$cat]"; #カテゴリ表示をやめてみる(ari-3) $cat = ""; } $o .= "$new2"; } elsif ( $t =~ /^LNEW\s(\S+)\s(.+)/) { # LNEW url hogehoge #$newtopic = $2; # searchで使うためにnewの中身を保存 if ($grp == 1) { # GRPの内部は非表示にする $grp = 2; return; } elsif ($grp == 2) { $grp = 0; } $newcount++; #if ( $newcount != 1 and $imode != 1) { if ( $imode != 1) { #常時 $newlineで区切ってみる $o .= "$newline"; } else { #iMODEのときは $o .= "
"; #とりあえず改行 } $subcount = 1; $fncount = 1; $fnmode = 0; $fn = ""; $o .= "$newmark$newcount:"; $o .= "\n" . "$new1$2"; if ($cat) { #print "[$cat]\n"; $o .= "[$cat]\n"; $cat = ""; } $o .= "$new2"; } elsif ($t =~ /^SUB(.*)/) { # SUB hogehoge #$subtopic = $1; # searchで使うためにsubの中身を保存 $o .= "$subline"; $o .= "$submark$subcount:"; $subcount++; $o .= "$sub1$1$sub2"; } elsif ($t =~ /^LSUB\s(\S+)\s(.+)/) { # LSUB url hogehoge #$subtopic = $2; # searchで使うためにsubの中身を保存 $o .= "$subline"; $o .= "$submark$subcount:"; $subcount++; $o .= ""; $o .= "$sub1$2$sub2"; } elsif ($t =~ /^LINK\s(\S+)\s(.+)/) { # LINK url hogehoge $o .= ""; $o .= "$2"; } elsif ($t =~ /^URL\s(\S+)(\s(.+))?/) { # URL url hogehoge $o .= ""; $o .= "$2 ($1)"; } elsif ($t =~ /^UL/ or $t =~ /^\/UL/ or $t =~ /^DL/ or $t =~ /^\/DL/ or $t =~ /^OL/ or $t =~ /^\/OL/) { $o .= "<$t>"; } elsif ( $t =~ /^\/PRE/) { # /PRE $premode = 0; $o .= ""; } elsif ( $t =~ /^PRE(.*)/) { # PRE if ($premode) { $o .= "$1"; } else { $o .= "
";
			$premode = 1;
		}

	} elsif ( $t =~ /^CITE/) {
		$o .= "
\n"; } elsif ( $t =~ /^\/CITE/) { $o .= "
\n"; } elsif ( $t =~ /^LI\s(.*)/) { # LI hoge $o .= "
  • $1"; } elsif ( $t =~ /^DT\s(.*)/) { #DT hoge $o .= "
    $1"; } elsif ( $t =~ /^DD\s(.*)/) { #DD hoge $o .= "
    $1"; } elsif ( $t =~ /^STRIKE\s(.*)/) { # STRIKE hoge $o .= "$1"; } elsif ( $t =~ /^LSTRIKE\s(\S+)\s(.*)/) { # LSTRIKE url hoge $o .= "$2"; } elsif ( $t =~ /^STRONG\s(.*)/) { # STRONG hoge $o .= "$1"; } elsif ( $t =~ /^FONT\s(\S+)\s(\S+)\s(.+)/) { # FONT para value hoge $o .= "$3"; } elsif ( $t =~ /^IMG\s(\S+)\s(\S+)\s(.+)/) { # IMG para url alt if ($1 eq "r") { $aln = "ALIGN=\"right\""; } elsif ($1 eq "l") { $aln = "ALIGN=\"left\""; } elsif ($1 eq "n") { $aln = ""; } #$o .= "\"$3\"$1=\"$2\"$3\n"; #iMODEなので基本的に画像は表示しません $o .= "[IMG $3]"; } elsif ( $t =~ /^!(.*)/) { # ! hoge #$o .= "\n"; 別に表示しなくてもいいよね } elsif ( $t =~ /^!#(.*)/) { # !# hoge } elsif ($t =~ /^FN/) { # FN $fnmode = 1; $o .= "("; } elsif ($t =~ /^\/FN/) { # /FN $fnmode = 0; $fncount++; $o .= ")\n"; } elsif ($t =~ /^ALIAS\s(.*)/) { # ALIAS 未対応だった!! #暫定的にalias文字列を出しておく #$o .= "$1"; $orig = $1; open(ALIAS, "$diarydir" ."conf/alias.txt"); while($a = ) { $a =~ /^(\S+)\s(.*)/; #print "$a,$1
    "; if ( $1 eq $orig ) { # 一致したら $o .= "$2"; } } close(ALIAS); } elsif ($t =~ /^RLINK\s(.+)\s(.+)\s(.+)/ ) { # RLINK 引数1 引数2 説明文章 $orig = $1; $url = $2; $cmt = $3; open(RLINK, "$diarydir" . "conf/rlink.txt"); while($a = ) { $a =~ /^(\S+)\s(.*)/; if ( $1 eq $orig ) { # 一致したら $url = $2 . $url; $o .= "$cmt"; } } close(RLINK); } elsif ( $t eq "P" ) { # P $o .= "

    "; } elsif ( $t eq "/P" ) { # /P $o .= "

    "; } else { $o .= "$t"; } } #タイトル一覧を表示する sub title { #$out .= "
      \n"; while($tmp = ) { jcode::convert(\$tmp, "euc") if ($hnfconv and $nkf == 2); if ($tmp =~ /^GRP/) { # GRP機能 kenji-3 $grp = 1; # grp mode on } if ($tmp =~ /^NEW\s(.+)/ or $tmp =~ /^LNEW\s\S+\s(.+)/){ if ($grp == 1) { # GRPの内部は非表示にする $grp = 2; } elsif ($grp == 2) { $grp = 0; } $newcount++ unless ($grp); $uri = $day . "S$newcount"; #$out .= "
    1. $1:\n" unless ($grp); $out .= "$newmark$newcount:$1:\n" unless ($grp); # listingをやめた } elsif ($tmp =~ /^SUB\s(.+)/ or $tmp =~ /^LSUB\s\S+\s(.+)/) { $out .= "$1 \n" unless ($grp); } } #$out .= "
    \n"; $out .= "
    \n"; if ($prevday) { if ($imode) { $out .= qq(驪[前の日]); #(1) } else { $out .= qq([前の日]); } } if ($nextday) { if ($imode) { $out .= qq(黎[次の日]); # (3) } else { $out .= qq([次の日]); } } $up = "?$day" . "P"; $ut = "?$day" . "T"; if ($imode) { $out .= "曆[日付移動]\n"; #(5) $out .= "力[予定]\n"; $out .= "歷[TODO]\n"; $out .= "年[検索]\n"; #(5) #iMODEでは「全部」表示はしない(表示できないから) } else { $out .= "[日付移動]\n"; $out .= "[予定]\n"; $out .= "[TODO]\n"; $out .= "[検索]\n"; $uri = $day ."SALL"; $out .= "[全部]\n"; } $out .= "
    i system ver $ver\n"; } # 予定を表示する sub planprint { $out .= "[予定]
    \n"; open(PLAN1, $plan1f); while($tmp = ) { jcode::convert(\$tmp, "euc") if ($hnfconv and $nkf == 2); if ($tmp =~ /^(\d+\/)?(\d+)\s/) { # 18 デート あるいは 2/18 結婚式 など ari-3 $tmpday = $2; $tmpday = "0" . $tmpday if ($tmpday < 10); if ($mday <= $tmpday) { #今日以降の予定 push(@pp,"$year/$mon/$tmpday $'"); # 配列に格納 1999/12/31 ほげ } } } close(PLAN1); open(PLAN2, $plan2f); while($tmp = ) { jcode::convert(\$tmp, "euc") if ($hnfconv and $nkf == 2); if ($tmp =~ /^(\d+\/)?(\d+)+\s/) { # 翌月は全部配列に入れちゃう $tmpday = $2; $tmpday = "0" . $tmpday if ($tmpday < 10); push(@pp,"$year2/$mon2/$tmpday $'"); # 配列に格納 } } close(PLAN2); @p = sort(@pp); if (!$maxplan) { $maxplan = 10; # 未定義時の最大数は10こ } if ($#p < $maxplan) { # 少ないとき $maxplan = $#p + 1; } for ($i = 0 ; $i < $maxplan ; $i++){ $p[$i] =~ /^(\d\d\d\d\/\d\d\/\d\d)\s/; $d = $1; $a = $'; #print $1; $d = &getdayoftheweek($d); $out .= "・$d $a
    \n"; # ここでplanの見た目を変更可能 } $out .= "
    \n"; #LINK表示 &ichiran; } #曜日を取得! sub getdayoftheweek { $_[0] =~ /(\d\d\d\d)\/(\d\d)\/(\d\d)/; my $year = $1 - 1900; my $mon = $2; my $day = $3; my $tt = timelocal(0,0,0,$day,$mon - 1,$year); my @tmp = localtime($tt); return "$mon/$day($week[$tmp[6]])"; } # TODOを表示する sub todoprint { my (@num); $out .= "[TODO]
    \n"; open(TODO, $todof); while($tmp = ) { jcode::convert(\$tmp, "euc") if ($hnfconv and $nkf == 2); if ($tmp =~ /^(\d+)\s/) { # 99 日記を続ける など push(@num, [$1, $']); # 無名配列[得点, 内容]を入れる } } close(TODO); # 得点をキーにして昇順でソート @num = sort { $b->[0] <=> $a->[0] } @num; if (!$maxtodo) { $maxtodo = 10; # 未定義時の最大数は10こ } if ($#num < $maxtodo) { # 少ないとき $maxtodo = $#num + 1; } for ($i = 0 ; $i < $maxtodo ; $i++){ $out .= "#$num[$i]->[0] $num[$i]->[1]
    \n"; #ここでTODOの見た目を変更可能 } $out .= "
    \n"; #LINK表示 &ichiran; } #[前][次]ってやつね sub section_jump { if ($section > 1) { # 前のセクションが存在 $sec = $section - 1; $u = "?$day" . "S$sec"; if ($imode) { $out .= "驪[前]"; } else { $out .= "[前]"; } } if ($newcount > $section) { # 後のセクションが存在 $sec = $section + 1; $u = "?$day" . "S$sec"; if ($imode) { $out .= "黎[後]"; } else { $out .= "[次]"; } } #一覧 &ichiran; } #日付移動 sub print_jump_form { open(STDOUT, "|nkf -s") if ($nkf == 1); $out .= "content-type: text/html\n\n"; $out .= "\n"; $out .= "\n" if (!$nkf); $out .= "i system jump\n"; $out .= "\n"; $out .= "i system jump

    \n"; $out .= "任意の日付にジャンプします。
    \n"; $out .= "3.を押すか、ボタンを押して下さい。
    \n"; if ($baseuri) { #ezweb対策 ari-3 $out .= qq(

    \n); } else { $out .= qq(\n); } $out .= qq(\n); $out .= qq(\n); $out .= "
    \n"; $out .= "「19990801」のように8桁の数字で指定して下さい。\n"; $out .= "
    \n"; $out .= "\n"; &jcode::convert(\$out, "sjis") if ($nkf == 2); #jcode.pl使用時はsjis変換 print $out; } #検索フォームを表示 sub print_search_form { open(STDOUT, "|nkf -s") if ($nkf == 1); $out .= "content-type: text/html\n\n"; $out .= "\n"; $out .= "\n" if (!$nkf); $out .= "i search system\n"; $out .= "\n"; $out .= "i search system
    \n"; $out .= "任意の単語を検索します。
    \n"; if ($baseuri) { $out .= qq(
    \n); } else { $out .= qq(\n); } $out .= qq(\n); $out .= qq(\n); $out .= "
    \n"; $out .= "単語を入力して\n"; $out .= "3.を押すか、ボタンを押して下さい。
    \n"; $out .= "
    \n"; $out .= "正規表現も使えます\n"; $out .= "\n"; &jcode::convert(\$out, "sjis") if ($nkf == 2); #jcode.pl使用時はsjis変換 print $out; } # # log取得 # sub logging { # loggin subroutine is based on # tohoho wwwwcounter # http://wakusei.cplaza.ne.jp/twn/wwwcount.htm # thanks 2 tohoho # server setup # # $ mkdir lock # $ touch isystem.cnt # $ touch isystem.dat # $ touch isystem.acc # $ chmod 777 lock # $ chmod 666 isystem.* $count_name = $confdir . "isystem"; $file_count = "$count_name" . ".cnt"; $file_date = "$count_name" . ".dat"; $file_access = "$count_name" . ".acc"; $file_lock = "lock/$count_name" . ".loc"; # # 環境変数TZを日本時間に設定する # $ENV{'TZ'} = "JST-9"; # # ロック権を得る # if ($do_file_lock) { foreach $i ( 1, 2, 3, 4, 5, 6 ) { if (mkdir("$file_lock", 0755)) { # ロック成功。次の処理へ。 last; } elsif ($i == 1) { # 10分以上古いロックファイルは削除する。 ($mtime) = (stat($file_lock))[9]; if ($mtime < time() - 600) { rmdir($file_lock); } } elsif ($i < 6) { # ロック失敗。1秒待って再トライ。 sleep(1); } else { # 何度やってもロック失敗。あきらめる。 exit(1); } } } # # 途中で終了してもロックファイルが残らないようにする # $SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "sigexit"; # # カウンターファイルからカウンター値を読み出す。 # if (open(IN, "< $file_count")) { $count = ; close(IN); } else { $count = -1; } #print "count=$count\n"; # # 日付ファイルから最終アクセス日付を読み出す。 # if (open(IN, "< $file_date")) { $date_log = ; close(IN); } else { $date_log = ""; } # # 今日の日付を得る # ($sec, $min, $hour, $mday, $mon, $year) = localtime(time()); $date_now = sprintf("%04d/%02d/%02d", 1900 + $year, $mon + 1, $mday); $time_now = sprintf("%02d:%02d:%02d", $hour, $min, $sec); #print "$time_now\n"; # # 日付が異なる、つまり、今日初めてのアクセスであれば # if ($date_log ne $date_now) { #print "mail log\n"; # # アクセスログをメールで送信する # if ($mailto ne "") { $tmp_count = 0; open(IN, "< $file_access"); while () { if (/^COUNT/) { $tmp_count++; } } close(IN); $msg = ""; $msg .= "To: $mailto\n"; $msg .= "From: $count_name\n"; $msg .= "Subject: ACCESS $date_log $tmp_count\n"; $msg .= "\n"; if ($account_detail) { open(IN, "< $file_access"); while () { $msg .= $_; } close(IN); } else { $msg .= "Access = $tmp_count\n"; } open(OUT, "| $sendmail $mailto"); print OUT $msg; close(OUT); } # # アクセスログを初期化する # open(OUT, "> $file_access"); close(OUT); # # 今日の日付を日付ログファイルに書き出す # open(OUT, "> $file_date"); print(OUT "$date_now"); close(OUT); } # # カウントアップ処理 # #print "count up mae\n"; if ($count >= 0) { #print "count up\n"; # # カウンタをひとつインクリメントする # $count++; # # %7E や \~ などを処理する # $referer = $ENV{'HTTP_REFERER'}; $referer =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $reffile =~ s/\\//g; # # アクセスログを記録する # open(OUT, ">> $file_access"); print(OUT "COUNT = [ $count ]\n"); print(OUT "TIME = [ $time_now ]\n"); #print(OUT "ADDR = [ $ENV{'REMOTE_ADDR'} ]\n"); #if ($ENV{'REMOTE_HOST'} ne $ENV{'REMOTE_ADDR'}) { print(OUT "HOST = [ $ENV{'REMOTE_HOST'} ]\n"); #} print(OUT "AGENT = [ $ENV{'HTTP_USER_AGENT'} ]\n"); # print(OUT "REFER = [ $referer ]\n"); if ($reffile && (!$my_url || ($reffile !~ /$my_url/))) { print(OUT "FROM = [ $reffile ]\n"); } print(OUT "\n"); close(OUT); # # カウンタをカウンタファイルに書き戻す # if (open(OUT, "> $file_count")) { print(OUT "$count"); close(OUT); } } # # ロック権を開放する # if ($do_file_lock) { rmdir($file_lock); } } # log用 lockfile削除ルーチン sub sigexit { rmdir($file_lock); exit(0); } #検索しまくり sub search_word { # 検索 $word = $_[0]; #検索語 $hitcount = 0; #hit数 open(STDOUT, "|nkf -s") if ($nkf == 1); #$out .= "content-type: text/html\n\n"; print "content-type: text/html\n\n"; #apache対策? ari-3 $out .= "\n"; $out .= "\n" if (!$nkf); $out .= "result\n"; $out .= "\n"; $out .= "検索結果
    \n"; &jcode::convert(\$word, "euc") if ($nkf == 2); # EUCに変換する #あれ?jcode.plを使ってないときはどうするんだろう???? # print $word; # ファイルをpick up masato-3 @a = (); for $y ($year-1..$year) { # 今年と去年の日記が対象 push(@a, <$diarydir$y/d*.hnf>); } @a = sort { $b cmp $a } @a; # 並び替え(降順) #これで、最新のhnfから順に並んでいるはず。 if (!$maxday) { $maxday = 60; #デフォルトで最大60日を検索 } if ($#a < $maxday) { # 少ないとき $maxday = $#a + 1; } for ( $i = 0 ; $i < $maxday ; $i++) { open(IN, $a[$i]); # 最新のファイルから順に開く $newcount = 0; $subcount = 0; $a[$i] =~ /d(\d{8})\.hnf/; $tmpday = $tmpday2 = $1; $tmpday2 =~ s/(\d\d\d\d)(\d\d)(\d\d)/$1\/$2\/$3/; while($tmp = ) { jcode::convert(\$tmp, "euc") if ($hnfconv and $nkf == 2); chomp($tmp); # 改行除去 &parse($tmp); # 解析 if ($o =~ /$word/i) { #一致したら $u = "?$tmpday" . "S" . "$newcount"; if ($u ne $lastu) { #先ほどのurlと同じ #$out .= "・$tmpday2:$newtopic:$subtopic \n"; $out .= "・$tmpday2:$newcount:$subcount \n"; $tmp =~ s/($word)/$1<\/B>/ig; $tmp =~ s/^L(NEW|SUB|STRIKE|STRONG|LINK|URL)+\s\S+//; # LNEW, LSUB, LSTRIKE, LSTRONG なんかのuriを削除しまくる $tmp =~ s/^[A-Z]+\s//; # hnfコマンドを除去する $tmp =~ s/~$//; # 改行の'~'を除去 $out .= "$tmp
    \n"; $hitcount++; $lastu = $u; } } } close(IN); } $out .= "
    $hitcount件hit
    \n"; &ichiran; $out .= "\n"; &jcode::convert(\$out, "sjis") if ($nkf == 2); print $out; } #[一覧]を表示する sub ichiran { $u = "?$day"; if ($imode) { $out .= "麗[一覧]\n"; } else { $out .= "[一覧]\n"; } } # i system history # yns(1999/9) > mns(1999/10) > mns for iMODE(2000/1) > i system(2000/2) # yns: yar-3 nikki system # mns: MIOMIO nikki system # # version up list # with many users....... # 2000/02/22 0.3.5 ari-3 patched # 2000/02/21 0.3.4 yar-3 search bug fix(regexp etc...) # 2000/02/21 0.3.3 yar-3 i search system # 2000/02/21 0.3.2 yar-3 with jcode.pl # 2000/02/18 0.3.1 yar-3 PLAN,TODO # 2000/02/17 0.3.0 yar-3 ez logger # 2000/02/17 0.2.9 yar-3 jump refined $baseuri set # 2000/02/17 0.2.8 yar-3 P fixed # 2000/02/15 0.2.7 yar-3 ALL sections show # 2000/02/15 0.2.6 ari-3 Lynx patched (SUB on title) # 2000/02/15 0.2.5 yar-3 PDXGW(-H") patched # 2000/02/15 0.2.4 key-3 iMODE char accesskey patched # 2000/02/15 0.2.3 yar-3 RLINK # 2000/02/15 0.2.2 yar-3 ALIAS problem fixed # 2000/02/14 0.2.1 ari-3 patched (headfile, URL problem, SJIS) # 2000/02/13 0.2.0 yar-3 (NEW fixed) # 2000/02/13 0.1.7 key-3 patched (title,author, SUB problem) # 2000/02/13 0.1.6 kenji-3 patched (GRP) # 2000/02/13 0.1.5 masato-3 patched (without CGI.pm) # 2000/02/04 by yar-3 # original 1999/10/06 by yar-3 # # # thanks 2 all users. # 1999,2000,2001 (C)yar-3 All rights reserved.