[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;