]> git.sesse.net Git - xml-template/blob - perl-sax/XML/TemplateSAX.pm
Start working on a SAX version of the Perl stuff. Very broken yet...
[xml-template] / perl-sax / XML / TemplateSAX.pm
1 #! /usr/bin/perl
2
3 #
4 # SAX version of XML::Template. Advantages over DOM: Doesn't have to load
5 # the entire thing into memory, and you can chain filters. Disadvantages:
6 # Slightly kludgier interface.
7 #
8 # Differences from the DOM version:
9
10 # - There is no process(). Instead, it works as a SAX filter, so you put it
11 #   in the stream, usually between a parser and a writer (ie.
12 #   parser -> XML::TemplateSAX::Handler -> writer). process_file works as
13 #   before, but it returns a _string_, not a DOM tree.
14 # - You can no longer insert a DOM tree. Instead, what you have is -- FIXME:
15 #   figure out this :-)
16 #
17
18 use XML::SAX::Expat;
19 use XML::SAX::Writer;
20
21 package XML::TemplateSAX::Handler;
22 use base qw(XML::SAX::Base);
23
24 sub new {
25         my $class = shift;
26         my %options = @_;
27
28         my $self = {
29                 obj => $options{'Content'},
30                 Handler => $options{'Handler'}
31         };
32         bless($self, $class);
33         return $self;
34 }
35
36 sub start_element {
37         my ($self, $data) = @_;
38
39         $self->SUPER::start_element($data);
40 }
41
42 package XML::TemplateSAX;
43
44 sub process_file {
45         my ($filename, $obj, $clean) = @_;
46
47         my $str = '';
48
49         # FIXME: hardcoding expat = not good?
50         my $writer = XML::SAX::Writer->new(Output => \$str);
51         my $filter = XML::TemplateSAX::Handler->new(Handler => $writer, Content => $obj);
52         my $parser = XML::SAX::Expat->new(Handler => $filter);
53         $parser->parse_file($filename);
54
55         return $str;
56 }
57
58 1;