HTML-CMTemplate
view release on metacpan or search on metacpan
CMTemplate.pm view on Meta::CPAN
}
sub __onCOMMENT__ {
my $self = shift;
$self->__debug__(\@_);
my $contents = shift;
# NOP: Just eat the tag
}
sub __process_cdata__ {
my $self = shift;
$self->__debug__(\@_);
my ($cdata) = @_;
# If we are in a TPL node, then we should just add the text to the current
# text in that node. Otherwise, something went wrong. We should always
# be prepared to receive text when it comes.
my $node = $self->__top_TPL__( 'text' );
$node->text( $node->text . $cdata );
$self->__debug__( "New CDATA length: " . length( $node->text ) );
}
# This function takes a chunk of text and decides what to do with it. It works
# in a similar fashion to expat, which will take text until you quit giving it
# to it. It simply looks for tags and data in between. When a complete tag is
# found, it passes the information off to a function to have it processed.
# When cdata is found (character data) it dumps it out. Note that there is
# no guarantee that the cdata will come back all at once. This function does
# not do any output buffering on cdata. If it isn't in a tag, it gives you
# everything that it currently has, whether it is the entire set of text
# or not.
sub __process_block__ {
my $self = shift;
$self->__debug__(\@_);
my $str = shift;
# This function only looks for tokens and keeps track of whether or not
# it is inside of a tag. Once a complete tag has been found, it will
# send the name of that tag and all remaining text inside of it to the
# appropriate function.
# If it reaches the end of a buffer and is not inside of a tag, it
# accumulates all text and sends it out to the cdata function.
# Append to the buffer and continue where we left off.
$self->{strbuf} .= $str;
# Note that if we are already inside of a tag, we search from a few
# characters before the boundary. Otherwise, we search from the beginning
# of the unprocessed buffer.
my $curpos = ($self->{parserintag}) ?
$self->{buflen} - $HTML::CMTemplate::tagEndLen + 1:
$self->{bufstart};
CMTemplate.pm view on Meta::CPAN
# the next section of buffer is read in.
my $pos = index( $self->{strbuf}, $HTML::CMTemplate::tagStart, $curpos);
$self->__debug__( "Start tag position: $pos" );
# If we found a start tag, we need to dump the text out and
# set the tag state. TODO: Check for escaped tags!
if ($pos > -1) {
# Found the start tag. Change state and get out.
$self->{parserintag} = 1;
$self->{tagstart} = $pos;
if ($pos > $curpos) {
$self->__process_cdata__(
substr( $self->{strbuf}, $curpos, $pos - $curpos )
);
$curpos = $pos;
}
# exhausted our buffer to this point.
$self->{bufstart} = $curpos;
}
else {
# No start tag found. Double check that the first character
# of the tag is not in the end of the buffer somewhere. If it
CMTemplate.pm view on Meta::CPAN
my $firstchar = substr( $HTML::CMTemplate::tagEnd, 0, 1 );
my $fpos = index(
$self->{strbuf},
$firstchar,
$self->{buflen} - $HTML::CMTemplate::tagEndLen + 1
);
# If nothing like a tag was found, set the position to be
# the character after the end of the buffer. Otherwise,
# use the position of the tag character.
$fpos = ($fpos > -1) ? $fpos : $self->{buflen};
$self->__process_cdata__(
substr( $self->{strbuf}, $curpos, $fpos - $curpos )
);
$curpos = $fpos;
$self->{bufstart} = $curpos;
}
}
}
# We need to do some boundary checking here. If, for example, the bufstart
# flag is beyond the end of the buffer, we should just erase the buffer.
( run in 0.630 second using v1.01-cache-2.11-cpan-454fe037f31 )