The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

ACCENTS

Beyoncé! Beyoncé! Beyoncé!!

    Beyoncé!  Beyoncé!
      Beyoncé!  Beyoncé!
        Beyoncé!  Beyoncé!

Older versions didn't convert Beyoncé in verbatim. EOP

       my $expected = <<"EOM";
.SH "ACCENTS"
.IX Header "ACCENTS"
Beyonce\\*'!  Beyonce\\*'!  Beyonce\\*'!!
.PP
.Vb 3
\\&    Beyonce\\*'!  Beyonce\\*'!
\\&      Beyonce\\*'!  Beyonce\\*'!
\\&        Beyonce\\*'!  Beyonce\\*'!
.Ve
.PP
Older versions didn't convert Beyonce\\*' in verbatim.
EOM
        $parser = Pod::Man->new or die "Cannot create parser\n";
        open my $out_fh, ">", 'out.tmp' or die "Can't open \$out_fh:  $!";
        $parser->output_fh($out_fh);
        $parser->parse_string_document($pod);
        close $out_fh;
        open my $in_fh, "<", 'out.tmp' or die "Can't open \$in_fh:  $!";
        while (<$in_fh>) { last if /^\.TH/; }
        my $man;
        {
            local $/ = undef;
            $man = <$in_fh>;
        }
        close $in_fh;
        unlink 'out.tmp';
        if ($man eq $expected) {
            print "ok 2\n";
        } else {
            print "not ok 2\n";
            print "Expected\n========\n$expected\nOutput\n======\n$man\n";
        }
    }
}

my $n = 3; while (<DATA>) { next until $_ eq "###\n"; open (TMP, '> tmp.pod') or die "Cannot create tmp.pod: $!\n"; while (<DATA>) { last if $_ eq "###\n"; print TMP $_; } close TMP; my $parser = Pod::Man->new or die "Cannot create parser\n"; $parser->parse_from_file ('tmp.pod', 'out.tmp'); undef $parser; open (OUT, 'out.tmp') or die "Cannot open out.tmp: $!\n"; while (<OUT>) { last if /^\.TH/ } my $output; { local $/; $output = <OUT>; } close OUT; unlink ('tmp.pod', 'out.tmp'); my $expected = ''; while (<DATA>) { last if $_ eq "###\n"; $expected .= $_; } if ($output eq $expected) { print "ok $n\n"; } else { print "not ok $n\n"; print "Expected\n========\n$expected\nOutput\n======\n$output\n"; } $n++; }

# Below the marker are bits of POD and corresponding expected nroff output. # This is used to test specific features or problems with Pod::Man. The input # and output are separated by lines containing only ###.

__DATA__

### =head1 NAME

gcc - GNU project C and C++ compiler

C++ NOTES

Other mentions of C++. ### .SH "NAME" gcc \- GNU project C and C++ compiler .SH "\*(C+ NOTES" .IX Header " NOTES" Other mentions of \*(C+. ###

### =head1 PERIODS

This . should be quoted. ### .SH "PERIODS" .IX Header "PERIODS" This \f(CW\*(C`.\*(C'\fR should be quoted. ###

### =over 4

  • A bullet.

  • Another bullet.

  • Also a bullet.

### =over 4

foo

Not a bullet.

*

Also not a bullet.

### =over 4

1. Not a number
2. Spaced right
1 Not a number
2 Spaced right

### =over 4

*

Not bullet.

### =head1 SEQS

"=over ... =back"

"S<...>"

The quotes should be converted in the above to paired quotes. ### .SH "SEQS" .IX Header "SEQS" \&\*(L"=over ... =back\*(R" .PP \&\*(L"...\*(R" .PP The quotes should be converted in the above to paired quotes. ###

### =head1 YEN

It cost me ¥12345! That should be an X. ### .SH "YEN" .IX Header "YEN" It cost me X12345! That should be an X. ###

### =head1 agrave

Open à la shell. Previous versions mapped it wrong. ### .SH "agrave" .IX Header "agrave" Open a\*` la shell. Previous versions mapped it wrong. ###

### =over

First level

Blah blah blah....

  • Should be a bullet.

### =over 4

1. Check fonts in @CARP_NOT test.

### =head1 LINK QUOTING

There should not be double quotes: (?>pattern). ### .SH "LINK QUOTING" .IX Header "LINK QUOTING" There should not be double quotes: \f(CW\*(C`(?>pattern)\*(C'\fR. ###

