our
$PREFERRED_PARSER
=
"XML::RSS"
;
sub
init_empty {
my
$feed
=
shift
;
eval
"use $PREFERRED_PARSER"
;
die
$@
if
$@;
$feed
->{rss} =
$PREFERRED_PARSER
->new(
version
=>
'2.0'
);
$feed
;
}
sub
init_string {
my
$feed
=
shift
;
my
(
$str
) =
@_
;
$feed
->init_empty;
if
(
$str
) {
$feed
->{rss}->parse(
$$str
);
}
$feed
;
}
sub
format
{
'RSS '
.
$_
[0]->{rss}->{
'version'
} }
sub
title {
shift
->{rss}->channel(
'title'
,
@_
) }
sub
link
{
shift
->{rss}->channel(
'link'
,
@_
) }
sub
description {
shift
->{rss}->channel(
'description'
,
@_
) }
sub
copyright {
shift
->{rss}->channel(
'copyright'
,
@_
) }
sub
language {
my
$feed
=
shift
;
if
(
@_
) {
$feed
->{rss}->channel(
'language'
,
$_
[0]);
$feed
->{rss}->channel->{dc}{language} =
$_
[0];
}
else
{
$feed
->{rss}->channel(
'language'
) ||
$feed
->{rss}->channel->{dc}{language};
}
}
sub
generator {
my
$feed
=
shift
;
if
(
@_
) {
$feed
->{rss}->channel(
'generator'
,
$_
[0]);
$_
[0];
}
else
{
$feed
->{rss}->channel(
'generator'
) ||
}
}
sub
author {
my
$feed
=
shift
;
if
(
@_
) {
$feed
->{rss}->channel(
'webMaster'
,
$_
[0]);
$feed
->{rss}->channel->{dc}{creator} =
$_
[0];
}
else
{
$feed
->{rss}->channel(
'webMaster'
) ||
$feed
->{rss}->channel->{dc}{creator};
}
}
sub
modified {
my
$rss
=
shift
->{rss};
if
(
@_
) {
$rss
->channel(
'pubDate'
,
DateTime::Format::Mail->format_datetime(
$_
[0]));
}
else
{
if
(
my
$ts
=
$rss
->channel(
'pubDate'
)) {
return
DateTime::Format::Mail->parse_datetime(
$ts
);
}
elsif
(
$ts
=
$rss
->channel->{dc}{date}) {
return
DateTime::Format::W3CDTF->parse_datetime(
$ts
);
}
}
}
sub
entries {
my
$rss
=
$_
[0]->{rss};
my
@entries
;
for
my
$item
(@{
$rss
->{items} }) {
push
@entries
, XML::Feed::Entry::RSS->wrap(
$item
);
}
@entries
;
}
sub
add_entry {
my
$feed
=
shift
;
my
(
$entry
) =
@_
;
$feed
->{rss}->add_item(%{
$entry
->unwrap });
}
sub
as_xml {
$_
[0]->{rss}->as_string }
sub
init_empty {
$_
[0]->{entry} = { } }
sub
title {
my
$entry
=
shift
;
@_
?
$entry
->{entry}{title} =
$_
[0] :
$entry
->{entry}{title};
}
sub
link
{
my
$entry
=
shift
;
if
(
@_
) {
$entry
->{entry}{
link
} =
$_
[0];
$entry
->{entry}{permaLink} =
$_
[0];
}
else
{
$entry
->{entry}{
link
} ||
$entry
->{entry}{guid};
}
}
sub
summary {
my
$item
=
shift
->{entry};
if
(
@_
) {
$item
->{description} =
ref
(
$_
[0]) eq
'XML::Feed::Content'
?
$_
[0]->body :
$_
[0];
}
}
else
{
my
$txt
;
if
(
$item
->{description} &&
$txt
=
$item
->{description};
}
XML::Feed::Content->wrap({
type
=>
'text/plain'
,
body
=>
$txt
});
}
}
sub
content {
my
$item
=
shift
->{entry};
if
(
@_
) {
my
$c
=
ref
(
$_
[0]) eq
'XML::Feed::Content'
?
$_
[0]->body :
$_
[0];
}
else
{
my
$body
=
$item
->{description};
XML::Feed::Content->wrap({
type
=>
'text/html'
,
body
=>
$body
});
}
}
sub
category {
my
$item
=
shift
->{entry};
if
(
@_
) {
$item
->{category} =
$item
->{dc}{subject} =
$_
[0];
}
else
{
$item
->{category} ||
$item
->{dc}{subject};
}
}
sub
author {
my
$item
=
shift
->{entry};
if
(
@_
) {
$item
->{author} =
$item
->{dc}{creator} =
$_
[0];
}
else
{
$item
->{author} ||
$item
->{dc}{creator};
}
}
sub
id {
my
$item
=
shift
->{entry};
if
(
@_
) {
$item
->{guid} =
$_
[0];
}
else
{
$item
->{guid} ||
$item
->{
link
};
}
}
sub
issued {
my
$item
=
shift
->{entry};
if
(
@_
) {
$item
->{dc}{date} = DateTime::Format::W3CDTF->format_datetime(
$_
[0]);
$item
->{pubDate} = DateTime::Format::Mail->format_datetime(
$_
[0]);
}
else
{
my
$date
;
eval
{
if
(
my
$ts
=
$item
->{pubDate}) {
my
$parser
= DateTime::Format::Mail->new;
$parser
->loose;
$date
=
$parser
->parse_datetime(
$ts
);
}
elsif
(
$ts
=
$item
->{dc}{date}) {
$date
= DateTime::Format::W3CDTF->parse_datetime(
$ts
);
}
};
return
$date
;
}
}
sub
modified {
my
$item
=
shift
->{entry};
if
(
@_
) {
DateTime::Format::W3CDTF->format_datetime(
$_
[0]);
}
else
{
return
eval
{ DateTime::Format::W3CDTF->parse_datetime(
$ts
) };
}
}
}
1;