File Coverage

blib/lib/XML/RDDL/Driver.pm
Criterion Covered Total %
statement 38 38 100.0
branch n/a
condition n/a
subroutine 6 6 100.0
pod 1 1 100.0
total 45 45 100.0


line stmt bran cond sub pod time code
1              
2             ###
3             # XML::RDDL::Driver - SAX2 Driver for RDDL Directories
4             # Robin Berjon
5             # 17/10/2001 - v.0.01
6             ###
7              
8             package XML::RDDL::Driver;
9 1     1   6276 use strict;
  1         3  
  1         82  
10 1     1   606 use XML::RDDL qw();
  1         3  
  1         23  
11              
12 1     1   7 use base qw(XML::SAX::Base);
  1         2  
  1         1714  
13 1     1   27181 use vars qw($VERSION $NS_RDDL $NS_XML $NS_XLINK);
  1         3  
  1         932  
14             $VERSION = $XML::RDDL::VERSION;
15             $NS_RDDL = $XML::RDDL::NS_RDDL;
16             $NS_XML = $XML::RDDL::NS_XML;
17             $NS_XLINK = $XML::RDDL::NS_XLINK;
18              
19              
20             #-------------------------------------------------------------------#
21             # parse
22             #-------------------------------------------------------------------#
23             sub parse {
24 1     1 1 605 my $self = shift;
25 1         2 my $dir = shift;
26              
27 1         5 my $doc = $self->_create_node;
28 1         3 my $pm_rddl = $self->_create_node(
29             Prefix => 'rddl',
30             NamespaceURI => $NS_RDDL,
31             );
32 1         30 my $pm_xlnk = $self->_create_node(
33             Prefix => 'xlink',
34             NamespaceURI => $NS_XLINK,
35             );
36              
37 1         12 $self->SUPER::start_document($doc);
38 1         213 $self->SUPER::start_prefix_mapping($pm_rddl);
39 1         208 $self->SUPER::start_prefix_mapping($pm_xlnk);
40 1         199 for my $res ($dir->get_resources) {
41 1         3 my %attr;
42 1         7 $attr{"{}id"} = $self->_create_node(
43             Name => 'id',
44             LocalName => 'id',
45             Prefix => '',
46             Value => $res->get_id,
47             NamespaceURI => '',
48             );
49 1         14 $attr{"{$NS_XML}base"} = $self->_create_node(
50             Name => 'xml:base',
51             LocalName => 'base',
52             Prefix => 'xml',
53             Value => $res->get_base_uri,
54             NamespaceURI => $NS_XML,
55             );
56 1         7 $attr{"{$NS_XML}lang"} = $self->_create_node(
57             Name => 'xml:lang',
58             LocalName => 'lang',
59             Prefix => 'xml',
60             Value => $res->get_lang,
61             NamespaceURI => $NS_XML,
62             );
63 1         414 $attr{"{$NS_XLINK}href"} = $self->_create_node(
64             Name => 'xlink:href',
65             LocalName => 'href',
66             Prefix => 'xlink',
67             Value => $res->get_href,
68             NamespaceURI => $NS_XLINK,
69             );
70 1         10 $attr{"{$NS_XLINK}role"} = $self->_create_node(
71             Name => 'xlink:role',
72             LocalName => 'role',
73             Prefix => 'xlink',
74             Value => $res->get_nature,
75             NamespaceURI => $NS_XLINK,
76             );
77 1         6 $attr{"{$NS_XLINK}arcrole"} = $self->_create_node(
78             Name => 'xlink:arcrole',
79             LocalName => 'arcrole',
80             Prefix => 'xlink',
81             Value => $res->get_purpose,
82             NamespaceURI => $NS_XLINK,
83             );
84 1         6 $attr{"{$NS_XLINK}title"} = $self->_create_node(
85             Name => 'xlink:title',
86             LocalName => 'title',
87             Prefix => 'xlink',
88             Value => $res->get_title,
89             NamespaceURI => $NS_XLINK,
90             );
91              
92 1         5 my $e = $self->_create_node(
93             Name => 'rddl:resource',
94             LocalName => 'resource',
95             Prefix => 'rddl',
96             NamespaceURI => $NS_RDDL,
97             Attributes => \%attr,
98             );
99              
100 1         23 $self->SUPER::start_element($e);
101 1         19009 delete $e->{Attributes};
102 1         35 $self->SUPER::end_element($e);
103             }
104 1         3467 $self->SUPER::end_prefix_mapping($pm_xlnk);
105 1         112 $self->SUPER::end_prefix_mapping($pm_rddl);
106 1         58 $self->SUPER::end_document($doc);
107             }
108             #-------------------------------------------------------------------#
109              
110             #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
111             #`,`, Private Helpers `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
112             #```````````````````````````````````````````````````````````````````#
113              
114             #-------------------------------------------------------------------#
115             # _create_node
116             #-------------------------------------------------------------------#
117             sub _create_node {
118 11     11   17 shift;
119             # this may check for a factory later
120 11         100 return {@_};
121             }
122             #-------------------------------------------------------------------#
123              
124              
125              
126             1;
127             #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
128             #`,`, Documentation `,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
129             #```````````````````````````````````````````````````````````````````#
130              
131             =pod
132              
133             =head1 NAME
134              
135             XML::RDDL::Driver - SAX2 Driver for RDDL Directories
136              
137             =head1 SYNOPSIS
138              
139             use XML::RDDL::Directory;
140             use XML::RDDL::Driver;
141             use MySAX2Handler;
142              
143             my $dir = XML::RDDL::Directory->new;
144             # do various things to add to the directory...
145              
146             my $handler = MySAX2Handler->new;
147             my $driver = XML::RDDL::Driver->new(Handler => $handler);
148             $driver->parse($dir);
149              
150             =head1 DESCRIPTION
151              
152             This module is a SAX2 driver that will take an RDDL Directory instance
153             and generate the appropriate events to serialize it to RDDL.
154              
155             Note that the rest of the document won't be present, and that if you
156             don't use the start_document() event to create a container document
157             and have more than one resource, the generated document won't be
158             valid. This driver's output is meant to be embedded in something else.
159              
160             =head1 METHODS
161              
162             =over 4
163              
164             =item XML::RDDL->new(%options)
165              
166             Creates a new XML::RDDL::Driver ready to fire off events. The options
167             are the same as those passed to all SAX2 drivers.
168              
169             =item XML::RDDL->parse($directory)
170              
171             Takes a Directory object and generates the appropriate events.
172              
173             =back
174              
175             =head1 AUTHOR
176              
177             Robin Berjon, robin@knowscape.com
178              
179             =head1 COPYRIGHT
180              
181             Copyright (c) 2001-2002 Robin Berjon. All rights reserved. This program is
182             free software; you can redistribute it and/or modify it under the same
183             terms as Perl itself.
184              
185             =head1 SEE ALSO
186              
187             http://www.rddl.org/, XML::RDDL
188              
189             =cut
190