File Coverage

blib/lib/Perl/Critic/Policy/Documentation/ProhibitLinkToSelf.pm
Criterion Covered Total %
statement 70 72 97.2
branch 16 20 80.0
condition 2 6 33.3
subroutine 18 18 100.0
pod 1 1 100.0
total 107 117 91.4


line stmt bran cond sub pod time code
1             # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 Kevin Ryde
2              
3             # This file is part of Perl-Critic-Pulp.
4              
5             # Perl-Critic-Pulp is free software; you can redistribute it and/or modify
6             # it under the terms of the GNU General Public License as published by the
7             # Free Software Foundation; either version 3, or (at your option) any later
8             # version.
9             #
10             # Perl-Critic-Pulp is distributed in the hope that it will be useful, but
11             # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12             # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13             # for more details.
14             #
15             # You should have received a copy of the GNU General Public License along
16             # with Perl-Critic-Pulp. If not, see <http://www.gnu.org/licenses/>.
17              
18              
19             # perlcritic -s ProhibitLinkToSelf ProhibitLinkToSelf.pm
20              
21              
22             package Perl::Critic::Policy::Documentation::ProhibitLinkToSelf;
23 40     40   26283 use 5.006;
  40         1219  
24 40     40   195 use strict;
  40         80  
  40         649  
25 40     40   163 use warnings;
  40         68  
  40         921  
26 40     40   176 use base 'Perl::Critic::Policy';
  40         65  
  40         3623  
27 40     40   140594 use Perl::Critic::Utils;
  40         70  
  40         710  
28              
29             # uncomment this to run the ### lines
30             #use Devel::Comments;
31              
32             our $VERSION = 97;
33              
34 40     40   29288 use constant supported_parameters => ();
  40         83  
  40         2051  
35 40     40   213 use constant default_severity => $Perl::Critic::Utils::SEVERITY_LOW;
  40         75  
  40         2030  
36 40     40   230 use constant default_themes => qw(pulp cosmetic);
  40         91  
  40         2102  
37 40     40   221 use constant applies_to => 'PPI::Document';
  40         177  
  40         4811  
38              
39             sub violates {
40 6     6 1 511507 my ($self, $elem, $document) = @_;
41             # ### ProhibitLinkToSelf on: $elem->content
42              
43 6         91 my $parser = Perl::Critic::Pulp::PodParser::ProhibitLinkToSelf->new
44             (policy => $self);
45 6         22 $parser->parse_from_elem ($elem);
46 6         22 return $parser->violations;
47             }
48              
49             package Perl::Critic::Pulp::PodParser::ProhibitLinkToSelf;
50 40     40   258 use strict;
  40         69  
  40         963  
51 40     40   181 use warnings;
  40         63  
  40         881  
52 40     40   553 use Pod::ParseLink;
  40         742  
  40         1687  
53 40     40   207 use base 'Perl::Critic::Pulp::PodParser';
  40         77  
  40         26087  
