]> git.sesse.net Git - xml-template/commitdiff
Start working on a SAX version of the Perl stuff. Very broken yet...
authorsgunderson@bigfoot.com <>
Thu, 1 Mar 2007 01:37:08 +0000 (02:37 +0100)
committersgunderson@bigfoot.com <>
Thu, 1 Mar 2007 01:37:08 +0000 (02:37 +0100)
perl-sax/XML/TemplateSAX.pm [new file with mode: 0644]
perl-sax/passthru.pl [new file with mode: 0644]
perl-sax/simple.pl [new file with mode: 0644]
tests/test.sh
xml/clone.xml
xml/master.xml
xml/passthru.xml
xml/simple.xml

diff --git a/perl-sax/XML/TemplateSAX.pm b/perl-sax/XML/TemplateSAX.pm
new file mode 100644 (file)
index 0000000..fce9ae2
--- /dev/null
@@ -0,0 +1,58 @@
+#! /usr/bin/perl
+
+#
+# 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.
+#
+# Differences from the DOM version:
+# 
+# - There is no process(). Instead, it works as a SAX filter, so you put it
+#   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 :-)
+#
+
+use XML::SAX::Expat;
+use XML::SAX::Writer;
+
+package XML::TemplateSAX::Handler;
+use base qw(XML::SAX::Base);
+
+sub new {
+       my $class = shift;
+       my %options = @_;
+
+       my $self = {
+               obj => $options{'Content'},
+               Handler => $options{'Handler'}
+       };
+       bless($self, $class);
+       return $self;
+}
+
+sub start_element {
+       my ($self, $data) = @_;
+
+       $self->SUPER::start_element($data);
+}
+
+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);
+
+       return $str;
+}
+
+1;
diff --git a/perl-sax/passthru.pl b/perl-sax/passthru.pl
new file mode 100644 (file)
index 0000000..6029f74
--- /dev/null
@@ -0,0 +1,5 @@
+#! /usr/bin/perl
+use XML::TemplateSAX;
+
+my $doc = XML::TemplateSAX::process_file('../xml/passthru.xml', {});
+print $doc;
diff --git a/perl-sax/simple.pl b/perl-sax/simple.pl
new file mode 100644 (file)
index 0000000..1e371fd
--- /dev/null
@@ -0,0 +1,8 @@
+#! /usr/bin/perl
+use XML::TemplateSAX;
+
+my $doc = XML::TemplateSAX::process_file('../xml/simple.xml', {
+       'title' => 'A very basic example',
+       '#hello' => 'Hello world!'
+});
+print $doc;
index 38ab5e4a7336f9919aca5bd3bf1c58f7e4ee1713..24a105b616c491ee0cae8ccaf64d64e405d93a11 100755 (executable)
@@ -4,7 +4,7 @@ if [ -z "$TESTS" ]; then
        TESTS="passthru simple clone include attribute attribute2 attribute3 attribute-empty"
 fi
 if [ -z "$LANGUAGES" ]; then
-       LANGUAGES="perl php python"
+       LANGUAGES="perl perl-sax php python"
 fi
 
 for L in $LANGUAGES; do
@@ -15,6 +15,9 @@ for L in $LANGUAGES; do
                if [ "$L" = "perl" ]; then
                        perl -I../perl ../perl/$T.pl > $TEMPFILE
                fi
+               if [ "$L" = "perl-sax" ]; then
+                       perl -I../perl-sax ../perl-sax/$T.pl > $TEMPFILE
+               fi
                if [ "$L" = "php" ]; then
                        php4-cgi -q ../php/$T.php > $TEMPFILE
                fi
index 52a90b9c9fcdf10913162d76e552dbd29d96ae61..fb4b2fe00a7d97767701ef5274cee8530626319c 100644 (file)
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 <!DOCTYPE
   html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
index e3af1361c86fb5f309676070d54476333d0a1957..d6832848b2caefeff6c4d116e1575a32dad14655 100644 (file)
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 <!DOCTYPE
   html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
index 69d0bfb2b2e6163cdb9edee8cc959a1d8173126c..d61e4c75f0c359a001a5882c7cefbfc31aded9cf 100644 (file)
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 <!DOCTYPE
   html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
index b4bac242b4101efe3fc693681d6aa9dc4fd508b3..b22955c8f804cda12997d2856e8f38cca9d682e3 100644 (file)
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 <!DOCTYPE
   html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">