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=3cadf65c89ae51ea3cdb4192e9cb0e7308d417d2;hb=HEAD;hpb=38ac0ad20634e83830c186b2070f6bfde24e0ed0 diff --git a/lib/Catalyst/Plugin/Sitemap.pm b/lib/Catalyst/Plugin/Sitemap.pm index 3cadf65..e408855 100644 --- a/lib/Catalyst/Plugin/Sitemap.pm +++ b/lib/Catalyst/Plugin/Sitemap.pm @@ -1,6 +1,102 @@ package Catalyst::Plugin::Sitemap; +BEGIN { + $Catalyst::Plugin::Sitemap::VERSION = '1.0.0'; +} + # ABSTRACT: Sitemap support for Catalyst. + +use strict; +use warnings; + +use Moose::Role; + +no warnings qw/uninitialized/; + +use WWW::Sitemap::XML; +use List::Util qw/ first /; + +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 = WWW::Sitemap::XML->new; + + 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 ) { + + 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); + } + + } + + return $sitemap; +} + +1; + + + +=pod + +=head1 NAME + +Catalyst::Plugin::Sitemap - Sitemap support for Catalyst. + +=head1 VERSION + +version 1.0.0 + =head1 SYNOPSIS # in MyApp.pm @@ -35,7 +131,7 @@ package Catalyst::Plugin::Sitemap; sub sitemap : Path('/sitemap') { my ( $self, $c ) = @_; - $c->res->body( $c->sitemap->xml ); + $c->res->body( $c->sitemap_as_xml ); } =head1 DESCRIPTION @@ -47,10 +143,14 @@ of the sitemap of a Catalyst application. =head2 sitemap() -Returns a L object. The sitemap object is populated by +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 @@ -71,7 +171,6 @@ resolves in a single url, this will results in an error. =item C<:Sitemap($priority)> - sub with_priority :Local :Sitemap(0.9) { ... } @@ -89,7 +188,8 @@ resolves in a single url, this will results in an error. ... } -Adds the url with the given entry attributes (as defined by C). +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. @@ -112,91 +212,41 @@ resolving to many urls. =back - -=head1 BUGS AND LIMITATIONS - -Currently, each invocation of the method C will -re-generate the C object. A future version -of this module might offer a way to only compute the sitemap -once. - - =head1 SEE ALSO -=over - -=item L - -=item http://babyl.dyndns.org/techblog/entry/catalyst-plugin-sitemap - -=back - -=cut - -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); +=over - for my $controller ( $self->controller(qr//) ) { - ACTION: - for my $a ( $controller->get_action_methods ) { +=item L - my $action = $controller->action_for( $a->name ); +Module that C currently uses under the hood. - my $attr = $action->attributes->{Sitemap} or next ACTION; +=item L - die "more than one attribute 'Sitemap' for sub ", - $a->fully_qualified_name - if @$attr > 1; +Original module that this plugin was using under the hood. - my @attr = split /\s*(?:,|=>)\s*/, $attr->[0]; +=item L - my %uri_params; +Similar plugin for the L framework, which inspired +C. - if ( @attr == 1 ) { - if ( $attr[0] eq '*' ) { - my $sitemap_method = $action->name . "_sitemap"; +=item http://babyl.dyndns.org/techblog/entry/catalyst-plugin-sitemap - if ( $controller->can($sitemap_method) ) { - $controller->$sitemap_method( $self, $sitemap ); - next ACTION; - } - } +Blog article introducing C. - if ( $attr[0] + 0 > 0 ) { - # it's a number - $uri_params{priority} = $attr[0]; - } +=back - } - elsif ( @attr > 0 ) { - %uri_params = @attr; - } +=head1 AUTHOR - $uri_params{loc} = $self->uri_for_action( $action->private_path ); +Yanick Champoux - $sitemap->add( \%uri_params ); +=head1 COPYRIGHT AND LICENSE - next ACTION; - } +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. - return $sitemap; -} +=cut -1; __END__