/Vector/RSS.pm
use Vector::Config qw/$webroot/;
use strict;
my %rssbits = (
rss => sub { my $tree = shift; return <<RSS },
<?xml version="1.0"?>
<rss version="2.0">
@{[ generate($tree->{main}) ]}
</rss>
RSS
thread => sub { my $tree = shift; return <<RSS },
<channel>
<title>Vector: #$tree->{xml_channel}/$tree->{xml_post_id}</title>
<link>${webroot}channel/$tree->{xml_channel}/$tree->{xml_post_id}</link>
<description>$tree->{xml_description}</description>
@{[ loop_generate($tree->{items}) ]}
</channel>
RSS
channel => sub { my $tree = shift; return <<RSS },
<channel>
<title>Vector: #$tree->{xml_channel}</title>
<link>${webroot}channel/$tree->{xml_channel}</link>
@{[ loop_generate($tree->{items}) ]}
</channel>
RSS
channels => sub { my $tree = shift; return <<RSS },
<channel>
<title>Vector</title>
<link>$webroot</link>
@{[ loop_generate($tree->{channels}) ]}
</channel>
RSS
post => sub { my $tree = shift; return <<RSS },
<item>
<link>${webroot}channel/$tree->{xml_channel}/$tree->{replyto}#post$tree->{post_id}</link>
<guid>${webroot}channel/$tree->{xml_channel}/$tree->{replyto}#post$tree->{post_id}</guid>
<title>$tree->{xml_username}</title>
<description>@{[ Vector::Util::xmlescape($tree->content) ]}</description>
</item>
RSS
channel_item => sub { my $tree = shift; return <<RSS },
<item>
<link>${webroot}channel/$tree->{xml_channel}</link>
<guid>${webroot}channel/$tree->{xml_channel}</guid>
<title>#$tree->{xml_channel}</title>
</item>
RSS
);
{
my $trees = shift;
my $r = '';
foreach my $t (@$trees) {
$r .= generate($t);
}
return $r;
}
{
my ($tree) = @_;
unless (defined $tree->{ }) {
die "Type not defined for tree";
}
unless (defined $rssbits{$tree->{ }}) {
die "No bit for $tree->{type}";
}
safety_dance($tree);
return $rssbits{$tree->{ }}->($tree);
}
{
my ($main) = @_;
return generate({type => 'rss', main => $main});
}
{
my ($tree) = @_;
my @keys = grep { $_ ne 'type' && !/^xml_/ } keys %$tree;
foreach my $k (@keys) {
next if ref $tree->{$k};
$tree->{"xml_$k"} = Vector::Util::xmlescape($tree->{$k});
$tree->{"url_$k"} = Vector::Util::url_encode($tree->{$k});
}
}
1;