CGI-SHTML
view release on metacpan or search on metacpan
CGI/SHTML.pm view on Meta::CPAN
### User Defined Variables ####################################################
$CONFIG ||= "/home/webserver/conf/shtml.pm";
$ROOTDIR = $ENV{'DOCUMENT_ROOT'} || "/Common/WebRoot";
$EMPTY = ""; # Edit this for debugging
%REPLACE = ( );
%CONFIG = ( 'timefmt' => "%D",);
%HEADER = (
'internal' => '/include/header-info.shtml',
'generic' => '/include/header-generic.shtml',
);
%FOOTER = (
'internal' => '/include/footer-info.shtml',
'generic' => '/include/footer-generic.shtml',
);
###############################################################################
# Set some environment variables that are important for SSI
$ENV{'DATE_GMT'} = gmtime(time);
$ENV{'DATE_LOCAL'} = localtime(time);
$ENV{'DOCUMENT_URI'} = join('', "http://",
$ENV{'SERVER_NAME'} || "localhost",
$ENV{'SCRIPT_NAME'} || $0 ) ;
$ENV{'LAST_MODIFIED'} = CGI::SHTML->_flastmod( $ENV{'SCRIPT_FILENAME'} || $0 );
delete $ENV{'PATH'};
@ISA = "CGI";
if ( -r $CONFIG ) { do $CONFIG }
=head2 SUBROUTINES
=over 2
=item new ()
Invokes CGI's new() command, but blesses with the local class. Also
performs the various local functions that are necessary.
=cut
sub new {
my $item = CGI::new(@_);
$$item{'NOPRINT'} = [];
$$item{'IFDONE'} = [];
$$item{'IF'} = 0;
bless $item, shift; $item;
}
=item parse_shtml ( LINE [, LINE [, LINE ]] )
Parses C<LINE> as if it were an SHTML file. Returns the parsed set of
lines, either in an array context or as a single string suitable for
printing. All of the work is actually done by C<ssi()>.
=cut
sub parse_shtml {
my ($self, @lines) = @_;
map { chomp } @lines; my $line = join("\n", @lines);
my @parts = split m/(<!--#.*?-->)/s, $line;
my @return;
while (@parts) {
my @ssi = ();
my $text = shift @parts || "";
unless ($self->_noprint) {
push @return, $text if defined $text && $text ne '';
}
if (scalar @parts && $parts[0] =~ /^<!--#(\w+)\s*(.*)?-->\s*$/m) {
@ssi = ($1, $2); shift @parts;
}
my $ssival = $ssi[0] ? $self->ssi(@ssi) : undef;
unless ($self->_noprint) {
push @return, $ssival if defined $ssival && $ssival ne '';
}
}
my $final = join("\n", @return);
$final;
}
sub _ifdone { shift->_arrayset('IFDONE', @_) }
sub _noprint { shift->_arrayset('NOPRINT', @_) }
sub _arrayset {
my ($self, $key, $val) = @_;
my $array = $$self{$key};
my $if = $$self{'IF'} - 1;
if (defined $val) { $$array[$if] = $val }
$$array[$if] || 0;
}
=item ssi ( COMMAND, ARGS )
Does the work of parsing an SSI statement. C<COMMAND> is one of the
standard SSI "tags" - 'echo', 'include', 'fsize', 'flastmod', 'exec',
'set', 'config', 'odbc', 'email', 'if', 'goto', 'label', and 'break'.
C<ARGS> is a string containing the rest of the SSI command - it is parsed
by this function.
Note: not all commands are implemented. In fact, all that is implemented
is 'echo', 'include', 'fsize', 'flastmod', 'exec', 'if/elif/else/endif',
and 'set'. These are all the ones that I've actually had to use to this
point.
=cut
sub ssi {
my ($self, $command, $args) = @_;
my %hash = ();
while ($args) { # Parse $args
$args =~ s/^(\w+)=(\"[^\"]*\"|'.*'|\S+)\s*//;
last unless defined($1);
my $item = lc $1; my $val = $2;
$val =~ s/^\"|\"$//g;
$hash{$item} = $val if defined($val);
}
my $orig = $self->_noprint;
( run in 0.306 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )