home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
perl_ste.zip
/
CPAN
/
WAIT.pm
Wrap
Text File
|
1997-08-12
|
11KB
|
365 lines
# -*- Mode: Perl -*-
# $Basename: WAIT.pm $
# $Revision: 1.6 $
# Author : Ulrich Pfeifer
# Created On : Fri Jan 31 11:30:46 1997
# Last Modified By: Ulrich Pfeifer
# Last Modified On: Tue Aug 12 11:54:22 1997
# Language : CPerl
# Update Count : 141
# Status : Unknown, Use with caution!
#
# (C) Copyright 1997, Ulrich Pfeifer, all rights reserved.
#
#
package CPAN::WAIT;
use ExtUtils::MakeMaker; # MM->catfile
use CPAN ();
require WAIT::Client;
require FileHandle;
use vars qw($VERSION $DEBUG $TIMEOUT);
# $Format: "\$\V\E\R\S\I\O\N = '$ModuleVersion$';"$ MM_Unix bug
$VERSION = '0.24';
$TIMEOUT = 20; # Set this to some larger value if you
# have a slow connection.
sub _open_connection () {
my ($host, $port, $con);
# Make sure that there is a wait server to try
unless ($CPAN::Config->{'wait_list'}) {
$CPAN::Config->{'wait_list'} = ['wait://ls6.informatik.uni-dortmund.de'];
}
# Try direct connection
my $server;
SERVER:
for $server (@{$CPAN::Config->{'wait_list'}}) {
warn "CPAN::WAIT $VERSION checking $server\n" if $DEBUG;
if ($server =~ m(^wait://([^:]+)(?::(\d+))?)) {
($host, $port) = ($1, $2 || 1404);
# Constructor is inherited from Net::NNTP
$con = WAIT::Client->new($host, Port => $port, Timeout => $TIMEOUT)
unless $DEBUG and $DEBUG =~ /force proxy/;
last SERVER if $con;
}
}
# Try connection via an http proxy
unless ($con) {
warn "Could not connect to the WAIT server at $host port $port\n"
unless $DEBUG and $DEBUG =~ /force proxy/;
if ($CPAN::Config->{'http_proxy'}) {
print "Trying your http proxy $CPAN::Config->{'http_proxy'}\n";
SERVER:
for $server (@{$CPAN::Config->{'wait_list'}}) {
if ($server =~ m(^wait://([^:]+)(?::(\d+))?)) {
($host, $port) = ($1, $2 || 1404);
$con = WAIT::Client::HTTP->new($host,
Port => $port,
Proxy => $CPAN::Config->{'http_proxy'},
Timeout => $TIMEOUT);
last SERVER if $con;
}
}
warn "No luck with your proxy either. Giving up\n"
unless $con;
} else {
warn "You did not tell the CPAN module about an http proxy.\n" .
"I could use such a beast instead of a direct connection.\n";
}
}
# We had no luck.
warn "No searching available!\n" unless $con;
return $con;
}
my $con;
# Temporary file for retrieved documents
my $tmp = MM->catfile($CPAN::Config->{'cpan_home'}, 'w4c.pod');
# run a search
sub wq {
my $self = shift;
my $result;
local ($") = ' ';
$con ||= _open_connection || return;
print "Searching for '@_'\n";
unless ($result = $con->search(@_)) {
print "Your query contains a syntax error.\n";
$self->wh('wq');
} else {
print $con->message;
print @{$result};
print "Type 'wr <number>' or 'wd <number>' to examine the results\n";
}
$result;
}
# display hit record
sub wr {
my $self = shift;
my $hit = shift;
my $result;
if (@_ or !$hit) {
print "USAGE: wr <hit-number>\n";
} else {
$con ||= _open_connection || return;
print "fetching info on hit number $hit\n";
$result = $con->info($hit);
print @$result;
}
$result;
}
# display hit document
sub wd {
my $self = shift;
my $hit = shift;
my $result;
if (@_ or !$hit) {
print "USAGE: wd <hit-number>\n";
return;
}
$con ||= _open_connection || return;
print "Get hit number $hit ...";
my $text = $con->get($hit);
my $lines = ($text)?@$text:'no';
print " done\nGot $lines lines\nRunning perldoc on it ...\n";
# perldoc does not read STDIN; so we need a temp file
{
my $fh = new FileHandle ">$tmp";
$fh->print(@{$text});
}
# is system available every were ??
system $^X, '-S', 'perldoc', $tmp
and warn "Could not run '$^X -S perldoc $tmp': $?\n"
and system $Config{'pager'}, $tmp
and warn "Could not run '$Config{'pager'} $tmp': $?\n"
and print @$text;
$text;
}
sub wl {
my $self = shift;
my $hits = shift;
if (@_) {
print "USAGE: wl <maximum-hit-count>\n";
return;
}
$con ||= _open_connection || return;
print "Setting maximum hit count to $hits\n";
$con->hits($hits);
}
my %HELP =
(
'h' => q{
'wh' displays a short summary of commands available via the WAIT
plugin.
'wh <command>' displays information about a the command given as argument
},
'q' => q{
Here are some query examples:
information retrieval free text query
information or retrieval same as above
des=information retrieval `information' must be in the description
des=(information retrieval) one of them in description
des=(information or retrieval) same as above
des=(information and retrieval) both of them in description
des=(information not retrieval) `information' in description and
`retrieval' not in description
des=(information system*) wild-card search
au=ilia author names may be misspelled
You can build arbitary boolean combination of the above examples.
The following fields are known:
'synopsis', 'name', 'bugs', 'author', 'example', 'description',
'environment'
Field names may be abbreviated.
},
'r' => q{
'wr <hit-number>' displays the record of the selected hit. Records look
like this:
source authors/id/CHIPS/perl5.003_24.tar.gz
headline perl - Practical Extraction and Report Language
size 12786
docid data/perl/pod/perl.pod
'source' is the patch relative to http://www.perl.org/CPAN/.
'headline' is the contents of the 'NAME' section of the POD document
'size' is the size of the POD document (not the size of the tar archive)!
'docid' is the path the POS document is stored in. It should be the
path in the tar archive minus the version number + a 'data'
prefix.
},
'l' => q{
Since answers to queries are sorted by decreasing probability of relevance,
you will probably be interested only in the first few hits. To limit the amout
of network traffic, the WAIT server only returns the best 10 hits per default.
You can change this limit with 'wl <number>'.
},
'd' => q{
The 'wd <hit-number>' command retrieves the POD document form the
server and stores it in the file 'w2c' in your CPAN directory. Then it
runs 'perlpod' on it. If you have problems, check if you local
'perlpod' works with absolute path names. Older versions are know to
fail. Also try to avoid fetching of large documents like 'perlfunc.pod'.
Use 'wr <hit-number>' to see how large the documents are before fetching
the actually if you have a slow connection.
},
);
sub wh {
my $self = shift;
my $cmd = shift;
if ($cmd and $cmd =~ /(\w)$/) {
print $HELP{$1} || "No help for 'w$1' yet.\n";
} else {
print qq[
Available commands:
wq query search the WAIT4CPAN server
wr hit-number display search result record
wd hit-number fetch the document and run perldoc on it
wl count limit search to <count> hits
wh command displays help on command if available
];
}
1;
}
END {
unlink $tmp if -e $tmp;
}
1;
__DATA__
=head1 NAME
CPAN::WAIT - adds commands to search a WAIT4CPAN server to the CPAN C<shell()>
=head1 SYNOPSIS
perl -MCPAN -e shell
> wq au=wall
> wr 3
> wd 3
> wl 20
> wh
> wh wq
=head1 DESCRIPTION
B<CPAN::WAIT> adds some comands to the CPAN C<shell()> to perform
searches on a WAIT server. It connects to a WAIT server using a simple
protocoll resembling NNTP as described in RFC977. It uses the
B<WAIT::Client> module to handle this connection. This in turn
inherits from B<Net::NNTP> from the F<libnet> package. So you need
B<Net::NNTP> to use this module.
If no direct connection to the WAIT server is possible, the modules
tries to connect via your HTTP proxy (as given by the CPAN
configuration). Be warned though that the emulation of the stateful
protocol via HTTP is slow.
The variable C<CPAN::WAIT::TIMEOUT> specifies the number of seconds to
wait for an answer from the server. The default is 20. You may want to
set it to some larger value if you have a slow connection.
The commands available are:
=over
=item B<wh> [B<command>]
Displays a short help message if called without arguments. If you
provide the name of another command you will get more information on
this command if available. Currently only B<wq> will be explained.
=item B<wl> I<count>
Limit the number of hits returned in a search to I<count>. The limit
usually is set ot 10 of you don't set it.
=item B<wq> I<query>
Send a query to the server.
Here are some query examples:
information retrieval free text query
information or retrieval same as above
des=information retrieval `information' must be in the description
des=(information retrieval) one of them in description
des=(information or retrieval) same as above
des=(information and retrieval) both of them in description
des=(information not retrieval) `information' in description and
`retrieval' not in description
des=(information system*) wild-card search
au=ilia author names may be misspelled
You can build arbitary boolean combination of the above examples.
Field names may be abbreviated. For further information see
F<http://ls6-www.informatik.uni-dortmund.de/CPAN>
The result should look like this:
wq au=wall
1 8.039 a2p - Awk to Perl translator
2 8.039 s2p - Sed to Perl translator
3 8.039 perlipc - Perl interprocess communication (signals, fifos, pipes, safe subprocesses, sockets, and semaphores)
4 8.039 ExtUtils::DynaGlue - Methods for generating Perl extension files
5 8.039 h2xs - convert .h C header files to Perl extensions
6 8.039 Sys::Syslog, openlog, closelog, setlogmask, syslog - Perl interface to the UNIX syslog(3) calls
7 8.039 h2ph - convert .h C header files to .ph Perl header files
8 8.039 Shell - run shell commands transparently within perl
9 8.039 pl2pm - Rough tool to translate Perl4 .pl files to Perl5 .pm modules.
10 8.039 perlpod - plain old documentation
=item B<wr> I<hit-number>
Display the Record of hit number I<hit-number>:
wr 1
source authors/id/CHIPS/perl5.003_24.tar.gz
headline a2p - Awk to Perl translator
size 5643
docid data/perl/x2p/a2p.pod
=item B<wd> I<hit-number>
Fetches the full text from the server and runs B<perlpod> on it. Make
sure that you have B<perlpod> in your path. Also check if your
B<perlpod> version can handle absolute pathes. Some older versions
ironically do not find a document if the full patch is given on the
command line.
=back
=head1 AUTHOR
Ulrich Pfeifer E<lt>F<pfeifer@ls6.informatik.uni-dortmund.de>E<gt>