Proposal: String#interpolate for safe templating

Hi,

I'm curious if anyone has considered a method called interpolate:

class String
  def interpolate(binding, filename, lineno)
    ... magic ...
  end
end

It would have a similar effect as %Q, but the input would already exist as a string rather than being parsed. This would avoid lots of escaping issues. i.e.

  eval("%Q{" + buffer + "}") is fine as long as buffer doesn't contain { or } in the wrong place....

Does this seem useful? I'm personally working on a template system and would find such a function very helpful. Not sure where to start if I was going to implement it - I downloaded the 1.9.2 source code but couldn't really find out where I'd add the code.

Kind regards,
Samuel

Hi,

I'm curious if anyone has considered a method called interpolate:

class String
def interpolate(binding, filename, lineno)
... magic ...
end
end

It would have a similar effect as %Q, but the input would already exist as a string rather than being parsed. This would avoid lots of escaping issues. i.e.

   eval\("%Q\{" \+ buffer \+ "\}"\) is fine as long as buffer doesn't contain \{ or \} in the wrong place\.\.\.\.

Well, you can do

buffer.gsub(%r<[\#{}]>, '\\\\\\&')

but that is probably not what you want. :slight_smile:

Does this seem useful? I'm personally working on a template system and would find such a function very helpful. Not sure where to start if I was going to implement it - I downloaded the 1.9.2 source code but couldn't really find out where I'd add the code.

I am not sure I understand how that would resolve your escaping
problem: the method in question cannot know whether you want specific
characters (namely #{ and }) as they are or as meta characters. Am I
missing something?

Kind regards

robert

···

On Wed, Feb 9, 2011 at 10:35 AM, Samuel Williams <space.ship.traveller@gmail.com> wrote:

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Samuel Williams wrote in post #980514:

Does this seem useful? I'm personally working on a template system and
would find such a function very helpful.

Of course if this is a programming exercise it's worthwhile for the
learning experience, but I hope you realise there are many templating
systems already out there :slight_smile:

First hit for "ruby templating" in google:
http://www.hokstad.com/mini-reviews-of-19-ruby-template-engines.html

I thought I had come across one which used #{...} style interpolation,
but I can't remember where now. I might have been imagining it.

···

--
Posted via http://www.ruby-forum.com/\.

Brian Candler wrote in post #980620:

First hit for "ruby templating" in google:
Mini reviews of 19 Ruby template engines

... and that's not even complete. It doesn't mention "mustache" for
instance:

I thought I had come across one which used #{...} style interpolation,
but I can't remember where now. I might have been imagining it.

It might have been Ezamar.

···

--
Posted via http://www.ruby-forum.com/\.