--- db/prgsrc/db.cgi 2008/11/09 20:02:36 1.149 +++ db/prgsrc/db.cgi 2010/09/24 09:05:48 1.161 @@ -3,8 +3,11 @@ use DBI; use CGI ':all'; #use strict; +use Encode; my @softfields=("От Олега Степанова"); use Time::Local; +use Data::Dumper "Dumper"; +use URI::Escape; my $proxyredirect=1; use POSIX qw(locale_h); use locale; @@ -68,7 +71,7 @@ $outputkvo=100 if $outputkvo>100; if (param('debug')) {$debug=1; $printqueries=1} *STDERR=*STDOUT if $debug; -if ($url !~ /db\.chgk\.info/ && $url !~ /localhost/ && $url !~ /bilbo/ && $url !~ /zaba/ && $url !~ /question\.chgk\.info/ ) { +if ($url!~ /\/\/db\// && $url !~ /db\.chgk\.info/ && $url !~ /localhost/ && $url !~ /bilbo/ && $url !~ /zaba/ && $url !~ /question\.chgk\.info/ ) { my $u="http://db.chgk.info/cgi-bin/db.cgi?$qs"; Redirect ($u); exit; @@ -211,7 +214,7 @@ sub fetchquestion { if ($WithTour) { ($$q{'QuestionId'}, $$q{'Question'},$$q{'Answer'},$$q{'PassCriteria'},$$q{'Comments'},$$q{'Authors'},$$q{'Sources'}, $$q{'Number'}, - $$q{'Title'}, $$q{'TourTitle'}, $$q{'FileName'},$$q{'PlayedAt'},$$q{'TourNumber'}) = + $$q{'Title'}, $$q{'TourTitle'}, $$q{'FileName'},$$q{'PlayedAt'},$$q{'TourNumber'},$$q{'PlayedAt2'}) = $sth->fetchrow; } else { ($$q{'QuestionId'}, $$q{'Question'},$$q{'Answer'},$$q{'PassCriteria'},$$q{'Comments'},$$q{'Authors'},$$q{'Sources'}, @@ -230,7 +233,7 @@ sub SelectQuestions { # my $where=join " OR ",@$q; my $where=join ',',@$q; $where &&= "QuestionId IN (".(join ',',$where).")"; - $where||=1; + $where||=0; $where="($where) AND Questions.ParentId=t1.Id AND t1.ParentId=t2.Id" if $WithTour; @@ -238,7 +241,7 @@ sub SelectQuestions { if ($WithTour) { $query="SELECT QuestionId, Questions.Question, Answer, PassCriteria, Comments, Authors, Sources, Questions.Number - , t2.Title, t1.Title, t2.FileName, t2.PlayedAt,t1.Number + , t2.Title, t1.Title, t2.FileName, t2.PlayedAt,t1.Number,t2.PlayedAt2 from Questions,Tournaments as t1, Tournaments as t2 WHERE $where"; } else { @@ -382,7 +385,7 @@ sub printform return < +action="/cgi-bin/db.cgi">

Поиск в базе вопросов

