]> git.sesse.net Git - xml-template/blob - perl-sax/XML/TemplateSAX.pm
Add a proper wrapper for php5-swig, which also makes attribute[23] pass. All tests...
[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. (In theory,
18 #   one could avoid the buffering and just defer the parsing/filtering until
19 #   it's needed, but Expat seems non-reentrant, which means starting a parser
20 #   from within a begin_element callback blows up.)
21 #
22
23 use strict;
24 use warnings;
25 use XML::SAX::Expat;
26 use XML::SAX::Writer;
27 use XML::TemplateSAX::Buffer;
28 use XML::TemplateSAX::Cleaner;
29 use XML::TemplateSAX::Handler;
30
31 package XML::TemplateSAX;
32
33 sub process_file_to_handler {
34         my ($filename, $handler, $obj, $clean) = @_;
35         $clean = 1 unless (defined($clean));
36
37         my ($cleaner, $filter, $parser);
38         my $str = '';
39
40         if ($clean) {
41                 $cleaner = XML::TemplateSAX::Cleaner->new(Handler => $handler);
42                 $filter = XML::TemplateSAX::Handler->new(Handler => $cleaner, Content => $obj);
43         } else {
44                 $filter = XML::TemplateSAX::Handler->new(Handler => $handler, Content => $obj);
45         }
46
47         # FIXME: hardcoding expat = not good?
48         $parser = XML::SAX::Expat->new(Handler => $filter);
49         $parser->parse_file($filename);
50
51         return $str;
52 }
53
54 sub process_file {
55         my ($filename, $obj, $clean) = @_;
56
57         my $str = '';
58         my $writer = XML::SAX::Writer->new(Output => \$str);
59
60         process_file_to_handler($filename, $writer, $obj, $clean);
61
62         return $str;
63 }
64
65 sub process_file_to_buffer {
66         my ($filename, $obj, $clean) = @_;
67         
68         my $buffer = XML::TemplateSAX::Buffer->new;
69         process_file_to_handler($filename, $buffer, $obj, $clean);
70
71         return $buffer;
72 }
73
74 sub alternate {
75         my ($tag, $array, @elems) = @_;
76
77         my $i = 0;
78         my $num = scalar @elems;
79
80         for my $ref (@$array) {
81                 if (defined($ref)) {
82                         $ref->{$tag} = $elems[$i++ % $num];
83                 }
84         }
85
86         return $array;
87 }
88
89 1;