]> git.sesse.net Git - xml-template/commitdiff
Introduce a SAX cleaner.
authorsgunderson@bigfoot.com <>
Thu, 1 Mar 2007 02:09:12 +0000 (03:09 +0100)
committersgunderson@bigfoot.com <>
Thu, 1 Mar 2007 02:09:12 +0000 (03:09 +0100)
perl-sax/XML/TemplateSAX.pm

index d2eb7a5bc1ead16e97b04f909f5a97b34826909c..18c8d6849b34f904de2cb59f5f51f6d92f70c325 100644 (file)
@@ -111,17 +111,42 @@ sub end_element {
        $self->SUPER::end_element($data);
 }
 
+package XML::TemplateSAX::Cleaner;
+use base qw(XML::SAX::Base);
+
+sub start_element {
+       my ($self, $data) = @_;
+       my $attrs = $data->{'Attributes'};
+
+       for my $a (keys %$attrs) {
+               if ($attrs->{$a}->{'NamespaceURI'} eq 'http://template.sesse.net/') {
+                       delete $attrs->{$a};
+               }
+       }
+
+       $self->SUPER::start_element($data);
+}
+
 package XML::TemplateSAX;
 
 sub process_file {
        my ($filename, $obj, $clean) = @_;
+       $clean = 1 unless (defined($clean));
 
+       my ($writer, $cleaner, $filter, $parser);
        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);
+       $writer = XML::SAX::Writer->new(Output => \$str);
+
+       if ($clean) {
+               $cleaner = XML::TemplateSAX::Cleaner->new(Handler => $writer, Content => $obj);
+               $filter = XML::TemplateSAX::Handler->new(Handler => $cleaner, Content => $obj);
+       } else {
+               $filter = XML::TemplateSAX::Handler->new(Handler => $writer, Content => $obj);
+       }
+
+       $parser = XML::SAX::Expat->new(Handler => $filter);
        $parser->parse_file($filename);
 
        return $str;