Add enclosure code.
[catagits/XML-Feed.git] / lib / XML / Feed / Format / Atom.pm
CommitLineData
c4d4c98e 1# $Id: Atom.pm 1958 2006-08-14 05:31:27Z btrott $
0d5e38d1 2
729cd7a8 3package XML::Feed::Format::Atom;
0d5e38d1 4use strict;
5
6use base qw( XML::Feed );
7use XML::Atom::Feed;
8use XML::Atom::Util qw( iso2dt );
9use List::Util qw( first );
ecac864a 10use DateTime::Format::W3CDTF;
0d5e38d1 11
9a36f82c 12use XML::Atom::Entry;
13XML::Atom::Entry->mk_elem_accessors(qw( lat long ), ['http://www.w3.org/2003/01/geo/wgs84_pos#']);
14
5383a560 15use XML::Atom::Content;
16
9b6bc912 17sub identify {
18 my $class = shift;
19 my $xml = shift;
20 my $tag = $class->_get_first_tag($xml);
21 return ($tag eq 'feed');
22}
23
24
973e1f9e 25sub init_empty {
4e9c4625 26 my ($feed, %args) = @_;
27 $args{'Version'} ||= '1.0';
28
29 $feed->{atom} = XML::Atom::Feed->new(%args);
973e1f9e 30 $feed;
31}
32
0d5e38d1 33sub init_string {
34 my $feed = shift;
35 my($str) = @_;
fe71566d 36 if ($str) {
37 $feed->{atom} = XML::Atom::Feed->new(Stream => $str)
38 or return $feed->error(XML::Atom::Feed->errstr);
39 }
0d5e38d1 40 $feed;
41}
42
43sub format { 'Atom' }
44
973e1f9e 45sub title { shift->{atom}->title(@_) }
0d5e38d1 46sub link {
973e1f9e 47 my $feed = shift;
48 if (@_) {
49 $feed->{atom}->add_link({ rel => 'alternate', href => $_[0],
50 type => 'text/html', });
51 } else {
4679cf3f 52 my $l = first { !defined $_->rel || $_->rel eq 'alternate' } $feed->{atom}->link;
973e1f9e 53 $l ? $l->href : undef;
54 }
55}
9a36f82c 56
57sub self_link {
58 my $feed = shift;
59 if (@_) {
60 my $uri = shift;
61 $feed->{atom}->add_link({type => "application/atom+xml", rel => "self", href => $uri});
62 return $uri;
63 }
64 else
65 {
66 my $l =
67 first
68 { !defined $_->rel || $_->rel eq 'self' }
69 $feed->{atom}->link;
70 ;
71
72 return $l ? $l->href : undef;
73 }
74}
75
973e1f9e 76sub description { shift->{atom}->tagline(@_) }
77sub copyright { shift->{atom}->copyright(@_) }
78sub language { shift->{atom}->language(@_) }
79sub generator { shift->{atom}->generator(@_) }
e8fcbc5b 80sub id { shift->{atom}->id(@_) }
81sub updated { shift->{atom}->updated(@_) }
82sub add_link { shift->{atom}->add_link(@_) }
5383a560 83sub base { shift->{atom}->base(@_) }
973e1f9e 84
85sub author {
86 my $feed = shift;
87 if (@_ && $_[0]) {
c4d4c98e 88 my $person = XML::Atom::Person->new(Version => 1.0);
973e1f9e 89 $person->name($_[0]);
90 $feed->{atom}->author($person);
91 } else {
92 $feed->{atom}->author ? $feed->{atom}->author->name : undef;
93 }
94}
95
5383a560 96
97
98
973e1f9e 99sub modified {
100 my $feed = shift;
101 if (@_) {
ecac864a 102 $feed->{atom}->modified(DateTime::Format::W3CDTF->format_datetime($_[0]));
973e1f9e 103 } else {
1ee56ab5 104 return iso2dt($feed->{atom}->modified) if $feed->{atom}->modified;
105 return iso2dt($feed->{atom}->updated) if $feed->{atom}->updated;
106 return undef;
973e1f9e 107 }
0d5e38d1 108}
0d5e38d1 109
c4d4c98e 110sub entries {
0d5e38d1 111 my @entries;
112 for my $entry ($_[0]->{atom}->entries) {
729cd7a8 113 push @entries, XML::Feed::Entry::Format::Atom->wrap($entry);
0d5e38d1 114 }
c4d4c98e 115
0d5e38d1 116 @entries;
117}
118
973e1f9e 119sub add_entry {
33d4cb3f 120 my $feed = shift;
121 my $entry = shift || return;
122 $entry = $feed->_convert_entry($entry);
973e1f9e 123 $feed->{atom}->add_entry($entry->unwrap);
124}
125
126sub as_xml { $_[0]->{atom}->as_xml }
127
729cd7a8 128package XML::Feed::Entry::Format::Atom;
0d5e38d1 129use strict;
130
131use base qw( XML::Feed::Entry );
132use XML::Atom::Util qw( iso2dt );
a749d9b9 133use XML::Feed::Content;
973e1f9e 134use XML::Atom::Entry;
0d5e38d1 135use List::Util qw( first );
136
973e1f9e 137sub init_empty {
138 my $entry = shift;
c4d4c98e 139 $entry->{entry} = XML::Atom::Entry->new(Version => 1.0);
973e1f9e 140 1;
141}
142
3bdbab6f 143sub format { 'Atom' }
144
973e1f9e 145sub title { shift->{entry}->title(@_) }
e8fcbc5b 146sub source { shift->{entry}->source(@_) }
147sub updated { shift->{entry}->updated(@_) }
5383a560 148sub base { shift->{entry}->base(@_) }
e8fcbc5b 149
0d5e38d1 150sub link {
973e1f9e 151 my $entry = shift;
152 if (@_) {
153 $entry->{entry}->add_link({ rel => 'alternate', href => $_[0],
154 type => 'text/html', });
155 } else {
4679cf3f 156 my $l = first { !defined $_->rel || $_->rel eq 'alternate' } $entry->{entry}->link;
973e1f9e 157 $l ? $l->href : undef;
158 }
0d5e38d1 159}
a749d9b9 160
161sub summary {
973e1f9e 162 my $entry = shift;
163 if (@_) {
ac9492d2 164 my %param;
165 if (ref($_[0]) eq 'XML::Feed::Content') {
166 %param = (Body => $_[0]->body);
167 } else {
168 %param = (Body => $_[0]);
169 }
170 $entry->{entry}->summary(XML::Atom::Content->new(%param, Version => 1.0));
973e1f9e 171 } else {
ac9492d2 172 my $s = $entry->{entry}->summary;
173 # map Atom types to MIME types
174 my $type = ($s && ref($s) eq 'XML::Feed::Content') ? $s->type : undef;
175 if ($type) {
176 $type = 'text/html' if $type eq 'xhtml' || $type eq 'html';
177 $type = 'text/plain' if $type eq 'text';
178 }
179 my $body = $s;
180 if (defined $s && ref($s) eq 'XML::Feed::Content') {
181 $body = $s->body;
182 }
183 XML::Feed::Content->wrap({ type => $type,
184 body => $body });
973e1f9e 185 }
a749d9b9 186}
187
4f413435 188my %types = (
189 'text/xhtml' => 'xhtml',
190 'text/html' => 'html',
191 'text/plain' => 'text',
192);
193
a749d9b9 194sub content {
973e1f9e 195 my $entry = shift;
196 if (@_) {
197 my %param;
5383a560 198 my $base;
973e1f9e 199 if (ref($_[0]) eq 'XML::Feed::Content') {
4f413435 200 if (defined $_[0]->type && defined $types{$_[0]->type}) {
201 %param = (Body => $_[0]->body, Type => $types{$_[0]->type});
202 } else {
203 %param = (Body => $_[0]->body);
204 }
5383a560 205 $base = $_[0]->base if defined $_[0]->base;
973e1f9e 206 } else {
c4d4c98e 207 %param = (Body => $_[0]);
973e1f9e 208 }
c4d4c98e 209 $entry->{entry}->content(XML::Atom::Content->new(%param, Version => 1.0));
5383a560 210 $entry->{entry}->content->base($base) if defined $base;
973e1f9e 211 } else {
212 my $c = $entry->{entry}->content;
c4d4c98e 213
214 # map Atom types to MIME types
215 my $type = $c ? $c->type : undef;
216 if ($type) {
217 $type = 'text/html' if $type eq 'xhtml' || $type eq 'html';
218 $type = 'text/plain' if $type eq 'text';
219 }
220
221 XML::Feed::Content->wrap({ type => $type,
5383a560 222 base => $c ? $c->base : undef,
973e1f9e 223 body => $c ? $c->body : undef });
224 }
a749d9b9 225}
0d5e38d1 226
227sub category {
973e1f9e 228 my $entry = shift;
0d5e38d1 229 my $ns = XML::Atom::Namespace->new(dc => 'http://purl.org/dc/elements/1.1/');
973e1f9e 230 if (@_) {
c4d4c98e 231 $entry->{entry}->add_category({ term => $_[0] });
973e1f9e 232 } else {
c4d4c98e 233 my $category = $entry->{entry}->category;
bf34c07e 234 my @return = $category ? ($category->label || $category->term) : $entry->{entry}->getlist($ns, 'subject');
235 return wantarray? @return : $return[0];
973e1f9e 236 }
237}
238
239sub author {
240 my $entry = shift;
241 if (@_ && $_[0]) {
c4d4c98e 242 my $person = XML::Atom::Person->new(Version => 1.0);
973e1f9e 243 $person->name($_[0]);
244 $entry->{entry}->author($person);
245 } else {
246 $entry->{entry}->author ? $entry->{entry}->author->name : undef;
247 }
248}
249
250sub id { shift->{entry}->id(@_) }
251
252sub issued {
253 my $entry = shift;
254 if (@_) {
ecac864a 255 $entry->{entry}->issued(DateTime::Format::W3CDTF->format_datetime($_[0])) if $_[0];
973e1f9e 256 } else {
257 $entry->{entry}->issued ? iso2dt($entry->{entry}->issued) : undef;
258 }
0d5e38d1 259}
260
973e1f9e 261sub modified {
262 my $entry = shift;
263 if (@_) {
ecac864a 264 $entry->{entry}->modified(DateTime::Format::W3CDTF->format_datetime($_[0])) if $_[0];
973e1f9e 265 } else {
1ee56ab5 266 return iso2dt($entry->{entry}->modified) if $entry->{entry}->modified;
267 return iso2dt($entry->{entry}->updated) if $entry->{entry}->updated;
268 return undef;
973e1f9e 269 }
270}
0d5e38d1 271
9a36f82c 272sub lat {
273 my $entry = shift;
274 if (@_) {
275 $entry->{entry}->lat($_[0]) if $_[0];
276 } else {
277 $entry->{entry}->lat;
278 }
279}
280
281sub long {
282 my $entry = shift;
283 if (@_) {
284 $entry->{entry}->long($_[0]) if $_[0];
285 } else {
286 $entry->{entry}->long;
287 }
288}
289
af6b00a4 290
291sub add_enclosure {
292 my($entry, $enclosure) = @_;
293 my $link = XML::Atom::Link->new;
294 $link->rel('enclosure');
295 $link->type($enclosure->type);
296 $link->href($enclosure->url);
297 $link->length($enclosure->length);
298 $entry->{entry}->add_link($link);
299};
300
301
0d5e38d1 3021;