Commit | Line | Data |
3353d70c |
1 | # $Id$ |
0d5e38d1 |
2 | |
729cd7a8 |
3 | package XML::Feed::Format::Atom; |
0d5e38d1 |
4 | use strict; |
5 | |
6 | use base qw( XML::Feed ); |
7 | use XML::Atom::Feed; |
8 | use XML::Atom::Util qw( iso2dt ); |
9 | use List::Util qw( first ); |
ecac864a |
10 | use DateTime::Format::W3CDTF; |
b7c406f5 |
11 | use HTML::Entities; |
0d5e38d1 |
12 | |
9a36f82c |
13 | use XML::Atom::Entry; |
14 | XML::Atom::Entry->mk_elem_accessors(qw( lat long ), ['http://www.w3.org/2003/01/geo/wgs84_pos#']); |
15 | |
5383a560 |
16 | use XML::Atom::Content; |
8c43fc54 |
17 | use XML::Feed::Entry::Format::Atom; |
5383a560 |
18 | |
9b6bc912 |
19 | sub identify { |
20 | my $class = shift; |
21 | my $xml = shift; |
22 | my $tag = $class->_get_first_tag($xml); |
23 | return ($tag eq 'feed'); |
24 | } |
25 | |
26 | |
973e1f9e |
27 | sub init_empty { |
4e9c4625 |
28 | my ($feed, %args) = @_; |
29 | $args{'Version'} ||= '1.0'; |
30 | |
31 | $feed->{atom} = XML::Atom::Feed->new(%args); |
973e1f9e |
32 | $feed; |
33 | } |
34 | |
0d5e38d1 |
35 | sub init_string { |
36 | my $feed = shift; |
37 | my($str) = @_; |
fe71566d |
38 | if ($str) { |
39 | $feed->{atom} = XML::Atom::Feed->new(Stream => $str) |
40 | or return $feed->error(XML::Atom::Feed->errstr); |
41 | } |
0d5e38d1 |
42 | $feed; |
43 | } |
44 | |
45 | sub format { 'Atom' } |
46 | |
973e1f9e |
47 | sub title { shift->{atom}->title(@_) } |
0d5e38d1 |
48 | sub link { |
973e1f9e |
49 | my $feed = shift; |
50 | if (@_) { |
51 | $feed->{atom}->add_link({ rel => 'alternate', href => $_[0], |
52 | type => 'text/html', }); |
53 | } else { |
4679cf3f |
54 | my $l = first { !defined $_->rel || $_->rel eq 'alternate' } $feed->{atom}->link; |
973e1f9e |
55 | $l ? $l->href : undef; |
56 | } |
57 | } |
9a36f82c |
58 | |
02de1790 |
59 | sub _rel_link { |
9a36f82c |
60 | my $feed = shift; |
02de1790 |
61 | my $rel = shift; |
9a36f82c |
62 | if (@_) { |
63 | my $uri = shift; |
02de1790 |
64 | $feed->{atom}->add_link({type => "application/atom+xml", rel => $rel, href => $uri}); |
9a36f82c |
65 | return $uri; |
66 | } |
67 | else |
68 | { |
02de1790 |
69 | my $l; |
70 | |
71 | if ($rel eq 'self') { |
72 | $l = first |
73 | { !defined $_->rel || $_->rel eq 'self' } |
74 | $feed->{atom}->link; |
75 | ; |
76 | } else { |
77 | $l = first |
78 | { !defined $_->rel || $_->rel eq $rel } |
79 | $feed->{atom}->link; |
80 | ; |
81 | } |
9a36f82c |
82 | |
83 | return $l ? $l->href : undef; |
84 | } |
85 | } |
86 | |
02de1790 |
87 | sub self_link { shift->_rel_link( 'self', @_ ) } |
88 | sub first_link { shift->_rel_link( 'first', @_ ) } |
89 | sub last_link { shift->_rel_link( 'last', @_ ) } |
90 | sub next_link { shift->_rel_link( 'next', @_ ) } |
91 | sub previous_link { shift->_rel_link( 'previous', @_ ) }; |
92 | sub current_link { shift->_rel_link( 'current', @_ ) } |
93 | sub prev_archive_link { shift->_rel_link( 'prev-archive', @_ ) } |
94 | sub next_archive_link { shift->_rel_link( 'next-archive', @_ ) } |
95 | |
973e1f9e |
96 | sub description { shift->{atom}->tagline(@_) } |
97 | sub copyright { shift->{atom}->copyright(@_) } |
98 | sub language { shift->{atom}->language(@_) } |
99 | sub generator { shift->{atom}->generator(@_) } |
e8fcbc5b |
100 | sub id { shift->{atom}->id(@_) } |
101 | sub updated { shift->{atom}->updated(@_) } |
102 | sub add_link { shift->{atom}->add_link(@_) } |
5383a560 |
103 | sub base { shift->{atom}->base(@_) } |
973e1f9e |
104 | |
105 | sub author { |
106 | my $feed = shift; |
107 | if (@_ && $_[0]) { |
c4d4c98e |
108 | my $person = XML::Atom::Person->new(Version => 1.0); |
973e1f9e |
109 | $person->name($_[0]); |
110 | $feed->{atom}->author($person); |
111 | } else { |
112 | $feed->{atom}->author ? $feed->{atom}->author->name : undef; |
113 | } |
114 | } |
115 | |
5383a560 |
116 | |
117 | |
118 | |
973e1f9e |
119 | sub modified { |
120 | my $feed = shift; |
121 | if (@_) { |
ecac864a |
122 | $feed->{atom}->modified(DateTime::Format::W3CDTF->format_datetime($_[0])); |
973e1f9e |
123 | } else { |
1ee56ab5 |
124 | return iso2dt($feed->{atom}->modified) if $feed->{atom}->modified; |
125 | return iso2dt($feed->{atom}->updated) if $feed->{atom}->updated; |
126 | return undef; |
973e1f9e |
127 | } |
0d5e38d1 |
128 | } |
0d5e38d1 |
129 | |
c4d4c98e |
130 | sub entries { |
0d5e38d1 |
131 | my @entries; |
132 | for my $entry ($_[0]->{atom}->entries) { |
729cd7a8 |
133 | push @entries, XML::Feed::Entry::Format::Atom->wrap($entry); |
0d5e38d1 |
134 | } |
c4d4c98e |
135 | |
0d5e38d1 |
136 | @entries; |
137 | } |
138 | |
973e1f9e |
139 | sub add_entry { |
33d4cb3f |
140 | my $feed = shift; |
141 | my $entry = shift || return; |
142 | $entry = $feed->_convert_entry($entry); |
973e1f9e |
143 | $feed->{atom}->add_entry($entry->unwrap); |
144 | } |
145 | |
146 | sub as_xml { $_[0]->{atom}->as_xml } |
147 | |
0d5e38d1 |
148 | 1; |