@@ -714,7 +717,10 @@ sub Search { my (@sar, $i, $sth,$where,$query); if ($metod eq 'rus') { - my @tasks=russearch($dbh,$sstr,$all,$allnf); + my @tasks; + @tasks = russearch($dbh,$sstr,$all,$allnf); + + return @tasks } elsif ($metod eq 'proxy') @@ -818,10 +824,11 @@ sub NoCase { sub PrintList { my ($dbh,$Questions,$shablon,$was)=@_; + my $total_found = $totalfound||$#$Questions+1; my $Output; my $first=param('first') ||1; $first=$first-($first-1)%$outputkvo; - my $fkvo=param('fkvo')||($#$Questions+1); + my $fkvo=param('fkvo')||$total_found; my $last=$first+$outputkvo-1; $last=$fkvo if $fkvo<$last; my($f,$l); @@ -893,7 +900,12 @@ sub PrintList { a({href=>$url."?".$qs."\&first=$llprint"},">>").(" "x4) } $Output.= "$nav".br."\n"; - my @q=@$Questions[$first-1..$last-1]; + my @q; + if ($totalfound) { + @q = @$Questions; + } else { + @q=@$Questions[$first-1..$last-1]; + } my %q=(); my $sth=SelectQuestions($dbh,\@q,1); my $qq; @@ -904,15 +916,17 @@ sub PrintList { $q{$Q[$_]{'QuestionId'}}=$Q[$_]; } - for (my $i = $first; $i <= $last; $i++) { - my $q=$q{$$Questions[$i-1]}; + for my $i(0..$#q) { + my $q=$q{$q[$i]}; my $output; $output = &PrintQuestion($dbh, $q, 1, 0, 1,$text,1 ); # if (param('metod') && (param('metod') eq 'rus' || param('metod') eq 'proxy')) { $output=~s/\b($shablon)\b/\$1\<\/strong\>/gi; $output=~s/($shablon)/\$1\<\/strong\>/gi; + $output=~s/(href="[^"]*?)(?:<.*?>)+([^"]*?)(?:<\/.*?>)+([^"]*?")/!1 $1$2$3 2!/g;#!!!! } + $Output.= $output; } $sth->finish; @@ -954,7 +968,7 @@ sub PrintSearch { } while (--$ss && (!$dbh->do ("insert into lastqueries (id,sstr,questions,allnf) values ($was, $qsstr,$tmp,$nf)"))); - $Output.= "Something is wrong...".br unless $ss; + $Output.= "Something is wrong...".br."\n" unless $ss; } } @@ -1084,12 +1098,18 @@ sub PrintTournament { @Tours = &GetTours($dbh, $Id); $list=''; my $textid; + my $isGroup; if ($Id) { for ($Tournament{'Type'}) { /Г/ && do { $output .= h2({align=>"center"}, "Группа: $Tournament{'Title'} ", - $Tournament{'PlayedAt'}||'') . p . "\n"; + $Tournament{'PlayedAt'}||'') . + ($Tournament{'PlayedAt2'}?' – '. + $Tournament{'PlayedAt2'}:'') . + + p . "\n"; + $isGroup=1; last; }; /Ч/ && do { @@ -1101,6 +1121,10 @@ sub PrintTournament { $title .= " $Tournament{'PlayedAt'}"; } + if ($Tournament{'PlayedAt2'}) { + $title .= ' – '.$Tournament{'PlayedAt2'}; + } + $output .= h2({align=>"center"}, "$title") . p . "\n"; $output.=&PrintEditor(\%Tournament); @@ -1167,7 +1191,9 @@ sub PrintTournament { if ($SingleTour or ($Tournament{'Type'} =~ /Т/)) { $list .= dd(img({src=>$imgsrc, alt=>$alt}) . " " . $Tournament{'Title'} . " " . - ($Tournament{'PlayedAt'}||"") . $qnum) . + ($Tournament{'PlayedAt'}||"") . + ($Tournament{'PlayedAt2'}?' – '.$Tournament{'PlayedAt2'}:"") . + $qnum) . dl( dd("[" . a({href=>tourhref($textid,0)}, @@ -1183,7 +1209,8 @@ sub PrintTournament { img({src=>$imgsrc, alt=>$alt}) . " " . a({href=>tourhref($textid,0,1)}, $Tournament{'Title'}. " ". - ($Tournament{'PlayedAt'}||'')) . $qnum); + ($Tournament{'PlayedAt'}||'')) . + ($Tournament{'PlayedAt2'}?' &ndash '. $Tournament{'PlayedAt2'}:''). $qnum); } } $output .= dl($list); @@ -1204,8 +1231,19 @@ sub PrintTournament { $output .= p($Info); } + + $output.=p("XML"); - + + if ($textid=$fname) + { + $textid=~s/\.txt//; + } + if (!$isGroup) { + $output .= center("[". + a({href=>"/v2/tour/$textid/print", target=>'_blank'}, 'версия для печати')."] [". + a({href=>"/v2/tour/$textid/fb2", target=>'_blank'}, 'fb2')."]".""); + } return $output; } @@ -1276,7 +1314,8 @@ sub PrintTour { $output .= h2({align=>"center"}, $Tournament{"Title"}, $Tournament{'PlayedAt'}||'', - "
", $Tour{"Title"} . + $Tournament{'PlayedAt2'}?' – '.$Tournament{'PlayedAt2'}:'', + "
\n", $Tour{"Title"} . " ($qnum вопрос$suffix)\n") . p; $output .=&PrintEditor(\%Tour); @@ -1290,24 +1329,27 @@ sub PrintTour { $output .= hr({-'align'=>'center', -'width'=>'80%'}); if ($Tournament{'URL'}) { - $output .= - p("Дополнительная информация об этом турнире - по адресу " . - a({-'href'=>$Tournament{'URL'}}, $Tournament{'URL'})); + $URL = $Tournament{'URL'}; + $URL=~s/http:\/znatoki\/boris\/reports\//$newsurl/ if $url=~/kulichki/ || $url=~/db.chgk.info/; + $URL=~s/\/znatoki\/boris\/reports\//$newsurl/ if url=~/kulichki/ || $url=~/db.chgk.info/; + + $output .= + p("Дополнительная информация об этом турнире - по адресу " . + a({-'href'=>$URL}, $URL)); } if ($Tournament{'Copyright'}) { $output .= p("Копирайт: " . $Tournament{'Copyright'}); } - if ($Tournament{'Info'}) { + if ($Tournament{'Info'} ) { $output .= p($Tournament{'Info'}); } - if ($Tour{'Info'}) { - $output .= p($Tour{'Info'}); + if ($Tour{'Info'} && ($Tournament{'Info'} ne $Tour{'Info'})) { + $output .= "!!".p($Tour{'Info'}); } - $output.=p("XML"); my $n=$Tour{'Number'}; @@ -1317,16 +1359,22 @@ sub PrintTour { $bottom .= "[" . a({href=>tourhref("$fname$nn",1)}, - "ответы") . "] " . br; + "ответы") . "] " } + $bottom .= "[".a({href=>"/v2/tour/$fname/print", target=>'_blank'}, 'версия для печати')."] [". + a({href=>"/v2/tour/$fname/fb2/", target=>'_blank'}, 'fb2')."]".br; + +# $bottom .= "[".a({href=>'/v2/print/'.$fname.'.'.$Tour{'Number'}, target=>'_blank'}, 'версия для печати')."]".br; + if ($n>1) { $bottom .= "[" . a({href=>tourhref("$fname.".($n-1),0)}, "предыдущий тур") . "] "; $bottom .= "[" . a({href=>tourhref("$fname.".($n-1),1)}, - "предыдущий тур с ответами") . "] " . br; + "предыдущий тур с ответами") . "] " . br."\n"; } + if (&IsTour($dbh, $Tour{'ParentId'}, $n + 1)) { $bottom .= "[" . a({href=>tourhref("$fname.".($n+1),0)}, @@ -1342,6 +1390,14 @@ sub PrintTour { return $output; } + +sub escapeUrl { + my $uri = shift; + $uri=~s/<.*?>//g; + $uri =~ s/([Ю-Ъю-ъ]+)/URI::Escape::uri_escape_utf8(decode("koi8-r",$1))/eg; + return $uri; +} + sub PrintField { my ($header, $value, $text) = @_; if ($text) { @@ -1349,15 +1405,29 @@ sub PrintField { } else { if ($header=~/Комментар/) { - $value=~s/^\s*$_[\.:]/p."\n".strong("$_").":"/me foreach @softfields; + $value=~s/^\s*$_[\.:]/p."\n".strong("$_").":\n"/me foreach @softfields; } - $value =~ s/^\s+/
    /mg; + $value =~ s/^\s+/
\n    /mg; $value =~ s/(\s+)-+(\s+)/$1–$2/mg; $value =~ s/\s+\–/ \–/mg if $value !~ /^\|/; $value =~ s/^\|([^\n]*)/
$1<\/pre>/mg;
-	    $value =~ s/(http:\/\/\S+[^\s\)\(\,\.])/$1<\/a>/g if $header !~ /^Авто/;
+
+	    $value =~ s/(http:\/\/\S+[^\s\)\(\,\.\]])/a({href=>escapeUrl($1)},$1)/egm if $header !~ /^Авто/;#!!!
+
+	    $value =~ s/\.\.\.\]/!!!ZAKR!!!/g;
+	    $value =~ s/пропущено\]/!!!PROP!!!/g;
+	    $value =~ s/пропущены\]/!!!PROP2!!!/g;
+	    $value =~ s/\[Раздаточный материал:(.*?)\]\s*\n/
Раздаточный материал<\/div> $1<\/div>\n$2/sm; + $value =~ s/<раздатка>(.*?)<\/раздатка>/
Раздаточный материал<\/div> $1<\/div>\n/sm; + $value =~ s/!!!ZAKR!!!/\.\.\.\]/g; + $value =~ s/!!!PROP!!!/пропущено\]/g; + $value =~ s/!!!PROP2!!!/пропущены\]/g; + + +# $value =~ s/(http:\/\/\S+[^\s\)\(\,\.])/make/eg if $header !~ /^Авто/;#!!! +# $value =~ s/(http:\/\/\S+[^\s\)\(\,\.])/$1<\/a>/g if $header !~ /^Авто/; # $value =~ s/(http:\/\/(?:\w+.)+[\w\\\~]+(\?[^\s.]+)?)/$1<\/a>/g if $header !~ /^Авто/; # $value =~ s/(\s)"/$1“/mg; # $value =~ s/^"/“/mg; @@ -1369,7 +1439,7 @@ sub PrintField { $value . p . "\n"; } return $text ? "$header:\n$value\n\n" : - strong("$header: ") . $value . p . "\n"; + strong("$header: ") . "\n".$value . p . "\n"; } # Gets a DB handler (ofcourse) and a question Id. Prints @@ -1389,6 +1459,7 @@ sub PrintQuestion { $Question{'FileName'}=$Tournament{'FileName'}; $Question{'Title'}=$Tournament{'Title'}; $Question{'PlayedAt'}=$Tournament{'PlayedAt'}; + $Question{'PlayedAt2'}=$Tournament{'PlayedAt2'}; $Question{'TourNumber'}=$Tour{'Number'}; $Question{'TourTitle'}=$Tour{'Title'}; } @@ -1404,7 +1475,8 @@ sub PrintQuestion { $titles .= dd(img({src=>"/icons/folder.open.gif"}) . " " . a({href=>tourhref($fname,0,1)}, - $Question{'Title'}, $Question{'PlayedAt'}||'')); + $Question{'Title'}, $Question{'PlayedAt'}||'', + $Question{'PlayedAt2'}?' – '.$Question{'PlayedAt2'}:'')); $titles .= dl(dd(img({src=>"/icons/folder.open.gif"}) . " " . a({href=>tourhref("$fname.$Question{'TourNumber'}#$qnum",1)}, @@ -1511,8 +1583,8 @@ EOTT $output.="" } - $output=~s/\(pic: ([^\)]*)\)/

