Posted on 2009-06-15 18:57:29-07 by simonm
Over-enthusiastic search-and-replace
Unfortunately, the text assembly performed by MicroMason means that use of the following terms (as shown, in all caps) will yield errors, as they are treated as assembler tokens instead of literal values: OUT, TOKEN, QUOTED.

The patch below helped me deal with the specific problem case we were facing, but there must be a more reliable, general-purpose approach...

Text/MicroMason/Base.pm, line 269:

- $typedef =~ s{\bOUT\b}{$output}g;
+ $typedef =~ s{\bOUT\(}{$output(}g;
Direct Responses: 11759 | Write a response
Posted on 2009-11-14 22:17:15-08 by simonm in response to 10970
Re: Over-enthusiastic search-and-replace
Hello,

Attached is a patch against release 2.06 for the "text contains OUT" bug.

The patch also includes a new test in 09-regression.t that exercises the error.

-Simon

---

diff -r -u Text-MicroMason-2.06/MicroMason/Base.pm Text-MicroMason-2.06-assembly-patch/MicroMason/B +ase.pm --- Text-MicroMason-2.06/MicroMason/Base.pm 2009-11-11 11:24:24.000000000 -0500 +++ Text-MicroMason-2.06-assembly-patch/MicroMason/Base.pm 2009-11-14 18:09:29.000000000 -0500 @@ -263,7 +263,6 @@ my ( $order, $fragments, $token_map ) = $self->assembler_vars(); my %token_streams = map { $_ => [] } map { ( /^\W?\@(\w+)$/ ) } @$order; - my ($output) = $fragments->{add_output}; while ( scalar @tokens ) { my ( $type, $token ) = splice( @tokens, 0, 2 ); @@ -274,11 +273,18 @@ or $self->croak_msg( "Unexpected token type '$type': '$token'" ); ($type, $token) = &$sub( $self, $token ); } - + if ( my $typedef = $token_map->{ $type } ) { - $typedef =~ s{\bTOKEN\b}{$token}g; - $typedef =~ s{\bQUOTED\b}{qq(\Q$token\E)}g; - $typedef =~ s{\bOUT\b}{$output}g; + # Perform token map substitution in a single pass so that uses of + # OUT in the token text are not improperly converted to output calls. + # -- Simon, 2009-11-14 + my %substitution_map = ( + 'OUT' => $fragments->{add_output}, + 'TOKEN' => $token, + 'QUOTED' => "qq(\Q$token\E)", + ); + $typedef =~ s/\b(OUT|TOKEN|QUOTED)\b/$substitution_map{$1}/g; + ( $type, $token ) = split ' ', $typedef, 2; } diff -r -u Text-MicroMason-2.06/t/09-regression.t Text-MicroMason-2.06-assembly-patch/t/09-regressi +on.t --- Text-MicroMason-2.06/t/09-regression.t 2009-10-30 16:03:16.000000000 -0400 +++ Text-MicroMason-2.06-assembly-patch/t/09-regression.t 2009-11-14 18:02:04.000000000 -0500 @@ -1,7 +1,7 @@ #!/usr/bin/perl -w use strict; -use Test::More tests => 24; +use Test::More tests => 25; use_ok 'Text::MicroMason'; @@ -177,3 +177,11 @@ } ###################################################################### + +TEXT_CONTAINS_OUT: { + my $scr_inout = 'IN <% "and" %> OUT burger'; + my $res_inout = 'IN and OUT burger'; + is $m->execute( text => $scr_inout), $res_inout; +} + +######################################################################
Direct Responses: 12606 | Write a response
Posted on 2010-03-30 08:24:00.117614-07 by ferrency in response to 11759
Re: Over-enthusiastic search-and-replace
I applied this patch. Thanks!
Direct Responses: Write a response
Perl Weekly newsletter
A free weekly newsletter for people who are busy to read all the blogs. click here to check it out.