Alex Young
4/8/2007 9:04:00 AM
Ken Bloom wrote:
> On Sat, 07 Apr 2007 04:07:16 +0900, Tim Pease wrote:
>
>> On 4/6/07, talkin ruby <rubytalk.heidmotron@gmail.com> wrote:
>>> just wondering if you could do something like this...
>>>
>>> ERB.new( some_erb_string ).result # '<%= result %>' another erb
>>> template
>>>
>>> so that way the result could be processed by another ERB.new
>>>
>>>
>> You are an evil and twisted individual! ;)
>>
>> To answer your question, though, sure! ERb can do that.
>>
>> require 'erb'
>>
>> @blah = '<%= @not_blah %>'
>> ERB.new( "blah <%= @blah %>" ).result #=> "blah <%= @not_blah %>"
>
> If you really want to be evil and twisted, what's the smallest self-
> reproducing erb program you can write that doesn't read its own file.
>
> The following solution is illegal:
> <%= open(__FILE__){|f| f.read} %>
Drat. This nearly works:
<%=s=";\"<%=s=\#{s.inspect}\#{s}\"%\>";"<%=s=#{s.inspect}#{s}"%>
The only reason it doesn't is that ERB barfs on '%>' in a string inside
a <%= %> block, while String#inspect ignores it. This requires... trickery.
Luckily, we have trickery on hand. When in doubt, reverse the data:
<%=s=">%\"}esrever.s{#}tcepsni.s{#=s=%<\";";"<%=s=#{s.inspect}#{s.reverse}"%>
That's 77 characters by my count. 77 characters of pure, twisted, evil :-)
--
Alex