Markaby is a Ruby library that lets you write HTML in Ruby. It's built into the Camping framework as the templating engine. To create elements, you call a method of that name.

# In Camping, you don't have to set up the Builder. # I'll leave it out in the other examples. mab = Markaby::Builder.new mab.p "This is a paragraph." mab.div "I can do the same thing with a div."

To nest your HTML, you can pass a block.

form :method => 'post' do legend 'Import stuff' textarea :name => 'queries', :rows => '25', :cols => '100' input :type => 'submit', :value => 'Import!' end

[A side note, the textarea method inserts some whitespace by default. Very annoying, so if you know how to get rid of it in a non-hacky way, please let me know.]

It uses lots of metaprogramming trickery to make your life a whole lot easier. For example, you can add an arbitrary class to an element by calling the class name as a method.

div.example "This div will be of class example."

The class methods can also be chained.

div.example.special "This div will be of class example _and_ special."

You can do the same thing with an id by simply appending a bang (!) to the class name.

div.main_content! "This div will have the id main_content."

But what if you want a variable class name? I can't just tack the variable name on because the magic will mean that the class will be the name of the variable, not the value.

%w[one two three].each {|c| puts mab.p.c.to_s}

That's not going to work. It will output this.

<p class="c"/> <p class="c"/> <p class="c"/>

Ruby's send method to the rescue.

%w[one two three].each {|c| puts mab.p.send(c)}

This correctly outputs this.

<p class="one"/> <p class="two"/> <p class="three"/>