#!/usr/bin/perl #↑環境にあわせて変更してください #-------------------------------- # 日記、更新記録用CGIスクリプト $var = '切って出し日記 Ver1.4'; # maked by wagona 2001.04.30 $mastar = 'http://kami-no.megumi.org/wagona/cgi-plant/'; #-------------------------------- require "jcode.pl"; # 日本語ライブラリへのパス $adminpass = 'gakuho0700'; # 管理者用パスワード $homeurl = 'http://www.fukushi-hiroba.com/gakudo/'; # ホームページのURL $pagemax = 4; # ログ記録件数(通常の表示件数) # この件数を超えると古い記事は過去ログに移されます $logmax = 0; # 過去ログの自動削除 0:自動削除はしない /1〜:指定月数を越えた過去ログは削除 /-1:過去ログを作らない $cginame = 'kd_diary.cgi'; # このCGIファイルの名前 $logfile = 'kd_diary.log'; # 記録ファイル名 $logdir = 'old'; # 過去ログ格納ディレクトリ名 $skinfile = 'skin.html'; # 表示用参照SKINファイル $htmlfile = 'kd_diary.html'; # 出力HTMLファイル $inifile = 'kd_diary.txt'; # 設定ファイル ### 最新記事の切り出しに関する設定 ### # 最新記事の切り出し方式 $newmode = 1; # 0:切り出ししない # 1:外部Javascriptとして切り出し # 2:SSI読みこみ用に切り出し # 最新記事の切り出し件数 $newput = 1; $skin_exfile = 'skin_ex.html'; # 切り出し専用SKINファイル $newjsfile = 'kd_diary.js'; # 最新記事切り出しJavaScriptファイル $newhtmlfile = 'kd_diary_new.txt'; # 最新記事切り出しHTMLファイル ### 編集フォーム関する設定 ### # 編集画面のBODYの設定 # 編集画面は管理人しか入れないので凝ってもあまり意味ないです $bodytag = <<"_BODYTAG"; _BODYTAG $form_size_x = 80; # 編集フォーム(本文)のカラム数(横幅) $form_size_y = 10; # 編集フォーム(本文)の行数 $titleform =1; # タイトル欄 0:不要/1:使用する $tag_opt = 1; # コメントとタイトルのタグ入力を 0:許可 / 1:無効化 $auto_link = 4; # 自動リンクの設定(http://〜のリンク化) tag_opt=1 のときだけ有効です # 0:リンクにしない # 1:リンクにする (tagert="_self") # 2:リンクにする (tagert="_parent") # 3:リンクにする (tagert="_top") # 4:リンクにする (tagert="_blank") ### 曜日に関する設定 ### # 曜日の表記・・・曜日の表示を変更したい場合は下の行の曜日名を書き換えてください @youbi = ('日','月','火','水','木','金','土'); #↑日本語にした例(行頭の「#」を削除すればこちらが有効になります) # 曜日の色・・・色コードの16進数を書き換えて下さい(並びは@youbiと同じです) @youbicolor = ('#FF0000','#000000','#000000','#000000','#000000','#000000','#0000ff'); # バージョンアップの設定 # ver 1.0 からバージョンアップした場合「1」にしてください $log_exc = 0; # ヘッダ&広告バナー # 編集画面のヘッダ部分と広告バナー表示の設定 # (通常の日記表示画面はSKIN.HTMLで設定します) ### 〜に挿入する内容 ### やスタイルシート等にご使用ください $in_header = <<"__HEAD"; 切って出し日記 __HEAD ### 直後に挿入する内容 $in_banner1 = <<"__BANNER1"; __BANNER1 ### 直前に挿入する内容 $in_banner2 = <<"__BANNER2"; __BANNER2 ##ここから下を変更した場合はサポート範囲外となります ########################################## # ########################################## $skipmark_s = '%-'; $skipmark_e = '-%'; &formdecode; @facetbl = (); %facename = (); @weathertbl = (); %wethername = (); @colortbl_1 = (); %colorname_1 = (); @colortbl_2 = (); %colorname_2 = (); open(ICONFILE, $inifile) || &error('設定ファイル異常'); @IN = ; close(ICONFILE); for($ix=0;;$ix++) { $IN[$ix] =~ s/\r//g; $IN[$ix] =~ s/\n//g; if( $IN[$ix] =~ /_end_of_face_icon_/) {last;} ($facetbl[$ix],$wk_name) = split(/\,/,$IN[$ix]); $facename{$facetbl[$ix]} = $wk_name; if($IN[$ix] eq '') {&error('アイコン情報ファイル内容不正');} } ($dummy,$icon_face,$icon_face_name) = split(/,/,$IN[$ix]); for($ix++,$jx=0;;$ix++,$jx++) { $IN[$ix] =~ s/\r//g; $IN[$ix] =~ s/\n//g; if( $IN[$ix] =~ /_end_of_weather_icon_/) {last;} ($weathertbl[$jx],$wk_name) = split(/\,/,$IN[$ix]); $weathername{$weathertbl[$jx]} = $wk_name; if($IN[$ix] eq '') {&error('設定ファイル内容不正');} } ($dummy,$icon_weather,$icon_weather_name) = split(/,/,$IN[$ix]); for($ix++,$jx=0;;$ix++,$jx++) { $IN[$ix] =~ s/\r//g; $IN[$ix] =~ s/\n//g; if( $IN[$ix] =~ /_end_of_color_info_1_/) {last;} ($colortbl_1[$jx],$wk_name) = split(/\,/,$IN[$ix]); $colorname_1{$colortbl_1[$jx]} = $wk_name; if($IN[$ix] eq '') {&error('設定ファイル内容不正');} } ($dummy,$color_opt_1,$color_opt_1_name) = split(/,/,$IN[$ix]); for($ix++,$jx=0;;$ix++,$jx++) { $IN[$ix] =~ s/\r//g; $IN[$ix] =~ s/\n//g; if( $IN[$ix] =~ /_end_of_color_info_2_/) {last;} ($colortbl_2[$jx],$wk_name) = split(/\,/,$IN[$ix]); $colorname_2{$colortbl_2[$jx]} = $wk_name; if($IN[$ix] eq '') {&error('設定ファイル内容不正');} } ($dummy,$color_opt_2,$color_opt_2_name) = split(/,/,$IN[$ix]); $def_comment=''; for($ix++,$jx=0;;$ix++,$jx++) { if( $IN[$ix] =~ /_end_of_default_comment_/) {last;} $def_comment .= $IN[$ix]; if($IN[$ix] eq '') {&error('設定ファイル内容不正');} } if($kind eq 'admin') { if($password ne $adminpass) {&error('パスワードが違います')} &mentview; } elsif ($kind eq 'reg') { ® } elsif ($kind eq 'del') { &deleate; } elsif ($kind eq 'log') { &logview; } #表示ファイルに戻る &location; exit; ########################################## # 記事編集 ########################################## sub mentview { &logread($logfile); $v_comment = $def_comment; $v_face = ''; $v_weather = ''; $f_date = $ed_date; $f_date = &wdayget($f_date); $dt_flg = 0; foreach $line (@LOGDATA) { ($l_date,$l_comment,$l_face,$l_weather,$l_color_1,$l_color_2,$l_title) = split(/<>/,$line); if($l_date eq $ed_date) { $v_comment = $l_comment; $v_comment =~ s/
/\n/g; $v_face = $l_face; $v_weather = $l_weather; $v_color_1 = $l_color_1; $v_color_2 = $l_color_2; $v_title = $l_title; $v_title =~ s/
/\n/g; $dt_flg = 1; last; } } if($dt_flg == 0) { if($ed_date lt $l_date) {&error('現行ログより過去の日付は編集できません');} } if($v_face eq '') { $v_face = $facetbl[0]; } if($v_weather eq '') { $v_weather = $weathertbl[0]; } if($v_color_1 eq '') { $v_color_1 = $colortbl_1[0]; } if($v_color_2 eq '') { $v_color_2 = $colortbl_2[0]; } print "Content-type:text/html\n\n"; print "\n\n"; print "$in_header\n"; print "\n"; print "$bodytag\n"; print "$in_banner1\n"; print "
\n"; print "$f_date の記事編集\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; if($icon_face == 1) { print "\n"; } elsif($icon_face == 2) { print "\n"; } if($icon_weather == 1) { print "\n"; } elsif($icon_weather==2) { print "\n"; } if($color_opt_1 == 1) { print "\n"; } elsif ($color_opt_1 == 2) { print "\n"; } if($color_opt_2 == 1) { print "\n"; } elsif ($color_opt_2 == 2) { print "\n"; } if($titleform) { print "\n"; } print "\n"; print "
$icon_face_name\n"; foreach $img (@facetbl) { if($v_face eq $img) { print "\n"; } else { print "\n"; } } print "
$icon_face_name
$icon_weather_name\n"; foreach $img (@weathertbl) { if($v_weather eq $img) { print "\n"; } else { print "\n"; } } print "
$icon_weather_name
$color_opt_1_name\n"; foreach $c_code (@colortbl_1) { if($v_color_1 eq $c_code) { print "\n"; } else { print "\n"; } } print "
$color_opt_1_name
$color_opt_2_name\n"; foreach $c_code (@colortbl_2) { if($v_color_2 eq $c_code) { print "\n"; } else { print "\n"; } } print "
$color_opt_2_name
タイトル
コメント\n"; if($newmode > 0) { print "
「$skipmark_s , $skipmark_e」で挟んだ部分は切り出しの対象外となります\n"; } print "
"; if($dt_flg == 1) { print " "; } print "


