#!/usr/bin/perl # $Id: search.cgi,v 2.0 2004/03/14 11:12:27 naohito Exp $ # # JPS イベント検索スクリプト 検索部 # http://planetarium.jp # # スクリプト開発: 福原直人 (http://news.local-group.jp/) # JPS用に改変:渡部義弥 (http://planetarium.jp/ # 2005 年火星用にさらに改変:渡部義弥 (http://planetarium.jp/ $datafile = 'mars2005.csv'; @regiontable = ( '全て', '北海道', '東北', '関東', '中部', '近畿', '中国', '四国', '九州' ); @areatable = ( '全て', '北海道', '青森県', '岩手県', '秋田県', '山形県', '宮城県', '福島県', '栃木県', '埼玉県', '茨城県', '群馬県', '千葉県', '東京都', '神奈川県', '新潟県', '富山県', '長野県', '山梨県', '静岡県', '石川県', '岐阜県', '愛知県', '福井県', '滋賀県', '三重県', '京都府', '大阪府', '奈良県', '和歌山県', '兵庫県', '鳥取県', '岡山県', '島根県', '広島県', '山口県', '徳島県', '愛媛県', '香川県', '高知県', '福岡県', '大分県', '佐賀県', '長崎県', '熊本県', '宮崎県', '鹿児島県', '沖縄県' ); @categorytable = ( '全て', 'プラネタリウム', '天体観望会', '講座・教室', '講演会', '展示', 'その他' ); sub sanitize { local ($item) = @_; $item =~ s/&/&/g; $item =~ s/"/"/g; $item =~ s//>/g; return $item; } require 'jcode.pl'; use CGI; $cgi = new CGI; @selectedRegion = $cgi->param("region"); @selectedArea = $cgi->param("area"); $selectedCategory = $cgi->param('category'); $selectedTime = $cgi->param('time'); $startTimeYY = $cgi->param('startyear'); $startTimeMM = $cgi->param('startmonth'); $startTimeDD = $cgi->param('startday'); $endTimeYY = $cgi->param('endyear'); $endTimeMM = $cgi->param('endmonth'); $endTimeDD = $cgi->param('endday'); $selectedStartTime = "$startTimeYY$startTimeMM$startTimeDD"; $selectedEndTime = "$endTimeYY$endTimeMM$endTimeDD"; $sbmt = $cgi->param('submit'); if ($sbmt eq ''){ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $mon++; $year += 1900; $startTimeYY = sprintf("%04d", $year); $startTimeMM = sprintf("%02d", $mon); $startTimeDD = sprintf("%02d", $mday); } $regionlist = ''; foreach $item (@regiontable){ if (grep (/$item/, @selectedRegion)){ $regionlist .= qq|\n|; } else { $regionlist .= qq|\n|; } } $arealist = ''; foreach $item (@areatable){ if (grep (/$item/, @selectedArea)){ $arealist .= qq|\n|; } else { $arealist .= qq|\n|; } } $categorylist = ''; foreach $item (@categorytable){ if ($item eq $selectedCategory){ $categorylist .= "\n"; } else { $categorylist .= "\n"; } } if ($startTimeYY eq '0000'){ $startYYlist = qq|\n|; } else { $startYYlist = qq|\n|; } for($i=2005; $i<2005; $i++){ $year = sprintf("%04d", $i); if ($startTimeYY eq $year){ $startYYlist .= "\n"; } else { $startYYlist .= "\n"; } } if ($startTimeMM eq '00'){ $startMMlist = qq|\n|; } else { $startMMlist = qq|\n|; } for($i=9; $i<13; $i++){ $month = sprintf("%02d", $i); if ($startTimeMM eq $month){ $startMMlist .= "\n"; } else { $startMMlist .= "\n"; } } if ($startTimeDD eq '00'){ $startDDlist = qq|\n|; } else { $startDDlist = qq|\n|; } for($i=1; $i<32; $i++){ $day = sprintf("%02d", $i); if ($startTimeDD eq $day){ $startDDlist .= "\n"; } else { $startDDlist .= "\n"; } } if ($endTimeYY eq '9999'){ $endYYlist = qq|\n|; } else { $endYYlist = qq|\n|; } for($i=2005; $i<2005; $i++){ $year = sprintf("%04d", $i); if ($endTimeYY eq $year){ $endYYlist .= "\n"; } else { $endYYlist .= "\n"; } } if ($endTimeMM eq '99'){ $endMMlist = qq|\n|; } else { $endMMlist = qq|\n|; } for($i=9; $i<13; $i++){ $month = sprintf("%02d", $i); if ($endTimeMM eq $month){ $endMMlist .= "\n"; } else { $endMMlist .= "\n"; } } if ($endTimeDD eq '99'){ $endDDlist = qq|\n|; } else { $endDDlist = qq|\n|; } for($i=1; $i<32; $i++){ $day = sprintf("%02d", $i); if ($endTimeDD eq $day){ $endDDlist .= "\n"; } else { $endDDlist .= "\n"; } } #### ヘッダ出力 ##### print < 2005年火星接近関連プラネタリウム・観望会・イベント検索

