#!/usr/local/bin/perl #↑1行目にサーバへ設置されているPerlのパスを設定してください。 #不明な場合にはサーバ管理者へ問い合わせてください。 #(このスクリプトはPerl5で書かれています。) ## ## このファイルについて ## 「管理ページ実行ファイル」 ## #---------------------------------------------------------------------------# #初期設定ファイルini.cgiを要求 require( "./ini.cgi" ); #カレンダー処理ライブラリap_calender.plを要求 require( $LIB_DIR."/ap_calender.pl" ); #入力データ解析 my %in = (); &parse_params( \%in ); #表示する月 my %g_cal = (); #表示レコード my @g_rows = (); #保存されている月 my @g_files = (); #処理開始 &start(); ## 処理開始 ## @return void sub start { if( exists( $in{'mode'} ) && ($in{'mode'} eq 'info') ) { require( $LIB_DIR."appinfo.pl" ); &appinfo::display(); } #未定義のパラメータを設定 my ( $n_y, $n_m, $n_d ) = &get_date(); $in{'this_y'} = $n_y; $in{'this_m'} = $n_m; #モード if( !exists( $in{'mode'}) ) { $in{'mode'} = "month"; $in{'def_page'} = 1; } #ページ if( !exists( $in{'page'}) ) { $in{'page'} = 1; } $in{'page'} = int $in{'page'}; #年 if( !exists( $in{'y'}) ) { $in{'y'} = $n_y; } #月 if( !exists( $in{'m'}) ) { $in{'m'} = $n_m; } #日 if( !exists( $in{'d'}) ) { $in{'d'} = $n_d; } #パラメータを検査 if( !( int $in{'page'} >= 1 ) || (($in{'y'} !~ /\d/) || ($in{'y'} =~ /\D/) ) || (($in{'m'} !~ /\d/) || ($in{'m'} =~ /\D/) ) || (($in{'d'} !~ /\d/) || ($in{'d'} =~ /\D/) ) || !( int $in{'y'} >= 1971 ) || !( int $in{'m'} >= 1 ) || !( int $in{'m'} <= 12 ) || !( int $in{'d'} >= 1 ) || !( int $in{'d'} <= 31 ) ) { &error( 'そのリクエストは認識できません。' ); } $in{'page'} = int $in{'page'}; $in{'y'} = int $in{'y'}; $in{'m'} = int $in{'m'}; $in{'d'} = int $in{'d'}; #前月の情報を設定 &set_monthinfo(); #モードで処理を振り分ける if( $in{'mode'} eq "month" ) { &do_month_mode(); } elsif( $in{'mode'} eq "day" ) { &do_day_mode(); } else { &error( 'そのリクエストは認識できません。' ); } exit(0); } ## 月間の記事閲覧 ## @return void sub do_month_mode { #ロック &lock(); #記事ファイル名を読む &check_datafilenames(); #記事ファイルを開き読む &read_recs_month( $in{'y'}, $in{'m'} ); &read_recs_month( $in{'last_y'}, $in{'last_m'} ); #ファイルを閉じる close( RECS ); #ロック解除 &unlock(); #HTTPレスポンスヘッダとHTMLヘッダ &print_http_header(); &print_header(); print "\n"; print "\n"; #左ここから print "\n"; print "\n"; print "
\n"; &print_calender( $in{'y'}, $in{'m'} ); &print_calender( $in{'last_y'}, $in{'last_m'} ); #カレンダー下 &print_menu(); #左ここまで print " \n"; #表示情報 my $pageinfo = &get_pageinfo(); print $in{'y'}."年".$in{'m'}."月〜"; print $in{'last_y'}."年".$in{'last_m'}."月"; print "分を表\示しています。$pageinfo\n"; #print "$BOUNDARY\n"; #レコードを書き出す my $rec_cnt = $PAGE_RECS; my $begin = $PAGE_RECS * ( $in{'page'} - 1 ); for( my $i = $begin; $i < @g_rows; $i++ ) { if( !$rec_cnt-- ) { last; } &parse_rec( $g_rows[$i] ); &print_rec(); } print "

\n"; #ページ移動リンク &print_pagelink(); #HTMLフッタ &print_footer(); exit(0); } ## 日の記事閲覧 ## @return void sub do_day_mode { #ロック &lock(); #記事ファイル名を読む &check_datafilenames(); #記事ファイルを開き読む &read_rec_day( $in{'y'}, $in{'m'}, $in{'d'} ); &read_rec_day( $in{'last_y'}, $in{'last_m'}, $in{'d'} ); #ファイルを閉じる close( RECS ); #ロック解除 &unlock(); #HTTPレスポンスヘッダとHTMLヘッダ &print_http_header(); &print_header(); print "\n"; print "\n"; #左ここから print "\n"; print "\n"; print "
\n"; &print_calender( $in{'y'}, $in{'m'} ); &print_calender( $in{'last_y'}, $in{'last_m'} ); #カレンダー下 &print_menu(); #左ここまで print " \n"; #表示情報 my $pageinfo = &get_pageinfo(); print $in{'y'}."年".$in{'m'}."月".$in{'d'}."日"; print "分を表\示しています。$pageinfo\n"; #print "$BOUNDARY\n"; #レコードを書き出す my $rec_cnt = $PAGE_RECS; my $begin = $PAGE_RECS * ( $in{'page'} - 1 ); for( my $i = $begin; $i < @g_rows; $i++ ) { if( !$rec_cnt-- ) { last; } &parse_rec( $g_rows[$i] ); &print_rec(); } print "