\n
\n"; print "$in_banner2\n"; print "\n"; exit; } ########################################## # ログデータ書きこみ ########################################## sub reg { if($comment eq '') {&error('コメントが入力さていません');} &logread($logfile); $f_date = $ed_date; $f_date = &wdayget($f_date); $line_no = -1; for($ix=0 ; $ix <= $#LOGDATA ; $ix++) { ($l_date,$l_comment,$l_face,$l_weather,$l_color_1,$l_color_2,$l_title) = split(/<>/,$LOGDATA[$ix]); if($l_date eq $ed_date) { $line_no = $ix ; last; } } if($line_no >= 0) { splice(@LOGDATA,$line_no,1); } $line = join '<>',($ed_date,$comment,$face,$weather,$color_1,$color_2,$title) ; unshift(@LOGDATA,$line); @LOGDATA = sort sorter1 @LOGDATA; if($#LOGDATA >= $pagemax) { $log_data = pop(@LOGDATA); if($logmax >= 0) { ($l_date,$l_comment,$l_face,$l_weather,$l_color_1,$l_color_2,$l_title) = split(/<>/,$log_data); $log_name = $logdir .'/'. substr($l_date,0,4) . substr($l_date,4,2) . '.log'; open(OLD,"$log_name"); @oldLOG = ; close(OLD); unshift(@oldLOG,"$log_data\n"); sort sorter1 @oldLOG; open(OLD,"> $log_name")|| &error('過去ログファイル/ディレクトリ異常'); print OLD @oldLOG; close(OLD); } } if($logmax > 0) { opendir(DIR,"$logdir") || &error('過去ログ格納ディレクトリがありません'); @dirent = grep(/[0-9]+\.log/,readdir(DIR)); @dirent_s = sort(@dirent); @dirent = reverse(@dirent_s); closedir(DIR) ; if($#dirent >= $logmax) { unlink ("$logdir\/$dirent[$#dirent]")|| &error("過去ログ($logdir\/$dirent[$#dirent])が削除できませんでした"); } } open(LOGFILE,"> $logfile"); foreach $line (@LOGDATA) { print LOGFILE "$line\n"; } close(LOGFILE); &htmlout; if($newmode == 1) { &jsput} elsif($newmode == 2) { &textput} } ########################################## # ログ削除 ########################################## sub deleate { &logread($logfile); $f_date = $ed_date; $f_date = &wdayget($f_date); $line_no = -1; for($ix=0 ; $ix <= $#LOGDATA ; $ix++) { ($l_date,$l_comment,$l_face,$l_weather,$l_color_1,$l_color_2,$l_title) = split(/<>/,$LOGDATA[$ix]); if($l_date eq $ed_date) { $line_no = $ix ; last; } } if($line_no >= 0) { splice(@LOGDATA,$line_no,1); } open(LOGFILE,"> $logfile")|| &error('ログファイル異常'); foreach $line (@LOGDATA) { print LOGFILE "$line\n"; } close(LOGFILE); &htmlout; if($newmode == 1) { &jsput} } ########################################## # ########################################## sub sorter1 { ($date1,$dummy1) = split(/<>/,$a); ($date2,$dummy2) = split(/<>/,$b); if($date1 lt $date2) {return (1)}; if($date1 eq $date2) {return (0)}; return (-1); } ########################################## # 現行ログのHTML化 ########################################## sub htmlout { &htmlmake; open(HTML,"> $htmlfile") || &error('HTMLファイル異常'); print HTML $html_msg; close(HTML); } ########################################## # 過去ログの表示 ########################################## sub logview { if($oldlog eq 'now') {&location}; &logread("$logdir\/$oldlog"); &htmlmake; print "Content-type:text/html\n\n"; print $html_msg; exit; } ########################################## # ログをHTML形式に編集 ########################################## sub htmlmake { $html_msg = ''; open(SKINFILE,$skinfile) || &error('SKINファイル異常'); @SKINDATA = ; close(SKINFILE); if($logmax >= 0) { opendir(DIR,"$logdir") || &error('過去ログ格納ディレクトリがありません'); @dirent = grep(/[0-9]+\.log/,readdir(DIR)); closedir(DIR) ; @dirent_s = sort(@dirent); @dirent = reverse(@dirent_s); $logsel = "\n"; } $copyright = "$var CGI-PLANT"; if($tag_opt == 1) { if($auto_link == 1) { $wk_target = "target=\"_self\"";} if($auto_link == 2) { $wk_target = "target=\"_parent\"";} if($auto_link == 3) { $wk_target = "target=\"_top\"";} if($auto_link == 4) { $wk_target = "target=\"_blank\"";} } for($ix=0 ; $ix <= $#SKINDATA ; $ix++) { $SKINDATA[$ix] =~ s/\n//g; $SKINDATA[$ix] =~ s/\r//g; if($SKINDATA[$ix] =~ //) { for($ix++ ; $SKINDATA[$ix] !~ // ; $ix++) { $SKINDATA[$ix] =~ s/\n//g; $SKINDATA[$ix] =~ s/\r//g; push(@ENTRY,$SKINDATA[$ix]); } foreach $line (@LOGDATA) { ($date,$comment,$face,$weather,$color_1,$color_2,$title) = split(/<>/,$line); if($newmode > 0 ) { $comment =~ s/$skipmark_s//g; $comment =~ s/$skipmark_e//g; } if($tag_opt == 1 && $auto_link > 0 ) { $comment =~ s|(http://[^\<]+)|$1|g; } if($tag_opt == 1 && $auto_link > 0 ) { $title =~ s|(http://[^\<]+)|$1|g; } $date = &date_form($date); @ENTRYW = @ENTRY; foreach $w_line (@ENTRYW) { $w_line =~ s/XX_DATE/$date/i; $w_line =~ s/XX_COMMENT/$comment/i; $w_line =~ s/XX_TITLE/$title/i; if($icon_face > 0 ) { $w_line =~ s/XX_FACE_S/$face/i; $w_line =~ s/XX_FACE/$facename{$face}/i; } if($icon_weather > 0 ) { $w_line =~ s/XX_WEATHER_S/$weather/i; $w_line =~ s/XX_WEATHER/$weathername{$weather}/i; } if($color_opt_1 > 0 ) { $w_line =~ s/XX_COLOR_1/$color_1/i; } if($color_opt_2 > 0 ) { $w_line =~ s/XX_COLOR_2/$color_2/i; } $html_msg .= "$w_line\n"; } } } else { $SKINDATA[$ix] =~ s/XX_HOME/$homeurl/i; $SKINDATA[$ix] =~ s/XX_LOGSELECT/$logsel/i; $SKINDATA[$ix] =~ s/XX_COPYRIGHT/$copyright/i; $html_msg .= "$SKINDATA[$ix]\n"; } } } ########################################## # 日付に色を付ける ########################################## sub date_form { $f_date = $_[0]; $f_date = &wdayget($f_date); if(! @youbicolor) {return $f_date;} ($wk_date,$yo_bi) = split(/[\(\)]/,$f_date); $color_date = $wk_date . "(" . "$yo_bi" . ")"; return $color_date; } ########################################## # 最新ログを外部Javascriptに出力 ########################################## sub jsput { open(JS,"> $newjsfile")|| &error("$newjsfile:作成失敗"); if ($skin_exfile) {&read_exskin;} for($ix=0 ; $ix < $newput && $LOGDATA[$ix]; $ix++) { ($date,$comment,$face,$weather,$color_1,$color_2,$title) = split(/<>/,$LOGDATA[$ix]); $comment =~ s/$skipmark_s[^$skipmark_s]*$skipmark_e//g; if($tag_opt == 1 && $auto_link > 0) { $comment =~ s|(http://[^\<]+)|$1|g; $title =~ s|(http://[^\<]+)|$1|g; } $date = &date_form($date); @ENTRYW = @ENTRY; foreach $w_line (@ENTRYW) { $w_line =~ s/\n//g; $w_line =~ s/\r//g; $w_line =~ s/XX_DATE/$date/i; $w_line =~ s/XX_COMMENT/$comment/i; $w_line =~ s/XX_TITLE/$title/i; if($icon_face > 0 ) { $w_line =~ s/XX_FACE_S/$face>/i; $w_line =~ s/XX_FACE/$facename{$face}/i; } if($icon_weather > 0 ) { $w_line =~ s/XX_WEATHER_S/$weather/i; $w_line =~ s/XX_WEATHER/$weathername{$weather}/i; } if($color_opt_1 > 0 ) { $w_line =~ s/XX_COLOR_1/$color_1/i; } if($color_opt_2 > 0 ) { $w_line =~ s/XX_COLOR_2/$color_2/i; } $w_line =~ s/\'/\\\'/g; print JS "document.write(\'$w_line\');\n"; } } close(JS); } ########################################## # 最新ログをテキストファイルに出力 ########################################## sub textput { open(NHTML,"> $newhtmlfile")|| &error("$newhtmlfile:作成失敗"); if ($skin_exfile) {&read_exskin;} for($ix=0 ; $ix < $newput && $LOGDATA[$ix]; $ix++) { ($date,$comment,$face,$weather,$color_1,$color_2) = split(/<>/,$LOGDATA[$ix]); $comment =~ s/$skipmark_s[^$skipmark_s]*$skipmark_e//g; if($tag_opt == 1 && $auto_link > 0) { $comment =~ s|(http://[^\<]+)|$1|g; $title =~ s|(http://[^\<]+)|$1|g; } $date = &date_form($date); @ENTRYW = @ENTRY; foreach $w_line (@ENTRYW) { $w_line =~ s/\n//g; $w_line =~ s/\r//g; $w_line =~ s/XX_DATE/$date/i; $w_line =~ s/XX_COMMENT/$comment/i; $w_line =~ s/XX_TITLE/$title/i; if($icon_face > 0 ) { $w_line =~ s/XX_FACE_S/$face>/i; $w_line =~ s/XX_FACE/$facename{$face}/i; } if($icon_weather > 0 ) { $w_line =~ s/XX_WEATHER_S/$weather/i; $w_line =~ s/XX_WEATHER/$weathername{$weather}/i; } if($color_opt_1 > 0 ) { $w_line =~ s/XX_COLOR_1/$color_1/i; } if($color_opt_2 > 0 ) { $w_line =~ s/XX_COLOR_2/$color_2/i; } print NHTML "$w_line\n"; } } close(NHTML); } ########################################## # 切り出し専用SKIN読みこみ ########################################## sub read_exskin { undef @ENTRY; $flag=0; open (EXSKINFILE,$skin_exfile) || &error('SKINファイル(ex)異常'); while () { if(!$flag && $_ =~ //) { $flag = 1; next; } else { if($_ =~ //) {last;} push(@ENTRY,$_) if($flag); } } close EXSKINFILE; } ########################################## # ログデータ読みこみ ########################################## sub logread { open(LOGFILE, $_[0]) || &error('ログファイル異常'); @LOGDATA = ; close(LOGFILE); foreach $line (@LOGDATA) { $line =~ s/\r//g; $line =~ s/\n//g; if($log_exc == 1) { ($l_date,$l_wk) = split(/<>/,$line,2); if(length($l_date)>8) { $ss_date = substr($l_date,0,4).substr($l_date,5,2).substr($l_date,8,2); $line = $ss_date.'<>'.$l_wk.'<>'; } } } } #################### # 表示ファイルに移動 #################### sub location { # IISサーバ対応 if ($ENV{PERLXS} eq "PerlIS") { print "HTTP/1.0 302 Temporary Redirection\r\n"; print "Content-type: text/html\n"; } print "Location: $htmlfile\n\n"; } ########################################## # ########################################## sub formdecode { 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; if($tag_opt == 1) { $value =~ s//>/g; $value =~ s/"/"/g; } $value =~ s/\r\n/
/g; $value =~ s/\r//g; $value =~ s/\n//g; $value =~ s/\*//g; $value =~ s/,//g; $value =~ s/^//g; $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $FORM{$name} = $value; } $kind = $FORM{'kind'}; $password = $FORM{'password'}; $logname = $FORM{'logname'}; if($FORM{'date'}) { $ed_date = $FORM{'date'}; } else { $ed_date = $FORM{'ed_y'} . $FORM{'ed_m'} . $FORM{'ed_d'}; } $comment= $FORM{'comment'}; $face = $FORM{'face'}; $weather = $FORM{'weather'}; $color_1 = $FORM{'color_1'}; $color_2 = $FORM{'color_2'}; $title = $FORM{'title'}; $oldlog = $FORM{'logfile'}; } #################### # 曜日の取得 #################### sub wdayget { local($f_date) = $_[0]; local($year,$mon,$day,$week) = (substr($f_date,0,4),substr($f_date,4,2),substr($f_date,6,2),0); if ($mon < 3) { $year--; $mon += 12; } $week = (int($year) + int($year/4) - int($year/100) + int($year/400) + int(($mon*13+8)/5) + $day) % 7; local($year,$mon) = (substr($f_date,0,4),substr($f_date,4,2)); $f_date = $mon.'月'.$day.'日'.$year.'年'."($youbi[$week])"; return $f_date; } #################### # ERROR #################### sub error { print "Content-type:text/html\n\n"; print "\n\n$in_header\n\n\n$in_banner1\n
\n\n"; print "ERROR!!($_[0])\n"; print "
\n$in_banner2\n\n\n"; exit; }