1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
# $Id: Util.pm,v 1.4 2004/05/08 13:20:58 btrott Exp $
package XML::Atom::Util;
use strict;
use XML::Atom;
use vars qw( @EXPORT_OK @ISA );
use Exporter;
@EXPORT_OK = qw( first textValue iso2dt encode_xml );
@ISA = qw( Exporter );
sub first {
if (LIBXML) {
my @res = $_[1] ? $_[0]->getElementsByTagNameNS($_[1], $_[2]) :
$_[0]->getElementsByTagName($_[2]);
return unless @res;
return $res[0];
} else {
my $set = $_[1] ?
$_[0]->find("descendant::*[local-name()='$_[2]' and namespace-uri()='$_[1]']") :
$_[0]->find("descendant::$_[2]");
return unless $set && $set->isa('XML::XPath::NodeSet');
($set->get_nodelist)[0];
}
}
sub textValue {
my $node = first(@_) or return;
LIBXML ? $node->textContent : $node->string_value;
}
sub iso2dt {
my($iso) = @_;
return unless $iso =~ /^(\d{4})(?:-?(\d{2})(?:-?(\d\d?)(?:T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|([+-]\d{2}:\d{2}))?)?)?)?/;
my($y, $mo, $d, $h, $m, $s, $zone) =
($1, $2 || 1, $3 || 1, $4 || 0, $5 || 0, $6 || 0, $7);
require DateTime;
my $dt = DateTime->new(
year => $y,
month => $mo,
day => $d,
hour => $h,
minute => $m,
second => $s,
time_zone => 'UTC',
);
if ($zone && $zone ne 'Z') {
my $seconds = DateTime::TimeZone::offset_as_seconds($zone);
$dt->subtract(seconds => $seconds);
}
$dt;
}
my %Map = ('&' => '&', '"' => '"', '<' => '<', '>' => '>',
'\'' => ''');
my $RE = join '|', keys %Map;
sub encode_xml {
my($str) = @_;
$str =~ s!($RE)!$Map{$1}!g;
$str;
}
1;
__END__
=head1 NAME
XML::Atom::Util - Utility functions
=head1 SYNOPSIS
use XML::Atom::Util qw( iso2dt );
my $dt = iso2dt($entry->issued);
=head1 USAGE
=head2 iso2dt($iso)
Transforms the ISO-8601 date I<$iso> into a I<DateTime> object and returns
the I<DateTime> object.
=head2 encode_xml($str)
Encodes characters with special meaning in XML into entities and returns
the encoded string.
=head1 AUTHOR & COPYRIGHT
Please see the I<XML::Atom> manpage for author, copyright, and license
information.
=cut
|