3 package XML::Atom::Util;
7 use vars qw( @EXPORT_OK @ISA );
10 @EXPORT_OK = qw( set_ns first nodelist childlist textValue iso2dt encode_xml create_element );
11 @ISA = qw( Exporter );
14 '0.3' => 'http://purl.org/atom/ns#',
15 '1.0' => 'http://www.w3.org/2005/Atom',
18 our %NS_VERSION = reverse %NS_MAP;
23 if (my $ns = delete $param->{Namespace}) {
25 $thing->{version} = $NS_VERSION{$ns};
27 my $version = delete $param->{Version} || $XML::Atom::DefaultVersion;
28 $version = '1.0' if $version == 1;
29 my $ns = $NS_MAP{$version} or $thing->error("Unknown version: $version");
31 $thing->{version} = $version;
41 my @nodes = nodelist(@_);
48 return $_[1] ? $_[0]->getElementsByTagNameNS($_[1], $_[2]) :
49 $_[0]->getElementsByTagName($_[2]);
52 $_[0]->find("descendant::*[local-name()='$_[2]' and namespace-uri()='$_[1]']") :
53 $_[0]->find("descendant::$_[2]");
54 return unless $set && $set->isa('XML::XPath::NodeSet');
55 return $set->get_nodelist;
61 return $_[1] ? $_[0]->getChildrenByTagNameNS($_[1], $_[2]) :
62 $_[0]->getChildrenByTagName($_[2]);
65 $_[0]->find("*[local-name()='$_[2]' and namespace-uri()='$_[1]']") :
67 return unless $set && $set->isa('XML::XPath::NodeSet');
68 return $set->get_nodelist;
73 my $node = first(@_) or return;
74 LIBXML ? $node->textContent : $node->string_value;
79 return unless $iso =~ /^(\d{4})(?:-?(\d{2})(?:-?(\d\d?)(?:T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|([+-]\d{2}:\d{2}))?)?)?)?/;
80 my($y, $mo, $d, $h, $m, $s, $zone) =
81 ($1, $2 || 1, $3 || 1, $4 || 0, $5 || 0, $6 || 0, $7);
83 my $dt = DateTime->new(
92 if ($zone && $zone ne 'Z') {
93 my $seconds = DateTime::TimeZone::offset_as_seconds($zone);
94 $dt->subtract(seconds => $seconds);
99 my %Map = ('&' => '&', '"' => '"', '<' => '<', '>' => '>',
101 my $RE = join '|', keys %Map;
105 $str =~ s!($RE)!$Map{$1}!g;
111 my($ns_uri, $ns_prefix);
112 if (ref $ns eq 'XML::Atom::Namespace') {
113 $ns_uri = $ns->{uri};
114 $ns_prefix = $ns->{prefix};
120 $elem = XML::LibXML::Element->new($name);
121 $elem->setNamespace($ns_uri, $ns_prefix ? $ns_prefix : ());
123 $ns_prefix ||= '#default';
124 $elem = XML::XPath::Node::Element->new($name);
125 my $ns = XML::XPath::Node::Namespace->new($ns_prefix => $ns_uri);
126 $elem->appendNamespace($ns);
136 XML::Atom::Util - Utility functions
140 use XML::Atom::Util qw( iso2dt );
141 my $dt = iso2dt($entry->issued);
147 Transforms the ISO-8601 date I<$iso> into a I<DateTime> object and returns
148 the I<DateTime> object.
150 =head2 encode_xml($str)
152 Encodes characters with special meaning in XML into entities and returns
155 =head1 AUTHOR & COPYRIGHT
157 Please see the I<XML::Atom> manpage for author, copyright, and license