Re: Scrunched up string literals in Pod::Simple tests

[email protected] (Florent Angly)
Newsgroups perl.pod-people
Message-ID <[email protected]>
Hi Sean,

You are right that Pod::Simple has problems with multiline POD strings 
contained into a variable or heredoc section:
	https://rt.cpan.org/Ticket/Display.html?id=36404
	https://rt.cpan.org/Ticket/Display.html?id=69390

In that second link, David Wheeler wrote that the simplest workaround is 
to escape POD directives in the string, as in:
	
 > my $var =<<EOS;
 >
 > \=head1 FAKE_POD_ENTRY_HERE
 >
 > This should not be extracted as POD since it is the content of a variable
 >
 > \=cut
 >
 > EOS

This workaround works great for me. See for example 
http://getopt-euclid.git.sourceforge.net/git/gitweb.cgi?p=getopt-euclid/getopt-euclid;a=blob;f=t/std_arguments.t;h=716cf0f8241018328c8e5a04c4878f16a299df54;hb=refs/heads/0.2.x

Regards,

Florent


On 21/02/12 10:30, Sean M. Burke wrote:
> As I look in Pod::Simple's ./t/ dir...
> Gawd those tests I made with \n\n's in them, with like ten lines
> squooshed into one blob with \n\n\n etc, like this:
>
> print "#\n# Tests for simple =item *'s\n";
> ok( $x->_out("\n=over\n\n=item *\n\nStuff\n\n=item *\n\nBar
> I<baz>!\n\n=back\n\n"),
> '<Document><over-bullet
> indent="4"><item-bullet>Stuff</item-bullet><item-bullet>Bar
> <I>baz</I>!</item-bullet></over-bullet></Document>'
> );
>
> ...are horrible!!
>
> I mean, I guess this is okay:
> ok( Pod::Simple::XMLOutStream->_out("\n=head1 =head1\n"),
> '<Document><head1>=head1</head1></Document>'
> );
>
> But it started with that and just kinda went down that path and kept going.
> Now, THERE IS A REASON. But not a great one!
> I think I *wanted* to be a sane person and use
>
> q{
>
> =over
>
> =item *...
> ...
>
> =back
>
> }
>
> But:
>
> 1) I worried that Perl, in running the program that constitutes this
> test, would try to parse that as actual pod! It's not supposed to, I
> think, but... But but but.
> Ditto with <<EOPOD stuff, which (come to think of it) looks better than
> a many-line q{...} thing.
>
> 2) Especially: I think was I worried about what newline format this test
> file might be in, and so, I worried what newline format would appear in
> that q{...}. Recall that MacPerl = \cm, Unix = \cj, some other stuff =
> \cm\cj, and it's all messy and hurts my head.
>
> However, NOW it occurs to me that I could have worked around BOTH
> problems by just having a dummy | or whatever (a backtick, a ~,
> anything) in the first column of every line, like so...
> And to an inverse problem, the trouble of XML blobs that contain
> newlines...
>
> Here, this should be a cure for what ails ya.
>
> First pod as a straight string literal, then as a |-thing in a q{...},
> then as a |-thing inside a HERE-doc, calling unbar.
>
> Then XML as a straight string literal (well, three concatted together),
> then as a |-thing in a q{...}, then as a |-thing inside a HERE-doc,
> calling no_nls.
>
>
> use strict; use warnings;
>
> my $pod_really =
> "\n\n=over\n\n=item *...\n...\n\n=back\n\nStuff whatever.\n\n";
>
> my $pod_q_ish = unbar( q{
> |
> |=over
> |
> |=item *...
> |...
> |
> |=back
> |
> |Stuff whatever.
> |
> }
> );
>
>
> my $pod_here_ish = unbar( <<EOP
> |
> |=over
> |
> |=item *...
> |...
> |
> |=back
> |
> |Stuff whatever.
> |
> EOP
> );
>
> # Trying |-initial lines
>
> print "Pod_Really and Pod_Q_ish differ!\n\n",
> "{$pod_really}\n\n{$pod_q_ish}\n\n" unless
> $pod_really eq $pod_q_ish;
> print "Pod_Really and Pod_Here_ish differ!\n\n",
> "{$pod_really}\n\n{$pod_here_ish}\n\n" unless
> $pod_really eq $pod_here_ish;
>
> # Now XML
>
> my $xml_really =
> qq[<Document><over-bullet indent="4"><item-bullet>]
> .qq[Stuff</item-bullet><item-bullet>Bar <I>baz</I>!]
> .qq[</item-bullet></over-bullet></Document>]
> ;
>
> my $xml_q_ish = no_nls( q[
> <Document><over-bullet indent="4"><item-bullet>
> Stuff</item-bullet><item-bullet>Bar <I>baz</I>!
> </item-bullet></over-bullet></Document>
> ]);
>
> my $xml_here_ish = no_nls( <<EOX
> <Document><over-bullet indent="4"><item-bullet>
> Stuff</item-bullet><item-bullet>Bar <I>baz</I>!
> </item-bullet></over-bullet></Document>
> EOX
> );
>
> print "XML_Really and XML_Q_ish differ!\n\n",
> "{$xml_really}\n\n{$xml_here_ish}\n\n" unless
> $xml_really eq $xml_q_ish;
>
> print "XML_Really and XML_Here_ish differ!\n\n",
> "{$xml_really}\n\n{$xml_here_ish}\n\n" unless
> $xml_really eq $xml_here_ish;
>
> print "End."; # <--- should be the only thing said.
>
>
>
> sub unbar {
> my($x) = join '', @_;
> for($x) {
> #Break where a '|' follows anything newline-ish:
> #
> s<\A\|><\n\|>;
> # ^^ Degen case: where a | is the very first character.
>
> s<[\cm\cj]+\|><\n>g; # Now for real.
> }
> return $x
> }
>
> sub no_nls { # returns, minus any newlines
> my $n = join '', @_;
> $n =~ s/[\cm\cj]+//g;
> return $n;
> }
>
>
> __END__
>
> That should run without saying anything about differing.
>
> Use it, adapt it, or not, it's up to you to figure out what makes things
> less like Lovecraftian camouflage to your programmery eyes.
>
>
>
> (As with vast vast areas of my life, I have to mark this unbar and
> no_nls things as another (now decade-old) pesky occurrence of: "Now,
> you'd THINK that I would have thought of that!")
>
>
> But whether the subject is myself, or anything else in the world, I have
> noticed that the phrase "Now, you'd THINK..." have had a pretty sad
> track record lately AMIRITE??
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.