XML-FeedWriter
view release on metacpan or search on metacpan
lib/XML/FeedWriter/RSS20.pm view on Meta::CPAN
package XML::FeedWriter::RSS20;
use strict;
use warnings;
use Carp;
use base qw( XML::FeedWriter::Base );
__PACKAGE__->_alias({
creator => 'dc:creator',
pubdate => 'pubDate',
published => 'pubDate',
lastbuilddate => 'lastBuildDate',
updated => 'lastBuildDate',
webmaster => 'webMaster',
managingeditor => 'managingEditor',
editor => 'managingEditor',
content => 'content:encoded',
summary => 'description',
});
__PACKAGE__->_requires({
channel => [qw( description link title )],
cloud => [qw( domain path port protocol registerProcedure )],
image => [qw( link title url )],
textinput => [qw( description link name title )],
enclosure => [qw( length type url )],
});
__PACKAGE__->_sort_order({
title => 10,
link => 9,
description => 8,
creator => 7,
author => 7,
pubDate => 6,
guid => 5,
});
sub _extra_options {
my ($self, $options) = @_;
my $no_cdata = delete $options->{no_cdata};
$self->{_use_cdata} = !$no_cdata;
}
sub _root_element {
my ($self, $modules) = @_;
$self->xml->startTag( rss =>
version => '2.0',
'xmlns:dc' => 'http://purl.org/dc/elements/1.1/',
'xmlns:content' => 'http://purl.org/rss/1.0/modules/content/',
%{ $modules },
);
}
sub _channel {
my ($self, $channel) = @_;
$channel->{lastBuildDate} ||= $self->dtx->for_rss20;
$self->xml->startTag('channel');
foreach my $key ( $self->_sort_keys( $channel ) ) {
if ( $key eq 'category' ) {
$self->_duplicable_elements( $key => $channel->{$key} );
}
elsif ( $key eq 'cloud' ) {
$self->_empty_element( $key => $channel->{$key} );
}
elsif ( $key =~ /image|textinput/ ) {
$self->_element_with_children( $key => $channel->{$key} );
}
elsif ( $key =~ /lastBuildDate|pubDate/ ) {
$self->_datetime_element( $key => $channel->{$key} );
}
elsif ( my ($type) = $key =~ /skip(Day|Hour)s/ ) {
$self->_element_with_duplicable_children(
$key => $channel->{$key}, lc $type
);
}
else {
$self->_data_element( $key => $channel->{$key} );
}
}
}
sub add_items {
my ($self, @items) = @_;
croak "can't add items any longer" if $self->_closed;
foreach my $i ( @items ) {
my %item = $self->_canonize( $i );
$self->xml->startTag('item');
foreach my $key ( $self->_sort_keys( \%item ) ) {
if ( $key eq 'pubDate' ) {
$self->_datetime_element( $key => $item{$key} );
}
elsif ( $key eq 'description' ) {
$self->_cdata_element( $key => $item{$key} );
}
elsif ( $key eq 'enclosure' ) {
$self->_empty_element( $key => $item{$key} );
}
elsif ( $key eq 'category' ) {
$self->_duplicable_elements( $key => $item{$key} );
}
else {
$self->_data_element( $key => $item{$key} );
}
}
$self->xml->endTag('item');
}
}
sub close {
my $self = shift;
return if $self->_closed;
$self->xml->endTag('channel');
$self->xml->endTag('rss');
$self->xml->end;
$self->_closed(1);
}
1;
__END__
=head1 NAME
XML::FeedWriter::RSS20
=head1 SYNOPSIS
use XML::FeedWriter;
# let's create a writer.
my $writer = XML::FeedWriter->new(
# specify type/version; RSS 2.0 by default
version => '2.0',
# and channel info
title => 'feed title',
link => 'http://example.com',
description => 'blah blah blah',
);
# add as many items as you wish (and spec permits).
$writer->add_items(
# each item should be a hash reference
{
( run in 1.672 second using v1.01-cache-2.11-cpan-39bf76dae61 )