\n"; #ページ移動リンク &print_pagelink(); #HTMLフッタ &print_footer(); exit(0); } ## ページ数を返す ## @return int ページ数 sub get_pages { my $pages = @g_rows; my $pages2 = int ( $pages / $PAGE_RECS ); if( ( $pages / $PAGE_RECS ) > $pages2 ) { $pages2++; } return $pages2; } ## ページ情報を返す ## @return string ページ情報 sub get_pageinfo { my $info = ""; my $pages = &get_pages(); if( $pages > 1 ) { $info = '('.$in{'page'}.'/'.$pages.')'; } return $info; } ## 記事を1件表示 ## @return void sub print_rec { my $tg_win = ""; #改行 if( $rec{'auto_ret'} ) { $rec{'content'} =~ s/\t/
/g; } #HTMLタグ if( $rec{'tag'} ) { $rec{'content'} =~ s/>/>/g; $rec{'content'} =~ s/</$2$3<\/a>/g; } #記事表示 print << "END_OF_DOC";

$rec{'headline'} $rec{'date'}
$rec{'content'}

END_OF_DOC return; } ## カレンダー下 ## @return void sub print_menu { print "

\n"; print "\n"; print "\n"; print "\t\n"; print "\t\n"; print "\n"; print "
前月翌月
\n"; if( @g_files > 0 ) { print "$BOUNDARY\n"; print "指定月+前月分\表\示

\n"; print join( "
\n", @g_files ); } print "$BOUNDARY\n"; print "$HOME_LINK

\n"; } ## ページリンク ## @return void sub print_pagelink { #ページ移動リンク my @plinks = (); if( $in{'page'} > 1 ) { $_ = $in{'page'} - 1; if( $in{'mode'} eq "month" ) { push @plinks, "←前へ" ; } elsif( $in{'mode'} eq "day" ) { push @plinks, "←前へ" ; } } if( @g_rows > ($in{'page'} * $PAGE_RECS) ) { $_ = $in{'page'} + 1; if( $in{'mode'} eq "month" ) { push @plinks, "次へ→" ; } elsif( $in{'mode'} eq "day" ) { push @plinks, "次へ→" ; } } if( @plinks ) { print join( " | \n", @plinks ); print "

