X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=perl-sax%2FXML%2FTemplateSAX.pm;h=04403976a3a4e1e902385ed4a9234744a1e842f1;hb=fcd2b8ecd1668b302e6000a10d307d537b5c432f;hp=fce9ae21a155125cee64b894894c1e26ea80f1a0;hpb=846bb64b483f688096d9c547b9cdb96a7775594a;p=xml-template diff --git a/perl-sax/XML/TemplateSAX.pm b/perl-sax/XML/TemplateSAX.pm index fce9ae2..0440397 100644 --- a/perl-sax/XML/TemplateSAX.pm +++ b/perl-sax/XML/TemplateSAX.pm @@ -3,7 +3,7 @@ # # SAX version of XML::Template. Advantages over DOM: Doesn't have to load # the entire thing into memory, and you can chain filters. Disadvantages: -# Slightly kludgier interface. +# Slightly kludgier interface, and you won't get a DOM tree out. # # Differences from the DOM version: # @@ -11,48 +11,80 @@ # in the stream, usually between a parser and a writer (ie. # parser -> XML::TemplateSAX::Handler -> writer). process_file works as # before, but it returns a _string_, not a DOM tree. -# - You can no longer insert a DOM tree. Instead, what you have is -- FIXME: -# figure out this :-) +# - You can no longer insert a DOM tree, naturally. Instead, you can set up +# an XML::TemplateSAX::Buffer, let it gobble up your data, and send it +# in the way you'd insert a DOM tree. process_file_to_buffer does this +# transparently for you, returning a buffer you can give in. # +use strict; +use warnings; use XML::SAX::Expat; use XML::SAX::Writer; +use XML::TemplateSAX::Buffer; +use XML::TemplateSAX::Cleaner; +use XML::TemplateSAX::Deferred; +use XML::TemplateSAX::Handler; -package XML::TemplateSAX::Handler; -use base qw(XML::SAX::Base); +package XML::TemplateSAX; -sub new { - my $class = shift; - my %options = @_; +sub process_file_to_handler { + my ($filename, $handler, $obj, $clean) = @_; + $clean = 1 unless (defined($clean)); - my $self = { - obj => $options{'Content'}, - Handler => $options{'Handler'} - }; - bless($self, $class); - return $self; -} + my ($cleaner, $filter, $parser); -sub start_element { - my ($self, $data) = @_; + if ($clean) { + $cleaner = XML::TemplateSAX::Cleaner->new(Handler => $handler); + $filter = XML::TemplateSAX::Handler->new(Handler => $cleaner, Content => $obj); + } else { + $filter = XML::TemplateSAX::Handler->new(Handler => $handler, Content => $obj); + } - $self->SUPER::start_element($data); + # FIXME: hardcoding expat = not good? + $parser = XML::SAX::Expat->new(Handler => $filter); + $parser->parse_file($filename); } -package XML::TemplateSAX; - sub process_file { my ($filename, $obj, $clean) = @_; my $str = ''; - - # FIXME: hardcoding expat = not good? my $writer = XML::SAX::Writer->new(Output => \$str); - my $filter = XML::TemplateSAX::Handler->new(Handler => $writer, Content => $obj); - my $parser = XML::SAX::Expat->new(Handler => $filter); - $parser->parse_file($filename); + + process_file_to_handler($filename, $writer, $obj, $clean); return $str; } +sub process_file_to_buffer { + my ($filename, $obj, $clean) = @_; + + my $buffer = XML::TemplateSAX::Buffer->new; + process_file_to_handler($filename, $buffer, $obj, $clean); + + return $buffer; +} + +sub process_file_to_placeholder { + my ($filename, $obj, $clean) = @_; + + return XML::TemplateSAX::Deferred->new($filename, $obj, $clean); +} + +sub alternate { + my ($tag, $array, @elems) = @_; + + my $i = 0; + my $num = scalar @elems; + + for my $ref (@$array) { + if (defined($ref)) { + $ref->{$tag} = $elems[$i++ % $num]; + } + } + + return $array; +} + 1;