### =head1 S<> MAGIC

Magic should be applied RISC OS to that. ### .SH " MAGIC" .IX Header " MAGIC" Magic should be applied \s-1RISC\s0\ \s-1OS\s0 to that. ###

### =head1 MAGIC MONEY

These should be identical.

Bippity boppity boo "The price is $100."

Bippity boppity boo "The price is $100." ### .SH "MAGIC MONEY" .IX Header "MAGIC MONEY" These should be identical. .PP Bippity boppity boo \*(L"The price is \f(CW$100\fR.\*(R" .PP Bippity boppity boo \*(L"The price is \f(CW$100\fR.\*(R" ###

### =head1 NAME

"Stuff" (no guesswork)

THINGS

Oboy, is this C++ "fun" yet! (guesswork) ### .SH "NAME" "Stuff" (no guesswork) .Sh "\s-1THINGS\s0" .IX Subsection "THINGS" Oboy, is this \*(C+ \*(L"fun\*(R" yet! (guesswork) ###

### =head1 Newline C Quote Weirdness

Blorp ' ''. Yes. ### .SH "Newline C Quote Weirdness" .IX Header "Newline C Quote Weirdness" Blorp \f(CW' \&''\fR. Yes. ###

### =head1 Soft Hypen Testing

sig­action manu­script Jark­ko Hie­ta­nie­mi

And again:

sig­action manu­script Jark­ko Hie­ta­nie­mi

And one more time:

sig­action manu­script Jark­ko Hie­ta­nie­mi ### .SH "Soft Hypen Testing" .IX Header "Soft Hypen Testing" sig\%action manu\%script Jark\%ko Hie\%ta\%nie\%mi .PP And again: .PP sig\%action manu\%script Jark\%ko Hie\%ta\%nie\%mi .PP And one more time: .PP sig\%action manu\%script Jark\%ko Hie\%ta\%nie\%mi ###

### =head1 X<> Whitespace

Blorpy prok wugga chachacha. ### .SH " Whitespace" .IX Header " Whitespace" Blorpy \fBprok\fR wugga chachacha. .IX Xref "bivav" ###

### =head1 Hyphen in S<>

Don't transform even-this hyphen. ### .SH "Hyphen in " .IX Header "Hyphen in " Don't transform\ even-this\ hyphen. ###

14 POD Errors

The following errors were encountered while parsing the POD:

Around line 39:

Non-ASCII character seen before =encoding in 'Beyoncé!'. Assuming CP1252

Around line 154:

'=item' outside of any '=over'

Around line 164:

=back doesn't take any parameters, but you said =back ### .IP "\(bu" 4 A bullet. .IP "\(bu" 4 Another bullet. .IP "\(bu" 4 Also a bullet. ###

Around line 177:

'=item' outside of any '=over'

Around line 181:

Expected text after =item, not a bullet

Around line 185:

=back doesn't take any parameters, but you said =back ### .IP "foo" 4 .IX Item "foo" Not a bullet. .IP "*" 4 Also not a bullet. ###

Around line 197:

'=item' outside of any '=over'

Around line 209:

=back doesn't take any parameters, but you said =back ### .IP "1. Not a number" 4 .IX Item "1. Not a number" .PD 0 .IP "2. Spaced right" 4 .IX Item "2. Spaced right" .IP "1 Not a number" 2 .IX Item "1 Not a number" .IP "2 Spaced right" 2 .IX Item "2 Spaced right" ###

Around line 225:

'=item' outside of any '=over'

Around line 229:

=back doesn't take any parameters, but you said =back ### .IP "*" 4 Not bullet. ###

Around line 276:

'=item' outside of any '=over'

Around line 288:

=back doesn't take any parameters, but you said =back ### .IP "First level" 4 .IX Item "First level" Blah blah blah.... .RS 4 .IP "\(bu" 4 Should be a bullet. .RE .RS 4 .RE ###

Around line 304:

'=item' outside of any '=over'

Around line 306:

=back doesn't take any parameters, but you said =back ### .ie n .IP "1. Check fonts in @CARP_NOT test." 4 .el .IP "1. Check fonts in \f(CW@CARP_NOT\fR test." 4 .IX Item "1. Check fonts in @CARP_NOT test." ###