2 # Dict.pl: Frontend to dict.org.
4 # Version: v0.6c (20000924).
13 my $server = "dict.org"; # need a specific host||ip.
15 my $proto = getprotobyname('tcp');
17 ###local $SIG{ALRM} = sub { die "alarm\n" };
21 ### return unless &::loadPerlModule("IO::Socket");
22 my $socket = new IO::Socket;
32 socket($socket, PF_INET, SOCK_STREAM, $proto) or return "error: socket: $!";
35 connect($socket, sockaddr_in($port, inet_aton($server))) or return "error: connect: $!";
40 if ($@ && $@ ne "alarm\n") { # failure.
41 $retval = "i could not get info from dict.org";
43 $socket->autoflush(1); # required.
46 if ($query =~ /^(\d+)\s+/) {
51 push(@results, &Dict_Wordnet($socket,$query));
52 push(@results, &Dict_Foldoc($socket,$query));
55 print $socket "QUIT\n";
58 my $total = scalar @results;
60 if (defined $num and ($num > $total or $num < 0)) {
61 &msg($::who, "error: choice in definition is out of range.");
68 $retval = sprintf("[%d/%d] %s", $num, $total, $results[$num]);
70 # suggested by larne and others.
71 my $prefix = "Dictionary '$query' ";
72 $retval = &::formListReply(1, $prefix, @results);
74 } elsif ($total == 1) {
75 $retval = "Dictionary '$query' ".$results[0];
77 $retval = "could not find definition for \002$query\002";
81 &::performStrictReply($retval);
85 my ($socket, $query) = @_;
88 &::status("Dict: asking Wordnet.");
89 print $socket "DEFINE wn \"$query\"\n";
98 if ($_ eq ".") { # end of def.
100 } elsif (/^250 /) { # stats.
102 } elsif (/^552 no match/) { # no match.
104 } elsif (/^\s+(\S+ )?(\d+)?: (.*)/) { # start of sub def.
107 ### &::DEBUG("def => '$def'.");
108 push(@results, $def) if ($def ne "");
111 if (0) { # old non-fLR format.
112 $def = "$query $wordtype: $text" if (defined $text);
113 $wordtype = substr($1,0,-1) if (defined $1);
114 ### &::DEBUG("_ => '$_'.") if (!defined $text);
117 } elsif (/^\s+(.*)/) {
120 $def =~ s/\[.*?\]$//g;
124 &::status("Dict: wordnet: found ". scalar(@results) ." defs.");
126 return if (!scalar @results);
132 my ($socket,$query) = @_;
135 &::status("Dict: asking Foldoc.");
136 print $socket "DEFINE foldoc \"$query\"\n";
144 return if /^552 /; # no match.
147 $firsttime-- if ($_ eq "");
151 last if (/^250/ or /^\.$/); # stats; end of def.
153 s/^\s+|\s+$//g; # each line.
155 if ($_ eq "") { # sub def separator.
156 $string =~ s/^\s+|\s+$//g; # sub def.
157 $string =~ s/[{}]//g;
159 next if ($string eq "");
161 push(@results, $string);
168 &::status("Dict: foldoc: found ". scalar(@results) ." defs.");
170 return if (!scalar @results);
171 pop @results; # last def is date of entry.