Apache-SSI

 view release on metacpan or  search on metacpan

lib/Apache/SSI.pm  view on Meta::CPAN

    return '';
}

sub echo_DATE_GMT   { shift()->_format_time(time(), undef, 'GMT') }
sub echo_DATE_LOCAL { shift()->_format_time(time()              ) }
sub echo_DOCUMENT_NAME {
    shift();
    my $r = _2main(shift);
    return &_set_VAR($r, 'DOCUMENT_NAME', basename $r->filename);
}
sub echo_DOCUMENT_URI {
    shift();
    my $r = _2main(shift);
    return &_set_VAR($r, 'DOCUMENT_URI', $r->uri);
}
sub echo_LAST_MODIFIED {
    my ($self, $r) = (shift(), _2main(shift));
    return &_set_VAR($r, 'LAST_MODIFIED', $self->_lastmod($r->filename));
}

sub _set_VAR {
    $_[0]->subprocess_env($_[1], $_[2]);
    return $_[2];
}

sub _eval_vars {
    my $self = shift;
    my $text = shift;
    $text =~ s{ (^|[^\\]) (\\\\)* \$(\{)?(\w+)(\})? }
              { $1 . substr($2,length($2)/2) . "\${ \\(\$self->ssi_echo({var=>'$4'})) }" }exg;
    #;  For poor BBEdit because of that last line
    package main; # In case they're running functions
    my $result = eval $text;
    $self->error("Eval error: $@") if $@;
    return $result;
}

sub _interp_vars {
    # Find all $var and ${var} expressions in the string and fill them in.
    my $self = shift;
    my ($a,$b,$c);  # Because ssi_echo may change $1, $2, ...
    $_[0] =~ s{ (^|[^\\]) (\\\\)* \$(\{)?(\w+)(\})? }
              { ($a,$b,$c) = ($1,$2,$4);
                $a . substr($b,length($b)/2) . $self->ssi_echo({var=>$c}) }exg;
}

# This might be better for _interp_vars:
#sub _interp_vars {
#    local $_ = shift;
#    my $out;
#
#    while (1) {
#
#        if ( /\G([^\\\$]+)/gc ) {
#            $out .= $1;
#            
#        } elsif ( /\G(\\\\)+/gc ) {
#            $out .= '\\' x (length($1)/2);
#            
#        } elsif ( /\G\\([^\$])/gc ) {
#            $out .= &escape_char($1);
#            
#        } elsif ( /\G\$(\w+)/gc ) {
#            $out .= &lookup($1);
#        
#        } elsif ( /\G\$\{(\w+)\}/gc ) {
#            $out .= &lookup($1);
#        
#        } else {
#            last;
#        }
#    }
#    $out;
#}

sub error {
    my $self = shift;
    print $self->{'errmsg'};
    $self->{_r}->log_error($_[0]) if @_ and $self->{_r};
    return '';
}


sub _2main { $_[0]->is_main() ? $_[0] : $_[0]->main() }

sub _format_time {
  my ($self, $time, $format, $tzone) = @_;
  $format ||= $self->{timefmt};
  return ($format ? 
	  POSIX::strftime($format, $self->_time_args($time, $tzone)) :
	  scalar $self->_time_args($time, $tzone));
}

sub _time_args {
  # This routine must respect the caller's wantarray() context.
  my ($self, $time, $zone) = @_;
  return ($zone && $zone =~ /GMT/) ? gmtime($time) : localtime($time);
}

sub _lastmod {
  my ($self, $file, $format) = @_;
  return $self->_format_time((stat $file)[9], $format);
}

1;

__END__

=head1 NAME

Apache::SSI - Implement Server Side Includes in Perl

=head1 SYNOPSIS

In httpd.conf:

    <Files *.phtml>  # or whatever
    SetHandler perl-script
    PerlHandler Apache::SSI
    </Files>



( run in 1.403 second using v1.01-cache-2.11-cpan-39bf76dae61 )