2005年火星接近関連プラネタリウム・観望会・イベント検索

EOF #### 検索フォーム出力 #### print <項目を選択して「検索」ボタンを押してください。

地域(複数選択可能)
ジャンル
時期
日から
日まで
EOF #### 検索結果出力 ### if ($sbmt ne ''){ $query = $ENV{'QUERY_STRING'}; ## 注意書き ## print <

検索結果

タイトルをクリックすると各イベントの詳細な情報が表示されます。
イベントへの参加にあたっては、主催者に電話等でご確認ください。

EOF open(IN,$datafile); $dmy = ; # 先頭行はフィールド名なので読み捨て $id = 1; $count = 0; while(my $line = ){ $line .= while ($line =~ tr/"// % 2 and !eof(IN)); $line = jcode'euc($line); $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/; @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_} ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); ($category, $source, $title, $gaiyo, $startdate, $enddate, $starttime, $kaijo{'name'}, $region, $kaijo{'zip'}, $area, $kaijo{'address'}, $mousikomi, $houto, $payment, $ninzu, $tanto{'name'}, $tanto{'tel'}, $url, $remark, $serial, ) = @values; $categoryMatch = 'no'; $regionMatch = 'no'; $timeMatch = 'no'; if ($selectedRegion[0] eq '') { $reagionMatch = 'yes'; } elsif (grep(/全て/,@selectedRegion)) { $regionMatch = 'yes'; } elsif (grep (/$region/, @selectedRegion)) { $regionMatch = 'yes' } if ($selectedCategory eq '' || $selectedCategory eq '全て' || $category eq $selectedCategory){ $categoryMatch = 'yes'; } $timeMatch = 'no'; if ($enddate eq ''){ $enddate = $startdate; } '0000年00月00日' =~ /([0-9]+)年([0-9]+)月([0-9]+)日/; $startdate =~ /([0-9]+)年([0-9]+)月([0-9]+)日/; $sdate = sprintf("%04d%02d%02d", $1, $2, $3); '9999年99月99日' =~ /([0-9]+)年([0-9]+)月([0-9]+)日/; $enddate =~ /([0-9]+)年([0-9]+)月([0-9]+)日/; $edate = sprintf("%04d%02d%02d", $1, $2, $3); if ($sdate <= $selectedEndTime && $edate >= $selectedStartTime){ $timeMatch = 'yes'; } if ($regionMatch eq 'yes' && $categoryMatch eq 'yes' && $timeMatch eq 'yes'){ $count++; if ($startdate eq $enddate){ $date = "$startdate"; } else { $date = "$startdate-$enddate"; } $title = sanitize($title); $category = sanitize($category); $region = sanitize($region); $date = sanitize($date); $starttime = sanitize($starttime); $endtime = $starttime; $kaijo{'name'} = sanitize($kaijo{'name'}); print < EOF } $id++; } } if ($count eq ''){ $msg = q|

|; } elsif ($count == 0){ $msg = '

該当するイベント情報はありませんでした。
地域・ジャンル・時期を選びなおして下さい

'; } else { $msg = qq|

全$count件のイベントを検索しました。


日本プラネタリウム協会

|; } ### フッタ出力 ### print < $msg

プログラム提供 福原直人 (星が好きな人のための新着情報)
日本プラネタリウム協会にて改変)

EOF
ジャンル タイトル 日程 会場
$category $title $date $kaijo{'name'}
$area$kaijo{'address'}