2004-04-06 03:08:25 +01:00
#!/usr/bin/perl -w
use strict ;
2005-01-12 17:27:38 +00:00
use Cwd ;
use File::Find ;
2004-04-20 00:37:35 +01:00
use File::Path ;
2008-01-18 17:08:48 +00:00
use Getopt::Long ;
2004-04-06 03:08:25 +01:00
2004-05-06 22:09:03 +01:00
# header column never has any info...
2005-05-31 14:10:49 +01:00
# certainly not now I've deleted it (DL)
2004-04-06 03:08:25 +01:00
2005-01-12 17:27:38 +00:00
( ( my $ progname = $ 0 ) =~ s/^.*\///ig ) ; # basename $0
my $ warnings ; # set this if we have non fatal problems
2008-01-18 17:08:48 +00:00
# my $cvsdirectories = ':'; # this gets filled with directories that should have
# cvsignores generated in a later pass
2004-04-06 03:08:25 +01:00
2004-04-20 00:37:35 +01:00
# Parse options
2004-04-18 19:57:30 +01:00
my $ no_verbose_progress = 0 ;
2004-04-20 00:37:35 +01:00
my $ usage = 0 ;
GetOptions ( 'quiet' = > \ $ no_verbose_progress , # be quiet
2008-01-18 17:08:48 +00:00
'help' = > \ $ usage # help!
) ;
2004-04-20 00:37:35 +01:00
# Print usage
if ( $ usage ) {
2008-01-18 17:08:48 +00:00
usage ( ) ;
2004-04-20 00:37:35 +01:00
}
2004-04-18 19:57:30 +01:00
2004-04-06 03:08:25 +01:00
unless ( $ ARGV [ 0 ] ) {
2008-01-18 17:08:48 +00:00
print STDERR "Specify a CSV file name as the program's argument (e.g. CAVETAB2.CSV)\n\n" ;
usage ( ) ;
2005-01-12 17:27:38 +00:00
}
2008-01-18 17:08:48 +00:00
# One day this may be proofed against this problem,
# but another command line parameter (location of expoweb)
2005-05-31 14:10:49 +01:00
# is inevitable, and unappealing
2005-01-12 17:27:38 +00:00
( $ _ = cwd ( ) ) =~ s/^.*\///ig ;
if ( $ _ ne "noinfo" ) {
2008-01-18 17:08:48 +00:00
print STDERR "This program expects to be run from a CWD of noinfo!\n\n" ;
usage ( ) ;
2004-04-06 03:08:25 +01:00
}
2004-05-06 22:09:03 +01:00
open ( CSV , "< $ARGV[0]" ) or print STDERR "That filename could not be opened. Exiting.\n" and die $! ;
2004-04-06 03:08:25 +01:00
2007-02-21 15:31:51 +00:00
open ( LENGTHS , "< lengths.dat" ) or print STDERR "No length data available! Exiting.\n" and die $! ;
2007-02-23 00:01:56 +00:00
open ( LOGFILE , "> make-indxal4.log" ) or print STDERR "Could not create log file! Exiting.\n" and die $! ;
2007-02-21 15:31:51 +00:00
my % lhash = munge_lengths ( ) ;
2005-01-12 17:27:38 +00:00
# Go down a directory
chdir ".." ;
2008-01-18 17:08:48 +00:00
open INDXAL , "> indxal.htm" or die $! ;
2004-04-21 14:18:29 +01:00
print INDXAL << "END" ;
2004-04-21 22:49:22 +01:00
< ! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" >
2004-04-06 03:08:25 +01:00
< ! - - ** * This file is auto - generated by $ progname - edit cavetab2 . csv instead - - >
2004-04-27 14:47:29 +01:00
< html lang = "en" xmlns = "http://www.w3.org/1999/xhtml" xml:lang = "en" >
2004-04-06 03:08:25 +01:00
<head>
2004-04-21 22:49:22 +01:00
< meta http - equiv = "Content-Type" content = "text/html; charset=iso-8859-1" / >
2004-04-06 03:08:25 +01:00
<title> Loser Plateau area : Cave description index </title>
2004-04-21 22:49:22 +01:00
< link rel = "stylesheet" type = "text/css" href = "css/main2.css" / >
2004-04-06 03:08:25 +01:00
</head>
<body>
2004-04-21 22:49:22 +01:00
<h1> Kataster Gruppe 1623 : < br />Loser Augst-Eck - INDEX</ h1 >
2004-04-06 03:08:25 +01:00
2005-06-12 12:31:07 +01:00
<p> Note that < a href = "1626/index.html" > information on caves in the adjacent area
2005-05-17 00:11:41 +01:00
1626 ( Rauher - Sch & ouml ; nberg ) </a> is to be found elsewhere . See also the < a
href = "dplong.htm" > list of lengths and depths </a> for the caves where we have
survey data . </p>
2004-05-07 15:50:43 +01:00
2004-04-21 14:18:29 +01:00
< table border = "0" frame = "void" >
2004-04-06 03:08:25 +01:00
END
<CSV> ; # starting to read in csv file, eat header line
# Read in pos file to @pos now rather than later so we don't repeat it n times
2005-01-12 17:27:38 +00:00
open INPUT2 , "< noinfo/all.pos" or print STDERR "Could not find all.pos in the noinfo directory\n" and die $! ;
2004-04-06 03:08:25 +01:00
my @ pos = <INPUT2> ;
close INPUT2 ;
# While loop which reads in each line of csv file
while ( <CSV> ) {
2008-01-18 17:08:48 +00:00
chomp ;
do_this_line ( $ _ ) ;
2004-04-06 03:08:25 +01:00
}
2004-04-20 00:37:35 +01:00
# Finish writing index file
2004-04-21 14:18:29 +01:00
print INDXAL << "END" ;
2004-04-06 03:08:25 +01:00
</table>
< ! - - LINKS - - >
2004-04-27 14:47:29 +01:00
< hr / > <ul>
2004-04-21 22:49:22 +01:00
<li> Back to < a href = "../index.htm" > CUCC Home page </a> </li>
<li> Back to < a href = "index.htm" > Expedition Intro page </a> </li>
<li>
<h3> Main Indices: </h3>
<ul> <li> < a href = "infodx.htm" > <b> Index </b> to Expo </a> information pages </li>
<li> < a href = "areas.htm" > Description of CUCC ' s area </a> and split to subareas </li>
<li> List of ( links to ) < a href = "pubs.htm" > published reports and logbooks </a> </li> </ul>
</li>
<li>
<h3> Pictures: </h3>
<ul> <li> < a href = "gall0.htm" > Text only Index </a> </li>
<li> < a href = "gallery/0.htm" > Index pages ( with thumbnails ) </a> </li> </ul>
</li>
<li>
<h3> Other info: </h3>
<ul> <li> Table of < a href = "folk/index.htm" > members of CUCC expeditions </a> 1976 - 99 </li>
<li> < a href = "others/index.htm" > Other groups </a> who have worked in the area . </li>
2005-06-12 12:31:07 +01:00
<li> < a href = "1626/index.html" > Adjacent area 1626 </a> </li> </ul>
2004-04-21 22:49:22 +01:00
</li>
</ul>
2004-04-21 14:18:29 +01:00
< ! - - / LINKS - - >
2004-04-06 03:08:25 +01:00
</body>
</html>
END
2004-04-21 14:18:29 +01:00
close INDXAL ;
2005-01-12 17:27:38 +00:00
#print "Information: Making area indices\n";
#make_indices();
print "Information: Done" ;
if ( $ warnings ) {
2008-01-18 17:08:48 +00:00
print " (with warnings)"
2005-01-12 17:27:38 +00:00
}
unless ( $ no_verbose_progress ) {
2008-01-18 17:08:48 +00:00
print ". Run with -q to see what problems occurred." ;
2005-01-12 17:27:38 +00:00
}
print "\n" ;
2004-04-20 00:37:35 +01:00
# Process a line of the CSV file
# First argument is contents of line to process
2004-05-07 15:50:43 +01:00
# 2nd arg is the Kataster number of the cave an entrance belongs to (optional)
# 3rd arg is the Other number of the cave an entrance belongs to (optional)
# 4th arg is the basename of the cave an entrance belongs to (optional)
2004-04-20 00:37:35 +01:00
# Returns nothing
2004-04-06 03:08:25 +01:00
sub do_this_line {
2008-01-18 17:08:48 +00:00
# Split single line into all the fields
my ( $ kat_num , $ kat_status , $ ents , $ other_number , $ mult_ents , $ file , $ linkfile , undef , $ name , $ unofficial_name , $ comment , $ area , $ explorers , $ u_description , $ equipment , $ qmlist , $ katstatus , $ references , $ u_centre_line , $ u_drawn_survey , $ survex_file , $ length , $ depth , $ extent , $ notes , $ ent_name , $ tag_punkt , $ other_punkt , $ desc_other_punkt , $ exact_punkt , $ fix_type , $ gpspresa , $ gpspostsa , $ northing , $ easting , $ altitude , $ bearings , $ map , $ location , $ approach , $ ent_desc , $ ent_photo , $ marking , $ marking_comment , $ findability , $ findability_comment ) = & parse_csv ( $ _ [ 0 ] ) ;
my $ parents_name ;
# If we have been called to process an entrance, we may have been given the cave's Kataster number or Other number
if ( $ _ [ 1 ] and ! $ kat_num ) {
$ kat_num = $ _ [ 1 ] ;
}
if ( $ _ [ 2 ] and ! $ other_number ) {
$ other_number = $ _ [ 2 ] ;
}
if ( $ _ [ 3 ] ) {
$ parents_name = $ _ [ 3 ] ;
}
# Bitch if a link file has too much information.
if ( $ linkfile && $ file ) {
print STDERR "Warning: both a file ($file) and a linkfile ($linkfile) specified. This makes no sense.\n\n" ;
$ warnings = 1 ;
}
if ( $ linkfile && ( $ kat_status || $ name || $ unofficial_name || $ comment || $ area || $ explorers || $ u_description || $ equipment || $ qmlist || $ katstatus || $ references || $ u_centre_line || $ u_drawn_survey || $ survex_file || $ length || $ depth || $ extent || $ notes || $ ent_name || $ tag_punkt || $ other_punkt || $ desc_other_punkt || $ exact_punkt || $ fix_type || $ gpspresa || $ gpspostsa || $ northing || $ easting || $ altitude || $ bearings || $ map || $ location || $ approach || $ ent_desc || $ ent_photo || ( $ marking and $ marking ne "\r" and $ marking ne "\r\n" and $ marking ne "\n" ) ) ) {
print STDERR "Warning: In the link cave $kat_num($ents) -> $other_number there is extraneous information provided that will not be used. Please merge it into the description of the cave to which it links. The only information allowed in a link file is Kataster Number,\nEntrances, Other Number, Multiple Entrances, and the name of the linkfile\n\n" ;
$ warnings = 1 ;
}
# Generate $linkid which will be kataster no., or other no. if no kataster no. present. Per HTML4 (and XHTML etc.) ID and NAME tokens must begin with alpha characters - hence "id" prepend
my $ linkid = "id$kat_num" ;
my $ other_number_no_brackets = $ other_number ;
if ( $ kat_num and $ other_number ) {
$ other_number = "($other_number)" ; # wrap it in brackets, so it doesn't appear to be official
} elsif ( $ other_number and ! $ kat_num ) {
$ linkid = "id$other_number" ;
}
# Under XHTML 1.0, link ids must not have '(', '?', ' ', or '/'
$ linkid =~ s/\//-/g ;
$ linkid =~ s/\?/q/ ;
$ linkid =~ s/\(/:/ ;
$ linkid =~ s/\)/:/ ;
$ linkid =~ s/ /_/ ;
$ linkid = lc ( $ linkid ) ;
my $ dslen = ( $ lhash { $ linkid } [ 0 ] or "" ) ;
my $ dsdepth = ( $ lhash { $ linkid } [ 1 ] or "" ) ;
my $ dsext = ( $ lhash { $ linkid } [ 2 ] or "" ) ;
if ( $ dslen ne "" ) { $ dslen = $ dslen . "m" } ;
if ( $ dsdepth ne "" ) { $ dsdepth = $ dsdepth . "m" } ;
if ( $ dsext ne "" ) { $ dsext = $ dsext . "m" } ;
if ( $ dslen and $ length ) { $ dslen = "$dslen ($length)" ; } ;
if ( $ dsdepth and $ depth ) { $ dsdepth = "$dsdepth ($depth)" ; } ;
if ( $ dsext and $ extent ) { $ dsext = "$dsext ($extent)" ; } ;
if ( $ dslen eq "" ) { $ dslen = $ length } ;
if ( $ dsdepth eq "" ) { $ dsdepth = $ depth } ;
if ( $ dsext eq "" ) { $ dsext = $ extent } ;
# Determine the number of directories deep the cave's main page is, in order to link to area descriptions and indxal
my $ toroot = 'Q' ; # hey; it's magic
my $ counter = ( $ file =~ tr /\// / ) ;
while ( $ counter ) {
$ toroot = join ( '' , $ toroot , "/.." ) ;
$ counter - - ;
}
$ toroot =~ s/Q\/// ;
# If it's not an entrance, and it's not in 1626, insert it in the index file
if ( $ mult_ents !~ /entrance/ && $ area ne 1626 ) {
my $ e = $ ents ;
$ e =~ s/ +/ /g ;
print INDXAL "<tr><td><a name=\"$linkid\">$kat_num $other_number" ;
if ( $ e ) {
print INDXAL "<small> - $e</small>" ;
}
print INDXAL "</a></td><td>" ;
if ( $ file ) {
print INDXAL "<a href=\"$file\">" ;
} elsif ( $ linkfile ) {
print INDXAL "<a href=\"$linkfile\">" ;
}
if ( $ name ) {
print INDXAL $ name ;
} else {
print INDXAL "?" ;
}
if ( $ unofficial_name ) {
print INDXAL " ($unofficial_name)" ;
}
if ( $ file or $ linkfile ) {
print INDXAL "</a>" ;
}
if ( $ comment ) {
print INDXAL " - $comment" ;
}
print INDXAL "</td></tr>\n" ;
}
# If the cave does not have a filename allocated, but does have multiple entrances, keep going through the CSV file until we are at the last entrance, before we return. This could go wrong if we ever did a linkfile for an entire cave (not just an entrance), which possessed multiple entrances. Until we do it stays like this
unless ( $ file ) { # this IS necessary
if ( $ mult_ents eq "yes" ) {
die "Umm, this code hasn't been tested recently and may be wrong (specifically using the file snarfer without assigning the return). Comment this death out to see what happens" ;
my $ e_mult_ents ;
do {
<CSV> ;
chomp ;
my $ emult_ents = ( & parse_csv ( $ _ ) ) [ 4 ] ;
$ e_mult_ents = $ emult_ents ;
} while ( $ e_mult_ents ne "last entrance" ) ;
}
return ;
}
# If command line option is set, then be quiet
unless ( $ no_verbose_progress ) {
print "Progress: $file\n" ;
}
# Determine $file's basename and dirname
( my $ fn = $ file ) =~ s/^.*\///ig ;
my $ path = $ file ;
$ path =~ s/\/$fn//g ;
# Make the directory that the file is in, in case it doesn't exist yet
2011-02-27 03:23:10 +00:00
mkpath ( $ path ) ;
2008-01-18 17:08:48 +00:00
# this is considered harmful now creation of directories is versioned - DL
# Open the file and start writing to it
open FILE , "> $file" or die "$!: $file" ;
print LOGFILE "Created $file\n" ;
print FILE << "END" ;
2004-04-21 22:49:22 +01:00
< ! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" >
2004-04-06 03:08:25 +01:00
< ! - - ** * This file is auto - generated by $ progname - edit cavetab2 . csv instead - - >
2004-04-27 14:47:29 +01:00
< html lang = "en" xmlns = "http://www.w3.org/1999/xhtml" xml:lang = "en" >
2004-04-06 03:08:25 +01:00
<head>
2004-04-21 22:49:22 +01:00
< meta http - equiv = "Content-Type" content = "text/html; charset=iso-8859-1" / >
< link rel = "stylesheet" type = "text/css" href = "$toroot/css/main2.css" / >
2004-04-06 03:08:25 +01:00
END
2008-01-18 17:08:48 +00:00
if ( $ kat_num ) {
if ( $ area ne 1626 ) {
print FILE "<title>1623:$kat_num" ;
} else {
print FILE "<title>1626:$kat_num" ;
}
} else {
print FILE "<title>$other_number" ;
}
print FILE << "END" ;
2004-04-06 03:08:25 +01:00
</title>
</head>
<body>
END
2008-01-18 17:08:48 +00:00
print FILE "<table id=\"cavepage\">\n" ;
print FILE "<tr><th id=\"kat_no\">" ;
if ( $ kat_num ) { print FILE "$kat_num" } else { print FILE "$other_number" }
if ( $ ents ) { print FILE " - $ents" }
if ( $ other_number && $ kat_num ) { print FILE "<br />$other_number" }
print FILE "</th><th id=\"name\">$name" ;
if ( $ unofficial_name ) {
if ( $ name ) {
print FILE "<br />" ;
}
print FILE " ($unofficial_name)" ;
}
print FILE "</th><th id=\"status\">$kat_status</th></tr>\n</table>" ; # if no $kat_status, no problem
if ( $ dslen or $ dsdepth or $ dsext ) {
print FILE "\n\n<p>" ;
}
if ( $ dslen ) {
print FILE "<b>Length:</b> ${dslen} " ;
}
if ( $ dsdepth ) {
print FILE "<b>Depth:</b> ${dsdepth} " ;
}
if ( $ dsext ) {
print FILE "<b>Extent:</b> ${dsext} " ;
}
if ( $ dslen or $ dsdepth or $ dsext ) {
print FILE "</p>" ;
}
# Entrance specific bit
unless ( $ mult_ents eq "yes" ) {
# If there is only one entrance,
print FILE "\n\n<p>" ;
if ( $ tag_punkt || $ other_punkt || $ exact_punkt || $ gpspostsa || $ gpspresa || $ easting || $ northing || $ altitude || $ fix_type || $ desc_other_punkt && ! $ ent_name ) { # basically, if do_ent is going to do anything, print "Entrance:"
print FILE "<b>Entrance: </b>" ;
}
# Process the location data for the entrance
do_ent ( $ tag_punkt , $ other_punkt , $ exact_punkt , $ gpspostsa , $ gpspresa , $ easting , $ northing , $ altitude , $ ent_name , $ fix_type , $ desc_other_punkt ) ;
print FILE "</p>"
} else {
# If there are multiple entrances
multi_ents ( $ file , $ kat_num , $ other_number , $ other_number_no_brackets , $ toroot ) ;
}
# Cave general bit
if ( $ area ) {
print FILE "\n\n<p><b>Nominal area:</b> " ;
foreach $ _ ( split ( / / , $ area ) ) { # deal with caves allocated multiple areas
if ( expandarea ( $ _ , 0 ) ) { # drop junk words in $area such as "or"
print FILE "$_ - <a href=\"$toroot\/" , ( expandarea ( $ _ , 0 ) ) [ 1 ] , "\/index.html#$linkid\">" , ( expandarea ( $ _ , 0 ) ) [ 0 ] , "</a> " ; # this sucketh mightily. How can I get a horizontal tab? FIXME
}
}
print FILE "</p>" ;
}
if ( $ location ) {
print FILE "\n\n<p><b>Location:</b> $location</p>" ;
}
if ( $ bearings ) {
print FILE "\n\n<p><b>Bearings:</b> $bearings</p>" ;
}
if ( $ approach ) {
print FILE "\n\n<p><b>Approach:</b> $approach</p>" ;
}
if ( $ map ) {
print FILE "\n\n<p><b>Map:</b> $map</p>" ;
}
if ( $ ent_desc ) {
print FILE "\n\n<p><b>Entrance Description:</b> $ent_desc</p>" ;
}
if ( $ ent_photo ) {
print FILE "\n\n<p><b>Entrance Photo:</b> $ent_photo</p>" ;
}
if ( $ marking or $ marking_comment ) {
print FILE "\n\n<p><b>Marking:</b> "
}
if ( $ marking ) {
print FILE "$marking" ;
}
if ( $ marking and $ marking_comment ) { print FILE ". (" }
if ( $ marking_comment )
{
print FILE "$marking_comment"
}
if ( $ marking and $ marking_comment ) { print FILE ")" }
if ( $ marking or $ marking_comment ) {
print FILE "</p>"
}
if ( $ references ) {
print FILE "\n\n<p><b>References:</b> $references</p>" ;
}
if ( $ u_description ) {
print FILE "\n\n<p><b>Underground Description:</b> $u_description</p>" ;
}
if ( $ equipment ) {
print FILE "\n\n<p><b>Equipment:</b> $equipment</p>" ;
}
if ( $ qmlist ) {
print FILE "\n\n<p><b>QM list:</b> $qmlist</p>" ;
}
if ( $ u_drawn_survey ) {
print FILE "\n\n<p><b>Survey:</b> $u_drawn_survey</p>" ;
}
if ( $ notes ) {
print FILE "\n\n<p><b>Notes:</b> $notes</p>" ;
}
if ( $ explorers ) {
print FILE "\n\n<p><b>Explorers:</b> $explorers</p>" ;
}
if ( $ katstatus ) {
print FILE "\n\n<p><b>Kataster Status:</b> $katstatus</p>" ;
}
if ( $ u_centre_line ) {
print FILE "\n\n<p><b>Centre Line:</b> $u_centre_line</p>" ;
}
if ( $ survex_file ) {
print FILE "\n\n<p><b>Survex file:</b> $survex_file</p>" ;
}
print FILE "\n\n<!-- LINKS -->\n<hr /><ul>\n" ;
# Count how many times the filename for FILE is in the CSV
my $ storedoffset ;
$ counter = 0 ;
$ storedoffset = tell ( CSV ) ;
seek ( CSV , 0 , 0 ) ;
while ( <CSV> ) {
chomp ;
if ( grep ( /,\"$file\",/ , $ _ ) ) {
$ counter + + ;
}
}
seek ( CSV , $ storedoffset , 0 ) ;
# If it is more than once, it is being linked to in some fashion, so provide a method to go back
if ( $ counter > 1 ) {
print FILE "<li><a href=\"javascript:history.back(1)\">Go Back (Javascript)</a></li>\n" ; # ACCK! ACCK! Evil JavaScript! - this is done for linkfiles (mainly), where the reader could have got there by numerous routes, and we don't know how to return them whence they came in advance
}
if ( $ mult_ents =~ /entrance/ ) {
print FILE "<li><a href=\"$parents_name\">Go up to overall cave description for this entrance</a></li>\n" ;
}
# Find the area the cave is in, and add appropriate links
foreach $ _ ( split ( / / , $ area ) ) { # deal with caves allocated multiple areas
if ( expandarea ( $ _ , 1 ) ) { # drop junk words in $area such as "or"
print FILE "<li><a href=\"$toroot\/" , ( expandarea ( $ _ , 1 ) ) [ 1 ] , "\/index.html#$linkid\">" , ( expandarea ( $ _ , 1 ) ) [ 0 ] , " area index and description</a></li>\n" ;
}
}
if ( $ area ne "1626" )
{
print FILE "<li><a href=\"$toroot/indxal.htm#$linkid\">Full Index of 1623 Caves</a></li>" ;
}
# Finish writing to file
print FILE << "END" ;
2004-04-21 22:49:22 +01:00
<li> < a href = "$toroot/areas.htm" > Other Areas </a> </li>
<li> < a href = "$toroot/index.htm" > Back to Expedition Intro page </a> </li>
</ul>
2004-04-21 14:18:29 +01:00
< ! - - / LINKS - - >
2004-04-06 03:08:25 +01:00
</body>
</html>
END
2008-01-18 17:08:48 +00:00
if ( tell ( FILE ) > 15000 ) {
print STDERR "Warning: File $file is bigger than 15kb; consider splitting its contents up\n\n" ;
}
close FILE ;
2004-04-06 03:08:25 +01:00
}
2004-04-20 00:37:35 +01:00
# Parse a line of CSV data
# Argument is the line of data to be processed
# Returns array of the separated variables
2004-04-06 03:08:25 +01:00
sub parse_csv {
2008-01-18 17:08:48 +00:00
my $ line = $ _ [ 0 ] ;
my @ parsedline = ( ) ;
my $ field = '' ;
while ( $ line =~ m { \ G (?:^|,)
( ? : "((?> [^" ] * ) ( ? > "" [ ^ "]*)*)" | ( [ ^ " , ] * ) ) } gx ) {
if ( $ 2 ) {
$ field = $ 2 ;
} elsif ( $ 1 ) {
$ field = $ 1 ;
$ field =~ s/""/"/g ;
} else {
$ field = '' ;
}
push ( @ parsedline , $ field ) ;
}
return ( @ parsedline ) ;
2004-04-06 03:08:25 +01:00
}
2005-01-12 17:27:38 +00:00
# Find the entrance information, from the entrance the link points at
# 1st arg - the filename (as in the CSV) to which the link goes
# 2nd arg - the entrance of the cave to which the link goes
# Returns nothing
sub do_link_ent {
2008-01-18 16:47:58 +00:00
my $ linkfile = $ _ [ 0 ] ;
my $ linkent = $ _ [ 1 ] ;
my $ linkname = $ _ [ 2 ] ;
my $ storedoffset ;
$ storedoffset = tell ( CSV ) ;
seek ( CSV , 0 , 0 ) ;
while ( <CSV> ) {
chomp ;
if ( ( & parse_csv ( $ _ ) ) [ 5 ] eq $ linkfile ) {
if ( ( & parse_csv ( $ _ ) ) [ 4 ] eq "yes" ) {
while ( ( & parse_csv ( $ _ ) ) [ 2 ] ne $ linkent ) {
$ _ = <CSV> ;
chomp ;
2008-01-18 17:08:48 +00:00
if ( ( & parse_csv ( $ _ ) ) [ 4 ] eq "last entrance" && ( & parse_csv ( $ _ ) ) [ 2 ] ne $ linkent ) {
print STDERR "Warning: Link entrance for $linkname not found, please specify Link Entrance\n\n" ;
2008-01-18 16:47:58 +00:00
$ warnings = 1 ;
seek ( CSV , $ storedoffset , 0 ) ;
return ;
}
}
}
2008-01-18 17:08:48 +00:00
my ( undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , $ lent_name , $ ltag_punkt , $ lother_punkt , $ ldesc_other_punkt , $ lexact_punkt , $ lfix_type , $ lgpspresa , $ lgpspostsa , $ lnorthing , $ leasting , $ laltitude , undef , undef , undef , undef , undef , undef , $ lmarking ) = & parse_csv ( $ _ ) ;
do_ent ( $ ltag_punkt , $ lother_punkt , $ lexact_punkt , $ lgpspostsa , $ lgpspresa , $ leasting , $ lnorthing , $ laltitude , $ lent_name , $ lfix_type , $ ldesc_other_punkt , $ lmarking ) ;
2008-01-18 16:47:58 +00:00
seek ( CSV , $ storedoffset , 0 ) ;
return ;
}
}
print STDERR "Warning: Link file for $linkname not found\n\n" ;
$ warnings = 1 ;
seek ( CSV , $ storedoffset , 0 ) ;
return ;
2005-01-12 17:27:38 +00:00
}
2004-04-20 00:37:35 +01:00
# Process the location data for the entrance
# Returns nothing
2004-04-06 03:08:25 +01:00
sub do_ent {
2008-01-18 17:08:48 +00:00
my $ punkt ;
my $ calc_easting ;
my $ calc_northing ;
my $ calc_altitude ;
my $ desc ;
my $ tag_punkt = $ _ [ 0 ] ;
my $ other_punkt = $ _ [ 1 ] ;
my $ exact_punkt = $ _ [ 2 ] ;
my $ gpspostsa = $ _ [ 3 ] ;
my $ gpspresa = $ _ [ 4 ] ;
my $ easting = $ _ [ 5 ] ;
my $ northing = $ _ [ 6 ] ;
my $ altitude = $ _ [ 7 ] ;
my $ ent_name = $ _ [ 8 ] ;
my $ fix_type = $ _ [ 9 ] ;
my $ desc_other_punkt = $ _ [ 10 ] ;
my $ marking = $ _ [ 11 ] ;
# Write out info for entrance
if ( $ ent_name ) {
print FILE "<b>Entrance Name:</b> $ent_name " ;
}
if ( $ altitude ) {
print FILE "<b>Recorded Alt:</b> $altitude " ;
}
if ( $ northing ) {
print FILE "<b>Recorded as N</b>$northing " ;
}
if ( $ easting ) {
print FILE "<b>Recorded as E</b>$easting " ;
}
if ( $ fix_type ) {
print FILE "<b>Fix type:</b> $fix_type " ;
}
if ( $ tag_punkt ) {
print FILE "<b>Tag point:</b> $tag_punkt " ;
}
if ( $ other_punkt ) {
print FILE "<b>Point:</b> $other_punkt " ;
if ( $ desc_other_punkt ) {
print FILE "<b>Point description:</b> $desc_other_punkt " ;
} else {
print FILE "<b>Point description:</b> none " ;
}
}
if ( $ exact_punkt ) {
print FILE "<b>Exact entrance:</b> $exact_punkt " ;
}
if ( $ gpspresa ) {
print FILE "<b>GPS pre sa:</b> $gpspresa " ;
}
if ( $ gpspostsa ) {
print FILE "<b>GPS post sa:</b> $gpspostsa " ;
}
# Decide which punkt to lookup
if ( $ tag_punkt ) {
$ punkt = $ tag_punkt ;
$ desc = "tag point" ;
} elsif ( $ other_punkt ) {
$ punkt = $ other_punkt ;
$ desc = "point" ;
} elsif ( $ exact_punkt ) {
$ punkt = $ exact_punkt ;
$ desc = "exact point" ;
} elsif ( $ gpspostsa ) {
$ punkt = $ gpspostsa ;
$ desc = "GPS (post SA)" ;
} elsif ( $ gpspresa ) {
$ punkt = $ gpspresa ;
$ desc = "GPS (pre SA)" ;
}
# Find the position of that punkt
if ( $ punkt ) {
for my $ surveypoint ( @ pos ) {
if ( $ surveypoint =~ m/\( *([0-9\.\-]*), *([0-9\.\-]*), *([0-9\.\-]*) \) $punkt(\r\n|\n|\r)/ ) {
$ calc_easting = $ 1 ;
$ calc_northing = $ 2 ;
$ calc_altitude = $ 3 ;
}
}
if ( $ calc_easting ) {
print FILE "<br />\nLookup values for $desc data: " ;
print FILE "<b>Alt:</b> $calc_altitude " ;
print FILE "<b>N</b>$calc_northing " ;
print FILE "<b>E</b>$calc_easting " ;
} else {
print STDERR "Warning: Lookup point for $desc data not found: $punkt\n\n" ;
$ warnings = 1 ;
}
}
if ( $ marking ) { print FILE "<b>Marking:</b> $marking " } ;
2004-04-06 03:08:25 +01:00
}
2004-04-20 00:37:35 +01:00
# Handle multiple entrances
# 1st arg is the file name of the cave to which the entrance belongs
# 2nd arg is the Kataster number of the cave
# 3rd arg is the Other number of the cave (which may have been put in brackets)
# 4th arg is the Other number of the cave without any brackets
# 5th arg is the path to return to the root from the cave
2004-04-06 03:08:25 +01:00
sub multi_ents {
2008-01-18 17:08:48 +00:00
my $ file = $ _ [ 0 ] ;
my $ kat_num = $ _ [ 1 ] ;
my $ other_number = $ _ [ 2 ] ;
my $ other_number_no_brackets = $ _ [ 3 ] ;
my $ toroot = $ _ [ 4 ] ;
print FILE "\n\n<p><b>Entrances:</b></p>\n\n<ul>" ;
my $ e_mult_ents ;
# Process each entrance
do {
my $ e = <CSV> ;
chomp ( $ e ) ;
my ( $ ekat_num , undef , $ eents , $ eother_number , $ emult_ents , $ efile , $ elinkfile , $ elinkent , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , undef , $ eent_name , $ etag_punkt , $ eother_punkt , $ edesc_other_punkt , $ eexact_punkt , $ efix_type , $ egpspresa , $ egpspostsa , $ enorthing , $ eeasting , $ ealtitude , undef , undef , undef , undef , undef , undef , $ emarking ) = & parse_csv ( $ e ) ;
if ( $ eother_number ) {
$ eother_number = "($eother_number)" ; # wrap it in brackets, so it doesn't appear to be official
}
print FILE "\n<li>" ;
if ( $ elinkfile ) { # this is a link to another cave - add link to entrance into cave file but don't generate another file for the entrance
print FILE "<a href=\"$toroot\/$elinkfile\">$eents $eother_number</a> " ;
do_this_line ( $ e , $ kat_num , $ other_number_no_brackets ) ;
# Process the location data for the entrance
do_link_ent ( $ elinkfile , $ elinkent , join ( '' , $ ekat_num , $ eents ) ) ;
} elsif ( $ efile ) { # call ourselves recursively to create a file for the entrance
print FILE "<a href=\"$toroot\/$efile\">$eents $eother_number</a> " ;
close FILE ; # perl filehandles are not recursively safe (when hacking at 4 in the morning). thus do this.
do_this_line ( $ e , $ kat_num , $ other_number_no_brackets , ( ( $ _ = $ file ) =~ s/^.*\///ig ) && $ _ ) ;
open FILE , ">> $file" or die $! ;
# Process the location data for the entrance
do_ent ( $ etag_punkt , $ eother_punkt , $ eexact_punkt , $ egpspostsa , $ egpspresa , $ eeasting , $ enorthing , $ ealtitude , $ eent_name , $ efix_type , $ edesc_other_punkt , $ emarking ) ;
} else { # no entrance file needed, and no link to another cave
print FILE "$eents $eother_number" ;
# Process the location data for the entrance
do_ent ( $ etag_punkt , $ eother_punkt , $ eexact_punkt , $ egpspostsa , $ egpspresa , $ eeasting , $ enorthing , $ ealtitude , $ eent_name , $ efix_type , $ edesc_other_punkt , $ emarking ) ;
}
print FILE "</li>" ;
$ e_mult_ents = $ emult_ents ;
} while ( $ e_mult_ents ne "last entrance" ) ;
print FILE "\n</ul>" ;
2004-04-06 03:08:25 +01:00
}
2004-04-20 01:11:21 +01:00
2005-01-12 17:27:38 +00:00
# Return detailed area name when handed area code
# 1st arg - area code
# 2nd arg - generalise subareas
sub expandarea {
2008-01-18 17:08:48 +00:00
if ( $ _ [ 1 ] == 1 && $ _ [ 0 ] =~ /1[a-z]/ && $ _ [ 0 ] ne 1626 ) {
return ( "Plateau" , "plateau" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "1a" ) {
return ( "Nearer plateau (access from Top Camp)" , "plateau" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "1b" ) {
return ( "Western plateau (Puffball area)" , "plateau" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "1c" ) {
return ( "Eastern plateau area near Steinbrücken path" , "plateau" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "1d" ) {
return ( "Further plateau near Eislufthöhle" , "plateau" ) ;
}
if ( $ _ [ 1 ] == 1 && $ _ [ 0 ] =~ /2[a-z]/ && $ _ [ 0 ] ne 1626 ) {
return ( "Schwarzmooskogel ridge" , "smkridge" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "2a" ) {
return ( "Southern Schwarzmooskogel ridge – Stellerweg / Weiße Warze area" , "smkridge" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "2b" ) {
return ( "South-east slopes of Vorderer Schwarzmooskogel – Eishöhle area" , "smkridge" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "2c" ) {
return ( "Vorderer to Hinterer Schwarzmooskogel – Kaninchenhöhle area" , "smkridge" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "2d" ) {
return ( "Northern Schwarzmooskogel ridge (access from Steinbrücken)" , "smkridge" ) ;
}
if ( $ _ [ 0 ] eq 3 ) {
return ( "Bräuning Alm" , "br-alm" ) ;
}
if ( $ _ [ 0 ] eq 4 ) {
return ( "Kratzer valley" , "kratzer" ) ;
}
if ( $ _ [ 0 ] eq 5 ) {
return ( "Schwarzmoos-Wildensee" , "wilden" ) ;
}
if ( $ _ [ 0 ] eq 6 ) {
return ( "Far plateau" , "remote" ) ;
}
if ( $ _ [ 0 ] eq 7 ) {
return ( "Egglgrube" , "egglgrub" ) ;
}
if ( $ _ [ 1 ] == 1 && $ _ [ 0 ] =~ /8[a-z]/ ) {
return ( "Loser/Augst See" , "loser" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "8a" ) {
return ( "South face of Loser - reached from Loser Hütte path" , "loser" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "8b" ) {
return ( "Ammerich and Höllgraben - below Dimmelwand and the last part of toll road" , "loser" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "8c" ) {
return ( "Around Augst See" , "loser" ) ;
}
if ( $ _ [ 1 ] == 0 && $ _ [ 0 ] eq "8d" ) {
return ( "Loser - Hochanger ridge area" , "loser" ) ;
}
if ( $ _ [ 0 ] eq 9 ) {
return ( "Gschwandt" , "gschwand" ) ;
}
if ( $ _ [ 0 ] eq 10 ) {
return ( "N & NE shore of Altauseer See" , "aaussee" ) ;
}
if ( $ _ [ 0 ] eq 11 ) {
return ( "Augstbach" , "augstb" ) ;
}
if ( $ _ [ 0 ] eq 1626 ) {
return ( "1626 (Rauher - Schönberg)" , "1626" ) ;
}
2005-01-12 17:27:38 +00:00
}
2004-04-20 01:11:21 +01:00
# Usage
sub usage {
2008-01-18 17:08:48 +00:00
print << "EOF" ;
2004-04-20 01:11:21 +01:00
USAGE: $ progname [ - options ] < CSV file >
2008-01-18 17:08:48 +00:00
- q , - - quiet Be quiet about progress
- h , - - help Show this message
2005-01-12 17:27:38 +00:00
$ progname must be run from noinfo directory of expoweb hierarchy .
2004-04-20 01:11:21 +01:00
EOF
2008-01-18 17:08:48 +00:00
exit ( 0 ) ;
2004-04-20 01:11:21 +01:00
}
2005-01-12 17:27:38 +00:00
# Parent function for making per area tables from CAVETAB2, which may then be included in some fashion
# Returns nothing
sub make_indices {
2008-01-18 17:08:48 +00:00
make_table ( 1 , "1a" , "plateau" , "Around Top Camp and below Bräuning Wall" ) ;
make_table ( 0 , "1b" , "plateau" , ""Nearer" plateau - including holes found on "geologists' walk"" , "Note that this area probably overlaps the last one - I found 171 whilst looking for 190 (as B9)..." ) ;
make_table ( 0 , "1c" , "plateau" , ""Nearer" plateau northeast of the col" ) ;
make_table ( 0 , "1d" , "plateau" , ""Middle" plateau" ) ;
make_table ( 1 , "2a" , "smkridge" , "Caves known or expected to link into the Stellerweg - Eishöhle and Kaninchenhöhle systems" ) ;
make_table ( 0 , "2b" , "smkridge" , "Caves in the same area - but not yet linked" ) ;
make_table ( 1 , "3" , "br-alm" ) ;
make_table ( 1 , "4" , "kratzer" ) ;
make_table ( 1 , "5" , "wilden" ) ;
make_table ( 1 , "6" , "remote" ) ;
make_table ( 1 , "7" , "egglgrub" ) ;
make_table ( 1 , "8a" , "loser" , "South face of Loser - reached from Loser Hütte path" ) ;
make_table ( 0 , "8b" , "loser" , "Ammerich and Höllgraben - below Dimmelwand and the last part of toll road" ) ;
make_table ( 0 , "8c" , "loser" , "Around Augst See" ) ;
make_table ( 0 , "8d" , "loser" , "Loser - Hochanger ridge area" ) ;
make_table ( 1 , "9" , "gschwand" ) ;
make_table ( 1 , "10" , "aaussee" ) ;
make_table ( 1 , "11" , "augstb" ) ;
make_table ( 1 , "1626" , "1626" ) ;
2005-01-12 17:27:38 +00:00
}
# Output the blurb for the index table
# 1st argument specifies whether to overwrite output file
# 2nd argument specifies area id
# 3rd argument specifies area directory
# 4rd argument (optional) gives a title to the table
# 5th argument (optional) specifies a comment to the table
# Returns nothing
sub make_table {
2008-01-18 17:08:48 +00:00
my @ caves ;
my $ i = 0 ;
if ( $ _ [ 0 ] == 1 ) {
open TAB , "> $_[2]/index.html.table" or die $! ;
} else {
open TAB , ">> $_[2]/index.html.table" or die $! ;
}
@ caves = area_grep ( "$_[1]" ) ;
if ( $ _ [ 3 ] ) {
print TAB "<h3 style=\"text-align:center\">$_[3]</h3>\n" ;
}
if ( $ _ [ 4 ] ) {
print TAB "<p style=\"text-align:center; font-size: 80%\">$_[4]</p>\n" ;
}
print TAB "<table class=\"trad centre\">\n" ;
while ( $ caves [ $ i ] [ 0 ] ) {
print TAB "<tr><td><a id=\"$caves[$i][0]\">$caves[$i][1]</a></td><td><a href=\"..\/$caves[$i][2]\">$caves[$i][3]</a></td></tr>\n" ;
$ i + + ;
}
print TAB "</table>\n\n" ;
close TAB ;
2005-01-12 17:27:38 +00:00
}
# Goes through CSV, looking in area column for the area id passed to it in the first argument
# Returns array, 1 x 1st dimension per matching area, 4 x 2nd dimension for linkid, number, file link, and name
sub area_grep {
2008-01-18 17:08:48 +00:00
my $ givenarea = $ _ [ 0 ] ;
my @ return ;
seek ( CSV , 0 , 0 ) ;
while ( <CSV> ) {
chomp ;
my ( $ kat_num , undef , undef , $ other_number , undef , $ file , $ linkfile , undef , $ name , undef , undef , $ area ) = & parse_csv ( $ _ ) ;
if ( $ area eq $ givenarea ) {
my $ linkid = "id$kat_num" ;
my $ number = $ kat_num ;
my $ link = $ file ;
if ( $ other_number ) {
if ( $ kat_num ) {
$ number = "$kat_num ($other_number)" ;
} else {
$ linkid = "id$other_number" ;
$ number = $ other_number ;
}
}
if ( $ linkfile && ! $ file ) {
$ link = $ linkfile ;
}
# Sanitise linkid
$ linkid =~ s/\//-/g ;
$ linkid =~ s/\?/q/ ;
$ linkid =~ s/\(/:/ ;
$ linkid =~ s/\)/:/ ;
$ linkid =~ s/ /_/ ;
$ linkid = lc ( $ linkid ) ;
push ( @ return , [ $ linkid , $ number , $ link , $ name ] ) ;
}
}
return ( @ return ) ;
2005-01-12 17:27:38 +00:00
}
2007-02-21 15:31:51 +00:00
sub munge_lengths {
2008-01-18 17:08:48 +00:00
print "Munging lengths\n" ;
my % return ;
while ( <LENGTHS> ) {
chomp ;
my ( $ id , $ len , $ depth , $ ext ) = split ( "\t" , $ _ ) ;
$ return { "id" . lc ( $ id ) } = [ $ len , $ depth , $ ext ] ;
}
return ( % return ) ;
}