File Coverage

blib/lib/XML/Filter/SAXT.pm
Criterion Covered Total %
statement 6 44 13.6
branch 0 6 0.0
condition 0 3 0.0
subroutine 2 23 8.7
pod 0 21 0.0
total 8 97 8.2


line stmt bran cond sub pod time code
1             #
2             # To do:
3             # - later: ErrorHandler, Locale?
4              
5             package XML::Filter::SAXT;
6 1     1   7618 use strict;
  1         3  
  1         41  
7              
8 1     1   5 use vars qw( $VERSION %SAX_HANDLERS );
  1         2  
  1         459  
9             $VERSION = 0.01;
10              
11             %SAX_HANDLERS = ( DocumentHandler =>
12             [ "start_document",
13             "end_document",
14             "start_element",
15             "end_element",
16             "characters",
17             "processing_instruction",
18             "comment",
19             "start_cdata",
20             "end_cdata",
21             "entity_reference",
22             "set_document_locator" # !! passes {Locator=>$perlsax}
23             ],
24              
25             DTDHandler =>
26             [ "notation_decl",
27             "unparsed_entity_decl",
28             "entity_decl",
29             "element_decl",
30             "attlist_decl",
31             "doctype_decl",
32             "xml_decl"
33             ],
34              
35             EntityResolver =>
36             [ "resolve_entity" ]);
37              
38             #
39             # Usage:
40             #
41             # $saxt = new XML::Filter::SAXT ( { Handler => $out0 },
42             # { DocumentHandler => $out1 },
43             # { DTDHandler => $out3,
44             # Handler => $out4
45             # }
46             # );
47             #
48             # $perlsax = new XML::Parser::PerlSAX ( Handler => $saxt );
49             # $perlsax->parse ( [OPTIONS] );
50             #
51             sub new
52             {
53 0     0 0   my ($class, @out) = @_;
54              
55 0           my $self = bless { Out => \@out }, $class;
56              
57 0           for (my $i = 0; $i < @out; $i++)
58             {
59 0           for my $handler (keys %SAX_HANDLERS)
60             {
61 0           my $callbacks = $SAX_HANDLERS{$handler};
62 0   0       my $h = ($self->{Out}->[$i]->{$handler} ||= $self->{Out}->[$i]->{Handler});
63 0 0         next unless defined $h;
64              
65 0           for my $cb (@$callbacks)
66             {
67 0 0         if (UNIVERSAL::can ($h, $cb))
68             {
69 0           $self->{$cb} .= "\$out->[$i]->{$handler}->$cb (\@_);\n";
70             }
71             }
72             }
73             }
74              
75 0           for my $handler (keys %SAX_HANDLERS)
76             {
77 0           my $callbacks = $SAX_HANDLERS{$handler};
78 0           for my $cb (@$callbacks)
79             {
80 0           my $code = $self->{$cb};
81 0 0         if (defined $code)
82             {
83 0           $self->{$cb} =
84             eval "sub { my \$out = shift->{Out}; $code }";
85             }
86             else
87             {
88 0           $self->{$cb} = \&noop;
89             }
90             }
91             }
92 0           return $self;
93             }
94            
95             sub noop
96 0     0 0   {
97             # does nothing
98             }
99              
100             for my $cb (map { @{ $_ } } values %SAX_HANDLERS)
101             {
102 0     0 0   eval "sub $cb { shift->{$cb}->(\@_); }";
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
  0     0 0    
103             }
104              
105             1; # package return code
106              
107             __END__