Prevent empty content
[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
973e1f9e 12sub init_empty {
4e9c4625 13 my ($feed, %args) = @_;
14 $args{'Version'} ||= '1.0';
15
16 $feed->{atom} = XML::Atom::Feed->new(%args);
973e1f9e 17 $feed;
18}
19
0d5e38d1 20sub init_string {
21 my $feed = shift;
22 my($str) = @_;
fe71566d 23 if ($str) {
24 $feed->{atom} = XML::Atom::Feed->new(Stream => $str)
25 or return $feed->error(XML::Atom::Feed->errstr);
26 }
0d5e38d1 27 $feed;
28}
29
30sub format { 'Atom' }
31
973e1f9e 32sub title { shift->{atom}->title(@_) }
0d5e38d1 33sub link {
973e1f9e 34 my $feed = shift;
35 if (@_) {
36 $feed->{atom}->add_link({ rel => 'alternate', href => $_[0],
37 type => 'text/html', });
38 } else {
4679cf3f 39 my $l = first { !defined $_->rel || $_->rel eq 'alternate' } $feed->{atom}->link;
973e1f9e 40 $l ? $l->href : undef;
41 }
42}
43sub description { shift->{atom}->tagline(@_) }
44sub copyright { shift->{atom}->copyright(@_) }
45sub language { shift->{atom}->language(@_) }
46sub generator { shift->{atom}->generator(@_) }
e8fcbc5b 47sub id { shift->{atom}->id(@_) }
48sub updated { shift->{atom}->updated(@_) }
49sub add_link { shift->{atom}->add_link(@_) }
973e1f9e 50
51sub author {
52 my $feed = shift;
53 if (@_ && $_[0]) {
c4d4c98e 54 my $person = XML::Atom::Person->new(Version => 1.0);
973e1f9e 55 $person->name($_[0]);
56 $feed->{atom}->author($person);
57 } else {
58 $feed->{atom}->author ? $feed->{atom}->author->name : undef;
59 }
60}
61
62sub modified {
63 my $feed = shift;
64 if (@_) {
ecac864a 65 $feed->{atom}->modified(DateTime::Format::W3CDTF->format_datetime($_[0]));
973e1f9e 66 } else {
c4d4c98e 67 $feed->{atom}->modified ? iso2dt($feed->{atom}->modified) : undef;
973e1f9e 68 }
0d5e38d1 69}
0d5e38d1 70
c4d4c98e 71sub entries {
0d5e38d1 72 my @entries;
73 for my $entry ($_[0]->{atom}->entries) {
973e1f9e 74 push @entries, XML::Feed::Entry::Atom->wrap($entry);
0d5e38d1 75 }
c4d4c98e 76
0d5e38d1 77 @entries;
78}
79
973e1f9e 80sub add_entry {
81 my $feed = shift;
82 my($entry) = @_;
83 $feed->{atom}->add_entry($entry->unwrap);
84}
85
86sub as_xml { $_[0]->{atom}->as_xml }
87
88package XML::Feed::Entry::Atom;
0d5e38d1 89use strict;
90
91use base qw( XML::Feed::Entry );
92use XML::Atom::Util qw( iso2dt );
a749d9b9 93use XML::Feed::Content;
973e1f9e 94use XML::Atom::Entry;
0d5e38d1 95use List::Util qw( first );
96
973e1f9e 97sub init_empty {
98 my $entry = shift;
c4d4c98e 99 $entry->{entry} = XML::Atom::Entry->new(Version => 1.0);
973e1f9e 100 1;
101}
102
103sub title { shift->{entry}->title(@_) }
e8fcbc5b 104sub source { shift->{entry}->source(@_) }
105sub updated { shift->{entry}->updated(@_) }
106
0d5e38d1 107sub link {
973e1f9e 108 my $entry = shift;
109 if (@_) {
110 $entry->{entry}->add_link({ rel => 'alternate', href => $_[0],
111 type => 'text/html', });
112 } else {
4679cf3f 113 my $l = first { !defined $_->rel || $_->rel eq 'alternate' } $entry->{entry}->link;
973e1f9e 114 $l ? $l->href : undef;
115 }
0d5e38d1 116}
a749d9b9 117
118sub summary {
973e1f9e 119 my $entry = shift;
120 if (@_) {
121 $entry->{entry}->summary(ref($_[0]) eq 'XML::Feed::Content' ?
122 $_[0]->body : $_[0]);
123 } else {
c4d4c98e 124 XML::Feed::Content->wrap({ type => 'html',
973e1f9e 125 body => $entry->{entry}->summary });
126 }
a749d9b9 127}
128
129sub content {
973e1f9e 130 my $entry = shift;
131 if (@_) {
132 my %param;
133 if (ref($_[0]) eq 'XML::Feed::Content') {
c4d4c98e 134 %param = (Body => $_[0]->body);
973e1f9e 135 } else {
c4d4c98e 136 %param = (Body => $_[0]);
973e1f9e 137 }
c4d4c98e 138 $entry->{entry}->content(XML::Atom::Content->new(%param, Version => 1.0));
973e1f9e 139 } else {
140 my $c = $entry->{entry}->content;
c4d4c98e 141
142 # map Atom types to MIME types
143 my $type = $c ? $c->type : undef;
144 if ($type) {
145 $type = 'text/html' if $type eq 'xhtml' || $type eq 'html';
146 $type = 'text/plain' if $type eq 'text';
147 }
148
149 XML::Feed::Content->wrap({ type => $type,
973e1f9e 150 body => $c ? $c->body : undef });
151 }
a749d9b9 152}
0d5e38d1 153
154sub category {
973e1f9e 155 my $entry = shift;
0d5e38d1 156 my $ns = XML::Atom::Namespace->new(dc => 'http://purl.org/dc/elements/1.1/');
973e1f9e 157 if (@_) {
c4d4c98e 158 $entry->{entry}->add_category({ term => $_[0] });
973e1f9e 159 } else {
c4d4c98e 160 my $category = $entry->{entry}->category;
e8fcbc5b 161 $category ? ($category->label || $category->term) : $entry->{entry}->getlist($ns, 'subject');
973e1f9e 162 }
163}
164
165sub author {
166 my $entry = shift;
167 if (@_ && $_[0]) {
c4d4c98e 168 my $person = XML::Atom::Person->new(Version => 1.0);
973e1f9e 169 $person->name($_[0]);
170 $entry->{entry}->author($person);
171 } else {
172 $entry->{entry}->author ? $entry->{entry}->author->name : undef;
173 }
174}
175
176sub id { shift->{entry}->id(@_) }
177
178sub issued {
179 my $entry = shift;
180 if (@_) {
ecac864a 181 $entry->{entry}->issued(DateTime::Format::W3CDTF->format_datetime($_[0])) if $_[0];
973e1f9e 182 } else {
183 $entry->{entry}->issued ? iso2dt($entry->{entry}->issued) : undef;
184 }
0d5e38d1 185}
186
973e1f9e 187sub modified {
188 my $entry = shift;
189 if (@_) {
ecac864a 190 $entry->{entry}->modified(DateTime::Format::W3CDTF->format_datetime($_[0])) if $_[0];
973e1f9e 191 } else {
192 $entry->{entry}->modified ? iso2dt($entry->{entry}->modified) : undef;
193 }
194}
0d5e38d1 195
1961;