2 # Dict.pl: Frontend to dict.org.
4 # Version: v0.6c (20000924).
6 # Updates: Copyright (c) 2005 - Tim Riker <Tim@Rikers.org>
8 # see http://luetzschena-stahmeln.de/dictd/
9 # for a list of dict servers
16 #use vars qw(PF_INET);
18 # need a specific host||ip.
19 my $server = "dict.org";
23 # return unless &::loadPerlModule("IO::Socket");
25 my $proto = getprotobyname('tcp');
36 # TODO: make strict-safe constants... so we can defer IO::Socket load.
37 my $socket = new IO::Socket;
38 socket($socket, PF_INET, SOCK_STREAM, $proto) or return "error: socket: $!";
40 local $SIG{ALRM} = sub { die "alarm" };
42 connect($socket, sockaddr_in($port, inet_aton($server))) or die "error: connect: $!";
48 $retval = "i could not get info from $server '$@'";
50 $socket->autoflush(1); # required.
53 if ($query =~ s/^(\d+)\s+//) {
58 push(@results, &Dict_Wordnet($socket,$query));
59 push(@results, &Dict_Foldoc($socket,$query));
60 push(@results, &Dict_web1913($socket,$query));
63 print $socket "QUIT\n";
66 &::DEBUG(join(";;\n",@results));
67 my $total = scalar @results;
73 if (defined $num and ($num > $total or $num < 1)) {
74 &::msg($::who, "error: choice in definition is out of range.");
81 $retval = sprintf("[%d/%d] %s", $num, $total, $results[$num-1]);
83 # suggested by larne and others.
84 my $prefix = "Dictionary '$query' ";
85 $retval = &::formListReply(1, $prefix, @results);
87 } elsif ($total == 1) {
88 $retval = "Dictionary '$query' ".$results[0];
90 $retval = "could not find definition for \002$query\002";
94 &::performStrictReply($retval);
98 my ($socket, $query) = @_;
101 &::status("Dict: asking Wordnet.");
102 print $socket "DEFINE wn \"$query\"\n";
111 &::DEBUG("wordnet '$_'");
112 if (/^552 no match/) {
115 } elsif (/^250 ok/) {
118 } elsif ($_ eq ".") {
120 push(@results, $def);
121 } elsif (/^\s+(\S+ )?(\d+)?: (.*)/) { # start of sub def.
124 #&::DEBUG("def => '$def'.");
125 push(@results, $def) if ($def ne "");
128 if (0) { # old non-fLR format.
129 $def = "$query $wordtype: $text" if (defined $text);
130 $wordtype = substr($1,0,-1) if (defined $1);
131 #&::DEBUG("_ => '$_'.") if (!defined $text);
133 } elsif (/^\s+(.*)/) {
136 $def =~ s/\[.*?\]$//g;
138 &::DEBUG("ignored '$_'");
142 &::status("Dict: wordnet: found ". scalar(@results) ." defs.");
144 return if (!scalar @results);
150 my ($socket,$query) = @_;
153 &::status("Dict: asking Foldoc.");
154 print $socket "DEFINE foldoc \"$query\"\n";
162 &::DEBUG("foldoc '$_'");
166 } elsif (/^250 ok/) {
171 next if ($def eq "");
172 $def =~ s/^\s+|\s+$//g; # sub def.
173 push(@results, $def);
176 } elsif (/^\s+(.*)/) {
181 } elsif ($_ eq "") { # sub def separator.
186 $def =~ s/^\s+|\s+$//g; # sub def.
189 &::DEBUG("ignored '$_'");
193 &::status("Dict: foldoc: found ". scalar(@results) ." defs.");
195 return if (!scalar @results);
196 #pop @results; # last def is date of entry.
202 my ($socket,$query) = @_;
205 &::status("Dict: asking web1913.");
206 print $socket "DEFINE web1913 \"$query\"\n";
214 &::DEBUG("web1913 '$_'");
222 # definition and/or retrieval
223 next if (/^151/ or /^150/);
229 if ($_ eq "" or $_ =~ /^\.$/) {
231 $string =~ s/^\s+|\s+$//g;
232 $string =~ s/[{}]//g;
234 next if ($string eq "");
236 push(@results, $string);
243 &::status("Dict: web1913: found ". scalar(@results) ." defs.");
245 return if (!scalar @results);
246 # last def is date of entry.