/Vector/RSS.pm
package Vector::RSS;
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
);

sub loop_generate {
	my $trees = shift;

	my $r = '';

	foreach my $t (@$trees) {
		$r .= generate($t);
	}

	return $r;
}

sub generate {
	my ($tree) = @_;

	unless (defined $tree->{type}) {
		die "Type not defined for tree";
	}

	unless (defined $rssbits{$tree->{type}}) {
		die "No bit for $tree->{type}";
	}

	safety_dance($tree);

	return $rssbits{$tree->{type}}->($tree);
}

sub generate_rss {
	my ($main) = @_;

	return generate({type => 'rss', main => $main});
}

sub safety_dance {
	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;