Customizing erb's recognized tags

L

Larry White

Hi

Does anyone know if it's possible to change the tags that erb
recognizes so that for instance, I can have it replace on #{} instead
of <%=3D %> ?

If so, could you point me an example of how it's done?

thanks.

thanks
 
J

James Edward Gray II

Hi

Does anyone know if it's possible to change the tags that erb
recognizes so that for instance, I can have it replace on #{} instead
of <%= %> ?

You mean normal String interpolation?
I have a #{2 - 1} line string here!
END
=> "I have a \#{2 - 1} line string here!\n"=> "I have a 1 line string here!\n"

James Edward Gray II
 
L

Larry White

I need to read in a template file and apply replacements in two steps
- so i can't use the same tags for each pass.

I don't think string interpolation works on strings read from files
which are single quoted by default. If there's a way around that it
might be ok.
 
J

James Edward Gray II

I need to read in a template file and apply replacements in two steps
- so i can't use the same tags for each pass.

I don't think string interpolation works on strings read from files
which are single quoted by default. If there's a way around that it
might be ok.

I just showed how to use delayed String interpolation on any String.
My example was single quoted.

Perhaps I don't understand the question. Can you post a trivial
example of what you want to work?

James Edward Gray II
 
L

Larry White

i want to do a series of replacements on a file in two passes - one at
'compile time', one at runtime. For a simple example, if i'm
creating 2 copies of a dynamic web page - one for each of two tables -
i would replace references to the table at 'compile time' and display
the particular values of a record from the table at runtime.It might
look like this

<body>
<% for column in #{table_name}.display_columns %>
<th class=3D"th1"><%=3D column.name %></th>
<% end %>
</body>

So i want to replace #{table_name} in the first pass and the rest of
the stuff in the second pass. Since there could be a large number of
replacements at either time, I thought a solution using erb with
different tag sets might be reasonably maintainable.

thanks for your help.
 
J

James Britt

Larry said:
Hi

Does anyone know if it's possible to change the tags that erb
recognizes so that for instance, I can have it replace on #{} instead
of <%= %> ?

If so, could you point me an example of how it's done?

I wrote a hack that overrides IO.read. When IO grabs the file, it
checks the file extension; if it's an erb template, it replaces <? ?>
(with some variants) markup with <% %> before passing along the content.

It was a Good Enough sort of thing for the circumstances.


class IO
class <<self
alias real_read read
end

def IO.read( *args )
return IO.real_read( *args ) unless args[0].to_s =~ /\.rhtml/i
text = IO.real_read( *args )
s = ''
text.each_line( ) { |l|
next if l =~ /<?xml/
l.gsub!( '<?eq', '<%=')
l.gsub!( '<? ', '<% ')
l.gsub!( '?>', '%>')
s << "#{l}\n"
}
s
end
end


James



--

http://www.ruby-doc.org - Ruby Help & Documentation
http://www.artima.com/rubycs/ - Ruby Code & Style: Writers wanted
http://www.rubystuff.com - The Ruby Store for Ruby Stuff
http://www.jamesbritt.com - Playing with Better Toys
http://www.30secondrule.com - Building Better Tools
 
J

James Edward Gray II

i want to do a series of replacements on a file in two passes - one at
'compile time', one at runtime. For a simple example, if i'm
creating 2 copies of a dynamic web page - one for each of two tables -
i would replace references to the table at 'compile time' and display
the particular values of a record from the table at runtime.It might
look like this

<body>
<% for column in #{table_name}.display_columns %>
<th class="th1"><%= column.name %></th>
<% end %>
</body>

So i want to replace #{table_name} in the first pass and the rest of
the stuff in the second pass. Since there could be a large number of
replacements at either time, I thought a solution using erb with
different tag sets might be reasonably maintainable.

My example pretty much works for that, with minor tweaks:
<body>
<% for column in #{table_name}.display_columns %>
<th class="th1"><%= column.name %></th>
<% end %>
</body>
END
=> "<body>\n \n <th class=\"th1\">col_one</th>\n \n <th class=
\"th1\">col_two</th>\n \n <th class=\"th1\">col_three</th>\n \n</
body>\n"

I wouldn't do it though. What's the harm of sticking the table name
in a variable each tim before you run the template through ERb?
Heck, run the templates like this:

ERB.new(template).result(table.instance_eval { binding })

And then just call display_columns directly.

Hope the helps.

James Edward Gray II
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,200
Messages
2,571,046
Members
47,646
Latest member
xayaci5906

Latest Threads

Top