1#!/usr/bin/env perl
2use 5.010;
3use open qw< :encoding(utf8) :std >;
4use autodie;
5use strict;
6use File::Find;
7use Encode::Guess;
8
9# Check if POD files contain non-ASCII without specifying
10# =encoding. Run it as:
11
12## perl Porting/checkpodencoding.pl
13
14find(
15    {
16        wanted => \&finder,
17        no_chdir => 1,
18    },
19    '.'
20);
21
22sub finder {
23    my $file = $_;
24
25    return if -d $file or -B $file;
26
27    open my $fh, '<', $file;
28
29    #say STDERR "Checking $file";
30
31    next if
32        # Test cases
33        $file =~ m[Pod-Simple/t];
34
35    my ($in_pod, $has_encoding, @non_ascii);
36
37    FILE: while (my $line = <$fh>) {
38        chomp $line;
39        if ($line =~ /^=[a-z]+/) {
40            $in_pod = 1;
41        }
42
43        if ($in_pod) {
44            if ($line =~ /^=encoding (\S+)/) {
45                $has_encoding = 1;
46                last FILE;
47            } elsif ($line =~ /[^[:ascii:]]/) {
48                my $encoding = guess_encoding($line);
49                push @non_ascii => {
50                    num => $.,
51                    line => $line,
52                    encoding => (ref $encoding ? "$encoding->{Name}?" : 'unknown!'),
53                };
54            }
55        }
56
57        if ($line =~ /^=cut/) {
58            $in_pod = 0;
59        }
60    }
61
62    if (@non_ascii and not $has_encoding) {
63        say "$file:";
64        $DB::single = 1;
65        for (@non_ascii) {
66            say "    $_->{num} ($_->{encoding}): $_->{line}";
67        }
68    }
69}
70