/g unless $text; - $output=~s/\(aud: ([^\)]*)\)/

<\/embed>

/g unless $text; + $output=~s/\(pic: ([^\)]*)\)/

<\/p>/g unless $text; + $output=~s/\(aud: ([^\)]*)\)//g unless $text; $output=~s/⌡/\ï/g; $output=~s/⌠/\Ï/g; @@ -1522,7 +1594,7 @@ $output.="" $fname||=param('tour'); my $qid=$fname ? ($fname.".$Question{'Number'}" ): ''; - $output.=br.a({href=> "/search/"."?metod=proxy& + $output.=br."\n".a({href=> "/search/"."?metod=proxy& qid=$qid"}, 'Близкие вопросы').p if $answer>0 && !$text && $qid && $showNearQuestions; return $output; @@ -1659,7 +1731,9 @@ sub PrintAll { $output .= dd(img({src=>"/icons/folder.gif", alt=>"[*]"}) . " " . a({href=>tourhref($textid,0,!$SingleTour)}, - $Tournament{'Title'}) ." " . ($Tournament{'PlayedAt'}||'') . " $New"); + $Tournament{'Title'}) ." " . ($Tournament{'PlayedAt'}||'') . + ($Tournament{'PlayedAt2'}?' – '.$Tournament{'PlayedAt2'}:'') . + " $New"); } if ($Id == 0 or $Tournament{'Type'} =~ /Г/ or $Tournament{'Type'} eq '') { for ($i = 0; $i <= $#Tours; $i++) { @@ -1704,7 +1778,8 @@ sub PrintDates { else {$textid=$Tournament{'Id'}}; $list .= dd(img({src=>"/icons/folder.gif", alt=>"[*]"}) . " " . a({href=>tourhref($textid,0,1)}, - $Tournament{'Title'}, $Tournament{'PlayedAt'}||'')); + $Tournament{'Title'}, $Tournament{'PlayedAt'}||'', + $Tournament{'PlayedAt2'}?' – '.$Tournament{'PlayedAt2'}:'')); } $sth->finish; $output .= dl($list); @@ -1821,14 +1896,14 @@ sub WriteFile { $fname=~s/.*\/(\w+)/$1/; my $query= "SELECT Id, Title, Copyright, Info, URL, - Editors, EnteredBy, PlayedAt, CreatedAt + Editors, EnteredBy, PlayedAt, CreatedAt, PlayedAt2 from Tournaments where FileName= '$fname' OR FileName=".$dbh->quote("$fname.txt"); my $sth=$dbh->prepare($query); my (%Question,%editor,%qnumber,%copyright,%author,%vid,%tourtitle); $sth->execute; my ($Id, $Title, $Copyright, $Info, $URL, - $Editors, $EnteredBy, $PlayedAt, $CreatedAt)= + $Editors, $EnteredBy, $PlayedAt, $CreatedAt, $PlayedAt2)= $sth->fetchrow; return -1 unless $Id; open (OUT, ">$TMPDIR/$fname.txt") || print STDERR "Error in $fname.txt\n"; @@ -1837,6 +1912,10 @@ sub WriteFile { my ($year,$month,$day)=split /-/, $date; # $month=0,$date=0 if $year && $month==1 && $day==1; my $pdate=sprintf("%02d-%3s-%4d",$day,$months[$month],$year); + if ($PlayedAt2) { + my ($year,$month,$day)=split /-/, $date; + $pdate .= sprintf(" - %02d-%3s-%4d",$day,$months[$month],$year); + } print OUT "Дата:\n$pdate\n\n" if $date; @@ -2006,15 +2085,15 @@ MAIN: print end_html; die "Can't connect to DB chgk\n"; }; - $dbh->do("set names koi8r"); + $dbh->do("set names koi8r"); -# if (param('qid') && (param('qid')=~/^\d+$/) || $tour && $tour=~/^\d+$/) { + if (param('qid') && (param('qid')=~/^\d+$/) || $tour && $tour=~/^\d+$/) { # my $destination='http://chgk.zaba.ru/search.html'; # print header (-'Content-Type' => 'text/html', # -'Location:'=> 'http:\\db.chgk.info'); -# Redirect($destination); -# exit -# } + Redirect($destination); + exit + } if (0 && $tour && !param('qnumber') && (!param('answers')||(param('answers')<=1))) { @@ -2126,6 +2205,14 @@ MAIN: $globaloutput.="\n"; $globaloutput.=&Include_virtual("$reklama")||'';