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{$selparm}) =~ /ARRAY/o) #JWT, IF SELECTED IS A LIST, CHECK ALL ELEMENTS! { my ($i); for ($i=0;$i<=$#{$parms->{$selparm}};$i++) { if ($valu eq ${$parms->{$selparm}}[$i]) { $res =~ s/\