]> git.sesse.net Git - xml-template/blob - perl-sax/XML/TemplateSAX.pm
Fix some internal oddities in perl-sax/structure; however, the test still
[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, and you won't get a DOM tree out.
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, naturally. Instead, you can set up
15 #   an XML::TemplateSAX::Buffer, let it gobble up your data, and send it
16 #   in the way you'd insert a DOM tree. process_file_to_buffer does this
17 #   transparently for you, returning a buffer you can give in.
18 #
19
20 use strict;
21 use warnings;
22 use XML::SAX::Expat;
23 use XML::SAX::Writer;
24 use XML::TemplateSAX::Buffer;
25 use XML::TemplateSAX::Cleaner;
26 use XML::TemplateSAX::Handler;
27
28 package XML::TemplateSAX;
29
30 sub process_file {
31         my ($filename, $obj, $clean) = @_;
32         $clean = 1 unless (defined($clean));
33
34         my ($writer, $cleaner, $filter, $parser);
35         my $str = '';
36
37         $writer = XML::SAX::Writer->new(Output => \$str);
38
39         if ($clean) {
40                 $cleaner = XML::TemplateSAX::Cleaner->new(Handler => $writer, Content => $obj);
41                 $filter = XML::TemplateSAX::Handler->new(Handler => $cleaner, Content => $obj);
42         } else {
43                 $filter = XML::TemplateSAX::Handler->new(Handler => $writer, Content => $obj);
44         }
45
46         # FIXME: hardcoding expat = not good?
47         $parser = XML::SAX::Expat->new(Handler => $filter);
48         $parser->parse_file($filename);
49
50         return $str;
51 }
52
53 sub process_file_to_buffer {
54         my ($filename, $obj, $clean) = @_;
55         $clean = 1 unless (defined($clean));
56
57         my ($buffer, $cleaner, $filter, $parser);
58
59         $buffer = XML::TemplateSAX::Buffer->new;
60
61         if ($clean) {
62                 $cleaner = XML::TemplateSAX::Cleaner->new(Handler => $buffer, Content => $obj);
63                 $filter = XML::TemplateSAX::Handler->new(Handler => $cleaner, Content => $obj);
64         } else {
65                 $filter = XML::TemplateSAX::Handler->new(Handler => $buffer, Content => $obj);
66         }
67
68         # FIXME: hardcoding expat = not good?
69         $parser = XML::SAX::Expat->new(Handler => $filter);
70         $parser->parse_file($filename);
71
72         return $buffer;
73 }
74
75 sub alternate {
76         my ($tag, $array, @elems) = @_;
77
78         my $i = 0;
79         my $num = scalar @elems;
80
81         for my $ref (@$array) {
82                 if (defined($ref)) {
83                         $ref->{$tag} = $elems[$i++ % $num];
84                 }
85         }
86
87         return $array;
88 }
89
90 1;