#!/usr/bin/perl use strict; use warnings; use utf8; use POSIX qw(locale_h); setlocale(LC_CTYPE, "pt_PT.UTF8"); use locale; use Encode; use OpenDict; use OpenDict::WebUtils; use CGI qw/:standard/; use CGI::Cookie; use Template; # This prints CGI header! my $DA = new OpenDict::WebUtils(query => '/browse'); my $username = $DA->{session} ? $DA->{session}->param("username") : undef; my $ROOT = $DA->{root}; my $xml = OpenDict->connect( db => "$DA->{root}/xml.db", attach => { users => "$ROOT/TMP/users.db" } ); my $margin = 15; my $count = 0; my $dbs; my $TOTAL = $xml->totalRecords; if (param("count")) { $count = param("count"); $count = 1 if ($count < 1); $count = $TOTAL if ($count > $TOTAL); } elsif (param("random")) { $count = rand($TOTAL)+1; } else { $count = int($TOTAL/2); } if (param("word")) { # Recalculate Index my $word = param("word"); Encode::_utf8_on($word); OpenDict::WebUtils::log_query($ROOT, $word); $word = OpenDict::norm($word); my $query = "SELECT word FROM entry WHERE normalized >= '$word' ORDER BY normalized LIMIT 1"; my $dbs = $xml->{dbh}->prepare($query); $dbs->execute; ($word) = $dbs->fetchrow_array; $query = "SELECT id FROM idx WHERE word == \"$word\" LIMIT 1"; $dbs = $xml->{dbh}->prepare($query); $dbs->execute; ($count) = $dbs->fetchrow_array; } if (param("letter")) { # Recalculate index my $letter = param("letter"); my $query = "SELECT id FROM idx WHERE word = '$letter' OR word LIKE '$letter%' ORDER BY id LIMIT 1"; my $dbs = $xml->{dbh}->prepare($query); $dbs->execute; ($count) = $dbs->fetchrow_array; } my ($PREVIOUS, $FOLLOWING); my $lower = $count - $margin; my $higher = $count + $margin; $dbs = $xml->dbh->prepare("SELECT id,word FROM idx WHERE id > $lower AND id < $higher ORDER BY id"); $dbs->execute(); my ($id, $word); my @results = (); push @results, [$id,$word] while (($id,$word) = $dbs->fetchrow_array); my $range = ($margin-1)*2 + 1; if (scalar(@results) < $range) { if ($results[0][0] == 1) { unshift @results, undef while scalar(@results) < $range; } else { push @results, undef while scalar(@results) < $range; } } my $cword = $results[$margin-1][1]; my $cword_letter = uc(substr(OpenDict::norm(lc($cword)),0,1)); print "
\n"; print "
\n"; for ('A'..'Z') { my $class = ($cword_letter eq $_) ? "selected" : "noselected"; print div({-class=>$class, -style=>"text-align: center; padding: 1px;"}, a({ -href => "browse?letter=$_"},$_)); } print "
\n"; my $SSTEP = 28; my $DSTEP = 2*$SSTEP; print "
\n"; print "
\n"; print a({-href => sprintf("browse?count=%d",$count-$SSTEP) }, img({-class=>"seta", -title=>"recuar $SSTEP", -src=>"/images/cima.png",-alt=>"-$SSTEP"})) if ($count-$SSTEP>0); print " "; print a({-href => sprintf("browse?count=%d",$count-$DSTEP) }, img({-class=>"seta", -title=>"recuar $DSTEP", -src=>"/images/cima2.png",-alt=>"-$DSTEP"})) if ($count-$DSTEP>0); print "
\n"; my $i = 0; for my $pair (@results) { $i++; next unless $pair; my $class = "noselected"; $class = "selected" if $i == $margin; $PREVIOUS = a( { -href => sprintf("browse?count=%d", $pair->[0])}, img({class=>'seta', src=>'/images/esquerda.png', alt=>'<'}), $pair->[1] ) if $i == $margin-1; $FOLLOWING = a( { -href => sprintf("browse?count=%d", $pair->[0])}, $pair->[1], img({class=>'seta', src=>'/images/direita.png', alt=>'>'}) ) if $i == $margin+1; print div({-class=>$class},a({-href => "browse?count=$pair->[0]" }, $pair->[1])),"\n"; } print "
\n"; print a({-href => sprintf("browse?count=%d",$count+$SSTEP) }, img({-class=>"seta", -title=>"avançar $SSTEP", -src=>"/images/baixo.png",-alt=>"+$SSTEP"})) if ($count+$SSTEP<=$TOTAL); print " "; print a({-href => sprintf("browse?count=%d",$count+$DSTEP) }, img({-class=>"seta", -title=>"avançar $DSTEP", -src=>"/images/baixo2.png",-alt=>"+$DSTEP"})) if ($count+$DSTEP<=$TOTAL); print "
\n"; print "
\n"; ## Coluna de Termos $PREVIOUS = div({style=>'float: left; width: 45%'}, $PREVIOUS); $FOLLOWING = div({style=>'float: right; width: 45%; text-align: right'}, $FOLLOWING); my @xmls = $xml->xml_entries($cword); print "
"; print div({class =>'nextprev'}, $PREVIOUS, $FOLLOWING, '
'); for (@xmls) { $xml->_format_xml($DA, $_, $username); }; print "
\n"; ## The #thedef print "
\n"; ## The #block print "


\n"; $DA->TT->process('footer');