package LoadHtml;
#use lib '/home1/people/turnerj';
use strict;
#no strict 'refs';
use vars (qw(@ISA @EXPORT $useLWP $err $rtnTime $VERSION));
require Exporter;
#use LWP::Simple;
eval 'use LWP::Simple; $useLWP = 1;';
#use Socket;
@ISA = qw(Exporter);
@EXPORT = qw(loadhtml_package loadhtml buildhtml dohtml modhtml AllowEvals cnvt set_poc
SetListSeperator SetRegices SetHtmlHome);
our $VERSION = '7.04';
local ($_);
local $| = 1;
my $calling_package = 'main'; #ADDED 20000920 TO ALLOW EVALS IN ASP!
my $poc = 'your website administrator';
my $listsep = ', ';
my $evalsok = 0;
my %cfgOps = (
hashes => 0,
CGIScript => 0,
includes => 1,
loops => 1,
numbers => 1,
pocs => 0,
perls => 0,
embeds => 0,
); #ADDED 20010720.
my ($htmlhome, $roothtmlhome, $hrefhtmlhome, $hrefcase);
sub SetListSeperator
{
$listsep = shift;
}
sub cnvt
{
my $val = shift;
return ($val eq '26') ? ('%' . $val) : (pack("c",hex($val)));
}
sub set_poc
{
$poc = shift || 'your website administrator';
$cfgOps{pocs} = 1;
}
sub SetRegices
{
my (%setregices) = @_;
my ($i, $j);
foreach $j (qw(hashes CGIScript includes embeds loops numbers pocs perls))
{
if ($setregices{"-$j"})
{
$cfgOps{$j} = 1;
}
elsif (defined($setregices{"-$j"}))
{
$cfgOps{$j} = 0;
}
}
}
sub loadhtml
{
my %parms = ();
my $html = '';
local ($/) = '\x1A';
if (&fetchparms(\$html, \%parms, 1, @_))
{
print &modhtml(\$html, \%parms);
return 1;
}
else
{
print $html;
return undef;
}
}
sub buildhtml
{
my %parms = ();
my $html = '';
local ($/) = '\x1A';
return &fetchparms(\$html, \%parms, 1, @_) ? &modhtml(\$html, \%parms) : $html;
}
sub dohtml
{
my %parms = ();
my $html = '';
return &fetchparms(\$html, \%parms, 0, @_) ? &modhtml(\$html, \%parms) : $html;
}
sub fetchparms
{
my $html = shift;
my $parms = shift;
my $fromFile = shift;
my ($parm0) = shift;
my ($v, $i, $t);
# %loopparms = ();
%{$parms} = ();
$$html = '';
$i = 1;
$parms->{'0'} = $parm0;
while (@_)
{
$v = shift;
$parms->{$i++} = (ref($v)) ? $v : "$v";
last unless (@_);
if ($v =~ s/^\-([a-zA-Z]+)/$1/)
{
$t = shift;
if (defined $t) #ADDED 20000523 PREVENT -W WARNING!
{
$parms->{$i} = (ref($t)) ? $t : "$t";
}
else
{
$parms->{$i} = '';
}
$parms->{$v} = $parms->{$i++};
}
}
unless ($fromFile)
{
$$html = $parm0;
return ($$html) ? 1 : 0;
}
if (open(HTMLIN,$parm0))
{
$$html = ();
close HTMLIN;
}
else
{
$$html = LWP::Simple::get($parm0) if ($useLWP);
unless(defined($$html) && $$html =~ /\S/o)
{
$$html = &html_error("Could not load html page: \"$parm0\"!");
return undef;
}
}
return 1;
}
sub AllowEvals
{
$evalsok = shift;
}
sub makaswap
{
my $parms = shift;
my $one = shift;
return ("\:$one") unless (defined($one) && defined($parms->{$one}));
if (ref($parms->{$one}) =~ /ARRAY/o) #JWT, TEST LISTS!
{
return defined($listsep) ? (join($listsep,@{$parms->{$one}})) : ($#{$parms->{$one}}+1);
}
elsif ($parms->{$one} =~ /(ARRAY|HASH)\(.*\)/o) #FIX BUG.
{
return (''); #JWT, TEST LISTS!
}
else
{
return ($parms->{$one});
}
#ACTUALLY, I DON'T THINK THIS IS A BUG, BUT RATHER WAS A PROBLEM
#WHEN $#PARMS > $#LOOPPARMS, PARMS WITH VALUE='' IN A LOOP WOULD
#NOT GET SUBSTITUTED DUE TO IF-CONDITION 1 ABOVE, BUT WOULD LATER
#BE SUBSTITUTED AS SCALERS BY THE GENERAL PARAMETER SUBSTITUTION
#REGEX AND THUS GET SET TO "ARRAY(...)". CONDITION-2 ABOVE FIXES THIS.
};
sub makamath #ADDED 20031028 TO SUPPORT IN-PARM EXPRESSIONS.
{
my ($one) = shift;
$_ = eval $one;
return $_;
};
sub makaloop
{
my ($parms, $parmnos, $loopcontent, $looplabel) = @_;
my $rtn = '';
my ($lc,$i0,$i,$j,%loopparms);
my (@forlist); #MOVED UP 20030515. - ORDERED LIST OF ALL HASH KEYS (IFF DRIVING PARAMETER IS A HASHREF).
$parmnos =~ s/\:(\w+)([\+\-\*]\d+)/eval(&makaswap($parms,$1).$2)/egs; #ALLOW OFFSETS, ie. ":#+1" $parmnos =~ s/\:(\w+)/&makaswap($parms,$1)/egs; #ALLOW ie.
$parmnos =~ s/\:(\w+)/&makaswap($parms,$1)/egs; #ALLOW OFFSETS, ie. ":#+1" $parmnos =~ s/\:(\w+)/&makaswap($parms,$1)/egs; #ALLOW ie.
$parmnos =~ s/[\:\(\)]//go;
$parmnos =~ s/\s+,/,/go;
$parmnos =~ s/,\s+/,/go;
my @vectorlist = (); #THE ORDERED LIST OF INDICES TO ITERATE OVER (ALWAYS NUMBERS):
# if ($parmnos =~ s/([a-zA-Z]+)\s+([a-zA-Z])/$2/) #CHANGED TO NEXT LN (20070831) TO ALLOW UNDERSCORES IN ITERATOR PARAMETER NAMES.
if ($parmnos =~ s/([a-zA-Z][a-zA-Z_]*)\s+([a-zA-Z])/$2/)
{
@vectorlist = @{$parms->{$1}}; #WE HAVE AN INDEX LIST PARAMETER ()
}
elsif ($parmnos =~ s/(\d+\,\d+)((?:\,\d+)*)\s+([a-zA-Z])/$3/) #WE HAVE A LITERAL INDEX LIST ()
{
eval "\@vectorlist = ($1 $2);";
}
$parmnos =~ s/\s+/,/go;
my (@listparms) = split(/\,/o, $parmnos);
#1ST IF-CHOICE ADDED 20070807 TO SUPPORT AN INDEX ARRAY OF HASH KEYS W/DRIVING PARAMETER OF TYPE HASHREF:
if (ref($parms->{$listparms[0]}) eq 'HASH' && defined($vectorlist[0]) && defined(${$parms->{$listparms[0]}}{$vectorlist[0]}))
{
#INDEX ARRAY CONTAINS HASH-KEYS AND 1ST (DRIVING) VECTOR IS A HASHREF:
@forlist = sort keys(%{$parms->{$listparms[0]}});
my @keys = @vectorlist;
@vectorlist = ();
for (my $i=0;$i<=$#keys;$i++)
{
for (my $j=0;$j<=$#forlist;$j++)
{
if ($keys[$i] eq $forlist[$j])
{
push (@vectorlist, $j);
last;
}
}
}
$i0 = scalar @vectorlist; #NUMBER OF LOOP ITERATIONS TO BE DONE.
}
elsif (defined($vectorlist[0]) && $vectorlist[0] =~ /^\d+$/o)
{
#INDEX ARRAY OF JUST NUMBERS:
if (ref($parms->{$listparms[0]}) eq 'HASH')
{
@forlist = sort keys(%{$parms->{$listparms[0]}});
}
$i0 = scalar @vectorlist;
}
else #NO INDEX LIST, SEE IF WE HAVE INCREMENT EXPRESSION (ie. "0..10|2"), ELSE DETERMINE FROM 1ST PARAMETER:
{
my ($istart) = 0;
my ($iend) = undef;
my ($iinc) = 1;
my $parmnos0 = $parmnos;
$istart = $1 if ($parmnos =~ s/([+-]?\d+)\.\./\.\./o);
$iend = $1 if ($parmnos =~ s/\.\.([+-]?\d+)//o);
$parmnos =~ s/\.\.//o; #ADDED 19991203 (FIXES "START.. ").
$iinc = $1 if ($parmnos =~ s/\|([+-]?\d+)//o);
$parmnos =~ s/^\s*\,//o; #ADDED 19991203 (FIXES "START.. ").
shift @listparms unless ($parmnos eq $parmnos0); #1ST LISTPARM IS THE INCREMENT EXPRESSION, REMOVE IT NOW.
if (ref($parms->{$listparms[0]}) eq 'HASH')
{
@forlist = sort keys(%{$parms->{$listparms[0]}});
if ($#vectorlist >= 0) { #THIS IF ADDED 20070914 TO SUPPORT ALTERNATELY SORTED LIST TO DRIVE HASH-DRIVEN LOOPS:
my @keys = @vectorlist; #IE.
@vectorlist = ();
for (my $i=0;$i<=$#keys;$i++)
{
for (my $j=0;$j<=$#forlist;$j++)
{
if ($keys[$i] eq $forlist[$j])
{
push (@vectorlist, $forlist[$j]);
last;
}
}
}
@forlist = @vectorlist;
}
$iend = $#forlist unless (defined $iend);
}
else
{
#no strict 'refs';
unless (defined $iend)
{
$iend = (ref($parms->{$listparms[0]}) eq 'ARRAY'
? $#{$parms->{$listparms[0]}} : 0);
}
}
@vectorlist = ();
$i = $istart;
$i0 = 0;
while (1)
{
if ($istart <= $iend)
{
last if ($i > $iend || $iinc <= 0);
}
else
{
last if ($i < $iend || $iinc >= 0);
}
push (@vectorlist, $i);
$i += $iinc;
++$i0;
}
}
my $icnt = 0;
foreach $i (@vectorlist)
{
$lc = $loopcontent;
foreach $j (keys %{$parms})
{
#if (@{$parms->{$j}}) #PARM IS A LIST, TAKE ITH ELEMENT.
if (" @listparms " =~ /\s$j\s/)
{
#@parmlist = @{$parms->{$j}};
if (ref($parms->{$j}) =~ /HASH/io) #ADDED 20020613 TO ALLOW HASHES AS LOOP-DRIVERS!
{
#WANT_VALUES: $loopparms{$j} = $parms->{$j}->{(keys(%{$parms->{$j}}))[$i]};
#$loopparms{$j} = (keys(%{$parms->{$j}}))[$i]; #CHGD. TO NEXT 20030515
$loopparms{$j} = ${$parms->{$j}}{$forlist[$i]};
# $lc =~ s/\:\%${looplabel}/$forlist[$i]/eg; #MOVED TO 302l 20070713 ADDED 20031212 TO MAKE :%_loopname HOLD KEY OF 1ST HASH!
}
elsif (ref($parms->{$j}) =~ /ARRAY/io) #TEST ADDED SO FOLLOWING SWITCHES COULD BE ADDED 20070615
{
$loopparms{$j} = ${$parms->{$j}}[$i];
}
elsif ($parms->{$j} =~ /^\$(\w+)/o)
{
#ADDED THIS ELSIF AND NEXT ELSE 20070615 TO
#PLAY NICE W/$dbh->selectall_arrayref()
#SO WE CAN PASS A 2D ROW-BASED MATRIX OF DB DATA
#AND ACCCESS EACH COLUMN AS A NAMED PARAMETER BY
#SPECIFYING: "-fieldname => '$matrix->[*][2]'"
#WHERE "matrix" IS THE DRIVING LOOP PARAMETER NAME
#AND "*" IS REPLACED BY NEXT SUBSCRIPT IN LOOP.
#THIS *AVOIDS* HAVING TO CONVERT ROW-MAJOR ARRAYS
#TO COLUMN-MAJOR AND PASSING EACH COLUMN SLICE!
my $one = $1;
my $eval = $parms->{$j};
# $eval =~ s/\*/$i/g; #CHGD. TO NEXT 20070831 TO ALLOW RECURSION, IE. '$matrix->[*][*][0]', ETC.
$eval =~ s/\*/$i/;
my $eval0 = $eval; #ADDED 20070831 TO SAVE FOR POSSIBLE REGRESSION.
$eval =~ s/$one/parms\-\>\{$one\}/;
$loopparms{$j} = eval $eval;
# $loopparms{$j} = $parms->{$j} if ($@); #CHGD. TO NEXT 20070831 TO ALLOW RECURSION, IE. '$matrix->[*][*][0]', ETC.
if ($@)
{
$eval0 =~ s/(?:\-\>)?\[\d+\]//; #STRIP OFF HIGH-ORDER DIMENSION SO THAT REFERENCE IS CORRECT W/N THE RECURSIVE CALL TO MAKALOOP!
$loopparms{$j} = $eval0;
}
}
else
{
$loopparms{$j} = $parms->{$j};
}
$loopparms{$j} = '' unless(defined($loopparms{$j}));
}
else #PARM IS A SCALER, TAKE IT'S VALUE.
{
$loopparms{$j} = $parms->{$j};
}
}
# (:# = CURRENT INDEX NUMBER INTO PARAMETER VECTORS; :* = ZERO-BASED ITERATION#; :% = CURRENT HASH KEY, IFF DRIVEN BY A HASHREF; :^ = NO. OF ITERATIONS TO BE DONE)
$lc =~ s#<\!\:\%(${looplabel})([^>]*?)>#&makanop2($parms,$forlist[$i],$2)#egs; #MOVED HERE 20070713 FROM 267l TO MAKE :%_loopname HOLD KEY OF 1ST HASH!
$lc =~ s/\:\%${looplabel}/$forlist[$i]/egs; #MOVED HERE 20070713 FROM 267l TO MAKE :%_loopname HOLD KEY OF 1ST HASH!
$lc =~ s#<\!\:\#(${looplabel})([^>]*?)>#&makanop2($parms,$i,$2)#egs;
$lc =~ s/\:\#${looplabel}([\+\-\*]\d+)/eval("$i$1")/egs; #ALLOW OFFSETS, ie. ":#+1"
$lc =~ s/\:\#${looplabel}/$i/egs;
$lc =~ s#<\!\:\^(${looplabel})([^>]*?)>#&makanop2($parms,$i0,$2)#egs;
$lc =~ s/\:\^${looplabel}([\+\-\*]\d+)/eval("$i0$1")/egs; #CHGD. 20020926 FROM :* TO :^.
$lc =~ s/\:\^${looplabel}/$i0/egs;
$lc =~ s#<\!\:\*(${looplabel})([^>]*?)>#&makanop2($parms,$icnt,$2)#egs;
$lc =~ s/\:\*${looplabel}([\+\-\*]\d+)/eval("$icnt$1")/egs; #ADDED 20020926 TO RETURN INCREMENT NUMBER (1ST = 0);
$lc =~ s/\:\*${looplabel}/$icnt/egs;
#IF-STMT BELOW ADDED 20070830 TO EMULATE Template::Toolkit's ABILITY TO REFERENCE
#SUBCOMPONENTS OF A REFERENCE BY NAME, IE:
#-arg => {'id' => 'value', 'name' => 'value'}
#...
#
if (ref($parms->{$listparms[0]}) eq 'HASH')
{
foreach $j (@listparms)
{
unless (defined $loopparms{$j})
{
$lc =~ s#<\!\:$j([^>]*?)\:>.*?<\!\:\/\1>#&makanop1($parms->{$listparms[0]}{$forlist[$i]},$j,$1)#egs;
$lc =~ s#<\!\:$j([^>]*?)>#&makanop1($parms->{$listparms[0]}{$forlist[$i]},$j,$1)#egs;
$lc =~ s/\:\{$j\}/&makaswap($parms->{$listparms[0]}{$forlist[$i]},$j)/egs; #ALLOW ":{word}"!
}
}
}
elsif (ref($parms->{$listparms[0]}) eq 'ARRAY')
{
foreach $j (@listparms)
{
unless (defined $loopparms{$j})
{
$lc =~ s#<\!\:$j([^>]*?)\:>.*?<\!\:\/\1>#&makanop1($parms->{$listparms[0]}[$i],$j,$1)#egs;
$lc =~ s#<\!\:$j([^>]*?)>#&makanop1($parms->{$listparms[0]}[$i],$j,$1)#egs;
$lc =~ s/\:\{$j\}/&makaswap($parms->{$listparms[0]}[$i],$j)/egs; #ALLOW ":{word}"!
}
}
}
$rtn .= &modhtml(\$lc,\%loopparms);
++$icnt;
}
# $i += $iinc; #NEXT 2 REMOVED 20070809 - DON'T APPEAR TO BE NEEDED.
# ++$i0;
return ($rtn);
};
sub makasel #JWT: REDONE 05/20/1999!
{
my ($parms, $selpart,$opspart,$endpart) = @_;
local *makaselop = sub
{
my ($selparm,$padding,$valuparm,$valu,$dispvalu) = @_;
$valu =~ s/\:\{?(\w+)\}?/&makaswap($parms,$1)/eg; #ADDED 19991206
$dispvalu =~ s/\:\{?(\w+)\}?/&makaswap($parms,$1)/eg; #ADDED 19991206
$valu = $dispvalu unless ($valuparm); #ADDED 05/17/1999
my ($res) = "$padding