#!/usr/local/bin/perl ####################################################################### # $Author: jgoerzen $ # $Revision: 1.1.1.1 $ # $Date: 2000/08/19 00:28:56 $ # $Source: /var/cvs/gopher/gopherd/scripts/autoabstract,v $ # $State: Exp $ # # Paul Lindner, University of Minnesota. # # Copyright 1994 by the Regents of the University of Minnesota # see the file "Copyright" in the distribution for conditions of use. ####################################################################### # MODULE: autoabstract # # A script to automatically generate a gopher+ ABSTRACT for an item # It can be set up to build .abstract files too.. # ####################################################################### # Revision History: # $Log: autoabstract,v $ # Revision 1.1.1.1 2000/08/19 00:28:56 jgoerzen # Import from UMN Gopher 2.3.1 after GPLization # # Revision 1.3 1995/02/06 22:27:56 lindner # Use dynamic space for Data_Dir, remove RunLS # # Revision 1.2 1994/12/15 17:34:25 lindner # Fix for .txt files # # Revision 1.1 1994/12/14 19:14:28 lindner # New scripts for Automatic Gopher Blocks # # ####################################################################### ####################################################################### # Parameters you might want to set.. # # %txtconvert specifies programs that take non-text output and # output a text version. # # $cacheit specifies that this script should automatically generate # .abstract files for us. eats disk space like a pig ####################################################################### # $txtconvert{'.ps'} = "ps2ascii \"%s\""; $txtconvert{'.html'} = "lynx -dump \"%s\""; $txtconvert{'.tar.Z'} = "zcat \"%s\" | tar tvf -"; $txtconvert{'.zip'} = "unzip -l \"%s\""; $txtconvert{'.tex'} = "detex %s"; $cacheit = 0; # ####################################################################### $filenamebase = shift || die "Need a filename..."; $fname = $filenamebase; $ENV{'PATH'} = $ENV{'PATH'} . ':/usr/local/bin:/usr/gnu/bin'; # # First, find out what filenames there are.. # exit if (-f "$fname.abstract"); exit if (-d "$fname"); $fname = &FindFiletoAbstract($fname); ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime, $mtime,$ctime,$blksize,$blocks) = stat($fname); exit if ($size < 512); exit if ($fname =~ /gif$/i); open(f, "<$fname"); foreach $e (keys(%txtconvert)) { if ($fname =~ /$e$/i) { $cmd = sprintf($txtconvert{"$e"}, $fname); close(f); open(f, "$cmd |"); done; } } # # Slurp file a paragraph at a time.. # $/ = ""; # # Read the first paragraph, lots of interesting stuff here.. # $_ = ; while (! (/^[\s]*/)) { $_ = ; } $firstpara = $_; if (/^From [\S]+[\s]+\S\S\S[\s]+\S\S\S[\s]+[\d]+ [\d]+:[\d]+:[\d]+ \d\d\d\d/ || /^Newsgroups: / || /^Article[\s]+[\d]+[\s]+of/ || /^Path: /) { # News or mail thingie... @lines = split(/\n/); foreach $i (@lines) { if ($i =~ /^Subject: (.*)$/) { $abstract .= $1 . "\n"; } if ($i =~ /^Newsgroups: (.*)$/) { $abstract .= $i . "\n"; } if ($i =~ /^Organization: (.*)$/) { $abstract .= $i . "\n"; } if ($i =~ /^Summary: (.*)$/) { $abstract .= $1 . "\n"; } if ($i =~ /^From: (.*)$/) { $abstract .= $i . "\n"; } if ($i =~ /^Keywords: (.*)$/) { $abstract .= $1 . "\n"; } } } elsif (/^\#!\/.*perl/ || /^\#!\/.*sh/) { @lines = split(/\n/); shift(@lines); foreach $i (@lines) { if (/\#/) { $abstract .= "$i\n"; } } } else { while () { if (length($firstpara) < 300) { $firstpara .= "\n$_"; } if (/^[\s]+Abstract/i) { $abstract .= $_; } if ($lastpara =~ /Abstract[\s]+$/i) { $abstract .= $_; } if (/^[\s]+Summary/i) { $abstract .= $_; } if ($lastpara =~ /Summary[\s]+$/i) { $abstract .= $_; } $lastpara = $_; } } $len = length($abstract); exit if ($len == $size); $abstract = $firstpara if ($len == 0); print "$abstract\n"; if ($cacheit) { open(abstractout, ">$filenamebase.abstract"); print abstractout "$abstract\n"; close(abstractout); } sub FindFiletoAbstract { local($fname) = @_; local($base, $f); return($fname) if ( -f $fname); # # Probably not a text file... # $fname =~ m/^(.*)\/([^\/]+)$/; $base = $1; $f = $2; if (!($fname =~ /\//)) { $base = "."; $f = $fname; } opendir(thedir, $base); @files = readdir(thedir); foreach $i (@files) { if ($i =~ /^$f/) { foreach $t (keys(%txtconvert)) { return("$base/$i") if ($i =~ /$t$/i); } return("$base/$i") if ($i =~ /txt$/i); push(@ourfiles, $i) } } closedir(thedir); return($ourfiles[1]); }