package MojoMojo::Formatter::CPANHyperlink; use parent qw/MojoMojo::Formatter/; =head1 NAME MojoMojo::Formatter::CPANHyperlink - automatically hyperlink CPAN modules when using the syntax {{cpan Some::Module}} =head1 DESCRIPTION Normally, to hyperlink to a CPAN module, you'd write: [MojoMojo::Formatter::CPANHyperlink](http://search.cpan.org/perldoc?MojoMojo::Formatter::CPANHyperlink) This plugin lets you write just {{cpan MojoMojo::Formatter::CPANHyperlink}} Just like POD, it supports adding a section after the module name: {{cpan Catalyst::Manual::Cookbook/Deployment}} will create a link to http://search.cpan.org/perldoc?Catalyst::Manual::Cookbook#Deployment Sections can contain any characters, except two consecutive closed braces: {{cpan Catalyst::Test/($res, $c) = ctx request( ... ); }} will link to http://search.cpan.org/perldoc?Catalyst::Test#($res,_$c)_=_ctx_request(_..._); In anticipation of future plugin syntax, you can optionally add a trailing slash {{cpan Some::Module/Section /}} =head1 METHODS =head2 format_content_order The CPANHyperlink formatter has no special requirements in terms of the order it gets run in, so it has a priority of 10. =cut sub format_content_order { 10 } =head2 format_content Calls the formatter. Takes a ref to the content as well as the context object. =cut sub format_content { my ( $class, $content ) = @_; my $component = qr/(?:[_[:alpha:]]\w*)/; my $cpan_module = qr[ $component (?: ::$component )* ]x; my $section = qr[ .*? (?= \s* /? }} ) ]x; $$content =~ s[ {{cpan \s+ ($cpan_module) (?: / ($section))? \s* \/? }} ] [ my ($module, $section) = ($1, $2); if (defined $section) { (my $anchor=$section) =~ s/\s/_/g; qq($section in $module) } else { qq($module) } ]eixg; } =head1 SEE ALSO L and L. =head1 AUTHORS Dan Dascalescu, L =head1 LICENSE This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself. =cut 1;