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

On Wed, Feb 9, 2011 at 10:35 AM, Samuel W.
[email protected] wrote:

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

Samuel W. 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.

Brian C. 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.