Created
April 11, 2021 19:30
-
-
Save artlung/74184de3c381966a14f97a8605d17572 to your computer and use it in GitHub Desktop.
~filo/stanford/940520/bin/index.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/local/bin/perl | |
require 'ctime.pl'; | |
require 'newgetopt.pl'; | |
#require '/usr/local/lib/perl5/ctime.pl'; | |
#require '/usr/local/lib/perl5/newgetopt.pl'; | |
#require '/usr/local/lib/perl5/sys/socket.ph'; | |
# | |
# ----> parse_hotlist <---- | |
# takes a file (default /chronos/c1/jerry/.hotlist | |
# with tabs as delimiters for depth | |
# and generate | |
# $MaxTabs -> number of levels | |
# %Keys -> array of keys per level | |
# %Topics -> array of topics | |
# | |
sub parse_hotlist | |
{ | |
if (defined @_) { | |
$hotlist = $_[0]; | |
} | |
else { | |
$hotlist = "hotlist"; | |
} | |
open (IT2, "<$hotlist"); | |
$CurTabs = 0; | |
$CurKey = "top_"; | |
$MaxTabs = 0; | |
while (<IT2>) { | |
chop $_; | |
# print ("Parsing ::: $_\n"); | |
# | |
# count the number of tabs on each line | |
# | |
for ($i =0; $i < length; $i++) { | |
if (substr($_,$i,1) ne "\t") { | |
$v = substr($_, $i); | |
last; | |
} | |
} | |
# | |
# if # tabs more than current | |
# | |
if ($i > $CurTabs) { | |
# print ("$i > $CurTabs, $CurKey\n"); | |
$CurTabs = $i; | |
@tmp = split(/\000/, $Topic{$CurKey}); | |
$CurKey .= "\000".$tmp[$#tmp]; | |
} | |
# | |
# if # tabs less than current | |
# | |
if ($i < $CurTabs) { | |
# print ("$i < $CurTabs, $CurKey\n"); | |
$CurTabs = $i; | |
@tmp = split (/\000/, $CurKey); | |
$CurKey = $tmp[0]; | |
for ($j = 1; $j <= $i; $j++) { | |
$CurKey .= "\000".$tmp[$j]; | |
} | |
} | |
# | |
# insert this into $Topic | |
# | |
while ($CurKey =~ /^(.*)<([a-z]*):(.*)>$/) { | |
$CurKey = $1; | |
} | |
# if ($CurKey=~ /^(.*)<comment:(.*)>$/) { # strip off comment fied | |
# $CurKey = $1; # assume that cannot have one with url... | |
# } | |
if (! defined($Topic{$CurKey})) { | |
$Topic{$CurKey} = $v; | |
} | |
else { | |
$Topic{$CurKey} .= "\000".$v; | |
} | |
# print ("inserting into $CurKey\n"); | |
# | |
# check if maxtab is exceeded | |
# | |
if ($CurTabs > $MaxTabs) { | |
$MaxTabs = $CurTabs; | |
} | |
# | |
# insert CurKey into Key array | |
# | |
if (! defined($Key[$CurTabs])) { | |
$Key[$CurTabs] = $CurKey; | |
} | |
else { | |
@val = split(/\003/, $Key[$CurTabs]); | |
$no = 0; | |
foreach $z (@val) { | |
if ($CurKey eq $z) { | |
$no = 1; | |
last; | |
} | |
} | |
if ($no == 0) { | |
$Key[$CurTabs] .= "\003".$CurKey; | |
} | |
} | |
} | |
close IT2; | |
# print ("keys are :\n", join ("\n", keys(%Topic)), "\n"); | |
# print ("MaxTabs is $MaxTabs\n"); | |
# for ($i =0; $i <= $MaxTabs; $i++) { | |
# print ("$i, $Key[$i] \n"); | |
# } | |
return; | |
} | |
# | |
# canonicalize a directory name | |
# | |
sub canon_path | |
{ | |
local($path) = $_[0]; | |
while ($path =~ /^(.*)<([a-z]*):(.*)>$/) { | |
$path = $1; | |
} | |
$path=~ s/[\']//g; # remove any bad chars ... (better way...) | |
$path =~ s/[\/]/+/g; # remove any bad chars ... (better way...) | |
return $path; | |
} | |
# | |
# prints output of parse_hotlist to files | |
# | |
sub print2file | |
{ | |
undef($dirlist); | |
$dircnt=0; | |
if ($opt_update) { | |
open (HOTDOC, ">$hotstat") ; | |
$date = &ctime(time); | |
chop $date; | |
print HOTODC "<p>"; | |
print HOTDOC "<i> Last modified on $date </i><br>\n"; | |
close HOTDOC; | |
open (HOTDOC, ">$hotdoc") ; | |
} | |
# do the iterative thing here... | |
for ($i =0; $i <= $MaxTabs; $i++) { | |
if ($i != 0) { | |
# | |
# | |
# print ("=======($i, $Key[$i])=====\n"); | |
# | |
# | |
print HOTDOC "<HEADER>\n<TITLE>Jerry and Dave\'s Guide to WWW </TITLE>\n</HEADER>\n<BODY>\n"; | |
} | |
# | |
# big for loop to make appropriate directories | |
# | |
foreach $j (split (/\003/, $Key[$i])) { | |
# | |
# | |
# print ("($j, $Topic{$j}) \n"); | |
# | |
# | |
if ($i != 0) { | |
# | |
# make sure this is same as below for references | |
# | |
@_ = split(/\000/, &canon_path($j)); | |
shift(@_); # get rid of top_ | |
$curdir = join("/",@_); # form directory path | |
$curdir =~ s/[\000\s]+$//g; # remove any trailing whitespace | |
$curdir =~ s/[\000\s]+/_/g; # sub white spaces with _ | |
$curdir = $hotdir."/".$curdir; | |
if (!(-e $curdir)) { | |
$dirlist .= " ".$curdir; | |
$dircnt++; | |
if ($dircnt > 15) { # some random number i made up... | |
# | |
print "mkdir -m g+w $dirlist<br>\n"; | |
# | |
system "mkdir -m g+w $dirlist"; | |
$dirlist =""; | |
$dircnt=0; | |
} | |
} | |
} | |
} | |
if ($dircnt > 0) { | |
# | |
print "mkdir -m g+w $dirlist<br>\n"; | |
# | |
system "mkdir -m g+w $dirlist"; | |
$dirlist =""; | |
$dircnt=0; | |
} | |
# | |
# big for loop to create all files | |
# | |
foreach $j (split (/\003/, $Key[$i])) { | |
# | |
# | |
# print ("($j, $Topic{$j}) \n"); | |
# | |
# | |
if ($i != 0) { | |
# | |
# make sure this is same as above for references | |
# | |
$curfile = &canon_path($j); | |
@_ = split(/\000/,$curfile); | |
shift(@_); | |
$curfile=join("/",@_); | |
$curfile =~ s/[\000\s]+$//g; # remove any trailing whitespace | |
$curfile =~ s/[\000\s]+/_/g; # sub white spaces with _ | |
$curtitle = $curfile; | |
$curfile .= "/index.html"; # current file name | |
$curfile = $hotdir."/".$curfile; | |
$here = pop(@_); | |
# | |
# open up $curfile | |
# | |
open (HOTDOC, ">$curfile"); | |
if (-w $curfile) { | |
# | |
# print "writing to file $curfile<br>\n"; | |
# | |
} | |
else { | |
print "cannot write to file $curfile<br>\n"; | |
} | |
print HOTDOC "<HEADER>\n<TITLE>$curtitle</TITLE>\n</HEADER>\n<BODY>\n"; | |
print HOTDOC "<base href=\"http://akebono.stanford.edu$hottree/$curtitle\"<P>\n"; | |
# print HOTDOC "<a name=\"begin_hotlist\"> <ISINDEX> </a> "; | |
$mod = $i % 3; | |
# horizontal menu bar | |
print HOTDOC "<a href=\"/~jerry/bin/myimagemap/hothead/$curtitle\"><img src=\"/~jerry/gifs/hothead.gif\" ismap></a>\n"; | |
if ($i == 1) { | |
print HOTDOC "<H2><a href=\"$http_url#begin_hotlist\"> <img src=\"/~jerry/gifs/level$mod.gif\" >"; | |
print HOTDOC join(": ", @_),"</a> $here</h2>\n"; | |
} | |
else { | |
print HOTDOC "<H2><a href=\"$http_url#begin_hotlist\">"; | |
print HOTDOC "<img src=\"/~jerry/gifs/level$mod.gif\" ></a><a href=\"./\">"; | |
print HOTDOC join(": ", @_),"</a>: $here</h2>\n"; | |
} | |
print HOTDOC "<UL>\n"; | |
# | |
# put page specific stuff here... | |
# | |
} | |
else { | |
print HOTDOC "<a name=\"begin_hotlist\"> <ISINDEX> </a> "; | |
print HOTDOC "<img align=middle src=\"/~jerry/gifs/grad_line.gif\">\n"; | |
print HOTDOC "<H3>\n"; | |
} | |
foreach $k (sort(split(/\000/, $Topic{$j}))) { | |
if ($i == 0) { | |
$style = "<dd> <img src=\"/~jerry/gifs/redball.gif\">"; | |
$endstyle = "</dd>"; | |
} | |
else { | |
$style = "<LI>"; | |
$endstyle = ""; | |
} | |
undef(%field); | |
while ($k =~ /^(.*)<([a-z]*):(.*)>$/) { | |
$k = $1; | |
$field{$2} = $3; | |
} | |
# | |
# not defined | |
# | |
if (!defined($field{'url'}) && !defined($field{'link'})) { | |
if (!defined($Topic{$j."\000".$k})) { | |
print HOTDOC "$style $k $endstyle\n"; | |
} | |
else { | |
$ref=&canon_path($j."\000".$k); | |
@_ = split(/\000/,$ref); | |
shift(@_); | |
$ref=join("/",@_); | |
$ref =~ s/[\s\000]+$//g; | |
$ref =~ s/[\s\000]+/_/g; # sub white spaces with _ | |
print HOTDOC "$style <a href=\"$hottree/$ref/\"> <b> $k </b> </a> $endstyle"; | |
} | |
} | |
# | |
# url is defined | |
# | |
elsif (defined($url=$field{'url'})) { | |
# url defined | |
print HOTDOC "$style <a href=\"$url\"> $k </a> $endstyle"; | |
$num_url++ unless $seen{$url}++; | |
} | |
# | |
# link is defined | |
# | |
elsif (defined($path=&canon_path($field{'link'}))) { | |
# | |
# pointer to another subheading | |
# | |
$path =~ tr/\#/\//; | |
$path =~ s/[\s\000]+/_/g; # sub white spaces with _ | |
$url = $hottree."/".$path."/"; | |
print HOTDOC "$style <a href=\"$url\"> <b> $k@</b> </a> $endstyle"; | |
} | |
# | |
# comment is defined | |
# | |
if (defined($comment=$field{'comment'})) { | |
print HOTDOC "- $comment"; | |
} | |
# | |
# implement date, author | |
# | |
print HOTDOC "\n"; | |
} | |
if ($i == 0) { | |
print HOTDOC "</H3>\n"; | |
print HOTDOC "<img align=middle src=\"/~jerry/gifs/grad_line.gif\">\n"; | |
} | |
else { | |
print HOTDOC"</UL>\n"; | |
print HOTDOC"<hr><address><a href=\"/~jerry/\">jerry\@akebono.stanford.edu</a></address>\n"; | |
} | |
close HOTDOC; | |
} | |
} | |
if ($opt_update) { | |
open (IT, ">>$hotstat"); | |
print IT "<em> There are currently <b> $num_url </b> entries in the hotlist database </em>\n<br>"; | |
close IT; | |
} | |
return; | |
} | |
# | |
# help | |
# | |
sub usage | |
{ | |
print "-h = help\n"; | |
print "-s <string> = filo's search for string\n"; | |
print "-update = force an update from ~jerry/.hotlist\n"; | |
return; | |
} | |
# | |
# main search mechanism | |
# | |
sub filo_search | |
{ | |
# | |
# serach using filo's remote server... | |
# | |
@query = @_; | |
$pquery = join(" ", @query); | |
$pquery =~ s/\\(.)/$1/g; | |
# | |
# print out search strings to a log | |
# | |
open (SEARCH_LOG,">>$hotdir/search.log"); | |
print SEARCH_LOG "$ENV{REMOTE_HOST} $pquery ", &ctime(time); | |
close SEARCH_LOG; | |
# | |
# talk to dave's server via socket 2345 | |
# | |
$sockaddr_t = 'S n a4 x8'; | |
$port = 2345; | |
$host = 'konishiki'; | |
($x, $x, $proto) = getprotobyname('tcp'); | |
socket(SEARCH, &AF_INET, &SOCK_STREAM, $proto) || die "socket: $!"; | |
($name, $aliases, $type, $len, $thataddr) = gethostbyname($host); | |
$that = pack($sockaddr_t, &PF_INET, $port, $thataddr); | |
connect(SEARCH, $that) || die "connect: $!"; | |
select((select(SEARCH), $| = 1)[0]); | |
print SEARCH "search\nkey $pquery\n\n"; | |
$_ = <SEARCH>; # skip the first empty line | |
$_ = <SEARCH>; | |
if ($_ =~/error/) { | |
print "An error has occurred while searching for \`<b>$pquery</b>\':<p>\n"; | |
while ($_ !~ /^$/) { | |
print $_; | |
$_ = <SEARCH>; | |
} | |
} | |
else { | |
print "Following items relevant to \`<b>$pquery</b>\' are found:<P>\n"; | |
print "<DL>\n"; | |
while ($_ !~ /^$/) { | |
if ($_ =~ /^path/) { | |
# chew up the path | |
undef($path); | |
undef($url); | |
undef($comment); | |
$_ =<SEARCH>; | |
while ($_ =~ /^\t/) { | |
chop; | |
$path .= $_; | |
$_ =<SEARCH>; | |
} | |
$path = &canon_path($path); | |
@p = split(/\t/,$path); | |
} | |
# | |
# wait for the next ^path | |
# | |
while ($_ !~ /^path/) { | |
if ($_ =~ /^$/) { | |
last; | |
} | |
if ($_ =~/^url (.*)$/) { | |
#chew up url | |
$url = $1; | |
} | |
if ($_ =~/^comment (.*)$/) { | |
#chew up comment | |
$comment = $1; | |
} | |
if ($_ =~/^date (.*)$/) { | |
#chew up date | |
$url_date = $1; | |
} | |
$_=<SEARCH>; | |
} | |
# | |
# print out the correct stuff... | |
# | |
if (defined($path)) { | |
if (defined($url)) { | |
$tail = pop @p; | |
$path = join ("/",@p); | |
$path =~ s/[\s\000]+/_/g; # sub white spaces with _ | |
if (!$seen{$path}++) { | |
print "<h2> <a href=\"$http_url#begin_hotlist\">\n"; | |
print "<img src=\"/~jerry/gifs/whiteball.gif\"></a>\n"; | |
print "<a href=\"$hottree$path\">$path</a></h2>\n"; | |
} | |
print "<ul><li><a href=\"$url\">$tail</a>\n"; | |
} | |
else { | |
$path = join ("/",@p); | |
$path =~ s/[\s\000]+/_/g; # sub white spaces with _ | |
if (!$seen{$path}++) { | |
print "<h2> <a href=\"$http_url#begin_hotlist\">\n"; | |
print "<img src=\"/~jerry/gifs/whiteball.gif\"></a>\n"; | |
print "<a href=\"$hottree/$path\">$path</a></h2>\n"; | |
} | |
} | |
if (defined($comment)) { | |
print "- $comment\n"; | |
} | |
print "</ul>\n"; | |
} | |
if ($_ =~ /^$/) { | |
last; | |
} | |
} | |
} | |
close SEARCH; | |
} | |
# | |
# main routine | |
# | |
{ | |
# | |
# definitions | |
# | |
$title = "Hotlist Search"; | |
$http_url = "http://akebono.stanford.edu/~jerry/bin/index.html"; | |
$htdocs_root = "/usr/local/etc/httpd/htdocs"; | |
$hottree = "/users/www_server"; | |
$hotdir = "/home/filo/public/stanford/940520"; | |
$hotdoc = "$hotdir/hotdoc.html"; | |
$hotstat = "$hotdir/hotstat.html"; | |
$rootdoc = "$htdocs_root/users/jerry/stuff.html"; | |
undef($MaxTabs); | |
undef($Topic); | |
undef($Key); | |
$num_url = 0; | |
# | |
# if there is an argument, process it... | |
# | |
if (defined @ARGV) { | |
&NGetOpt('h','update','s=s','search'); | |
print "Content-type: text/html\n\n"; | |
if ($opt_h) { | |
print "<HEAD>\n<TITLE>Help</TITLE>\n</HEAD>\n"; | |
print "<body><h1>Help</h1>\n"; | |
print "<pre>\n"; | |
&usage; | |
print "</pre>\n"; | |
} | |
elsif ($opt_update){ | |
print "<HEAD>\n<TITLE>Update hotlist</TITLE>\n</HEAD>\n"; | |
print "<body><h1>Updating hotlist</h1>\n"; | |
print "<h3>This may take a while...</h3>\n"; | |
# print ("umask is ", umask,"<br>\n"); | |
umask((umask() & 0) | 75); | |
# print ("umask is ", umask,"<br>\n"); | |
&parse_hotlist; | |
&print2file; | |
print "<a href=\"/~jerry/bin/index.html\">Reload</a> hotlist<br>\n"; | |
} | |
else { | |
# | |
# do the search | |
# | |
print "<HEAD>\n<TITLE>Search of ", $title, "</TITLE>\n"; | |
print "</HEAD>\n"; | |
print "<BODY>\n<H1>", $title, "</H1>\n"; | |
print "<base href=\"http://akebono.stanford.edu/~jerry/bin/index.html?-search\">\n"; | |
# | |
print "Perl regular expressions can also be entered<br>\n"; | |
print "The words will be matched against title, URL, and comments<br>\n"; | |
print "Enter string(s) or substring(s) you wish to search for, and hit <b>return</b>.<br>\n"; | |
print "<a name=\"begin_hotlist\"> <ISINDEX> </a> "; | |
if (!$opt_search) { | |
&filo_search(@ARGV); | |
} | |
# | |
print "<form method=\"POST\" action=\"http://akebono.stanford.edu/~jerry/bin/search-engine\">"; | |
print "<img align=middle src=\"/~jerry/gifs/grad_line.gif\"><br>\n"; | |
print "Press <input type=\"submit\" value=\"Here\"> to go to "; | |
print "<select name=\"search-engines\">\n"; | |
print "<option selected> IS Workgroup Search Engines\n"; | |
print "<option> SUSI II Search Engines\n"; | |
print "<option> W3 Search Engines\n"; | |
print "<option> DACLOD\n"; | |
print "<option> World Wide Web Worm\n"; | |
print "</select><br>\n"; | |
print "<p></form>\n"; | |
} | |
} | |
# | |
# no argument - just print out the list | |
# | |
else { | |
# | |
# print out the hotlist | |
# | |
$i = 0; | |
print "Content-type: text/html\n\n"; | |
# | |
# foreach $k (keys(%ENV)) { | |
# print "$k=$ENV{$k}<p>\n"; | |
# } | |
# | |
print "<HEADER>\n<TITLE>Jerry and Dave\'s Guide to WWW </TITLE>\n"; | |
print "<base href=\"http://public.yahoo.com/filo/stanford/940520/\">\n"; | |
print "</HEADER>\n"; | |
print "<body>\n"; | |
print "<H1>Jerry and Dave's WWW Interface... <I>(Always Under construction) </I></H1>"; | |
if (defined($ENV{HTTP_FROM})) { | |
if ($ENV{HTTP_FROM}=~/(.+)@(.+)/) { | |
print "<h2> Welcome, $1 from $2 </h2><hr>"; | |
} | |
else { | |
print "<h2> Welcome, $ENV{HTTP_FROM} </h2><hr>"; | |
} | |
} | |
else { | |
print "<h2> Welcome, visitor from $ENV{REMOTE_HOST} </h2><hr>"; | |
} | |
open (IT, "<$rootdoc"); | |
while (<IT>) { | |
print ; | |
} | |
close IT; | |
# print "<h2> Please Read!!</h2>This is the <i>new</i> version of the hotlist with new directory organization. Please <a href=\"/~jerry/form.html\">tell me</a> of any bugs. Thanks.<hr>"; | |
open (IT, "<$hotstat"); | |
while (<IT>) { | |
print ; | |
} | |
close IT; | |
# print "<hr>\n"; | |
open (HOTDOC, "<$hotdoc") || warn ("open: $hotdoc"); | |
while (<HOTDOC>) { | |
print ; | |
$i++; # to handle the bug!! | |
sleep 1 unless ($i % 1400 ); # to handle the bug!! | |
} | |
close HOTDOC; | |
} | |
print "</body>\n"; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Originally captured from https://web.archive.org/web/20020306060700/http://public.yahoo.com/~filo/stanford/940520/bin/index.html