]> git.sesse.net Git - xml-template/blob - perl-sax/XML/TemplateSAX/Buffer.pm
Almost fix cloning. Yay!
[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 $ptr = shift;
12
13         my $self = {
14                 events => [],
15                 ptr => $ptr
16         };
17         bless($self, $class);
18         return $self;
19 }
20
21 sub start_element {
22         my ($self, $data) = @_;
23         push @{$self->{'events'}}, [ 'E', $data ];
24 }
25
26 sub characters {
27         my ($self, $data) = @_;
28         push @{$self->{'events'}}, [ 'C', $data ];
29 }
30
31 sub comment {
32         my ($self, $data) = @_;
33         push @{$self->{'events'}}, [ 'c', $data ];
34 }
35
36 sub processing_instruction {
37         my ($self, $data) = @_;
38         push @{$self->{'events'}}, [ 'p', $data ];
39 }
40
41 sub end_element {
42         my ($self, $data) = @_;
43         push @{$self->{'events'}}, [ 'e', $data ];
44 }
45
46 sub replay {
47         my ($self, $dest) = @_;
48
49         for my $event (@{$self->{'events'}}) {
50                 my ($type, $data) = @$event;
51                 if ($type eq 'E') {
52                         $dest->start_element($data);
53                 } elsif ($type eq 'C') {
54                         $dest->characters($data);
55                 } elsif ($type eq 'c') {
56                         $dest->comment($data);
57                 } elsif ($type eq 'p') {
58                         $dest->processing_instruction($data);
59                 } elsif ($type eq 'e') {
60                         $dest->end_element($data);
61                 }
62         }
63 }
64
65 1;