Using heredoc string in erb

Hi. I’d like to use heredoc notation in an erb view (I’m using Merb,
but I believe this is an erb issue, not specific to merb). For
example, I wrote a helper function that lets me use syntax like that
below. However, this example produces a parser error:

can’t find string “CODE” anywhere before EOF

Any ideas how I can get this to work? I posted this on the merb group
as well, but I suspect it’s really an erb issue:

<%= code “java”, <<-CODE

// create a panel using a GridBagLayout
JPanel panel = new JPanel (new GridBagLayout());

// three labels on the first row
panel.add (new JLabel (“One”));
panel.add (new JLabel (“Two”));
panel.add (new JLabel (“Threeeee”));

CODE %>

If I can get this to work it would be a really cool technique for
writing HTML helper functions.

Is this what you need?:

#!/usr/bin/env ruby
require ‘erb’
e = ERB.new(DATA.read)
print e.result
END
<%= code = <<-CODE.chomp

// create a panel using a GridBagLayout
JPanel panel = new JPanel (new GridBagLayout());

// three labels on the first row
panel.add (new JLabel (“One”));
panel.add (new JLabel (“Two”));
panel.add (new JLabel (“Threeeee”));
CODE
%>

2009/12/4 jakemiles [email protected]:

<%= code “java”, <<-CODE

   // create a panel using a GridBagLayout
   JPanel panel = new JPanel (new GridBagLayout());

   // three labels on the first row
   panel.add (new JLabel ("One"));
   panel.add (new JLabel ("Two"));
   panel.add (new JLabel ("Threeeee"));

CODE %>

Make that
CODE
%>

IOW, place the %> on the next line.

If I can get this to work it would be a really cool technique for
writing HTML helper functions.

HTML helper functions in Java in an ERB template? How does this work?

Cheers

robert

Thanks! The .chomp fixed it.

No, the intention isn’t to create helper functions in Java. The web
page happens to be a tutorial on Java. The helper function is a ruby
helper that appliers google’s syntaxhighlighting javascript thing to
the provided block of text.

The resulting code in the view, for posterity, is:

<%= code “java”, <<-“CODE”.chomp

// create a panel using a GridBagLayout
JPanel panel = new JPanel (new GridBagLayout());

// three labels on the first row
panel.add (new JLabel (“One”));
panel.add (new JLabel (“Two”));
panel.add (new JLabel (“Threeeee”));

CODE
%>

And the helper function it calls is this:

def code(lang, block)
“<script type="syntaxhighlighter" class="brush: #{lang}"><!
[CDATA[#{block}]]>”
end

This turns the provided block of code into this HTML:

Which is the syntax for the syntaxhighlighter package that syntax-
highlights the code in the page andmakes it look quite sharp. The
helper will also automagically include the right javascript file for
the language of the formatted code block.

On Dec 4, 9:51 am, Robert K. [email protected] wrote:

   panel.add (new JLabel ("Two"));
   panel.add (new JLabel ("Threeeee"));

CODE %>

Make that
CODE
%>

2009/12/4 jakemiles [email protected]:

Thanks! The .chomp fixed it.

For me moving the “%>” to the next line fixed it.

   JPanel panel = new JPanel (new GridBagLayout());


   // three labels on the first row
   panel.add (new JLabel ("One"));
   panel.add (new JLabel ("Two"));
   panel.add (new JLabel ("Threeeee"));

]]>

Which is the syntax for the syntaxhighlighter package that syntax-
highlights the code in the page andmakes it look quite sharp. The
helper will also automagically include the right javascript file for
the language of the formatted code block.

Erm, why do you need a helper function for this? Why not directly
place this in the ERB template

Or even do

<%= CODE_INTRO_JAVA %>
// create a panel using a GridBagLayout
JPanel panel = new JPanel (new GridBagLayout());

   // three labels on the first row
   panel.add (new JLabel ("One"));
   panel.add (new JLabel ("Two"));
   panel.add (new JLabel ("Threeeee"));

