[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Customizing erb's recognized tags

ljw1001@gmail.com

12/10/2005 1:46:00 AM

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?

thanks.

thanks


6 Answers

James Gray

12/10/2005 2:14:00 AM

0

On Dec 9, 2005, at 7:46 PM, Larry White wrote:

> 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?

>> str = <<'END'
I have a #{2 - 1} line string here!
END
=> "I have a \#{2 - 1} line string here!\n"
>> eval %Q{"#{str}"}
=> "I have a 1 line string here!\n"

James Edward Gray II



ljw1001@gmail.com

12/10/2005 2:33:00 AM

0

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.

On 12/9/05, James Edward Gray II <james@grayproductions.net> wrote:
> On Dec 9, 2005, at 7:46 PM, Larry White wrote:
>
> > 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?
>
> >> str = <<'END'
> I have a #{2 - 1} line string here!
> END
> => "I have a \#{2 - 1} line string here!\n"
> >> eval %Q{"#{str}"}
> => "I have a 1 line string here!\n"
>
> James Edward Gray II
>
>
>


James Gray

12/10/2005 2:44:00 AM

0

On Dec 9, 2005, at 8:33 PM, Larry White wrote:

> 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


ljw1001@gmail.com

12/10/2005 2:58:00 AM

0

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.

thanks for your help.

On 12/9/05, James Edward Gray II <james@grayproductions.net> wrote:
> On Dec 9, 2005, at 8:33 PM, Larry White wrote:
>
> > 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
>
>


james_b

12/10/2005 3:06:00 AM

0

Larry White wrote:
> 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.ru... - Ruby Help & Documentation
http://www.artima.c... - Ruby Code & Style: Writers wanted
http://www.rub... - The Ruby Store for Ruby Stuff
http://www.jame... - Playing with Better Toys
http://www.30seco... - Building Better Tools


James Gray

12/10/2005 3:17:00 AM

0

On Dec 9, 2005, at 8:58 PM, Larry White wrote:

> 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:

>> template = <<'END'
<body>
<% for column in #{table_name}.display_columns %>
<th class="th1"><%= column.name %></th>
<% end %>
</body>
END
=> "<body>\n <% for column in \#{table_name}.display_columns %>\n
<th class=\"th1\"><%= column.name %></th>\n <% end %>\n</body>\n"
>> table = Object.new
=> #<Object:0x321188>
>> class << table
>> def display_columns
>> names = %w{col_one col_two col_three}
>> end
>> end
=> nil
>> class String
>> def name; self end
>> end
=> nil
>> table_name = "table"
=> "table"
>> template = eval(%Q{"#{template.gsub('"', '\\"')}"}, binding)
=> "<body>\n <% for column in table.display_columns %>\n <th
class=\"th1\"><%= column.name %></th>\n <% end %>\n</body>\n"
>> require "erb"
=> true
>> ERB.new(template).result(binding)
=> "<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