a678d17fa565d9eeeaee1271b2ff6931ec9a163c
[catagits/XML-Feed.git] / lib / XML / Feed / RSS.pm
1 # $Id: RSS.pm,v 1.3 2004/05/30 09:39:52 btrott Exp $
2
3 package XML::Feed::RSS;
4 use strict;
5
6 use base qw( XML::Feed );
7 use XML::RSS;
8 use DateTime::Format::Mail;
9 use DateTime::Format::W3CDTF;
10
11 sub init_string {
12     my $feed = shift;
13     my($str) = @_;
14     my $rss = $feed->{rss} = XML::RSS->new;
15     if ($str) {
16         $rss->parse($str);
17     }
18     $feed;
19 }
20
21 sub format { 'RSS ' . $_[0]->{rss}->{'version'} }
22
23 ## The following elements are the same in all versions of RSS.
24 sub title { $_[0]->{rss}->channel('title') }
25 sub link { $_[0]->{rss}->channel('link') }
26 sub description { $_[0]->{rss}->channel('description') }
27
28 ## This is RSS 2.0 only--what's the equivalent in RSS 1.0?
29 sub copyright { $_[0]->{rss}->channel('copyright') }
30
31 ## The following all work transparently in any RSS version.
32 sub language {
33     $_[0]->{rss}->channel('language') ||
34     $_[0]->{rss}->channel->{dc}{language}
35 }
36
37 sub generator {
38     $_[0]->{rss}->channel('generator') ||
39     $_[0]->{rss}->channel->{'http://webns.net/mvcb/'}{generatorAgent};
40 }
41
42 sub author {
43     $_[0]->{rss}->channel('webMaster') ||
44     $_[0]->{rss}->channel->{dc}{creator};
45 }
46
47 sub modified {
48     my $rss = $_[0]->{rss};
49     if (my $ts = $rss->channel('pubDate')) {
50         return DateTime::Format::Mail->parse_datetime($ts);
51     } elsif ($ts = $rss->channel->{dc}{date}) {
52         return DateTime::Format::W3CDTF->parse_datetime($ts);
53     }
54 }
55
56 sub entries {
57     my $rss = $_[0]->{rss};
58     my @entries;
59     for my $item (@{ $rss->{items} }) {
60         push @entries, XML::Feed::RSS::Entry->wrap($item);
61     }
62     @entries;
63 }
64
65 package XML::Feed::RSS::Entry;
66 use strict;
67
68 use base qw( XML::Feed::Entry );
69
70 sub title { $_[0]->{entry}{title} }
71 sub link { $_[0]->{entry}{link} }
72 sub summary { $_[0]->{entry}{description} }
73
74 sub content {
75     my $item = $_[0]->{entry};
76     $_[0]->{entry}{'http://purl.org/rss/1.0/modules/content/'}{encoded} ||
77     $_[0]->{entry}{'http://www.w3.org/1999/xhtml'}{body} ||
78     $_[0]->{entry}{description};
79 }
80
81 sub category {
82     $_[0]->{entry}{category} || $_[0]->{entry}{dc}{subject};
83 }
84
85 sub author {
86     $_[0]->{entry}{author} || $_[0]->{entry}{dc}{creator};
87 }
88
89 ## XML::RSS doesn't give us access to the rdf:about for the <item>,
90 ## so we have to fall back to the <link> element in RSS 1.0 feeds.
91 sub id {
92     $_[0]->{entry}{guid} || $_[0]->{entry}{link};
93 }
94
95 sub issued {
96     if (my $ts = $_[0]->{entry}{pubDate}) {
97         return DateTime::Format::Mail->parse_datetime($ts);
98     } elsif ($ts = $_[0]->{entry}{dc}{date}) {
99         return DateTime::Format::W3CDTF->parse_datetime($ts);
100     }
101 }
102
103 sub modified {
104     if (my $ts = $_[0]->{entry}{'http://purl.org/rss/1.0/modules/dcterms/'}{modified}) {
105         return DateTime::Format::W3CDTF->parse_datetime($ts);
106     }
107 }
108
109 1;