#!/usr/local/bin/perl # Copyright (c) CGIROOM. http://www.cgiroom.nu #======================================================================# # [Ver 2.03.2s ] 簡易高機能検索専用データベース # # このプログラムによって起きた事にCGIROOMは責任を負いません。 # 利用契約に同意できない方のご利用は、遠慮下さい。 # #======================================================================# # 初期設定 #◆ jcode.plまでのパス require 'jcode.pl'; #◆ データファイルまでのパス # 何個でも増やして設定可能! $SEEK{'default'} = 'database.dat'; #◆ テンプレートファイル設定 # 何個でも増やして設定可能! $html{'default'} = 'html.htm'; $html{'list2'} = 'html2.htm'; $html{'list3'} = 'html3.htm'; #◆ 1ページ標準表示件数 $print_max = 10; #◆ 1ページ最大表示件数 $max_max = 20; #◆ タブ区切りファイルの場合は先頭の「#$tab」の「#」を削除 # 「<>」区切りのデータファイルなら、そのあと\tを<>に書き変え可能 $tab = "\t"; #◆ __LINKLIST__ で表示するページ件数 $linklist = 30; #◆ 最大検索件数 # x件該当が出たら残りのデータは検索しない。 $foundmax = 500; #======================================================================# $DAT{"start_time"} = (times)[0] ;&set_; print"Content-type: text/html\n\n"; if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN,$QUERY,$ENV{'CONTENT_LENGTH'}) }else{ $QUERY = $ENV{'QUERY_STRING'} } @QUERY=split(/&/,$QUERY); foreach (@QUERY){ ($n,$v)=split(/=/); $v=~ tr/+/ /; $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $v =~ s/\r|\n|\t/ /g; $v =~ s/\s+(""|"|,)\s+/ /g; $v =~ s/^(""|"|,)$//g; next if $n eq "" || $v eq ""; &jcode::convert(\$v,'sjis'); if(index($n,"IDn",0) >= 0){ $ID{$n}=$v }elsif(index($n,"IDv",0) >= 0){ $n=~ /^IDv(\d+)/; $IDv{$1}.=" " if $IDv{$1}; $IDv{$1}.=$v; }elsif(index($n,"template",0) >= 0){ push(@template,$v) if $v =~ /^\d+\-\d+$/ }else{ $s=$n=~ /^join/ ?"":" "; $FORM{$n}.=$s if $FORM{$n}; $FORM{$n}.=$v } &tag($v); $PRINT{$n}=$v; } if($FORM{'query'}){ foreach ( split(/&/,$FORM{'query'})){ ($n,$v)=split(/=/); next if $n eq "" || $v eq ""; if($n=~ /^IDn/){ $ID{$n}=$v }elsif($n=~ /^IDv(\d+)/){ $IDv{$1}.=" " if $IDv{$1}; $IDv{$1}.=$v }else{ $s=$n=~ /^join/ ?"":" "; $FORM{$n}.=$s if $FORM{$n}; $FORM{$n}.=$v } } } #======================================================================# #◆テンプレートファイルの読み込み $FORM{'tid'} =~ s/\W//g; $HTML = $html{$FORM{'tid'}} || $html{'default'}; open(HTML)||&error('テンプレートファイルを開けません'); read(HTML,$htmls,-s HTML); close(HTML); ($h_html,$b_html,$f_html)=split("",$htmls,3); &error('非対応のテンプレートファイルファイルが指定されました') unless $b_html; #======================================================================# #◆ テンプレート(補助型)処理 foreach(@template){ ($n,$v)=split(/\-/); $FORM{$ID{"IDn$n"}}.= $FORM{$ID{"IDn$n"}} ? " ".$IDv{$v} : $IDv{$v} ; } #======================================================================# #◆ 表示件数処理 $print_max = $FORM{'print'} if $FORM{'print'} && $FORM{'print'} !~ /\D/; $print_max = $max_max if $print_max > $max_max; $print_max_dat = $print_max; #======================================================================# #◆ 選択(補助型)処理 while(($n,$v)=each(%ID)){ $n =~ /IDn(\d+)/; $FORM{$v} .= $FORM{$v} ? " ".$IDv{$1} : $IDv{$1}; } #======================================================================# #◆ 結合(補助型)処理 if(index($QUERY,"join",0) >= 0){ while(($n,$v)=each(%FORM)){ $n=~ s/^join//; push(@form,"$n\t$v"); delete $FORM{"join$n"}; } foreach(@form){ ($n,$v)=split(/\t/); $FORM{$n} = $v if $n ne "" && $v ne ""; } undef @form; } #======================================================================# #◆ 選択(補助型)処理 if(index($QUERY,"select",0) >= 0){ while(($n,$v)=each(%FORM)){ if($n=~ s/^select// && $FORM{"$v$n"} eq ""){ push(@form,"$v$n\t$FORM{\"value$n\"}"); delete $FORM{"select$n"}; } } foreach(@form){ ($n,$v)=split(/\t/); $FORM{$n} = $v if $n ne "" && $v ne ""; } undef @form; } #======================================================================# #◆ 類似文字検索機能 if($FORM{'word'} == 2){%W=( 'A','(?:A|a|A|a)','a','(?:A|a|A|a)','A','(?:A|a|A|a)','a','(?:A|a|A|a)', 'B','(?:B|b|B|b)','b','(?:B|b|B|b)','B','(?:B|b|B|b)','b','(?:B|b|B|b)', 'C','(?:C|c|C|c)','c','(?:C|c|C|c)','C','(?:C|c|C|c)','c','(?:C|c|C|c)', 'D','(?:D|d|D|d)','d','(?:D|d|D|d)','D','(?:D|d|D|d)','d','(?:D|d|D|d)', 'E','(?:E|e|E|e)','e','(?:E|e|E|e)','E','(?:E|e|E|e)','e','(?:E|e|E|e)', 'F','(?:F|f|F|f)','f','(?:F|f|F|f)','F','(?:F|f|F|f)','f','(?:F|f|F|f)', 'G','(?:G|g|G|g)','g','(?:G|g|G|g)','G','(?:G|g|G|g)','g','(?:G|g|G|g)', 'H','(?:H|h|H|h)','h','(?:H|h|H|h)','H','(?:H|h|H|h)','h','(?:H|h|H|h)', 'I','(?:I|i|I|i)','i','(?:I|i|I|i)','I','(?:I|i|I|i)','i','(?:I|i|I|i)', 'J','(?:J|j|J|j)','j','(?:J|j|J|j)','J','(?:J|j|J|j)','j','(?:J|j|J|j)', 'K','(?:K|k|K|k)','k','(?:K|k|K|k)','K','(?:K|k|K|k)','k','(?:K|k|K|k)', 'L','(?:L|l|L|l)','l','(?:L|l|L|l)','L','(?:L|l|L|l)','l','(?:L|l|L|l)', 'M','(?:M|m|M|m)','m','(?:M|m|M|m)','M','(?:M|m|M|m)','m','(?:M|m|M|m)', 'N','(?:N|n|N|n)','n','(?:N|n|N|n)','N','(?:N|n|N|n)','n','(?:N|n|N|n)', 'O','(?:O|o|O|o)','o','(?:O|o|O|o)','O','(?:O|o|O|o)','o','(?:O|o|O|o)', 'P','(?:P|p|P|p)','p','(?:P|p|P|p)','P','(?:P|p|P|p)','p','(?:P|p|P|p)', 'Q','(?:Q|q|Q|q)','q','(?:Q|q|Q|q)','Q','(?:Q|q|Q|q)','q','(?:Q|q|Q|q)', 'R','(?:R|r|R|r)','r','(?:R|r|R|r)','R','(?:R|r|R|r)','r','(?:R|r|R|r)', 'S','(?:S|s|S|s)','s','(?:S|s|S|s)','S','(?:S|s|S|s)','s','(?:S|s|S|s)', 'T','(?:T|t|T|t)','t','(?:T|t|T|t)','T','(?:T|t|T|t)','t','(?:T|t|T|t)', 'U','(?:U|u|U|u)','u','(?:U|u|U|u)','U','(?:U|u|U|u)','u','(?:U|u|U|u)', 'V','(?:V|v|V|v)','v','(?:V|v|V|v)','V','(?:V|v|V|v)','v','(?:V|v|V|v)', 'W','(?:W|w|W|w)','w','(?:W|w|W|w)','W','(?:W|w|W|w)','w','(?:W|w|W|w)', 'X','(?:X|x|X|x)','x','(?:X|x|X|x)','X','(?:X|x|X|x)','x','(?:X|x|X|x)', 'Y','(?:Y|y|Y|y)','y','(?:Y|y|Y|y)','Y','(?:Y|y|Y|y)','y','(?:Y|y|Y|y)', 'Z','(?:Z|z|Z|z)','z','(?:Z|z|Z|z)','Z','(?:Z|z|Z|z)','z','(?:Z|z|Z|z)', '1','(?:1|一|壱|1)','一','(?:1|一|壱|1)','壱','(?:1|一|壱|1)','1','(?:1|一|壱|1)', '2','(?:2|二|弐|2)','二','(?:2|二|弐|2)','弐','(?:2|二|弐|2)','2','(?:2|二|弐|2)', '3','(?:3|三|参|3)','三','(?:3|三|参|3)','参','(?:3|三|参|3)','3','(?:3|三|参|3)', '4','(?:4|四|4)','四','(?:4|四|4)','4','(?:4|四|4)', '5','(?:5|五|5)','五','(?:5|五|5)','5','(?:5|五|5)', '6','(?:6|六|6)','六','(?:6|六|6)','6','(?:6|六|6)', '7','(?:7|七|7)','七','(?:7|七|7)','7','(?:7|七|7)', '8','(?:8|八|8)','八','(?:8|八|8)','8','(?:8|八|8)', '9','(?:9|九|9)','九','(?:9|九|9)','9','(?:9|九|9|9)', '0','(?:0|零|0)','零','(?:0|零|0)','0','(?:0|零|0|〇)', 'あ','(?:ぁ|あ)','ぁ','(?:あ|ぁ)','い','(?:ぃ|い)','ぃ','(?:ぃ|い)', 'う','(?:ぅ|う)','ぅ','(?:う|ぅ)','え','(?:ぇ|え)','ぇ','(?:ぇ|え)', 'お','(?:ぉ|お)','ぉ','(?:お|ぉ)','や','(?:ゃ|や)','ゃ','(?:ゃ|や)', 'ゆ','(?:ゅ|ゆ)','ゅ','(?:ゅ|ゆ)','よ','(?:ょ|よ)','ょ','(?:ょ|よ)', ',','(?:、|,|,)','、','(?:、|,|,)',',','(?:、|,|,)', '.','(?:.|。|\.)','。','(?:.|。|\.)','.','(?:.|。|\.)', '@','(?:@|\@)','@','(?:@|\@)', '#','(?:#|\#)','#','(?:#|\#)', '$','(?:$|\$)','$','(?:$|\$)', '%','(?:%|\%)','%','(?:%|\%)', '’','(?:’|\')','\'','(?:’|\')', '(','(?:(|\()','(','(?:(|\()', ')','(?:)|\))',')','(?:)|\))', ';','(?:;|\;)',';','(?:;|\;)', ':','(?::|\:)',':','(?::|\:)', '*','(?:*|\*)','*','(?:*|\*)', '=','(?:=|\=)','=','(?:=|\=)', '+','(?:+|\+)','+','(?:+|\+)', '?','(?:?|\?)','?','(?:?|\?)', '!','(?:!|\!)','!','(?:!|\!)', '^','(?:^|\^)','^','(?:^|\^)', '|','(?:||\|)','|','(?:||\|)', '[','(?:[|\[)','[','(?:[|\[)', ']','(?:]|\])',']','(?:]|\])', '/','(?:/|\/)','/','(?:/|\/)','\','(?:\|\\)','\\','(?:\|\\|¥)','¥','(?:¥|\\)', '−','(?:−|\-|\x81\x5B)','-','(?:−|\-|\x81\x5B)',"\x81\x5B",'(?:−|\-|\x81\x5B)', '<','(?:<|\<\;)','>','(?:>|\>)')} $komozi = "(?i)" unless $FORM{'word'}; #======================================================================# #◆ 検索パラメータ整理処理 while(($n,$v)=each(%FORM)){ $FORM{$n}=~ s/ / /g if $n !~ /equal/; } $AND = $FORM{'and'} || $FORM{'AND'} || $FORM{'key'}; $OR = $FORM{'or'} || $FORM{'OR'}; $NOT = $FORM{'not'} || $FORM{'NOT'}; $INDEX = $FORM{'index'} || $FORM{'INDEX'}; %wild=('*','.*?','?','.'); while(($n,$v)=each(%FORM)){ next if $n =~ /^(?:join|select)/o; next if $n !~ /^(?:key|not|equal|and|or|up|down|wildor|wildkeys|wildnot|wildequal|keys|index|sort|sline|eline|word|reverse)/io; $q .= "$v "; ($nn,$vv)=($n,$v); $vv =~ s/(\W)/'%'. unpack("H*",$1)/oeg; $nn =~ s/(\W)/'%'. unpack("H*",$1)/oeg; $url .="$nn\=$vv\&"; if($n =~ /^(?:keys|or|not|and|wildor|wildkeys|wildnot|wildequal|equal)/o){ &word(\$v); @COLOR{split(/\s+/,$v)}=1; if(substr($n,0,1) eq "w"){ #◆ワイルドカード $n=~ s/^wild//o; $v=~ s/\\(\*|\?)/$wild{$1}/go; if($n =~ s/^equal/keys/){ if($FORM{"word"}==2){ $v=~ s/ /(?: |\\s)/og; }else{ $v=~ s/ /\\s/og; } } if($n =~ /^(?:or|not)/o){ $v =~ s/\s+/|/og; $v ="(" . $v .")"; } $v =~ s/\s+/\$ \^/og if $n =~ /^keys/o; $v = '^' . $v . '$'; }else{ #◆その他 if($n =~ /^equal/){ if($FORM{"word"}==2){ $v=~ s/ /(?: |\s)/og; } }else{ $v =~ s/\s+/|/g if $n =~ /^(?:or|not)/o } } } if($n =~ /^(not|equal|and|or|up|down|keys)(\d+)$/o){ #◆ 列検索 if($1 eq "keys" || $1 eq "and"){ my(@value)=split(/\s+/,$v); $v=\@value; } my(@list)=($2 - 1,$1,$v); push(@form,\@list) if ($2 - 1) >= 0; } } $q =~ s/\s+$//; &word(\$OR) if $OR; &word(\$NOT) if $NOT; &word(\$AND) if $AND; @COLOR{split(/\s+/,"$AND $OR $INDEX")}=1; foreach(@data){ undef $_ if /\D/ } $OR =~ s/\s+/|/g; $NOT=~ s/\s+/|/g; @AND=split(/\s+/,$AND); @INDEX=split(/\s+/,$INDEX); $DAT{'keywords'} = $q; &tag($DAT{'keywords'}); $c=$FORM{'count'}+0; $DAT{"target"}= $FORM{'target'} + 0; $DAT{"max"}= $FORM{'max'} + 0; $sline=$FORM{'sline'} - 1 if $FORM{'sline'}; $eline=$FORM{'eline'} if $FORM{'eline'} && $FORM{'eline'} !~ /\D/; #======================================================================# #◆ 検索指定がなにもなければ・・・該当無しで終了 if($q !~ /\S/){ &pro(\$h_html); &pro(\$f_html); print $h_html , $f_html; exit; } #======================================================================# #◆ データファイル読み込み $FORM{'did'} =~ s/\W//g; $SEEK = $SEEK{$FORM{'did'}} || $SEEK{'default'}; open(SEEK) || &error('データファイルを開けません');binmode(SEEK); if($sline && $sline !~ /\D/){ while(){ last if $sline <= $. } } FI: while(){ last if $eline && $eline <= $.; foreach $key (@INDEX){ next FI if index($_,$key,0) < 0 } foreach $key (@AND){ next FI if ! /$komozi$key/ } next if $OR && ! /$komozi$OR/o; next if $NOT && /$komozi$NOT/o; s/[\r\n]+//; if($tab){ @data=split(/$tab/,$_); }elsif(index($_,'"') >= 0){ @data=(); @line=split(/,/,$_); while(@line){ $dummy = shift @line; while(($dummy=~ tr/"/"/ % 2) == 1){ last unless @line; $dummy .=',' . shift @line; } if(index($dummy,'"') >= 0){ chop $dummy; substr($dummy,0,1)=""; $dummy=~ s/""/"/og; } push(@data,$dummy); } }else{ @data=split(/,/,$_) } foreach(@form){ ($keys,$n,$v)=@{$_}; next FI if &{$dcheck{$n}}; } last if $c++ >= $foundmax; push(@found,[$.,@data]); } while(){ 1; } $DAT{"found_over"}=1 if $c == $foundmax + 1; @SORT= split(/\s+/,$FORM{'sort'}); $i=0; foreach (@SORT[0..9]){ next unless $_; my($sort,$cmd,$r); $sort[$i][0] = $1 if ( /(\d+)/ && $1 > 0 || next) || next; $sort[$i][1] = /^d/i ? 1 : 0; $sort[$i][2] = /s$/i ? 1 : 0; $i++; } if(@sort){ @found = sort { &sort_s } @found; } sub sort_s{ my $i; foreach $s(@sort){ if($s->[2]){ if($s->[1]){ $i = $b->[$s->[0]] cmp $a->[$s->[0]] }else{ $i = $a->[$s->[0]] cmp $b->[$s->[0]] } }else{ if($s->[1]){ $i = $b->[$s->[0]] <=> $a->[$s->[0]] }else{ $i = $a->[$s->[0]] <=> $b->[$s->[0]] } } return $i if $i; } 0 } if($FORM{'reverse'}){ @found = reverse @found; }elsif($FORM{'random'} || $FORM{'tane'}){ my $ip = $ENV{'REMOTE_ADDR'}; $ip =~ s/\D//g; $tane = int($FORM{'tane'}) || time + $ip + $$; srand($tane); my @temp; push( @temp , splice(@found,rand(@found),1)) while @found; @found = @temp; $url .="tane=$tane&"; } $DAT{'max'}=$. + 0; $FORM{'p'} =~ s/\D//g; $start= $FORM{'p'} * $print_max; $DAT{'target'}=@found; $DAT{"start_count"} = $start + 1; $DAT{"NEXT"}="${'url'}print=$print_max_dat&tid=$FORM{'tid'}&did=$FORM{'did'}&p=" . ($FORM{'p'} + 1) if $start + $print_max <= $#found; $DAT{"BACK"}="${'url'}print=$print_max_dat&tid=$FORM{'tid'}&did=$FORM{'did'}&p=" . ($FORM{'p'} - 1) if $FORM{'p'} > 0; $pagemax = int($DAT{'target'} / $print_max) + ($DAT{'target'} % $print_max != 0); $pagestart = 1; if($pagemax > $linklist){ if($FORM{'p'} > int($linklist / 2)){ $pagestart = $FORM{'p'} + 1 - int($linklist / 2); if($pagestart + $linklist > $pagemax){ $pagestart = $pagemax - $linklist + 1; }else{ $pagemax = $pagestart + $linklist - 1; } }elsif($pagemax > $linklist){ $pagemax = $linklist ; } } for($i=$pagestart ;$i <= $pagemax ;$i++){ $s=$i - 1; if($FORM{'p'} eq $s){ $DAT{"LINKLIST"} .="$i|"; }else{ $DAT{"LINKLIST"} .="$i|"; } } chop $DAT{"LINKLIST"}; $DAT{"time"} = (times)[0] - $DAT{"start_time"}; $DAT{"end_time"} = (times)[0] ; $DAT{'count'}= $#found + 1 if ($DAT{'count'} = $start + $print_max) > $#found + 1; &pro(\$h_html); print $h_html; for($i=$start ; $i <= $start + $print_max - 1; $i++){ @data = @{$found[$i]} ; last if ! @data ; ($DAT{'no'},$DAT{'count'})=($data[0], $i + 1); $Btmp = $b_html; &pro(\$Btmp); print $Btmp; @last = @data; } &pro(\$f_html); print $f_html; exit; #======================================================================# #◆ 関数 sub tag{#タグ解除 $_[0]=~ s/&/&/g; $_[0]=~ s//>/g; $_[0]=~ s/"/"/g } sub word{#類似文字検索機能 *word = shift ; $word =~ s/([^\w ])/\\$1/go && return 1 if $FORM{'word'} < 2; $word =~ s/((?:[\x81-\x9F|\xE0-\xEF][\x40-\x7E|\x80-\xFC])|(?:[\x20-\x7E])|(?:[\xA0-\xDF]))/&_word($1)/oeg } sub _word{ $sw=$_[0]; return $W{$sw} if $W{$sw}; $sw =~ s/([^\w ])/\\$1/go; return $sw } sub a{#自動リンク *_ = shift; s/("|>|<)/ $1 /go; s/
/\n/go; s/(http:\/\/[\!-;\=\?-\~]+)|([\x81-\x9F|\xE0-\xEF][\x40-\x7E|\x80-\xFC])*([\x21-\x7E]+\@[\x21-\x7E]+\.[\x21-\x7E]+)/$3 ? "$2$1$3<\/a>" : "$2$1$3<\/a>"/eog; s/ ("|>|<) /$1/go; s/\n/
/go; } sub encode_url{#URLエンコード *_ = shift; s/(\W)/sprintf("%%%02X", ord($1))/eg; } sub color{#カラーカラーカラー (*_ , $color) = @_; unless($colors){ $colors = join('|',%COLOR); 1 while $colors =~ s/^\||^.$|\|$|^\\?.\||\|\\?.(\|)|\|(\|)|\|\\?.$/$1$2/o; } if($colors){ s/\G((?:(?:[\x81-\x9F|\xE0-\xEF][\x40-\x7E|\x80-\xFC])|(?:[\x20-\x7E])|(?:[\xA0-\xDF]))*?)($colors)/$1$2<\/font>/og; } } sub cut{#文字カット local(*cut,$cut_size)=@_; return $cut if $cut_size >= length($cut); $cut = substr($cut,0,$cut_size); chop $cut if $cut !~ /^(?:[\x81-\x9F|\xE0-\xEF][\x40-\x7E|\x80-\xFC]|[\x20-\x7E\xA0-\xDF])*$/; } sub formats{ ($n,$v)=($1,$2); if(index($v,":last",0) >= 0){ $a = $last[$n] }elsif(index($v,":form",0) >= 0){ $a = $PRINT{$n}; }elsif(index($v,":env") >= 0){ $a = $ENV{$n}; }elsif(index($v,":cookie") >= 0){ $a = $COOKIE{$n}; }elsif($n =~ /\D/){ $a = $DAT{$n}; }else{ $a = $data[$n]; } foreach(split(/\:/,$v)){ if($If{$_}){ $If{$_}->(\$a); }elsif(/^auto\-br\((\d+)\)/o){ my($br)=$1; $a =~ s/(\w{$br})/$1
/g; }elsif(/^([\*\%\/\+\-])\((\-?\d+(?:\.\d+)?)\)/o){ $a = $If{$1}->($a,$2); }elsif(/^cut\((\d+)\)/o){ &cut(\$a,$1) }elsif(/^color\((.+?)\)/o){ &color(\$a,$1) } } $a; } sub pro{#テンプレート内の実行 *html_S = shift; $html_S =~ s/__(.+?)((?::cut\(\d+\)|:color\(.+?\)|:last|:auto\-br\(\d+\)|:a|:encode|:form|:tagout|:cookie|:res|:env|:int|:,|:\+\+|:\-\-|:[\*\%\/\+\-]\(\-?\d+(?:\.\d+)?\))*)__/&formats/eg; 1 while $html_S =~ s/<\!\-\-IF(\d*)=(\S+?)(?: (\S+) (.+?))?\-\->(.*?)(?:<\!\-\-ELSE\1=\2\-\->(.*?))?<\!\-\-END\1=\2\-\->/&ifs($2,$3,$4,$5,$6)/eis; } sub ifs{ @d=@_; $d[0] =~ s/([^:]+)((?::cut\(\d+\)|:color\(.+?\)|:last|:auto\-br\(\d+\)|:a|:encode|:form|:tagout|:cookie|:res|:env|:int|:,|:\+\+|:\-\-|:[\*\%\/\+\-]\(\-?\d+(?:\.\d+)?\))*)/&formats/eg; if($d[1] && $IF{$d[1]}){ return $IF{$d[1]}->($d[0],$d[2]) ? $d[3] : $d[4] } return $d[0] ? $d[3] : $d[4]; } sub set_{ $IF{"<"} = sub { return 1 if $_[0] < $_[1] }; $IF{">"} = sub { return 1 if $_[0] > $_[1] }; $IF{"lt"} = sub { return 1 if $_[0] lt $_[1] }; $IF{"gt"} = sub { return 1 if $_[0] gt $_[1] }; $IF{"<="} = sub { return 1 if $_[0] <= $_[1] }; $IF{">="} = sub { return 1 if $_[0] >= $_[1] }; $IF{"le"} = sub { return 1 if $_[0] le $_[1] }; $IF{"ge"} = sub { return 1 if $_[0] ge $_[1] }; $IF{"=="} = sub { return 1 if $_[0] == $_[1] }; $IF{"!="} = sub { return 1 if $_[0] != $_[1] }; $IF{"eq"} = sub { return 1 if $_[0] eq $_[1] }; $IF{"ne"} = sub { return 1 if $_[0] ne $_[1] }; $IF{"index"} = sub { return 1 if index($_[0],$_[1],0) >= 0 }; $If{"+"} = sub { $_[0] + $_[1] }; $If{"-"} = sub { $_[0] - $_[1] }; $If{"*"} = sub { $_[0] * $_[1] }; $If{"/"} = sub { $_[1] >= 1 ? $_[0] / $_[1] : 0 }; $If{"%"} = sub { $_[1] >= 1 ? $_[0] % $_[1] : 0 }; $If{"a"} = \&a; $If{"encode"} = \&encode_url; $If{"tagout"} = \&tagout; $If{"++"} = sub { *if = shift; $if++ }; $If{"--"} = sub { *if = shift; $if-- }; $If{"br"} = sub { *if = shift; $if =~ s/
/\n/ig}; $If{"int"}= sub { *if = shift; $if = int($if) }; $If{"res"}= sub { *if = shift; $if =~ s/^|(
|\n)/$1> /ig}; $If{","} = sub { *if = shift; 1 while $if =~ s/(.*\d)(\d\d\d)/$1,$2/;}; $dcheck{"and"} = $dcheck{"keys"} = sub { foreach (@{$v}){ return 1 if $data[$keys] !~ /$komozi$_/ } }; $dcheck{"or"} = sub { return 1 if $data[$keys] !~ /$komozi$v/ }; $dcheck{"not"}= sub { return 1 if $data[$keys] =~ /$komozi$v/ }; $dcheck{"up"} = sub { return 1 if $data[$keys] < $v }; $dcheck{"down"}=sub { return 1 if $data[$keys] > $v }; $dcheck{"equal"}=sub{ return 1 if $data[$keys] !~ /^$v$/; }; } sub error{ print "

$_[0]

CCGIROOM"; exit; } #================================================================================# #【 作 成 】:わん < wake-t@mtc.biglobe.ne.jp > #【公開場所】:CGIROOM < http://cgiroom.nu > #【 履 歴 】: # 1999/07/22 Ver 0.00 # 1999/08/06 Ver 1.00 # 1999/10/13 Ver 1.20 検索機能に 以上、以下、結合、選択 を追加 # 2000/01/03 Ver 1.30 タブ区切りファイルに対応、検索機能にNOT,ORを追加 # 2000/01/12 Ver 1.31 1.30のバグを修正 # 2000/01/20 Ver 1.32 1.31のバグを修正 # 2000/02/21 Ver 1.33 1.32のバグを修正 10以上の列検索が出来なかったバグ # 2000/05/13 Ver 1.40 高度検索機能を追加 # 2000/05/23 Ver 1.41 1.40で発生したバグ修正(非公開) # 2000/05/29 Ver 1.42 やっとこさ公開 # 2000/06/22 Ver 1.43 equalだけで検索すると該当しないバグを修正 # 2000/10/14 Ver 1.44 ワイルドカードに対応、以上以下検索のバグを修正 # 2000/11/18 Ver 2.00 βデザインをテンプレート式に変更 # 2000/12/03 Ver b2 ちょこっとバグ修正 # 2001/02/20 Ver 2.01 :aバグの修正 onlyone機能の向上 # 2001/03/17 Ver 2.02 1列目検索バグを修正 # 2001/08/11 Ver 2.02s ソート版更新 # 2001/09/17 Ver 2.03s query検索対応 # 2001/09/17 Ver 2.03.1s Perl 5.004で作動するように修正 # 2001/10/18 Ver 2.03.2s __count__ reverse の改ページ不備を修正 #================================================================================#