\n"; } my $pages = &get_pages(); @plinks = (); for( my $i = 1; $i <= $pages; $i++ ) { if( $i == $in{'page'} ) { push @plinks, "$i"; } else { if( $in{'mode'} eq "month" ) { push @plinks, "$i" ; } elsif( $in{'mode'} eq "day" ) { push @plinks, "$i" ; } } } #2ページ以上なら表示 if( @plinks >= 2 ) { print join( " | \n", @plinks ); } } #---------------------------------------------------------------------------# ## 前月を設定 ## @return void sub set_monthinfo { #前月 if( $in{'m'} == 1 ) { $in{'last_m'} = 12; $in{'last_y'} = $in{'y'} - 1; } else { $in{'last_m'} = $in{'m'} - 1; $in{'last_y'} = $in{'y'}; } #翌月 if( $in{'m'} == 12 ) { $in{'next_m'} = 1; $in{'next_y'} = $in{'y'} + 1; } else { $in{'next_m'} = $in{'m'} + 1; $in{'next_y'} = $in{'y'}; } return; } ## データファイル名を読み ## ## @return void sub check_datafilenames { my @files = (); if( !opendir( DIR, $DATA_DIR ) ) { &error( 'データディレクトリアクセスエラー。', $DATA_DIR.'のパーミッションを確認してください。' ); } my $file = ""; while( $file = readdir( DIR ) ) { if( ($file =~ /^\./ ) || #.隠しファイルなどを無視 ($file =~ /^Icon/) || #MacOSXアイコン対策 ($file !~ /^d_.+/) ) { next; } push @files, $file; } close( DIR ); #新しい順 @files = sort { $b cmp $a } @files; #現在の年月日と比較 #パラメータの無い状態 my $n_file = "d_".$in{'y'}.'_'.sprintf("%02d",$in{'m'}).'.cgi'; #既存のファイルがあり、 #一番最近のファイルが過去の月なら、それをデフォルトで表示 if( exists $in{'def_page'} ) { if( (@files >= 1) && ( ($n_file cmp $files[0]) >= 1 ) ) { $in{'y'} = int substr( $files[0], 2, 4 ); $in{'m'} = int substr( $files[0], 7, 2 ); &set_monthinfo(); } } #保存されている月のリンク my $y_str = undef; my $m_str = undef; for( my $i = 0; $i < @files; $i++ ) { $y_str = substr( $files[$i], 2, 4 ); $m_str = int substr( $files[$i], 7, 2 ); push @g_files, "". "$y_str\年"."$m_str\月〜". "" ; } return; } ## 指定の月から2ヶ月分の記事を全件読み、 ## 指定の月と前月分に記事が存在する日付を調べる ## @param int 年 ## @param int 月 ## @return void sub read_recs_month { my( $tg_yaer, $tg_month ) = @_; $tg_month = sprintf("%02d",$tg_month); my $row = ""; my $file_name = $DATA_DIR.'d_'.$tg_yaer.'_'.$tg_month.'.cgi'; if( !open( IN, "<".$file_name ) ) { if( -e $file_name ) { &error( 'データアクセスエラー。' ); } } else { while( $row = readline( *IN ) ) { &parse_rec( $row ); $g_cal{$rec{'date'}} = 1; push @g_rows, $row; } close( IN ); } return; } ## 指定の日の記事を読み ## 指定の月と前月分に記事が存在する日付を調べる ## @param int 年 ## @param int 月 ## @param int 日 ## @return void sub read_rec_day { my( $tg_yaer, $tg_month, $tg_day ) = @_; $tg_month = sprintf("%02d",$tg_month); $tg_day2 = sprintf("%02d",$tg_day); my $row = ""; my $file_name = $DATA_DIR.'d_'.$tg_yaer.'_'.$tg_month.'.cgi'; my $date = $tg_yaer."/".$tg_month."/".$tg_day2; if( !open( IN, "<".$file_name ) ) { if( -e $file_name ) { &error( 'データアクセスエラー。' ); } } else { while( $row = readline( *IN ) ) { &parse_rec( $row ); $g_cal{$rec{'date'}} = 1; if( $rec{'date'} eq $date ) { push @g_rows, $row; } } close( IN ); } return; } ## 年と月を返す ## @param int タイムスタンプ ## @return int 4ケタの年 ## @return int 月 ## @return int 日 sub get_date { my( $time ) = @_; if( !defined( $time ) || $time eq "" ) { $time = time(); } my @tinfo = localtime( $time ); my $yaer = $tinfo[5] + 1900; my $month = $tinfo[4] + 1; my $day = $tinfo[3]; return $yaer, $month, $day; } ## カレンダーを出力 ## @param int 年 ## @param int 月 ## @return void sub print_calender { my( $year, $mon ) = @_; my $days = ap_calender::getDays( $year, $mon ); print "

\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; my $day = 1; my $col = 0; my $blank = 0; my $year_month = $year."/".sprintf("%02d",$mon)."/"; my $date = ""; while( $day <= $days ) { $col = 0; print "\n"; #一日の曜日調節 if( $day == 1 ) { $col = ap_calender::getWeek( $year, $mon, 1 ); $blank = $col; while( $blank > 0 ) { print "\n"; $blank--; } } while( $col < 7 ) { if( $day <= $days ) { $date = $year_month.sprintf("%02d",$day); if( exists $g_cal{$date} ) { print "\n"; } else { print "\n"; } $day++; $col++; } print "\n"; } print "
"; print $year."年".$mon."月"; print "
 "; print ""; print "$day"; } else { print ""; print "$g_cal{$day}\n"; print "$day"; } print " 
\n"; print "

\n"; print "

\n"; } ## この実行ファイルのHTTPレスポンスヘッダを出力 ## @return void sub print_http_header { #キャッシュ制御 print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; print "Expires: -1\n"; #ロボット用 print "Robots: index,follow\n"; #コンテンツ形 print "Content-Type: text/html;charset=Shift_JIS\n"; #コネクション print "Proxy-Connection: close\n"; print "Connection: close\n\n"; return; } ## HTMLヘッダを出力 ## @return void sub print_header { #サブタイトル my $sub_title = ""; if( $in{'mode'} eq "month" ) { $sub_title = " - ".$in{'y'}."年".$in{'m'}."月"."〜". $in{'last_y'}."年".$in{'last_m'}."月分". &get_pageinfo() ; } elsif( $in{'mode'} eq "day" ) { $sub_title = " - ".$in{'y'}."年".$in{'m'}."月".$in{'d'}."日分". &get_pageinfo() ; } my $style = $LIB_DOCS_ADDR.'style_index.css'; my $title_str = "$TITLE"; if( $TITLE_IMG ne "" ) { $title_str = ""; } print << "END_OF_DOC"; $TITLE$sub_title $title_str $BOUNDARY END_OF_DOC return; } ## HTMLフッタを出力 ## @return void sub print_footer { print "

\n"; if( $ADMIN_LINK ) { print "
"; print ""; print "管理用"; print "
\n"; } if( $LISENCE ne 'REGISTERED' ) { print "
"; print ""; print "$THIS_NAME $VERSION"; print "
\n"; } print "\n"; print "\n"; return; } 0;