#!/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 "