diff options
author | adam.danischewski@gmail.com <adam.danischewski@code.google.com> | 2015-12-26 05:04:28 -0500 |
---|---|---|
committer | adam.danischewski@gmail.com <adam.danischewski@code.google.com> | 2015-12-26 05:04:28 -0500 |
commit | 237aa4d809412cc91d4ef57a16783979ba866f0f (patch) | |
tree | 0a923e2cc7ddde82bcb28342f8f985c28c02cb60 /info2html | |
parent | 509b23289dd65a1512d69ab5c6ee63ef8d868fce (diff) |
Initialization.
Diffstat (limited to 'info2html')
-rwxr-xr-x | info2html | 746 |
1 files changed, 746 insertions, 0 deletions
diff --git a/info2html b/info2html new file mode 100755 index 0000000..8479b69 --- /dev/null +++ b/info2html @@ -0,0 +1,746 @@ +#!/usr/bin/perl +#--------------------------------------------------------- +# info2html +#--------------------------------------------------------- +# +# PURPOSE +# This perl script converts info nodes to HTML format. +# The node is specified on the command line using the +# syntax +# (<infofile>)<tag> +# If <infofile> and/or <tag> are missing, (dir)Top is assumed. +# +# AUTHOR +# Karl Guggisberg <guggis@iam.unibe.ch> +# +# HISTORY +# 11.10.93 V 1.0 +# 14.10.93 V 1.0a some comments added +# 15.10.93 V 1.0b file for configuration settings +# 16.10.93 V 1.0c multiple info path possible +# some bugs in escaping references removed +# 28.6.94 V 1.0d some minor changes +# 8.4.95 V 1.1 bug fixes by Tim Witham +# <twitham@eng.fm.intel.com> +# 1998.05.05 V 1.2 bug fixes, added expires headers, added infocat, +# taken over web site maintenance. +# Jon Howell <jonh@cs.dartmouth.edu> +# 2006-08-16 V 2.0 Output HTML is tidier now. CSS added. +# Lots of new config vars added, so old config files +# may not work happily unless you tweak them a bit. +# Minor bugfixes to the (de)escaping logic. +# Minor typoes in comments fixed. +# +#------------------------------------------------------- +require 5; # even though most of the code is in Perl 4 style. +$VERSION = "2.0"; + +# Getting the full path of the info2html.conf +$0 =~ m!(.*/)[^/]+$!; +use File::Basename; +$CURRENT_PATH=dirname(__FILE__); +$INFO2HTMLCONF = $CURRENT_PATH."/info2html.conf"; +require($INFO2HTMLCONF); #-- configuration settings + +use CGI; +#$ENV{'REQUEST_METHOD'} or + #print "Note: I'm really supposed to be run as a CGI!\n"; + +#-- patterns +$NODEBORDER = '\037\014?'; #-- delimiter of an info node +$REDIRSEP = '\177'; #-- delimiter in tag tables +$WS = '[ \t]+'; #-- white space + +$WSS = '[ \t]*'; #-- white space * +$TE = '[\t\,\.]'; #-- end of a tag +$TAG = '[^\t\,\.]+'; #-- pattern for a tag +$FTAG = '[^\)]+'; #-- pattern for a file name in + #-- a cross reference + +#--------------------------------------------------------- +# DieFileNotFound +#--------------------------------------------------------- +# Replies and error message if the file '$FileName' is +# not accessible. +#--------------------------------------------------------- +# Don't reveal where we're looking... --jonh 5/20/97 (and reapplied 5/4/1998) +sub DieFileNotFound{ + local($FileName) = @_; + #-- TEXT : error message if a file could not be opened + print <<"EOF"; +<html><head><title>Info Files - Error Message</title> +$BOTS_STAY_AWAY +$HTML_HEAD_STUFF</head><body class='error noopen'> +<h1>File IO Error</h1> +The Info file could not be opened for reading. +</body></html> +EOF + die "\n"; +} + +#--------------------------------------------------------- +# Escape +#--------------------------------------------------------- +sub Escape{ + local($Tag) = @_; + #-- escaping is not needed anymore KG/28.6.94 + #-- oh yes it is -- jonh 5/16/1997 + + $Tag =~ s/ /%20/g; # space + $Tag =~ s/\+/%AB/g; # + + + #$Tag; + return CGI::escape($Tag); +} + +#---------------------------------------------------------- +# DeEscape +#---------------------------------------------------------- +sub DeEscape{ + local($Tag) = @_; + #-- deescaping is not needed anymore. KG/28.6.94 + $Tag =~ s/%AB/%2b/g; + $Tag =~ s/%20/ /g; + #-- oh yes it is -- jonh 5/16/1997 + #$Tag; + return CGI::unescape($Tag); +} + +#---------------------------------------------------------- +# ParsHeaderToken +#---------------------------------------------------------- +# Parses the heaer line of an info node for a specific +# link directive (e.g. Up, Prev) +#---------------------------------------------------------- +sub ParsHeaderToken{ + local($HL,$Token) = @_; + local($InfoFile,$Tag,$Temp); + return ("","") if $HL !~ /$Token:/; #-- token not available + $HL =~ m!$Token:$WS(\(($FTAG)\))!; + $InfoFile = $2; + $Temp = $2 ne "" ? '\('.$2.'\)' : ""; + $HL =~ m!$Token:$WS$Temp$WSS([^\t\,\.\n]+)?([\t\,\.\n])!; + $Tag = $1 ne "" ? $1 : "Top"; + return $InfoFile,$Tag; +} + +#--------------------------------------------------------- +# ParsHeaderLine +#-------------------------------------------------------- +# Parses the header line on an info node for all link +# directives allowed in a header line. +# Sometimes the keyword 'Previous' is found in stead of +# 'Prev'. That's why the redirection line is checked +# against both of these keywords. +#------------------------------------------------------- +sub ParsHeaderLine{ + local($HL) = @_; + local(@LinkInfo,@LinkList); + #-- Node + @LinkInfo = &ParsHeaderToken($HL,"Node"); + push(@LinkList,@LinkInfo); + #-- Next + @LinkInfo = &ParsHeaderToken($HL,"Next"); + push(@LinkList,@LinkInfo); + #-- Up + @LinkInfo = &ParsHeaderToken($HL,"Up"); + push(@LinkList,@LinkInfo); + #-- Prev or Previous + @LinkInfo = &ParsHeaderToken($HL,"Prev"); + &ParsHeaderToken($HL,"Previous") if $LinkInfo[0] eq "" && $LinkInfo[1] eq ""; + push(@LinkList,@LinkInfo); + return @LinkList; +} + +############################################################ +# turn tabs into correct number of spaces +# +sub Tab2Space { + local($line) = @_; + $line =~ s/^\t/ /; # 8 leading spaces if initial tab + while ($line =~ s/^([^\t]+)(\t)/$1 . ' ' x (8 - length($1) % 8)/e) { + } # replace each tab with right num of spaces + return $line; +} + +#-------------------------------------------------------- +# MenuItem2HTML +#-------------------------------------------------------- +# Transform an info menu item in HTML with references +#------------------------------------------------------- +sub MenuItem2HTML{ + local($Line,$BaseInfoFile) = @_; + local($MenuLinkTag,$MenuLinkFile,$MenuLinkRef,$MenuLinkText); + + $Line = &Tab2Space($Line); # make sure columns line up well + + if ($Line =~ /\* ([^:]+)::/){ # -- is a simple entry ending with :: ? + $MenuLinkTag = $1; + $MenuLinkRef = $1; + $MenuLinkText = $'; + $MenuLinkFile = &Escape($BaseInfoFile); + + } elsif ($Line =~ /\* ([^:]+):(\s*\(($FTAG)\)\.?)?(.*)$/) { + $MenuLinkFile = $BaseInfoFile; + $MenuLinkRef = $1; + $MenuLinkText = $4; + if ($2) { + $MenuLinkFile = $3; + $MenuLinkTag = 'Top'; + $MenuLinkText = ($2 ? ' ' x (length($2)+1) : '') . "$4\n"; + } else { + $Line = "$4\n"; + if ($Line =~ /( *($TAG)?$TE(.*))$/) { + $MenuLinkTag = $2; + $MenuLinkText = $Line; + } + } + } else { # can't determine link, just show it + return $Line; + } + $MenuLinkTag = &Escape($MenuLinkTag); # -- escape special chars + + # Yes, we routinely double-escape. Does anyone remember why? + + #-- produce a HTML line + return "$MENU_DOT<a class='menux' href=\"$PROGRAM?($MenuLinkFile)$MenuLinkTag\">$MenuLinkRef</a>$MenuLinkText"; +} + +#------------------------------------------------------------- +# ReadIndirectTable +#------------------------------------------------------------ +# Scans an info file for the occurence of an 'Indirect:' +# table. Scans the entries and returns two lists with the +# filenames and the global offsets. +#--------------------------------------------------------- +sub ReadIndirectTable{ + local($FileName,*InfoFiles,*Offsets) = @_; + local($i,$Next); +# open(FH1,$FileName) || &DieFileNotFound($FileName); + if ( $FileName =~ /^(.+)\.gz$/ ) { + open(FH1,"gunzip < " . $FileName . " 2>/dev/null |") || &DieFileNotFound($FileName); + } elsif ( $FileName =~ /^(.+)\.bz2$/ ) { + open(FH1,"bzcat " . $FileName . " 2>/dev/null |") || &DieFileNotFound($FileName); + } else { + open(FH1,$FileName) || &DieFileNotFound($FileName); + } + #-- scan for start of Indirect: Table + while(<FH1>){ + $Next = <FH1> if /$NODEBORDER/; + last if $Next =~ /^Indirect:/i; + } + $i = 0; + #-- scan the entries and setup the arrays + while(<FH1>){ + last if /$NODEBORDER/; + if(/([^:]+):[ \t]+(\d+)/){ + push(@InfoFiles,$1); + push(@Offsets,$2); + } + } + close(FH1); +} + +#--------------------------------------------------------- +# ReadTagTable +#-------------------------------------------------------- +# Reads in a tag table from an info file. +# Returns an associative array with the tags found. +# Tags are transformed to lower case (info is not +# case sensitive for tags). +# The entries in the associative array are of the +# form +# <file>#<offset> +# <file> may be empty if an indirect table is +# present or if the node is located in the +# main file. +# 'Exists' indicates if a tag table has been found. +# 'IsIndirect' indicates if the tag table is based +# on a indirect table. +#-------------------------------------------------------- +sub ReadTagTable{ + local($FileName,*TagList,*Exists,*IsIndirect) = @_; + local($File,$Offset); + + if ( $FileName =~ /^(.+)\.gz$/ ) { + open(FH,"gunzip < " . $FileName . " 2>/dev/null |") || &DieFileNotFound($FileName); + } elsif ( $FileName =~ /^(.+)\.bz2$/ ) { + open(FH,"bzcat " . $FileName . " 2>/dev/null |") || &DieFileNotFound($FileName); + } else { + open(FH,$FileName) || &DieFileNotFound($FileName); + } + + $Exists = 0; + $IsIndirect = 0; + #-- scan for start of tag table + while(<FH>){ + if(/$NODEBORDER/){ + if (<FH> =~ /^Tag table:/i){ + $Exists = 1; + last; + } + } + } + #-- scan the entries + while (<FH>){ + $IsIndirect = 1 if /^\(Indirect\)/i; + last if /$NODEBORDER/; + /Node:[ \t]+([^$REDIRSEP]+)$REDIRSEP(\d+)/; + $Tag = $1; + $Tag =~ y/A-Z/a-z/; #-- to lowercase + $Offset = $2; + if(/File:[ \t]+([^\t,]+)/){ + $File = $1; + } + else{ + $File = ""; + } + $TagList{$Tag} = $File."#".$Offset; + } + close(FH); +} + +#---------------------------------------------------------- +# ParsCrossRefs +#---------------------------------------------------------- +# scans a line for the existence of cross references and +# transforms them to HTML using a little icon +#---------------------------------------------------------- +sub ParsCrossRefs{ + local($prev,$Line,$BaseInfoFile) = @_; + local($NewLine,$Token) = (1); + $Line = " ".$Line; + if ($prev =~ /\*Note([^\t\,\.]*)$/i) { + if ($Line =~ /^$TAG$TE/) { + $Line = "$prev-NEWLINE-$Line"; + } + } + @Tokens = split(/(\*Note)\s*/i,$Line); # -- split the line + while($Token = shift @Tokens){ + $CrossRefTag = $CrossRefRef = $CrossRefFile = $CrossRefText = ''; + if($Token !~ /^\*Note/i){ #-- this part is pure text + $NewLine .= $Token; + next; #-- ... take the next part + } + $CrossRef = shift(@Tokens); + if ($CrossRef !~ /:/){ #-- seems not to be a valid cross ref. + $NewLine .= $Token.$CrossRef; + next; # -- ... take the next one + } + if ($CrossRef =~ /^([^:]+)::/){ # -- a simple cross ref.. + $CrossRefTag = $1; + $CrossRefText = $'; + $CrossRefRef = $CrossRefTag; + $CrossRefTag =~ s/-NEWLINE-/ /g; + $CrossRefTag =~ s/^\s+//; + $CrossRefTag =~ s/\s+/ /g; + $CrossRefRef =~ s/-NEWLINE-/\n/g; + $CrossRefTag = &Escape($CrossRefTag); # -- escape specials + $BaseInfoFile = &Escape($BaseInfoFile); + $NewLine .= "<a class='xref' title='a cross reference' href=\"$PROGRAM?($BaseInfoFile)$CrossRefTag\"\n>$CR_URL$CrossRefRef</a>$CrossRefText"; + next; # -- .. take the next one + } + if ($CrossRef !~ /$TE/) { # never mind if tag doesn't end on this line + $NewLine .= $Token.$CrossRef; + next; + } +#print "--- Com. CR : $CrossRef --- \n"; + $CrossRef =~ /([^:]+):/; #-- A more complicated one .. + $CrossRefRef = $1; + $CrossRef = $'; + $CrossRefText = $CrossRef; + if ($CrossRef =~ /^(\s|\n|-NEWLINE-)*\(($FTAG)\)/){ #-- .. with another file ? + $CrossRefFile = $2; + $CrossRef = $'; + } + $CrossRef =~ /^(\s|\n|-NEWLINE-)*($TAG)?($TE)/; #-- ... and a tag ? + $CrossRefTag = $2; + if ($CrossRefTag eq "" && $CrossRefFile eq ""){ + $NewLine .= "*Note : $CrossRefText$3"; + next; + } + + $CrossRefTag =~ s/-NEWLINE-/ /g; + $CrossRefTag =~ s/^\s+//; + $CrossRefTag =~ s/\s+/ /g; + $CrossRefRef =~ s/-NEWLINE-/\n/g; + $CrossRefText =~ s/-NEWLINE-/\n/g; + $CrossRefFile = $BaseInfoFile if $CrossRefFile eq ""; + $CrossRefTag = "Top" if $CrossRefTag eq ""; + $CrossRefRef = "($CrossRefFile)$CrossRefTag" if $CrossRefRef eq ''; + $CrossRefTag = &Escape($CrossRefTag); #-- escape specials + $CrossRefFile = &Escape($CrossRefFile); + #-- append the HTML text + $NewLine .= "<a class='xref' title='a cross reference' href=\"$PROGRAM?($CrossRefFile)$CrossRefTag\"\n>$CR_URL$CrossRefRef</a>$CrossRefText"; + } + if ($NewLine =~ /\*Note([^\t\,\.]*)$/i) { + return "DONTPRINTYET $NewLine"; + } else { + $NewLine; #-- return the new line + } +} + + +#------------------------------------------------------------- +# PrintLinkInfo +#------------------------------------------------------------- +# prints the HTML text for a link information in the +# header of an info node. Uses some URLs of icons +# are specified in 'info2html.conf'. +#------------------------------------------------------------ +sub PrintLinkInfo{ + local($LinkType,$LinkFile,$LinkTag,$BaseInfoFile,$NoKeys) = @_; + local($LinkFileEsc, $LinkAtts); + return if $LinkFile eq "" && $LinkTag eq ""; + $LinkAtts = ''; + #-- Link Type 'Prev' + if ($LinkType =~ /Prev/){ + $LinkTypeText = $PREV_URL; + $LinkAtts = $NoKeys ? " title='$LinkType' " + : " accesskey='p' title='alt-p: previous' "; + } + #-- Link Type 'Up' + elsif($LinkType =~ /Up/){ + $LinkTypeText = $UP_URL; + $LinkAtts = $NoKeys ? " title='$LinkType' " + : " accesskey='u' title='alt-u: up' "; + } + #-- Link Type 'Next' + elsif($LinkType =~ /Next/){ + $LinkTypeText = $NEXT_URL; + $LinkAtts = $NoKeys ? " title='$LinkType' " + : " accesskey='n' title='alt-n: next' "; + } + #-- If no auxiliary file specified, use the current info file + $LinkFile = $LinkFile eq "" ? $BaseInfoFile : $LinkFile; + $LinkRef = $LinkTag; + $LinkTag = &Escape($LinkTag); + $LinkFileEsc = &Escape($LinkFile); + #-- print the HTML Text + print <<"EOF"; +<a href="$PROGRAM?($LinkFileEsc)$LinkTag" $LinkAtts +>$LinkTypeText + <em>$LinkFile:</em> $LinkRef</a> +EOF +} + +#------------------------------------------------------------- +# PrintHeader +#------------------------------------------------------------- +# Prints the header for an info node in HTML format +#------------------------------------------------------------ +sub PrintHeader{ + local(*LinkList,$BaseInfoFile) = @_; + #-- TEXT for the header of an info node + + local $heading = + $LinkList[1] eq 'Top' + ? "<h1 class='basetitle'>$BaseInfoFile</h1>" + : "<h2><em class='base'>$BaseInfoFile:</em> <span class='section'>$LinkList[1]</span></h2>" + ; + + print <<"EOF"; +<html><head><title>Info: ($BaseInfoFile) $LinkList[1]</title> +$HTML_HEAD_STUFF</head><body class='node'> +EOF + + print "\n<div class='nav navtop'\n>", + "<a href=\"infocat\">$CATALOG_URL Info Catalog</a>\n"; + &PrintLinkInfo("Prev",$LinkList[6],$LinkList[7],$BaseInfoFile); + &PrintLinkInfo("Up", $LinkList[4],$LinkList[5],$BaseInfoFile); + &PrintLinkInfo("Next",$LinkList[2],$LinkList[3],$BaseInfoFile); + + print "</div>\n\n$heading"; + + print "\n<pre>"; + return; +} + + +#--------------------------------------------------------- +# PrintFooter +#--------------------------------------------------------- +# prints the footer for an info node in HTML format +#--------------------------------------------------------- +sub PrintFooter{ + local(*LinkList,$BaseInfoFile) =@_; + #-- TEXT for the footer of an info node + print "</pre>\n\n"; + print "<div class='nav navbottom'\n>", + "<a href=\"infocat\">$CATALOG_URL Info Catalog</a>\n"; + &PrintLinkInfo("Prev",$LinkList[6],$LinkList[7],$BaseInfoFile,1); + &PrintLinkInfo("Up", $LinkList[4],$LinkList[5],$BaseInfoFile,1); + &PrintLinkInfo("Next",$LinkList[2],$LinkList[3],$BaseInfoFile,1); + + print "</div>\n"; + + if($LinkList[1] eq 'Top') { + # Let's be modestly concise and show this only on Top pages + print <<"EOF"; +\n<div class='generator'> +<hr> +<em>automatically generated by </em> +<a href="$DOC_URL">info2html v$VERSION</a> +</div> +EOF + } else { + print "<!-- info2html v$VERSION -->\n"; + } + + print "</body></html>\n"; + return; +} + +#---------------------------------------------------------- +# ReplyNotFoundMessage +#---------------------------------------------------------- +sub ReplyNotFoundMessage{ + local($FileName,$Tag) = @_; + print <<"EOF"; +<html><head><title>Info Files - Error Message</title> +$BOTS_STAY_AWAY +$HTML_HEAD_STUFF</head><body class='error nonesuch'> +<h1>Error</h1> +The Info node <em>$Tag</em> in Info file <em>$FileName</em> +does not exist. +</body></html> +EOF +} +#----------------------------------------------------------- +# InfoNode2HTML +#----------------------------------------------------------- +# scans an info file for the node with the name '$Tag' +# starting at the postion '$Offset'. +# If found, the node is translated to HTML and printed. +#------------------------------------------------------------ +sub InfoNode2HTML{ + local($FileName,$Offset,$Tag,$BaseInfoFile) = @_; + local($Found); + if ( $FileName =~ /^(.+)\.gz$/ ) { + open(FH2,"gunzip < " . $FileName . " 2>/dev/null |") || &DieFileNotFound($FileName); + } elsif ( $FileName =~ /^(.+)\.bz2$/ ) { + open(FH2,"bzcat " . $FileName . " 2>/dev/null |") || &DieFileNotFound($FileName); + } else { + open(FH2,$FileName) || &DieFileNotFound($FileName); + } + seek(FH2,$Offset,0); + $Tag =~ y/A-Z/a-z/; # -- to lowercase + #-- scan for the node start + $Found = 0; + while(<FH2>){ + if (/$NODEBORDER/){ + $Line = <FH2>; + @LinkList = &ParsHeaderLine($Line); + $CompareTag = $Tag; + $CompareTag =~ s/([^0-9A-Za-z])/\\$1/g; #-- escape special chars ! + $Temp = $LinkList[1]; + $Temp =~ y/A-Z/a-z/; #-- to lower case + if($Temp =~ /^\s*$CompareTag\s*$/){ #-- node start found ? + $Found = 1; + last; + } + } + } + if($Found == 0){ # -- break if not found + &ReplyNotFoundMessage($FileName,$Tag); + return; + } + &PrintHeader(*LinkList,$BaseInfoFile); + $InMenu = 0; + while(<FH2>){ + last if /$NODEBORDER/; + #-- replace metacharacters + s/&/&/g; + s/>/>/g; + s/</</g; + if (/^\* Menu/ && $InMenu ==0) { # -- start of menu section ? + $InMenu = 1; + print "</pre>\n<h3>Menu</h3>\n<pre class='menu'>"; + } + elsif (/^\* / && $InMenu == 1) { #-- a menu entry ? + $Line = &MenuItem2HTML($_,$BaseInfoFile); + print $Line; + } + else { #-- a normal line, just replace cross refs + $Line = &ParsCrossRefs($prev,$_,$BaseInfoFile); + if ($Line =~ /^DONTPRINTYET (.*)$/) { + $prev = $1; + } else { + $prev = $Line; + $Line =~ s!- (Variable|Function|Macro|Command|Special Form|User Option):.*$!<em>$&</em>!; + print $Line; + } + } + } + close(FH2); + &PrintFooter(*LinkList,$BaseInfoFile); +} + +#------------------------------------------------------------- +# max +#------------------------------------------------------------ +sub max{ + local($a,$b) = @_; + return $a >= $b ? $a : $b; +} + +#----------------------------------------------------------- +# GetFileAndOffset +#------------------------------------------------------------ +# This procedure locates a specific node in a info file +# The location is based on the tag and indirect table in +# basic info file if such tables are available. +# Because the offsets specified in the tag and in the +# indirect tables are more or less inaccurate, the computed +# offset is set back 100 bytes. From this position +# the specified node will be looked for sequentially. +#------------------------------------------------------------ +sub GetFileAndOffset{ + local($BaseInfoFile,$NodeName) = @_; + local($Exists,$IsIndirect,$File,$Offset,$FileOffset); + $NodeName =~ y/A-Z/a-z/; + &ReadIndirectTable($BaseInfoFile,*FileNames,*Offsets); + &ReadTagTable($BaseInfoFile,*TagList,*Exists,*IsIndirect); + if ($Exists == 0){ #-- no tag table available + return "",0; + } + if (! defined $TagList{$NodeName}){ #-- tag is not in the tag table + return "",0; + } + ($File,$Offset) = split(/#/,$TagList{$NodeName}); + return $File, &max($Offset-100,0) if $File ne ""; #-- there is an + #-- explicite not in the tag table + if ($IsIndirect == 1){ + for $i (0..$#Offsets){ + if ($Offsets[$i] <= $Offset) { # cleaner if structure --jonh 1997.05.27 + $FileOffset = $Offsets[$i]; + $File = $FileNames[$i]; + } + } + return $File, &max($Offset - $FileOffset - 100,0); #-- be safe (-100!) + } + else { + return "", &max($Offset - 100,0); + } +} + +# FindFile: find the given file on the infopath, return full name or "". +# Let filenames optionally have .info suffix. Try named version first. +sub FindFile { + local($File) = @_; + local($Alt, $Name); + if ($File =~ /^(.+)\.info/) { + $Alt = $1; + } else { + $Alt = $File . '.info'; + } + for $Name ($File, $File . '.gz', $File . '.bz2', $Alt, $Alt . '.gz', $Alt . '.bz2') { + for (@INFODIR) { + return "$_/$Name" if (-e "$_/$Name"); + } + } + return ""; +} + +#------------------------------------------------------- +# +#------------------- MAIN ----------------------------- +#print CGI::header('-type'=>'text/html', +# '-expires'=>60*60*24*30); + # use a long expiration -- it's pretty + # stable data. Units are seconds; this is 1 month. + # -- jonh 1998.05.04 +#print "Content-type: text/html\n"; #-- Mime header for ncsa httpd 1.2 +#print "\n"; + +#$PROGRAM = $0; # determine our basename +#$PROGRAM =~ s!.*/!!; + ####ZZ +#$PROGRAM = $ENV{'SCRIPT_NAME'}; +$PROGRAM = "info2html"; + #print "In here this... $PROGRAM \n"; + ####ZZ + #$CommandLine = DeEscape($ENV{'QUERY_STRING'}); # jonh DeEscape() 1997.05.16 + $CommandLine = DeEscape($ARGV[0]); # jonh DeEscape() 1997.05.16 +if ($CommandLine =~ /\(([^\)]+)\)(.+)/) { + $BaseInfoFile = &DeEscape($1); + $BaseInfoFile =~ s#\.\./##g; # jonh 5/20/97 -- sanitize up-references + $NodeName = &DeEscape($2); +} elsif( $CommandLine =~ /^([-_0-9a-zA-Z]+)$/) { # tolerate bare queries + $BaseInfoFile = &DeEscape($1); + $NodeName = 'Top'; +} else { + $BaseInfoFile = 'dir'; + $NodeName = 'Top'; +} + +$BaseInfoFile = "dir" if $BaseInfoFile =~ /^dir$/i; +$FileNameFull = &FindFile($BaseInfoFile); +($File,$Offset) = &GetFileAndOffset($FileNameFull,$NodeName); +$File = $BaseInfoFile if $File eq ""; +$FileNameFull = &FindFile($File); +&InfoNode2HTML($FileNameFull,$Offset,$NodeName,$BaseInfoFile); + +exit; + +############################################################################### +# # +# Longer, more boring history # +# # +############################################################################### +# ---------------------------- +# revision 1.12 +# date: 1995/04/05 16:58:51; author: twitham; state: Exp; lines: +1 -0 +# Emphasize variable, function, macro, etc. definitions. +# ---------------------------- +# revision 1.11 +# date: 1995/04/05 16:37:51; author: twitham; state: Exp; lines: +5 -5 +# Fixed bug: (file) references must be next to the *Note blah: +# ---------------------------- +# revision 1.10 +# date: 1995/04/05 15:24:25; author: twitham; state: Exp; lines: +3 -3 +# Fixed bug: node name was matching as substring of longer node names. +# ---------------------------- +# revision 1.9 +# date: 1995/04/04 23:27:14; author: twitham; state: Exp; lines: +1 -0 +# Fixed bug of cross ref variables being used again within a page. +# ---------------------------- +# revision 1.8 +# date: 1995/04/04 23:05:52; author: twitham; state: Exp; lines: +2 -2 +# Added some spaces for clarity. +# ---------------------------- +# revision 1.7 +# date: 1995/04/04 23:01:02; author: twitham; state: Exp; lines: +8 -9 +# Cleaned up the HTML. +# ---------------------------- +# revision 1.6 +# date: 1995/04/04 22:25:34; author: twitham; state: Exp; lines: +51 -26 +# Got multi-line cross references working. +# ---------------------------- +# revision 1.5 +# date: 1995/01/19 01:43:02; author: twitham; state: Exp; lines: +27 -32 +# Changed to use (dir)Top as default, +# and to make links relative to current page. +# ---------------------------- +# revision 1.4 +# date: 1995/01/17 01:23:10; author: twitham; state: Exp; lines: +24 -20 +# Cleaned up .info filename suffix option. +# ---------------------------- +# revision 1.3 +# date: 1995/01/14 01:52:33; author: twitham; state: Exp; lines: +61 -42 +# Lined up columns in menus, got indexes working, many other improvements. +# ---------------------------- +# revision 1.2 +# date: 1995/01/13 16:33:33; author: twitham; state: Exp; lines: +2 -10 +# almost working at this site. +# ---------------------------- +# revision 1.1 +# date: 1995/01/13 16:33:04; author: twitham; state: Exp; +# Initial revision +# +# V 1.0d +# +# Minor changes from 1.0b are +# +# update to cgi specification +# escaping/deescaping removed +# error messages in english |