X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fp5-Catalyst-Plugin-Sitemap;a=blobdiff_plain;f=lib%2FCatalyst%2FPlugin%2FSitemap.pm;h=e408855fc55dec89b45772b8a170bbfa32a9d8c4;hp=73639508f26c3c2b1fa3034011aa8b9861e4e0d2;hb=HEAD;hpb=eb978d87a480b55befbc544e06ed593d8808964f diff --git a/lib/Catalyst/Plugin/Sitemap.pm b/lib/Catalyst/Plugin/Sitemap.pm index 7363950..e408855 100644 --- a/lib/Catalyst/Plugin/Sitemap.pm +++ b/lib/Catalyst/Plugin/Sitemap.pm @@ -1,4 +1,10 @@ package Catalyst::Plugin::Sitemap; +BEGIN { + $Catalyst::Plugin::Sitemap::VERSION = '1.0.0'; +} + +# ABSTRACT: Sitemap support for Catalyst. + use strict; use warnings; @@ -7,16 +13,30 @@ use Moose::Role; no warnings qw/uninitialized/; -use Search::Sitemap; +use WWW::Sitemap::XML; use List::Util qw/ first /; -sub sitemap { +has sitemap => ( + is => 'ro', + builder => '_build_sitemap', + lazy => 1, +); + +sub sitemap_as_xml { + my $self = shift; + return $self->sitemap->as_xml->toString; +} + +sub _build_sitemap { my $self = shift; - my $sitemap = Search::Sitemap->new; - $sitemap->pretty(1); + my $sitemap = WWW::Sitemap::XML->new; - for my $controller ( $self->controller(qr//) ) { + if ( $self->can('uri_disposition') ) { + $self->uri_disposition('absolute'); + } + + for my $controller ( map { $self->controller($_) } $self->controllers ) { ACTION: for my $a ( $controller->get_action_methods ) { @@ -43,6 +63,7 @@ sub sitemap { } if ( $attr[0] + 0 > 0 ) { + # it's a number $uri_params{priority} = $attr[0]; } @@ -52,11 +73,9 @@ sub sitemap { %uri_params = @attr; } - $uri_params{loc} = $self->uri_for_action( $action->private_path ); + $uri_params{loc} = ''.$self->uri_for_action( $action->private_path ); - $sitemap->add( \%uri_params ); - - next ACTION; + $sitemap->add(%uri_params); } } @@ -66,24 +85,168 @@ sub sitemap { 1; -__END__ -ways I can do it -is Sitemap( ) ? => use it as is -else => has _sitemap? => use it -else => use the uri directly +=pod +=head1 NAME -sitemap => sub { - my ( $self, $c, $sitemap ) = @_; +Catalyst::Plugin::Sitemap - Sitemap support for Catalyst. - ... -}; +=head1 VERSION -sub action_sitemap { - my ( $self, $c, $sitemap ) = @_; -} +version 1.0.0 -sub do_stuff :Local :Sitemap { -} +=head1 SYNOPSIS + + # in MyApp.pm + + use Catalyst qw/ Sitemap /; + + # in the controller + + sub alone :Local :Sitemap { + ... + } + + sub with_priority :Local :Sitemap(0.75) { + ... + } + + sub with_args :Local + :Sitemap( lastmod => 2010-09-27, changefreq => daily ) { + ... + } + + sub with_function :Local :Sitemap(*) { + ... + } + + sub with_function_sitemap { + $_[2]->add( 'http://localhost/with_function' ); + } + + # and then... + + sub sitemap : Path('/sitemap') { + my ( $self, $c ) = @_; + + $c->res->body( $c->sitemap_as_xml ); + } + +=head1 DESCRIPTION + +L provides a way to semi-automate the creation +of the sitemap of a Catalyst application. + +=head1 CONTEXT METHOD + +=head2 sitemap() + +Returns a L object. The sitemap object is populated by +inspecting the controllers of the application for actions with the +sub attribute C<:Sitemap>. + +=head2 sitemap_as_xml() + +Returns the sitemap as a string containing its XML representation. + +=head1 C<:Sitemap> Subroutine Attribute + +The sitemap is populated by actions ear-marked with the <:Sitemap> sub +attribute. It can be invoked in different ways: + +=over + +=item C<:Sitemap> + + sub alone :Local :Sitemap { + ... + } + +Adds the url of the action to the sitemap. + +If the action does not +resolves in a single url, this will results in an error. + +=item C<:Sitemap($priority)> + + sub with_priority :Local :Sitemap(0.9) { + ... + } + +Adds the url, with the given number, which has to be between 1 (inclusive) +and 0 (exclusive), as its priority. + +If the action does not +resolves in a single url, this will results in an error. + +=item C<:Sitemap( %attributes )> + + sub with_args :Local + :Sitemap( lastmod => 2010-09-27, changefreq => daily ) { + ... + } + +Adds the url with the given entry attributes (as defined by +L). + +If the action does not +resolves in a single url, this will results in an error. + +=item C<:Sitemap(*)> + + sub with_function :Local :Sitemap(*) { } + + sub with_function_sitemap { + my ( $self, $c, $sitemap ) = @_; + + $sitemap->add( 'http://localhost/with_function' ); + } + +Calls the function 'I_sitemap', if it exists, and passes it the +controller, context and sitemap objects. + +This is currently the only way to invoke C<:Sitemap> on an action +resolving to many urls. + +=back + +=head1 SEE ALSO + +=over + +=item L + +Module that C currently uses under the hood. + +=item L + +Original module that this plugin was using under the hood. + +=item L + +Similar plugin for the L framework, which inspired +C. + +=item http://babyl.dyndns.org/techblog/entry/catalyst-plugin-sitemap + +Blog article introducing C. + +=back + +=head1 AUTHOR + +Yanick Champoux + +=head1 COPYRIGHT AND LICENSE + +This software is copyright (c) 2010 by Yanick Champoux. + +This is free software; you can redistribute it and/or modify it under +the same terms as the Perl 5 programming language system itself. + +=cut + + +__END__