file = src/sidebars
------------------------------------------------------------------------------
#!/usr/pkg/bin/perl
#
# SIDEBARS - Provides a pseudo-navbar for people who don't wish to use
# frames for navigation purposes. Supports subfolders!
$version = "v1.0 Baxil, 8-22-2K";
$filelist = "/u0/baxil/pagesWSidebar";
$sc = ","; # split character -- separates filename & subfolder & textstring
$sidebarsrc = "/u0/baxil/sidebardefault";
print STDOUT "Sidebars $version;\n File list (${filelist}), source (${sidebarsrc})\n";
$srcdir = "/u0/web/baxil/";
$begmatch = '';
$endmatch = '';
$imgmarker = '\[]'; # may need to change if sidebar text contains it.
# Since $imgmarker is used in a pattern match, THIS EQUALS THE STRING '[]'.
$hitimage = '
' . "\n";
$missimage = '
' . "\n";
$Errors = "";
############################ Main program ##############################
(open(FILELIST, "< $filelist") && open(SIDEBARSRC, "< $sidebarsrc"))
or die("Can't open one of the two default files!\n");
@sidebar = ;
close SIDEBARSRC; # that was quick. ;)
# ----- Process the filelist, build a hash table w/ the data ----------
%fnord = ();
while ($holder=) {
next if (m/^\w\w/); # skips lines not starting w/ 2 letter/numbers.
@temp = split /$sc/o, $holder;
$tempkey = shift @temp;
$fnord{$tempkey} = join $sc, @temp;
}
# ----- Go through the hash table and change each file in turn --------
$ctr = 0;
foreach $ffile (keys %fnord) {
# ---- build this particular file's sidebar ------
($matchnum, $matchstr) = split /$sc/o, $fnord{$ffile};
chop $matchstr; # this removes the \n from the end of it.
$j = -1;
@mysidebar = ();
for ($c = 0; $c < @sidebar; $c++) {
if ( $sidebar[$c] =~ /^\{(.)\}/ ) { # a new SB entry: has {num}
$j++;
# now determine whether this particular one goes in our bar or not
if ($1 == "0" || $1 == $matchnum) {
$mysidebar[$j] = $sidebar[$c];
} else {
do { $c++ } until ( $sidebar[$c] =~ /^\{(.)\}/ );
$c--; # back up one so for will increment to next "good" line
next;
}
} else {
next if ($j == -1); # throw away stuff at beginning of file ;)
$mysidebar[$j] .= $sidebar[$c];
}
}
# And one more time through to insert appropriate images! :)
for ($j = 0; $j < @mysidebar; $j++) {
if ( $mysidebar[$j] =~ /$matchstr/s ) {
$mysidebar[$j] =~ s/$imgmarker/$hitimage/s;
}
$mysidebar[$j] =~ s/$imgmarker/$missimage/sg; # get the rest of 'em, if any.
$mysidebar[$j] =~ s/^\{.\}//s; # and remove that annoying {X}.
}
# --------------- Now prepare file to be written to -------------------
$srcfile = $srcdir . $ffile;
if (! (-e $srcfile) ) {
$Errors .= "Apparently $srcfile doesn't exist. Please fix $filelist.\n";
next;
}
if (! `grep \'$begmatch\' $srcfile`) {
$Errors .= "No match of $begmatch in $srcfile! Didn't process.\n";
next;
}
if (! `grep \'$endmatch\' $srcfile`) {
$Errors .= "No match of $endmatch in $srcfile! Didn't process.\n";
next;
}
if (! open(SRCFILE, "< $srcfile") ) {
print STDOUT "Couldn't open file $srcfile! Quitting.\n";
print STDOUT $Errors;
die;
}
# Retrieve static (not-modified-here) text from the given file
$partone = "";
$partthree = ""; # re-zero variables ;P
$stoplooping = "";
do { # Get first part of the homepage file
$holder=;
$partone .= $holder;
$stoplooping = "yes" if ($holder =~ /$begmatch/);
} until ($stoplooping);
until ($HellFreezesOver) { # Now deal with (i.e. ignore) what to replace
$holder=;
last if (($temp = $holder) =~ /$endmatch/); # exit loop if matchy.
}
$partthree = $holder; # since it wasn't added to part two
while ($holder=) { $partthree .= $holder; } # Get rest of the file
close SRCFILE;
# make baxup of source file here.
if (`mv $srcfile ${srcfile}.bak`) { # 0 = successful execution.
print STDOUT $Errors . "\n";
die("Couldn't back up $srcfile -- ABORTED W/O CHANGING IT!");
}
# ------ And finally, write the new file with happy updated sidebar -------
if (! open(HOMEOUT, "> $srcfile") ) {
print STDOUT $Errors . "\n";
die("couldn't open $srcfile for write, FILES HAVE BEEN MOVED!!");
}
print HOMEOUT $partone . "\n";
for ($j = 0; $j < @mysidebar; $j++) {
print HOMEOUT $mysidebar[$j] . "\n";
}
print HOMEOUT $partthree;
close HOMEOUT;
print $ffile;
$ctr++;
if ($ctr % 3 == 0) { print "\n"; } else { print " ... "; }
} # ... and proceed to next file in the list.
# --------- End-of-program cleanup --------------------------
if ($Errors != "") {
print $Errors;
} else {
print "\nProgram completed successfully. Remember backup files.\n";
}
exit;