]> git.sesse.net Git - xml-template/blob - perl-sax/XML/TemplateSAX/Buffer.pm
Add a Buffer class, for the SAX stuff.
[xml-template] / perl-sax / XML / TemplateSAX / Buffer.pm
1 #! /usr/bin/perl
2
3 # A utility class that can store SAX events and replay them back to some SAX
4 # handler as many times as you'd like. Useful for both cloning and including.
5
6 package XML::TemplateSAX::Buffer;
7 use base qw(XML::SAX::Base);
8
9 sub new {
10         my $class = shift;
11         my %options = @_;
12
13         my $self = {
14                 events => []
15         };
16         bless($self, $class);
17         return $self;
18 }
19
20 sub start_element {
21         my ($self, $data) = @_;
22         push @{$self->{'events'}}, [ 'E', $data ];
23 }
24
25 sub characters {
26         my ($self, $data) = @_;
27         push @{$self->{'events'}}, [ 'C', $data ];
28 }
29
30 sub comment {
31         my ($self, $data) = @_;
32         push @{$self->{'events'}}, [ 'c', $data ];
33 }
34
35 sub processing_instruction {
36         my ($self, $data) = @_;
37         push @{$self->{'events'}}, [ 'p', $data ];
38 }
39
40 sub end_element {
41         my ($self, $data) = @_;
42         push @{$self->{'events'}}, [ 'e', $data ];
43 }
44
45 sub replay {
46         my ($self, $dest) = @_;
47
48         for my $event (@{$self->{'events'}}) {
49                 my ($type, $data) = @$event;
50                 if ($type eq 'E') {
51                         $dest->start_element($data);
52                 } elsif ($type eq 'C') {
53                         $dest->characters($data);
54                 } elsif ($type eq 'c') {
55                         $dest->comment($data);
56                 } elsif ($type eq 'p') {
57                         $dest->processing_instruction($data);
58                 } elsif ($type eq 'e') {
59                         $dest->end_element($data);
60                 }
61         }
62 }
63
64 1;