| Buscador documentation | Contained in the Buscador distribution. |
Buscador::Atom - a plugin to provide atom feeds for Buscador
This provides four different Atom feeds for a Buscador system -
Most recent mails in the whole system
${base}/atom.xml
or
${base}/mail/atom
${base}/list/atom/<id>
${base}/entity/atom/<id>
${base}/mail/thread/atom/<id>
or
${base}/mail/thread_atom/<id>
Where id is any message-id from that thread.
http://www.atomenabled.org/
Simon Wistow <simon@thegestalt.org>
Copyright (c) 2004, Simon Wistow
| Buscador documentation | Contained in the Buscador distribution. |
package Buscador::Atom; use strict;
sub parse_path_order { 13 } sub parse_path { my ($self, $buscador) = @_; $buscador->{path} =~ s!atom.xml$!mail/atom/!; $buscador->{path} =~ s!mail/thread/atom/!mail/thread_atom/!; } package Email::Store::Mail; use Date::Parse qw( str2time ); sub atom :Exported { my ($self, $r) = @_; my $pager = $self->do_pager($r); $r->{content_type} = "application/xml"; $r->{objects} = [ $pager->search_recent ]; $r->{template_args}{link} = Buscador->config->{uri_base}; $r->{template_args}{title} = "Recent mails from ".Buscador->config->{uri_base}; $r->{template} = "custom/atom"; } sub extract_time { my $self = shift; my $container = shift; my $date = Mail::Thread->_get_hdr( $container->message, 'date' ); return str2time( $date ); } sub thread_atom :Exported { my ($self, $r) = @_; my $base = Buscador->config->{uri_base}; my $mail = $r->objects->[0]; my $root = $mail->container->root; # get all the mails in this thread my @messages; $root->iterate_down( sub { my ($c, $d) = @_; push @messages, $c if $c->message; } ); # okay, wander them in date order @messages = sort { $self->extract_time( $a ) <=> $self->extract_time( $b ) } @messages; my @return; my $count = 0; for (@messages) { my $mess = Email::Store::Mail->retrieve($_->message->id); next unless $mess; push @return, $mess; last if $count++ > Buscador->config->{rows_per_page}; } $base =~ s!/\s*$!!; $r->{content_type} = "application/xml"; $r->{objects} = [ @return ]; $r->{template_args}{link} = "$base/mail/thread/".$mail->id; $r->{template_args}{title} = "Recent mails from $base/mail/thread/".$mail->id; $r->{template} = "atom"; } package Email::Store::List; sub atom :Exported { my ($self, $r, $list) = @_; my $pager = Email::Store::Mail->do_pager($r); $r->{content_type} = "application/xml"; $r->{template_args}{link} = Buscador->config->{uri_base}."list/view/".$list->id; $r->{template_args}{mails} = [ $pager->search_recent_posts($list->id) ]; $r->{template_args}{title} = "Recent mails from ".$list->name; $r->{template} = "custom/atom"; } package Email::Store::Entity; sub atom :Exported { my ($self, $r, $name) = @_; my $pager = Email::Store::Addressing->do_pager($r); my @mails = $pager->search_name_sorted($name->id); $r->{template_args}{mails} = [ map { $_->mail } @mails ]; # find the first name available to us my $person; foreach my $mail (@mails) { $person = $mail->name->name; last if $person && $person !~ /^\s*$/; } $r->{content_type} = "application/xml"; $r->{template_args}{link} = Buscador->config->{uri_base}."entity/view/".$name->id; $r->{template_args}{title} = "Recent mails from $person"; $r->{template} = "custom/atom"; } 1;