From: Alex Young Date: 2007-04-08T18:04:06+09:00 Subject: Re: can erb produce erb? Ken Bloom wrote: > On Sat, 07 Apr 2007 04:07:16 +0900, Tim Pease wrote: > >> On 4/6/07, talkin ruby 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