ASP4

 view release on metacpan or  search on metacpan

lib/ASP4/PageParser.pm  view on Meta::CPAN

  my $code = <<"CODE";
package $s->{package};

use strict;
use warnings 'all';
no warnings 'redefine';
use base '$s->{base_class}';
use vars __PACKAGE__->VARS;
use ASP4::PageLoader;

sub _init {
  my (\$s) = \@_;
  \$s->{script_name} = q<$s->{script_name}>;
  \$s->{filename}    = q<$s->{filename}>;
  \$s->{base_class}  = q<$s->{base_class}>;
  \$s->{compiled_as} = q<$s->{compiled_as}>;
  \$s->{package}     = q<$s->{package}>;
@{[
  $s->{masterpage} ?
    "  \$s->{masterpage}  = ASP4::PageLoader->load( script_name => q<$s->{masterpage}->{script_name}> );"
    : ""
]}
  return;
}

CODE

  unless( $s->{masterpage} )
  {
    $code .= <<"CODE";
sub run {
use warnings 'all';
my (\$__self, \$__context) = \@_;
\$__self->init_asp_objects(\$__context) unless defined(\$Response);
#line 1
$$ref
}
CODE
  }# end unless()
  
  foreach( reverse ( @content_tags, @placeholder_tags ) )
  {
    $code .= <<"SUB";

sub $_->{id} {
my (\$__self, \$__context) = \@_;
if( \$__context->did_end() ){\$__context->response->Clear(); return; }
#line $_->{line}
$_->{contents}
}# end $_->{id}

SUB
  }# end foreach()
  
  $code .= "\n1;# return true:\n";
  
  open my $ofh, '>', $s->{saved_to}
    or die "Cannot open '$s->{saved_to}' for writing: $!";
  print $ofh $code;
  close($ofh);
  chmod(0766, $s->{saved_to});

  my $config = ASP4::ConfigLoader->load();
  $config->load_class( $s->{package} );
  return $s->{package}->new();
}# end parse()


sub _tag_line_number
{
  my ($s, $tag) = @_;
  
  my $number = 1;
  for( split /\r?\n/, ${ $s->source_code } )
  {
    if( m/\Q$tag\E/s )
    {
      return $number;
    }# end if()
    $number++;
  }# end for()
  
  return;
}# end _tag_line_number()


sub _parse_include_tags
{
  my ($s) = @_;
  
  my $ref = $s->source_code;
  
  $$ref =~ s{
    \<\!\-\-\s*\#include\s+virtual\="(.*?)"\s*\-\-\>
  }{~); \$Response->Include(\$Server->MapPath("$1")); \$Response->Write(q~}xsg;
}# end _parse_include_tags()


sub _parse_scriptlet_tags
{
  my ($s) = @_;
  
  my $ref = $s->source_code;
  
  # Parse <%= %> items:
  $$ref =~ s{
    <%\=(.*?)%>
  }{
    '~);$Response->Write(' . $1 . ');$Response->Write(q~'
  }xgse;
  
  # TODO: Add <%& HTMLEncode($str) %>
  
  # TODO: Add <%% URLEncode($str) %>

  $$ref =~ s{
    <%\s*([^\@\#\=]?.*?)%>
  }{
    my $txt = $1; '~);' . $txt . ';$Response->Write(q~'
  }gxse;
  



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