Add built local::lib
[catagits/Gitalist.git] / local-lib5 / lib / perl5 / i486-linux-gnu-thread-multi / XML / LibXML / SAX / Generator.pm
1 # $Id: Generator.pm 772 2009-01-23 21:42:09Z pajas 
2 #
3 # This is free software, you may use it and distribute it under the same terms as
4 # Perl itself.
5 #
6 # Copyright 2001-2003 AxKit.com Ltd., 2002-2006 Christian Glahn, 2006-2009 Petr Pajas
7 #
8 #
9
10 package XML::LibXML::SAX::Generator;
11
12 use strict;
13
14 use XML::LibXML;
15 use vars qw ($VERSION);
16
17 $VERSION = "1.70"; # VERSION TEMPLATE: DO NOT CHANGE
18
19 sub CLONE_SKIP {
20   return $XML::LibXML::__threads_shared ? 0 : 1;
21 }
22
23 warn("This class (", __PACKAGE__, ") is deprecated!");
24
25 sub new {
26     my $class = shift;
27     unshift @_, 'Handler' unless @_ != 1;
28     my %p = @_;
29     return bless \%p, $class;
30 }
31
32 sub generate {
33     my $self = shift;
34     my ($node) = @_;
35     
36     my $document = { Parent => undef };
37     $self->{Handler}->start_document($document);
38     
39     process_node($self->{Handler}, $node);
40     
41     $self->{Handler}->end_document($document);
42 }
43
44 sub process_node {
45     my ($handler, $node) = @_;
46     
47     my $node_type = $node->getType();
48     if ($node_type == XML_COMMENT_NODE) {
49         $handler->comment( { Data => $node->getData } );
50     }
51     elsif ($node_type == XML_TEXT_NODE || $node_type == XML_CDATA_SECTION_NODE) {
52         # warn($node->getData . "\n");
53         $handler->characters( { Data => $node->getData } );
54     }
55     elsif ($node_type == XML_ELEMENT_NODE) {
56         # warn("<" . $node->getName . ">\n");
57         process_element($handler, $node);
58         # warn("</" . $node->getName . ">\n");
59     }
60     elsif ($node_type == XML_ENTITY_REF_NODE) {
61         foreach my $kid ($node->getChildnodes) {
62             # warn("child of entity ref: " . $kid->getType() . " called: " . $kid->getName . "\n");
63             process_node($handler, $kid);
64         }
65     }
66     elsif ($node_type == XML_DOCUMENT_NODE) {
67         # just get root element. Ignore other cruft.
68         foreach my $kid ($node->getChildnodes) {
69             if ($kid->getType() == XML_ELEMENT_NODE) {
70                 process_element($handler, $kid);
71                 last;
72             }
73         }
74     }
75     else {
76         warn("unknown node type: $node_type");
77     }
78 }
79
80 sub process_element {
81     my ($handler, $element) = @_;
82     
83     my @attr;
84     
85     foreach my $attr ($element->getAttributes) {
86         push @attr, XML::LibXML::SAX::AttributeNode->new(
87             Name => $attr->getName,
88             Value => $attr->getData,
89             NamespaceURI => $attr->getNamespaceURI,
90             Prefix => $attr->getPrefix,
91             LocalName => $attr->getLocalName,
92             );
93     }
94     
95     my $node = {
96         Name => $element->getName,
97         Attributes => { map { $_->{Name} => $_ } @attr },
98         NamespaceURI => $element->getNamespaceURI,
99         Prefix => $element->getPrefix,
100         LocalName => $element->getLocalName,
101     };
102     
103     $handler->start_element($node);
104     
105     foreach my $child ($element->getChildnodes) {
106         process_node($handler, $child);
107     }
108     
109     $handler->end_element($node);
110 }
111
112 package XML::LibXML::SAX::AttributeNode;
113
114 use overload '""' => "stringify";
115
116 sub new {
117     my $class = shift;
118     my %p = @_;
119     return bless \%p, $class;
120 }
121
122 sub stringify {
123     my $self = shift;
124     return $self->{Value};
125 }
126
127 1;
128
129 __END__
130
131 =head1 NAME
132
133 XML::LibXML::SAX::Generator - Generate SAX events from a LibXML tree
134
135 =head1 SYNOPSIS
136
137   my $handler = MySAXHandler->new();
138   my $generator = XML::LibXML::SAX::Generator->new(Handler => $handler);
139   my $dom = XML::LibXML->new->parse_file("foo.xml");
140   
141   $generator->generate($dom);
142
143 =head1 DESCRIPTION
144
145 THIS CLASS IS DEPRACED! Use XML::LibXML::SAX::Parser instead!
146
147 This helper class allows you to generate SAX events from any XML::LibXML
148 node, and all it's sub-nodes. This basically gives you interop from
149 XML::LibXML to other modules that may implement SAX.
150
151 It uses SAX2 style, but should be compatible with anything SAX1, by use
152 of stringification overloading.
153
154 There is nothing to really know about, beyond the synopsis above, and
155 a general knowledge of how to use SAX, which is beyond the scope here.
156
157 =cut