=head スクリプト名 renewal_r.cgi - 更新日記検索 =head 概要 更新日記形式の日記を読取、日記の記事単位で検索結果を表示する。 =head 更新履歴 2004-11-07 メモるシステム(memol_edit.cgi ver: 1.01)でメモを書けるように、メモ作成のリンクを生成(ver: 1.01) =cut use LWP::Simple; require 'cgi-lib.pl'; # 日記システム関連の設定 $diary_filename = "renewal";# 日記ファイルベース名 $diary_file = "${diary_filename}.html";# 日記ファイル名 $siteurl = "http://homepage1.nifty.com/kazuf/";# 日記ファイルを置くサイト URL $sitename = "TS Network ☆ミ";# サイト名 $siteimage = "png/tsnetworkc3.png";# サイト代表画像 $mailaddress = "kazuf\@mars.dti.ne.jp";# サイト管理者メールアドレス $title = "更新日記検索結果";# 日記検索結果表示タイトル $fyear = 2001; # 日記を付け始めた年 $fmon = 3; # 日記を付け始めた月 $cgidir = $ENV{'CGIDIR'};# メモるシステム追加 [2004-11-07] # renewal_r.html の入力フォームからのデータ取得 &ReadParse(*in); # 現在の日付時刻の取得 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); if($in{'byear'}){ if($in{'byear'} > $fyear && $in{'byear'} - 1900 <= $year){ $fyear = $in{'byear'}; $fmon = 1; } } if($in{'eyear'}){ $eyear = $in{'eyear'} - 1900; if($eyear < $year && $eyear >= $fyear){ $year = $eyear; $mon = 12; } } for($iy=$fyear;$iy<=$year+1900;$iy++){ # 年が日記を付け始めた年ならば、 if($iy == $fyear){ $immin = $fmon;# 日記を付け始めた月から $immax = 12; # 12月まで # 年が今年の }elsif($iy == $year + 1900){ $immin = 1; # 1月から $immax = $mon;# 今月まで # 間の年ならば、 }else{ $immin = 1; # 1月から $immax = 12;# 12月まで } for($im=$immin;$im<=$immax;$im++){ $im =~ s/^(\d)$/0$1/;# 1桁月の場合は10の位に0を付加する # 日記ファイル名を配列に格納していく push(@dfiles, "${diary_filename}_${iy}_${im}.html"); } } push(@dfiles, "${diary_filename}.html");# 今月のファイル名 # renewal_r.html の入力から検索文字列取得 if($in{'pattern'}){ $kw = $in{'pattern'}; }else{ $kw = $ARGV[0]; } # CGI 出力開始 print "Content-type: text/html\n\n"; # 日記ファイル名とサイト名から、URL を生成し、 # LWP::Simple の get 関数で内容を取得する。 foreach $dfile (sort @dfiles){ $htmlfile = $siteurl . $dfile; if($html = get $htmlfile){ # 改行で分割して配列に格納 @content = split(/\n+/, $html); }else{ next; } # 行単位で解析 $insw = 0; foreach $line (@content){ # 日記の日付を取得 if($line =~ /^
(\d+)\/(\d+)\/(\d+)[^\d]*
(.*)$/i){ $date = sprintf("%4d/%1.2d/%1.2d",$3,$1,$2); if($4 ne ""){ $category = ""; $subject = $date; } $insw = 1;# 日記部分を示すフラグを立てる $count = 0;# マッチ回数の初期化 # 日記のカテゴリと主題を取得 }elsif($line =~ /^
([^<]+)<\/A><\/div>/i){ $category = "#".$1;$subject = $2; # 主題にリンクがある場合のカテゴリと主題の取得 }elsif($line =~ /^
([^<]*)(?:)*([^<]+)(?:<\/A>)*([^<]*)<\/A><\/div>/i){ $category = "#".$1;$subject = $2.$3.$4; # タグで日記を抜ける }elsif($line =~ /^<\/DL>$/i){ $insw = 0;# フラグを降ろす last;# foreach ループを抜ける } $line =~ s/<.+?>//g;# HTML タグを削除 # 日記部分であり、かつ検索パターンにマッチすると # マッチした部分を赤いフォントに設定して、 # 日付、ファイル名、フラグメント、主題をキーに格納する if($insw == 1 && $line =~ /$kw/io){ while($line =~ s/(>[^><]*)($kw)(?!<\/font>)/$1$2<\/font>/i){ ; } if($line !~ /[<>]/){ $line =~ s/($kw)/$1<\/font>/ig; } $count++; $anchor{"$date\t$dfile$category\t$subject"} .= "

($count) $line

\n"; } } } # CGI HTML 先頭部分の出力 print < $title $siteimage$title
HERE1 # マッチした記事部分を整理して、HTML 出力 foreach $key (sort keys(%anchor)){ ($date,$link,$subject) = split(/\t/,$key); # メモるシステム連動のための追加 [2004-11-07] $date_encoding = &juri_encode($date); $rnurl_encoding = &juri_encode("${siteurl}$link"); $subject_encoding = &juri_encode($subject); print "
$date: $subjectメモ作成
\n"; ### print $anchor{$key}; print "
\n"; } # CGI 終了部分出力 print <

$sitename >>
<$mailaddress>

HERE2 # Jperl用URLエンコーディング sub juri_encode{ my($str) = @_; $str =~ s/([^a-z0-9\-_.!*'\(\)~ ])/length($1) == 2 ? sprintf "%%%1s%1s%%%1s%1s", split("",unpack("H4", $1)) : sprintf "%%%02X", ord($1)/egi; $str =~ tr/ /+/; return $str; }