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