#!/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\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:\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";
$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";
$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.