54              
55             my %command_non_text = (for => 1,
56             begin => 1,
57             end => 1,
58             # cut => 1, # not seen unless -process_cut_cmd
59             );
60             sub command {
61 8     8   615 my $self = shift;
62 8         19 my ($command, $text, $linenum, $paraobj) = @_;
63 8         36 $self->SUPER::command(@_); # maintain 'in_begin'
64              
65             # if ($command eq 'for'
66             # && $text =~ /^ProhibitLinkToSelf\b\s*(.*)/) {
67             # my $directive = $1;
68             # ### $directive
69             # if ($directive =~ /^allow next( (\d+))?/) {
70             # # numbered "allow next 5" means up to that many following,
71             # # unnumbered "allow next" means one following
72             # $self->{'allow_next'} = (defined $2 ? $2 : 1);
73             # }
74              
75 8 100       20 if ($command eq 'head1') {
76 7         29 $self->{'in_name'} = ($text =~ /^\s*NAME\b/);
77 7         23 $self->{'in_see_also'} = ($text =~ /^\s*SEE\s+ALSO\b/);
78             ### in_name now: $self->{'in_name'}
79             ### in_see_also: $self->{'in_see_also'}
80             }
81              
82 8 50       24 unless ($command_non_text{$command}) {
83             # padded for the column number right, the leading spaces do no harm here
84 8         28 _check_text ($self,
85             (' ' x (length($command)+1)) . $text,
86             $linenum,
87             $paraobj);
88             }
89              
90 8         102 return '';
91             }
92              
93             sub textblock {
94 11     11   628 my ($self, $text, $linenum, $paraobj) = @_;
95             ### textblock(): "linenum=$linenum"
96             ### $text
97              
98             # "=begin :foo" is markup, check it. Other =begin is not markup.
99 11 50 33     36 unless ($self->{'in_begin'} eq '' || $self->{'in_begin'} =~ /^:/) {
100 0         0 return '';
101             }
102              
103 11         23 my $str = _check_text ($self, $text, $linenum, $paraobj);
104             ### interpolated: $str
105 11 100       35 if ($self->{'in_name'}) {
106 10 100       38 if ($str =~ /^\s*([[:word:]:]+)\s*-/) {
107             ### add own package name: $1
108 6         22 $self->{'own_package_names'}->{$1} = 1;
109             }
110             }
111 11         160 return '';
112             }
113              
114             sub _check_text {
115 19     19   38 my ($self, $text, $linenum, $paraobj) = @_;
116             ### _check_text() ...
117             ### $linenum
118 19         925 return $self->interpolate($text, $linenum);
119             }
120              
121             sub interior_sequence {
122 7     7   23 my ($self, $cmd, $text, $paraobj) = @_;
123             ### interior_sequence() ...
124              
125 7 50       25 if ($cmd eq 'X') {
    100          
126             # index entry, no text output, but keep newlines for linenum
127 0         0 $text =~ tr/\n//cd;
128              
129             } elsif ($cmd eq 'L') {
130 6         22 my ($display, $inferred, $name, $section, $type)
131             = Pod::ParseLink::parselink ($text);
132             ### $display
133             ### $inferred
134             ### $name
135              
136 6 50 33     247 if (defined $name && $self->{'own_package_names'}->{$name}) {
137 6         26 $text =~ /(\s*)$/;
138 6         15 my $pos = length($text) - length($1); # end of $text
139             ### $pos
140 6         26 (undef, my $linenum) = $paraobj->file_line;
141              
142             $self->violation_at_linenum_and_textpos
143 6 100       34 (($self->{'in_see_also'}
144             ? "L<> link to this POD itself in \"SEE ALSO\" section, probable typo"
145             : "L<> link to this POD itself, suggest just C<> markup is enough"),
146             $linenum, $text, $pos);
147             }
148 6 100       193 return (defined $display ? $display : $name);
149             }
150 1         27 return $text;
151             }
152              
153             1;
154             __END__
155              
156             =for stopwords Ryde clickable one's formatters filename
157              
158             =head1 NAME
159              
160             Perl::Critic::Policy::Documentation::ProhibitLinkToSelf - don't LE<lt>E<gt> link to own POD
161              
162             =head1 DESCRIPTION
163              
164             This policy is part of the L<C<Perl::Critic::Pulp>|Perl::Critic::Pulp>
165             add-on. It asks you not to use C<< LE<lt>E<gt> >> markup to refer to a POD
166             document itself.
167              
168             =for ProhibitVerbatimMarkup allow next 6
169              
170             =head1 NAME
171              
172             My::Package - something
173              
174             =head1 DESCRIPTION
175              
176             L<My::Package> does blah blah ... # bad
177              
178             =head1 SEE ALSO
179              
180             L<My::Package> # bad
181              
182             The idea is that it doesn't make sense to link to a document from within
183             itself. If rendered as a clickable link then it may suggest there's
184             somewhere else to go to read about the module when in fact you're already
185             looking at it.
186              
187             This is only a minor thing though, so this policy is low severity and under
188             the C<cosmetic> theme (see L<Perl::Critic/POLICY THEMES>).
189              
190             In ordinary text the suggestion is plain C<< CE<lt>E<gt> >> or similar for
191             one's own module name,
192              
193             =for ProhibitVerbatimMarkup allow next
194              
195             C<My::Package> does something something ... # ok
196              
197             In a "SEE ALSO" a link to self in very likely a typo, or too much cut and
198             paste, or at least pretty unnecessary since there's no need to "see also"
199             what you've just read.
200              
201             If linking to a particular section within one's own document then use
202             C<< LE<lt>E<gt> >> with just the section part. This will probably give
203             better looking output from the formatters too,
204              
205             =for ProhibitVerbatimMarkup allow next 2
206              
207             L<My::Package/SECTION> # bad
208              
209             L</SECTION> # ok
210              
211             For this policy the name of the POD is picked out of the "=head1 NAME"
212             section, so doesn't depend on the filename or directory where C<perlcritic>
213             is run. In the current code multiple names can be given in man-page style.
214             Not sure if that's a good idea.
215              
216             =head1 NAME
217              
218             My::Package -- blah
219              
220             My::Package::Parser -- and its parser
221              
222             =head1 DESCRIPTION
223              
224             It's always possible an C<< LE<lt>E<gt> >> is right and in fact the "NAME"
225             appearing is wrong. A violation on the C<< LE<lt>E<gt> >> will at least
226             show there's something fishy in the one or the other.
227              
228             =head2 Disabling
229              
230             If you don't care about this then you can always disable
231             C<ProhibitLinkToSelf> from your F<.perlcriticrc> file in the usual way (see
232             L<Perl::Critic/CONFIGURATION>),
233              
234             [-Documentation::ProhibitLinkToSelf]
235              
236             If you like to almost always put C<< LE<lt>E<gt> >> on module names,
237             including in the module's own POD, then disable this policy. Maybe an
238             option in the future could allow links to self in ordinary text but prohibit
239             in "SEE ALSO".
240              
241             =head1 SEE ALSO
242              
243             L<Perl::Critic::Pulp>,
244             L<Perl::Critic>
245              
246             L<Perl::Critic::Policy::Documentation::RequirePackageMatchesPodName>,
247             L<Perl::Critic::Policy::Documentation::ProhibitAdjacentLinks>
248              
249             =head1 HOME PAGE
250              
251             L<http://user42.tuxfamily.org/perl-critic-pulp/index.html>
252              
253             =head1 COPYRIGHT
254              
255             Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 Kevin Ryde
256              
257             Perl-Critic-Pulp is free software; you can redistribute it and/or modify it
258             under the terms of the GNU General Public License as published by the Free
259             Software Foundation; either version 3, or (at your option) any later
260             version.
261              
262             Perl-Critic-Pulp is distributed in the hope that it will be useful, but
263             WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
264             or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
265             more details.
266              
267             You should have received a copy of the GNU General Public License along with
268             Perl-Critic-Pulp. If not, see <http://www.gnu.org/licenses/>.
269              
270             =cut