From fcd2b8ecd1668b302e6000a10d307d537b5c432f Mon Sep 17 00:00:00 2001 From: "sgunderson@bigfoot.com" <> Date: Thu, 1 Mar 2007 16:44:22 +0100 Subject: [PATCH] Add deferred parsing for perl-sax. Doesn't work yet, though, so it uses a fugly workaround. --- perl-sax/XML/TemplateSAX.pm | 10 ++++++--- perl-sax/XML/TemplateSAX/Deferred.pm | 31 ++++++++++++++++++++++++++++ perl-sax/XML/TemplateSAX/Handler.pm | 7 +++++-- perl-sax/include.pl | 2 +- 4 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 perl-sax/XML/TemplateSAX/Deferred.pm diff --git a/perl-sax/XML/TemplateSAX.pm b/perl-sax/XML/TemplateSAX.pm index aba8c21..0440397 100644 --- a/perl-sax/XML/TemplateSAX.pm +++ b/perl-sax/XML/TemplateSAX.pm @@ -23,6 +23,7 @@ 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; @@ -32,7 +33,6 @@ sub process_file_to_handler { $clean = 1 unless (defined($clean)); my ($cleaner, $filter, $parser); - my $str = ''; if ($clean) { $cleaner = XML::TemplateSAX::Cleaner->new(Handler => $handler); @@ -44,8 +44,6 @@ sub process_file_to_handler { # FIXME: hardcoding expat = not good? $parser = XML::SAX::Expat->new(Handler => $filter); $parser->parse_file($filename); - - return $str; } sub process_file { @@ -68,6 +66,12 @@ sub process_file_to_buffer { 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) = @_; diff --git a/perl-sax/XML/TemplateSAX/Deferred.pm b/perl-sax/XML/TemplateSAX/Deferred.pm new file mode 100644 index 0000000..6ed9d3e --- /dev/null +++ b/perl-sax/XML/TemplateSAX/Deferred.pm @@ -0,0 +1,31 @@ +#! /usr/bin/perl + +use strict; +use warnings; +use XML::TemplateSAX; +use Data::Dumper; +package XML::TemplateSAX::Deferred; + +sub new { + my $class = shift; + my ($filename, $obj, $clean) = @_; + + my $self = { + filename => $filename, + obj => $obj, + clean => $clean + }; + bless($self, $class); + return $self; +} + +sub parse { + my ($self, $handler) = @_; + + my $buf = XML::TemplateSAX::process_file_to_buffer($self->{'filename'}, $self->{'obj'}, $self->{'clean'}); + $buf->replay($handler); + + # XML::TemplateSAX::process_file_to_handler($self->{'filename'}, $handler, $self->{'obj'}, $self->{'clean'}); +} + +1; diff --git a/perl-sax/XML/TemplateSAX/Handler.pm b/perl-sax/XML/TemplateSAX/Handler.pm index b684c93..319883b 100644 --- a/perl-sax/XML/TemplateSAX/Handler.pm +++ b/perl-sax/XML/TemplateSAX/Handler.pm @@ -113,9 +113,12 @@ sub start_element { if (ref($match) eq 'XML::TemplateSAX::Buffer') { $match->replay($self); $self->{'obj'} = undef; + } elsif (ref($match) eq 'XML::TemplateSAX::Deferred') { + $match->parse($self); + $self->{'obj'} = undef; + } else { + $self->{'obj'} = $match; } - - $self->{'obj'} = $match; return; } } diff --git a/perl-sax/include.pl b/perl-sax/include.pl index 287351b..dc26562 100644 --- a/perl-sax/include.pl +++ b/perl-sax/include.pl @@ -1,7 +1,7 @@ #! /usr/bin/perl use XML::TemplateSAX; -my $doc = XML::TemplateSAX::process_file_to_buffer('../xml/included.xml', { +my $doc = XML::TemplateSAX::process_file_to_placeholder('../xml/included.xml', { 'color' => 'red' }, 0); my $master = XML::TemplateSAX::process_file('../xml/master.xml', { -- 2.39.2