[Templates-cvs] cvs commit: TT3/benchmark/lib/Scanner Count.pm Null.pm PostScan.pm Split.pm

cvs@template-toolkit.org cvs@template-toolkit.org
Fri, 19 Dec 2003 12:08:08 +0000


cvs         03/12/19 12:08:08

  Added:       benchmark/lib/Scanner Count.pm Null.pm PostScan.pm Split.pm
  Log:
  added benchmark files
  
  Revision  Changes    Path
  1.1                  TT3/benchmark/lib/Scanner/Count.pm
  
  Index: Count.pm
  ===================================================================
  package Scanner::Count;
  use Template::TT3::Scanner;
  use base qw( Template::TT3::Scanner );
  use vars qw( $DEBUG );
  use strict;
  use warnings;
  
  sub scan {
      my ($self, $text, $handler) = @_;
      my $textref = ref $text ? $text : \$text;
  
      $self->{ reset } = 0;
      my $line = 1;
      my $size = 0;
  
      SCAN_FOR_TAGS: {
          my ($tagmap, $regex, $regexen) = @$self{ qw( tagmap regex regexen  ) };
  
          last SCAN_FOR_TAGS unless $regex;
  
          while ($$textref =~ /$regex/cg) {
              my ($pretext, $start) = ($1, $2);
              my $end;
  
              if (defined $pretext && length $pretext) {
                  # count newlines and notify document
                  $size = ($pretext =~ tr/\n//);
                  $handler = $handler->text(\$pretext, $line, $size) 
                      || return $self->error($handler->error());
                  $line += $size;
              }
  
              my $tag = $tagmap->{ $start };
  
              unless (defined $tag) {
                  my $regexen = $self->{ regexen };
                  for my $n (0..$#$regexen) {
                      if ($start =~ $regexen->[$n]) {
                          $tag = $self->{ regtags }->[$n]
                              || return $self->error("no tag for regex $regexen->[$n]");
                          $tagmap->{ $start } = $tag;
                          last;
                      }
                  }
                  return $self->error("no tag defined for '$start'")
                      unless defined $tag;
              }
  
              if (defined ($end = $tag->{ end }) && length($end)) {
                  my $regex = $tag->{ end_regex } ||= do {
                      $end = ref $end eq 'Regexp' ? $end : quotemeta($end);
                      qr/ \G (.*?) ($end) /sox;
                  };
                  
                  return $self->error("no closing tag to match $start")
                      unless $$textref =~ /$regex/gc;
                  my ($content, $end) = ($1, $2);
  
                  $size = ( $start   =~ tr/\n// ) 
                        + ( $content =~ tr/\n// ) 
                        + ( $end     =~ tr/\n// );
  
                  $handler = $tag->scan(\$content, $handler, $line, $size, $start, $end)
                      || return $self->error($tag->error());
  
                  $line += $size;
              }
              else {
                  my $start_pos = pos($$textref) || 0;
  
                  $handler = $tag->scan($textref, $handler, $line, 0, $start)
                      || return $self->error($tag->error());
      
                  my $end_pos = pos $$textref || 0;
                  my $substr  = substr($$textref, $start_pos, $end_pos - $start_pos);
                  $line += ($substr =~ tr/\n//);
              }
  
              # check to see if tags have changed
              if ($self->{ reset }) {
                  $self->debug("scanner reset\n") if $DEBUG;
                  redo SCAN_FOR_TAGS;
              }
          }
      }
  
      # scan for any trailing text
      if ($$textref =~ / \G (.+) /sx) {
          my $text = $1;
          $size = ($text =~ tr/\n//);
          $handler = $handler->text(\$text, $line, $size) 
              || return $self->error($handler->error());
          $line += $size;
      }
  
      return 1;
  }
  
  
  1;
  
  
  
  
  1.1                  TT3/benchmark/lib/Scanner/Null.pm
  
  Index: Null.pm
  ===================================================================
  package Scanner::Null;
  use Template::TT3::Scanner;
  use base qw( Template::TT3::Scanner );
  use vars qw( $DEBUG );
  use strict;
  use warnings;
  
  sub scan {
      my ($self, $text, $handler) = @_;
      my $textref = ref $text ? $text : \$text;
  
      $self->{ reset } = 0;
      my $line = 0;
      my $size = 0;
  
      SCAN_FOR_TAGS: {
          my ($tagmap, $regex, $regexen) = @$self{ qw( tagmap regex regexen  ) };
  
          last SCAN_FOR_TAGS unless $regex;
  
          while ($$textref =~ /$regex/cg) {
              my ($pretext, $start) = ($1, $2);
              my $end;
  
              if (defined $pretext && length $pretext) {
                  $handler = $handler->text(\$pretext, $line, $size) 
                      || return $self->error($handler->error());
              }
  
              my $tag = $tagmap->{ $start };
  
              unless (defined $tag) {
                  my $regexen = $self->{ regexen };
                  for my $n (0..$#$regexen) {
                      if ($start =~ $regexen->[$n]) {
                          $tag = $self->{ regtags }->[$n]
                              || return $self->error("no tag for regex $regexen->[$n]");
                          $tagmap->{ $start } = $tag;
                          last;
                      }
                  }
                  return $self->error("no tag defined for '$start'")
                      unless defined $tag;
              }
  
              if (defined ($end = $tag->{ end }) && length($end)) {
                  my $regex = $tag->{ end_regex } ||= do {
                      $end = ref $end eq 'Regexp' ? $end : quotemeta($end);
                      qr/ \G (.*?) ($end) /sx;
                  };
                  
                  return $self->error("no closing tag to match $start")
                      unless $$textref =~ /$regex/gc;
                  my ($content, $end) = ($1, $2);
  
                  $handler = $tag->scan(\$content, $handler, $line, $size, $start, $end)
                      || return $self->error($tag->error());
              }
              else {
                  $handler = $tag->scan($textref, $handler, $line, 0, $start)
                      || return $self->error($tag->error());
              }
  
              # check to see if tags have changed
              if ($self->{ reset }) {
                  $self->debug("scanner reset\n") if $DEBUG;
                  redo SCAN_FOR_TAGS;
              }
          }
      }
  
      # scan for any trailing text
      if ($$textref =~ / \G (.+) /sx) {
          my $posttext = $1;
          $handler = $handler->text(\$posttext, $line, $size) 
              || return $self->error($handler->error());
      }
  
      return 1;
  }
  
  
  1;
  
  
  
  
  
  1.1                  TT3/benchmark/lib/Scanner/PostScan.pm
  
  Index: PostScan.pm
  ===================================================================
  package Scanner::PostScan;
  use Template::TT3::Scanner;
  use base qw( Template::TT3::Scanner );
  use vars qw( $DEBUG );
  use strict;
  use warnings;
  
  sub scan {
      my ($self, $text, $handler) = @_;
      my $textref = ref $text ? $text : \$text;
  
      $self->{ reset } = 0;
      my $line = 1;
      my $size = 0;
  
      SCAN_FOR_TAGS: {
          my ($tagmap, $regex, $regexen) = @$self{ qw( tagmap regex regexen  ) };
  
          last SCAN_FOR_TAGS unless $regex;
  
          while ($$textref =~ /$regex/cg) {
              my ($pretext, $start) = ($1, $2);
              my $end;
  
              if (defined $pretext && length $pretext) {
                  # count newlines and notify document
                  $size = ($pretext =~ tr/\n//);
                  $handler = $handler->text(\$pretext, $line, $size) 
                      || return $self->error($handler->error());
                  $line += $size;
              }
  
              my $tag = $tagmap->{ $start };
  
              unless (defined $tag) {
                  my $regexen = $self->{ regexen };
                  for my $n (0..$#$regexen) {
                      if ($start =~ $regexen->[$n]) {
                          $tag = $self->{ regtags }->[$n]
                              || return $self->error("no tag for regex $regexen->[$n]");
                          $tagmap->{ $start } = $tag;
                          last;
                      }
                  }
                  return $self->error("no tag defined for '$start'")
                      unless defined $tag;
              }
  
              my $start_pos = pos($$textref) || 0;
  
              if (defined ($end = $tag->{ end }) && length($end)) {
                  my $regex = $tag->{ end_regex } ||= do {
                      $end = ref $end eq 'Regexp' ? $end : quotemeta($end);
                      qr/ \G (.*?) ($end) /sx;
                  };
                  
                  return $self->error("no closing tag to match $start")
                      unless $$textref =~ /$regex/gc;
                  my ($content, $end) = ($1, $2);
  
                  $handler = $tag->scan(\$content, $handler, $line, $size, $start, $end)
                      || return $self->error($tag->error());
              }
              else {
                  $handler = $tag->scan($textref, $handler, $line, 0, $start)
                      || return $self->error($tag->error());
              }
  
              my $end_pos = pos $$textref || 0;
              my $substr  = substr($$textref, $start_pos, $end_pos - $start_pos);
              $line += ($substr =~ tr/\n//);
  
              # check to see if tags have changed
              if ($self->{ reset }) {
                  $self->debug("scanner reset\n") if $DEBUG;
                  redo SCAN_FOR_TAGS;
              }
          }
      }
  
      # scan for any trailing text
      if ($$textref =~ / \G (.+) /sx) {
          my $text = $1;
          $size = ($text =~ tr/\n//);
          $handler = $handler->text(\$text, $line, $size) 
              || return $self->error($handler->error());
          $line += $size;
      }
  
      return 1;
  }
  
  
  1;
  
  
  
  
  1.1                  TT3/benchmark/lib/Scanner/Split.pm
  
  Index: Split.pm
  ===================================================================
  package Scanner::Split;
  use Template::TT3::Scanner;
  use base qw( Template::TT3::Scanner );
  use vars qw( $DEBUG );
  use strict;
  use warnings;
  
  sub scan {
      my ($self, $text, $handler) = @_;
      my $textref = ref $text ? $text : \$text;
  
      $self->{ reset } = 0;
      $self->{ line  } = 1;
      $self->{ size  } = 0;
  
      SCAN_FOR_TAGS: {
          my ($tagmap, $regex, $regexen) = @$self{ qw( tagmap regex regexen  ) };
  
          last SCAN_FOR_TAGS unless $regex;
  
          while ($$textref =~ /$regex/cg) {
              my ($pretext, $start) = ($1, $2);
              my $end;
  
              if (defined $pretext && length $pretext) {
                  $handler = $self->text(\$pretext, $handler) || return;
              }
  
              my $tag = $tagmap->{ $start };
  
              unless (defined $tag) {
                  my $regexen = $self->{ regexen };
                  for my $n (0..$#$regexen) {
                      if ($start =~ $regexen->[$n]) {
                          $tag = $self->{ regtags }->[$n]
                              || return $self->error("no tag for regex $regexen->[$n]");
                          $tagmap->{ $start } = $tag;
                          last;
                      }
                  }
                  return $self->error("no tag defined for '$start'")
                      unless defined $tag;
              }
              
              $handler = $self->tag($textref, $handler, $tag, $start) || return;
  
              # check to see if tags have changed
              if ($self->{ reset }) {
                  $self->debug("scanner reset\n") if $DEBUG;
                  redo SCAN_FOR_TAGS;
              }
          }
      }
  
      # scan for any trailing text
      if ($$textref =~ / \G (.+) /sx) {
          my $posttext = $1;
          $handler = $self->text(\$posttext, $handler) || return;
      }
  
      return 1;
  }
  
  
  
  sub text {
      my ($self, $text, $handler) = @_;
  
      # count newlines and notify document
      $self->{ size } = ($$text =~ tr/\n//);
      $handler = $handler->text($text, $self->{ line }, $self->{ size }) 
          || return $self->error($handler->error());
      $self->{ line } += delete $self->{ size };
      return $handler;
  }
  
  sub tag {
      my ($self, $text, $handler, $tag, $start) = @_;
      my $end;
  
      if (defined ($end = $tag->{ end }) && length($end)) {
          my $regex = $tag->{ end_regex } ||= do {
              $end = ref $end eq 'Regexp' ? $end : quotemeta($end);
              qr/ \G (.*?) ($end) /sx;
          };
                  
          return $self->error("no closing tag to match $start")
              unless $$text =~ /$regex/gc;
          my ($content, $end) = ($1, $2);
  
          $self->{ size } = ( $start   =~ tr/\n// ) 
                          + ( $content =~ tr/\n// ) 
                          + ( $end     =~ tr/\n// );
  
          $handler = $tag->scan(\$content, $handler, $self->{ line }, 
                                $self->{ size }, $start, $end)
              || return $self->error($tag->error());
  
          $self->{ line } += delete $self->{ size };
      }
      else {
          my $start_pos = pos($$text) || 0;
  
          $handler = $tag->scan($text, $handler, $self->{ line }, 0, $start)
              || return $self->error($tag->error());
      
          my $end_pos = pos $$text || 0;
          my $substr  = substr($$text, $start_pos, $end_pos - $start_pos);
          $self->{ line } += ($substr =~ tr/\n//);
      }
      return $handler;
  }
  
  1;