use MT::Template::Context; use RDF::Core::Parser; use LWP::Simple qw(get); my %thumbs = (); my %dates = (); my %titles = (); MT::Template::Context->add_container_tag(PicdiaryLatest => \&picdiarylatest); MT::Template::Context->add_tag(PicdiaryTitle => sub { my $ctx = shift; $ctx->stash('title'); }); MT::Template::Context->add_tag(PicdiaryThumb => sub { my $ctx = shift; $ctx->stash('thumb'); }); MT::Template::Context->add_tag(PicdiaryURL => sub { my $ctx = shift; $ctx->stash('url'); }); sub picdiarylatest { my $ctx = shift; my $res = ''; my $builder = $ctx->stash('builder'); my $tokens = $ctx->stash('tokens'); %thumbs = (); %dates = (); %titles = (); my $feed = "http://www.picdiary.com/cgi-bin/latest.pl"; my $rdf = get($feed); my $parser = new RDF::Core::Parser(Assert => \&rdf, BaseURI => "http://www.picdiary.com"); $parser->parse($rdf); my @sortdates = sort { $b cmp $a } keys %dates; foreach my $date (@sortdates[0..2]) { $ctx->stash('thumb',$thumbs{$dates{$date}}); $ctx->stash('title',$titles{$dates{$date}}); $ctx->stash('url',$dates{$date}); defined(my $out = $builder->build($ctx, $tokens)) or return $ctx->error($ctx->errstr); $res .= $out; } return $res; } sub rdf { my %assert = @_; if($assert{'predicate_uri'} eq "http://purl.org/dc/elements/1.1/date") { $dates{$assert{'object_literal'}} = $assert{'subject_uri'}; } if($assert{'predicate_uri'} eq "http://purl.org/rss/1.0/title") { $titles{$assert{'subject_uri'}} = $assert{'object_literal'}; } if($assert{'predicate_uri'} eq "http://xmlns.com/foaf/0.1/thumbnail") { $thumbs{$assert{'subject_uri'}} = $assert{'object_uri'}; } }