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