From 1caf1fe58c904c8dde490ba1ef90e7325f56da10 Mon Sep 17 00:00:00 2001 From: "sgunderson@bigfoot.com" <> Date: Thu, 1 Mar 2007 13:23:50 +0100 Subject: [PATCH] Find out how we're going to handle includes. Some comment updates. Add (failing) include test. --- perl-sax/XML/TemplateSAX.pm | 32 ++++++++++++++++++++++++++++---- perl-sax/include.pl | 12 ++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 perl-sax/include.pl diff --git a/perl-sax/XML/TemplateSAX.pm b/perl-sax/XML/TemplateSAX.pm index 5edeea6..10714a4 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,8 +11,10 @@ # 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; @@ -32,7 +34,6 @@ sub process_file { my ($writer, $cleaner, $filter, $parser); my $str = ''; - # FIXME: hardcoding expat = not good? $writer = XML::SAX::Writer->new(Output => \$str); if ($clean) { @@ -42,10 +43,33 @@ sub process_file { $filter = XML::TemplateSAX::Handler->new(Handler => $writer, Content => $obj); } + # FIXME: hardcoding expat = not good? $parser = XML::SAX::Expat->new(Handler => $filter); $parser->parse_file($filename); return $str; } +sub process_file_to_buffer { + my ($filename, $obj, $clean) = @_; + $clean = 1 unless (defined($clean)); + + my ($buffer, $cleaner, $filter, $parser); + + $buffer = XML::TemplateSAX::Buffer->new; + + if ($clean) { + $cleaner = XML::TemplateSAX::Cleaner->new(Handler => $buffer, Content => $obj); + $filter = XML::TemplateSAX::Handler->new(Handler => $cleaner, Content => $obj); + } else { + $filter = XML::TemplateSAX::Handler->new(Handler => $buffer, Content => $obj); + } + + # FIXME: hardcoding expat = not good? + $parser = XML::SAX::Expat->new(Handler => $filter); + $parser->parse_file($filename); + + return $buffer; +} + 1; diff --git a/perl-sax/include.pl b/perl-sax/include.pl new file mode 100644 index 0000000..287351b --- /dev/null +++ b/perl-sax/include.pl @@ -0,0 +1,12 @@ +#! /usr/bin/perl +use XML::TemplateSAX; + +my $doc = XML::TemplateSAX::process_file_to_buffer('../xml/included.xml', { + 'color' => 'red' +}, 0); +my $master = XML::TemplateSAX::process_file('../xml/master.xml', { + 'title' => 'Main HTML title', + 'h1' => 'Nice heading here', + 'contents' => $doc +}); +print $master; -- 2.39.2