From: Yanick Champoux Date: Tue, 28 Sep 2010 00:15:02 +0000 (-0400) Subject: initial commit X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=cc84fb8d76fc3e975d2d593c51d4488d530aec6b;p=chaz%2Fp5-Catalyst-Plugin-Sitemap initial commit --- cc84fb8d76fc3e975d2d593c51d4488d530aec6b diff --git a/dist.ini b/dist.ini new file mode 100644 index 0000000..acbdfe9 --- /dev/null +++ b/dist.ini @@ -0,0 +1,6 @@ +name = Catalyst-Plugin-Sitemap +author = Yanick Champoux +license = Perl_5 +copyright_holder = Yanick Champoux +copyright_year = 2010 + diff --git a/lib/Catalyst/Plugin/Sitemap.pm b/lib/Catalyst/Plugin/Sitemap.pm new file mode 100644 index 0000000..eb6e92b --- /dev/null +++ b/lib/Catalyst/Plugin/Sitemap.pm @@ -0,0 +1,89 @@ +package Catalyst::Plugin::Sitemap; + +use strict; +use warnings; + +use Moose::Role; + +no warnings qw/uninitialized/; + +use Search::Sitemap; +use List::Util qw/ first /; + +sub sitemap { + my $self = shift; + + my $sitemap = Search::Sitemap->new; + $sitemap->pretty(1); + + for my $controller ( $self->controller(qr//) ) { + ACTION: + for my $a ( $controller->get_action_methods ) { + + my $action = $controller->action_for( $a->name ); + + my $attr = $action->attributes->{Sitemap} or next ACTION; + + die "more than one attribute 'Sitemap' for sub ", + $a->fully_qualified_name + if @$attr > 1; + + my @attr = split /\s*(?:,|=>)\s*/, $attr->[0]; + + my %uri_params; + + if ( @attr == 1 ) { + if ( $attr[0] eq '*' ) { + my $sitemap_method = $action->name . "_sitemap"; + + if ( $controller->can($sitemap_method) ) { + $controller->$sitemap_method( $self, $sitemap ); + next ACTION; + } + } + + if ( $attr[0] + 0 > 0 ) { + # it's a number + $uri_params{priority} = $attr[0]; + } + + } + elsif ( @attr > 0 ) { + %uri_params = @attr; + } + + $uri_params{loc} = $self->uri_for_action( $action->private_path ); + + $sitemap->add( \%uri_params ); + + next ACTION; + } + + } + + return $sitemap->xml; +} + +1; + +__END__ + +ways I can do it + +is Sitemap( ) ? => use it as is +else => has _sitemap? => use it +else => use the uri directly + + +sitemap => sub { + my ( $self, $c, $sitemap ) = @_; + + ... +}; + +sub action_sitemap { + my ( $self, $c, $sitemap ) = @_; +} + +sub do_stuff :Local :Sitemap { +} diff --git a/t/lib/TestApp.pm b/t/lib/TestApp.pm new file mode 100644 index 0000000..5350115 --- /dev/null +++ b/t/lib/TestApp.pm @@ -0,0 +1,10 @@ +package TestApp; + +use strict; +use warnings; + +use Catalyst qw/ Sitemap /; + +__PACKAGE__->setup; + +1; diff --git a/t/lib/TestApp/Controller/Root.pm b/t/lib/TestApp/Controller/Root.pm new file mode 100644 index 0000000..01a131d --- /dev/null +++ b/t/lib/TestApp/Controller/Root.pm @@ -0,0 +1,35 @@ +package TestApp::Controller::Root; + +use strict; +use warnings; + +use parent 'Catalyst::Controller'; + +sub sitemap : Path('/sitemap') { + my ( $self, $c ) = @_; + + $c->res->body( $c->sitemap ); +} + +sub alone :Path('/alone') :Sitemap { } + +sub with_priority :Path('/with_priority') :Sitemap(0.75) { } + +sub with_function :Path('/with_function') :Sitemap(*) { } + +sub with_function_sitemap { + $_[2]->add( 'http://localhost/with_function' ); +} + +sub with_args :Path('/with_args') + :Sitemap( lastmod => 2010-09-27, changefreq => daily ) + {} + + +1; + + + + + + diff --git a/t/sitemap.t b/t/sitemap.t new file mode 100644 index 0000000..26f91ab --- /dev/null +++ b/t/sitemap.t @@ -0,0 +1,25 @@ + +use strict; +use warnings; + +use Test::More tests => 4; # last test to print + +use lib 't/lib'; + +use Catalyst::Test 'TestApp'; + +my $xml = request('/sitemap')->content; + +$xml =~ s/\s+//g; + +like $xml, qr{http://localhost/alone}, ':Sitemap'; +like $xml, qr{http://localhost/with_function}, + ':Sitemap(*)'; +like $xml, + qr{http://localhost/with_priority0.75}, + ':Sitemap(0.75)'; + +like $xml, + qr{http://localhost/with_args2010-09-27daily}, + ':Sitemap(lotsa stuff)'; +