<%= CODE_END %>

with proper definitions of both constants? What am I missing?

Kind regards

robert

PS: Please do not top post.

On 4 Dez., 12:27, Robert K. [email protected] wrote:

helper that appliers google’s syntaxhighlighting javascript thing to
panel.add (new JLabel (“One”));
[CDATA[#{block}]]>"
panel.add (new JLabel (“Two”));

Or even do

with proper definitions of both constants? What am I missing?

Kind regards

robert

PS: Please do not top post.


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

Ah - thanks for all the suggestions.

  1. you’re right, it was moving the %> to its own line that did it.
    The chomp isn’t necessary.

  2. I’ll look at the HAML approach, which seems great.

  3. I didn’t think of using a constant, but I wouldn’t. I also always
    opt for functional abstraction over a variable or constant, in case I
    want to extend the behavior later without having to change all the
    instances of usage.

For example, I did end up extending the functionality. It now takes a
hash of options that it passes to syntaxhighlighter, and other options
that do my own custom stuff and wrap additional html around it.

The resulting code, much cleaner than the full syntaxhighlighter html,
is this:

<%= code :brush => “java”,
:code => <<-CODE

// create a panel using a GridBagLayout
JPanel panel = new JPanel (new GridBagLayout());

// three labels on the first row
panel.add (new JLabel (“One”));
panel.add (new JLabel (“Two”));
panel.add (new JLabel (“Threeeee”));

CODE
%>

And I was able to easily extend it with an option that places an image
floating to the right of the code (and changes the css class of the
syntaxhighlighter thing itself so it doesn’t fill 100% of the page
width):

<%= code :brush => “java”,
:image => “http://jakemiles.smugmug.com/photos/
702110106_Wtyxg-S.jpg”,
:code => <<-CODE

// create a panel using a GridBagLayout
JPanel panel = new JPanel (new GridBagLayout());

// three labels on the first row
panel.add (new JLabel (“One”));
panel.add (new JLabel (“Two”));
panel.add (new JLabel (“Threeeee”));

CODE
%>

I wonder if you could do something along the lines of Rails’ capture
helper? Then you could write

<%= code :brush=>“java” do %>
Java code goes here
<% end %>

The Java code would still be subject to erb expansion though.

If you’re using ERb outside of Rails, you should just be able to copy
what Rails does. See
http://github.com/rails/rails/blob/master/actionpack/lib/action_view/helpers/capture_helper.rb

  # The capture method allows you to extract part of a template into 

a
# variable. You can then use this variable anywhere in your
templates or layout.
#
# ==== Examples
# The capture method can be used in ERb templates…
#
# <% @greeting = capture do %>
# Welcome to my shiny new web page! The date and time is
# <%= Time.now %>
# <% end %>

Brian C. wrote:

I wonder if you could do something along the lines of Rails’ capture
helper? Then you could write

<%= code :brush=>“java” do %>
Java code goes here
<% end %>

Incidentally, it looks like this is what webby does with its coderay and
uv filters.
http://webby.rubyforge.org/reference/

jakemiles wrote:

Thanks! The .chomp fixed it.

No, the intention isn’t to create helper functions in Java. The web
page happens to be a tutorial on Java. The helper function is a ruby
helper that appliers google’s syntaxhighlighting javascript thing to
the provided block of text.

The resulting code in the view, for posterity, is:

<%= code “java”, <<-“CODE”.chomp

// create a panel using a GridBagLayout
JPanel panel = new JPanel (new GridBagLayout());

// three labels on the first row
panel.add (new JLabel (“One”));
panel.add (new JLabel (“Two”));
panel.add (new JLabel (“Threeeee”));

CODE
%>

[…]

Interesting. Something else you might want to consider: use Haml. It’s
got a number of advantages over ERb, but the relevant one here is that
you could define a custom filter so you could do

:java
// your java code
// goes here

and not mess around with here documents.

Best,
–Â
Marnen Laibow-Koser
http://www.marnen.org
[email protected]