Force working version XML::Atom
[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(@_) }
47
48sub author {
49 my $feed = shift;
50 if (@_ && $_[0]) {
c4d4c98e 51 my $person = XML::Atom::Person->new(Version => 1.0);
973e1f9e 52 $person->name($_[0]);
53 $feed->{atom}->author($person);
54 } else {
55 $feed->{atom}->author ? $feed->{atom}->author->name : undef;
56 }
57}
58
59sub modified {
60 my $feed = shift;
61 if (@_) {
ecac864a 62 $feed->{atom}->modified(DateTime::Format::W3CDTF->format_datetime($_[0]));
973e1f9e 63 } else {
c4d4c98e 64 $feed->{atom}->modified ? iso2dt($feed->{atom}->modified) : undef;
973e1f9e 65 }
0d5e38d1 66}
0d5e38d1 67
c4d4c98e 68sub entries {
0d5e38d1 69 my @entries;
70 for my $entry ($_[0]->{atom}->entries) {
973e1f9e 71 push @entries, XML::Feed::Entry::Atom->wrap($entry);
0d5e38d1 72 }
c4d4c98e 73
0d5e38d1 74 @entries;
75}
76
973e1f9e 77sub add_entry {
78 my $feed = shift;
79 my($entry) = @_;
80 $feed->{atom}->add_entry($entry->unwrap);
81}
82
83sub as_xml { $_[0]->{atom}->as_xml }
84
85package XML::Feed::Entry::Atom;
0d5e38d1 86use strict;
87
88use base qw( XML::Feed::Entry );
89use XML::Atom::Util qw( iso2dt );
a749d9b9 90use XML::Feed::Content;
973e1f9e 91use XML::Atom::Entry;
0d5e38d1 92use List::Util qw( first );
93
973e1f9e 94sub init_empty {
95 my $entry = shift;
c4d4c98e 96 $entry->{entry} = XML::Atom::Entry->new(Version => 1.0);
973e1f9e 97 1;
98}
99
100sub title { shift->{entry}->title(@_) }
0d5e38d1 101sub link {
973e1f9e 102 my $entry = shift;
103 if (@_) {
104 $entry->{entry}->add_link({ rel => 'alternate', href => $_[0],
105 type => 'text/html', });
106 } else {
4679cf3f 107 my $l = first { !defined $_->rel || $_->rel eq 'alternate' } $entry->{entry}->link;
973e1f9e 108 $l ? $l->href : undef;
109 }
0d5e38d1 110}
a749d9b9 111
112sub summary {
973e1f9e 113 my $entry = shift;
114 if (@_) {
115 $entry->{entry}->summary(ref($_[0]) eq 'XML::Feed::Content' ?
116 $_[0]->body : $_[0]);
117 } else {
c4d4c98e 118 XML::Feed::Content->wrap({ type => 'html',
973e1f9e 119 body => $entry->{entry}->summary });
120 }
a749d9b9 121}
122
123sub content {
973e1f9e 124 my $entry = shift;
125 if (@_) {
126 my %param;
127 if (ref($_[0]) eq 'XML::Feed::Content') {
c4d4c98e 128 %param = (Body => $_[0]->body);
973e1f9e 129 } else {
c4d4c98e 130 %param = (Body => $_[0]);
973e1f9e 131 }
c4d4c98e 132 $entry->{entry}->content(XML::Atom::Content->new(%param, Version => 1.0));
973e1f9e 133 } else {
134 my $c = $entry->{entry}->content;
c4d4c98e 135
136 # map Atom types to MIME types
137 my $type = $c ? $c->type : undef;
138 if ($type) {
139 $type = 'text/html' if $type eq 'xhtml' || $type eq 'html';
140 $type = 'text/plain' if $type eq 'text';
141 }
142
143 XML::Feed::Content->wrap({ type => $type,
973e1f9e 144 body => $c ? $c->body : undef });
145 }
a749d9b9 146}
0d5e38d1 147
148sub category {
973e1f9e 149 my $entry = shift;
0d5e38d1 150 my $ns = XML::Atom::Namespace->new(dc => 'http://purl.org/dc/elements/1.1/');
973e1f9e 151 if (@_) {
c4d4c98e 152 $entry->{entry}->add_category({ term => $_[0] });
973e1f9e 153 } else {
c4d4c98e 154 my $category = $entry->{entry}->category;
155 $category ? ($category->label || $category->term) : $entry->{entry}->get($ns, 'subject');
973e1f9e 156 }
157}
158
159sub author {
160 my $entry = shift;
161 if (@_ && $_[0]) {
c4d4c98e 162 my $person = XML::Atom::Person->new(Version => 1.0);
973e1f9e 163 $person->name($_[0]);
164 $entry->{entry}->author($person);
165 } else {
166 $entry->{entry}->author ? $entry->{entry}->author->name : undef;
167 }
168}
169
170sub id { shift->{entry}->id(@_) }
171
172sub issued {
173 my $entry = shift;
174 if (@_) {
ecac864a 175 $entry->{entry}->issued(DateTime::Format::W3CDTF->format_datetime($_[0])) if $_[0];
973e1f9e 176 } else {
177 $entry->{entry}->issued ? iso2dt($entry->{entry}->issued) : undef;
178 }
0d5e38d1 179}
180
973e1f9e 181sub modified {
182 my $entry = shift;
183 if (@_) {
ecac864a 184 $entry->{entry}->modified(DateTime::Format::W3CDTF->format_datetime($_[0])) if $_[0];
973e1f9e 185 } else {
186 $entry->{entry}->modified ? iso2dt($entry->{entry}->modified) : undef;
187 }
188}
0d5e38d1 189
1901;