This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Check for Unicode replacement character in t/porting/podcheck.t
authorDagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Mon, 11 Sep 2017 15:55:17 +0000 (16:55 +0100)
committerDagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Mon, 11 Sep 2017 15:59:34 +0000 (16:59 +0100)
Pod::Simple replaces bytes that aren't valid according to the
document's encoding (declared or auto-detected) \N{REPLACEMENT
CHARACTER}, so catch that.

t/porting/podcheck.t

index 650cbf0..9b314a1 100644 (file)
@@ -93,6 +93,11 @@ missing from the C<LE<lt>E<gt>> pod command.
 A pod can't be linked to unless it has a unique name.
 And a NAME should have a dash and short description after it.
 
+=item Occurrences of the Unicode replacement character
+
+L<Pod::Simple> replaces bytes that aren't valid according to the document's
+encoding (declared or auto-detected) with C<\N{REPLACEMENT CHARACTER}>.
+
 =back
 
 If the C<PERL_POD_PEDANTIC> environment variable is set or the C<--pedantic>
@@ -361,6 +366,7 @@ my $multiple_targets = "There is more than one target";
 my $duplicate_name = "Pod NAME already used";
 my $no_name = "There is no NAME";
 my $missing_name_description = "The NAME should have a dash and short description after it";
+my $replacement_character = "Unicode replacement character found";
 # the pedantic warnings messages
 my $line_length = "Verbatim line length including indents exceeds $MAX_LINE_LENGTH by";
 my $C_not_linked = "? Should you be using L<...> instead of";
@@ -853,6 +859,16 @@ package My::Pod::Checker {      # Extend Pod::Checker
             $running_CFL_text{$addr} .= $text;
         }
 
+        # do this line-by-line so we can get the right line number
+        my @lines = split /^/, $running_simple_text{$addr};
+        for my $i (0..$#lines) {
+            if ($lines[$i] =~ m/\N{REPLACEMENT CHARACTER}/) {
+                $self->poderror({ -line => $start_line{$addr} + $i,
+                    -msg => $replacement_character,
+                    parameter => "possibly invalid ". $self->encoding . " input at character " . pos $lines[$i],
+                });
+            }
+        }
         return $return;
     }