From: sgunderson@bigfoot.com <> Date: Thu, 1 Mar 2007 11:16:38 +0000 (+0100) Subject: Add a Buffer class, for the SAX stuff. X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=672fc78eaa0837b59d90d0926433739aeac1f93b;p=xml-template Add a Buffer class, for the SAX stuff. --- diff --git a/perl-sax/XML/TemplateSAX/Buffer.pm b/perl-sax/XML/TemplateSAX/Buffer.pm new file mode 100644 index 0000000..f7a141b --- /dev/null +++ b/perl-sax/XML/TemplateSAX/Buffer.pm @@ -0,0 +1,64 @@ +#! /usr/bin/perl + +# A utility class that can store SAX events and replay them back to some SAX +# handler as many times as you'd like. Useful for both cloning and including. + +package XML::TemplateSAX::Buffer; +use base qw(XML::SAX::Base); + +sub new { + my $class = shift; + my %options = @_; + + my $self = { + events => [] + }; + bless($self, $class); + return $self; +} + +sub start_element { + my ($self, $data) = @_; + push @{$self->{'events'}}, [ 'E', $data ]; +} + +sub characters { + my ($self, $data) = @_; + push @{$self->{'events'}}, [ 'C', $data ]; +} + +sub comment { + my ($self, $data) = @_; + push @{$self->{'events'}}, [ 'c', $data ]; +} + +sub processing_instruction { + my ($self, $data) = @_; + push @{$self->{'events'}}, [ 'p', $data ]; +} + +sub end_element { + my ($self, $data) = @_; + push @{$self->{'events'}}, [ 'e', $data ]; +} + +sub replay { + my ($self, $dest) = @_; + + for my $event (@{$self->{'events'}}) { + my ($type, $data) = @$event; + if ($type eq 'E') { + $dest->start_element($data); + } elsif ($type eq 'C') { + $dest->characters($data); + } elsif ($type eq 'c') { + $dest->comment($data); + } elsif ($type eq 'p') { + $dest->processing_instruction($data); + } elsif ($type eq 'e') { + $dest->end_element($data); + } + } +} + +1;