Haml, el haiku de las páginas web
Una de tantas ventajas del modelo MVC bajo el que fue creado Rails es la relativa independencia de los componentes que lo forman. Por ejemplo sería factible reemplazar ActiveRecord con alguna otra capa ORM. Tal vez lo más interesante es poder emplear otro motor de plantillas en lugar de ERb (Embedded Ruby); éste es el interpretador de los archivos .rhtml que todo programador en Rails conoce. Existen varias opciones, las más conocidas son Markaby y RedCloth (interpretador de Textile). Sin embargo una opción interesante y que está haciendo muchas olas en la comunidad Rails es Haml (XHTML Abstraction Markup Language). La promesa de Haml es "convertir tus asquerosas plantillas en agradables Haikus". Veamos si lo cumple...
Plantillas HTML/XML tradicionales
La manera habitual de escribir código HTML, XML o variantes, es hacerlo manualmente; y a pesar de la limpieza que pueda tener el código, es un hecho que algunos factores son muy repetitivos; como por ejemplo tener que cerrar mecánicamente todas las etiquetas, o asignarles clases, identificadores y demás atributos.
Aún cuando un buen editor de texto nos puede auxiliar con estas tareas, así como con la indentación para mejorar la legibilidad del código, esta solución no es perfecta porque depende del uso del editor de texto y crea una brecha entre usuarios de editores muy potentes y automáticos y quienes prefieren un editor más sencillo y que quizá no hace tanto trabajo por el usuario.
Rails permite intercambiar el mecanismo de generación de vistas; el default es Embedded Ruby, que conceptualmente recuerda PHP y constituye para quien usa Rails por primera vez, una revelación de simplicidad y limpieza de código; aunque esto se debe primordialmente a la separación de lógica de negocios fuera de las vistas.
Otras opciones "oficiales" si bien no las únicas son Markaby y RedCloth. Red Cloth reemplaza las plantillas con una sintaxis en texto simplificada, y a partir de ésta genera el código HTML/XML correspondiente. Markaby describe las páginas programáticamente, con bloques en Ruby, generando de manera similar HTML/XML.
Haml tiene una filosofía similar a Markaby, pero en lugar de emplear código Ruby directamente, constituye un "mini-lenguaje" empleado para describir documentos XML, que siempre tienen una sintaxis jerárquica bastante rígida. El resultado es una manera más concisa de describir los documentos XML. Sin embargo el poder de Haml no sólo radica en la simplicidad; más bien la simplicidad es una característica de la que emana dicho poder.
Haml
Según el sitio oficial de Haml , está basado en la idea de que el código de descripcion de páginas debe ser hermoso. Pensando en la simplicidad de Ruby y la elegancia de Rails, Haml va un paso más allá de Markaby y simplifica el XML; recordando el axioma de que "la perfección se alcanza, no cuando ya no queda nada más por agregar, sino cuando no queda nada más por eliminar". Como lenguaje de propósito específico está completamente diseñado para documentos XML, y no tiene ninguna característica fuera de este ámbito.
Una consecuencia de esta filosofía es que la "belleza" no es superficial; el objetivo es un incremento de productividad, que se logra por medio de tres factores:
- Simplificación del código. Haml simplemente requiere escribir menos.
- Representación visual de la jerarquía del documento. Todo documento XML es una lista jerárquica. Haml permite representar esta jerarquía por medio de indentación, similar a como lo hace el lenguaje Python. Esto permite que el código sea visualmente más claro, así como eliminar la redundancia de cerrar todas las etiquetas. A cambio se tiene la desventaja de que el intérprete de Haml es MUY estricto en cuanto a la indentación.
- Compatibilidad. Haml puede coexistir con las vistas rhtml e incluso mezclar código ERb y Haml. Esto nos da la oportunidad de migrar sitios existentes de forma gradual, lo que nos da un incentivo para dicha migración así como una ruta sin riesgos para aprender Haml.
Para usar Haml existe un breve tutorial en el sitio oficial que va más o menos así.
Tutorial de Haml
Primero se debe instalar Haml, que es un plugin para Rails. Dentro del directorio de nuestra aplicación Rails, hacemos:
./script/plugin install http://svn.hamptoncatlin.com/haml/tags/stable
Una vez instalado podemos comenzar a convertir cualquier archivo rhtml a haml. Es posible hacer algo como renombrarlo:
/app/view/account/login.rhtml ==> /app/view/account/login.haml
Tras hacer esto conviene reiniciar la aplicación (WEBRick o Mongrel). Después de esto la aplicación debe funcionar tal como lo hacía antes, mostrando la compatibilidad de Haml.
Ahora podemos comenzar a convertir el documento. Veamos la equivalencia entre etiquetas HTML y Haml.
RHTML:
<small><%= item.body %></small>
Haml:
%small= item.body
En Haml podemos definir una etiqueta arbitraria con el signo de porcentaje y el nombre de la etiqueta. Esto funciona, por ejemplo, para %strong, %div, %body, %html, o cualquier otra. Después del nombre de la etiqueta viene la acción "=", que le indica a Haml que debe evaluar la expresión a la derecha y colocar el resultado dentro de la etiqueta. Una característica interesante es que Haml automáticamente enviará saltos de línea cuando haga falta para mantener consistencia en la longitud de las líneas en el XML generado.
XHTML:
# El texto corto se ve igual en Haml y RHTML
<small>Short words</small>
# Haml divide el texto largo de esta forma
<small>
Long paragraph about lots of interesting things that I'm sure
lots of people are extremely interested in.
</small>
# mientras que, RHTML lo mostraría así...
<small>Long paragraph about lots of interesting things that I'm sure
lots of people are extremely interested in.</small>
Agregar atributos a una etiqueta (como clases, id, href, alt) es igual de sencillo:
XHTML:
<small class="code" id="message">Hola, mundo!</small>
Haml:
%small{:class => "code", :id => "message"} Hola mundo!Los atributos se describen por medio de un hash de atributos y valores. En este caso nótese que no especificamos "=" después de la etiqueta; en una situación así, Haml asume que a la derecha de la etiqueta se encuentra una cadena simple y la muestra sin mayor evaluación.
Ya que la clase y el id son tan comunes, Haml tiene una sintaxis abreviada para ellos, que se basa en la sintaxis empleada en CSS y por lo tanto es familiar para quien domine CSS:
%small.code#message Hola mundo!
La clase va denotada por un punto (.) y el id por un signo número (#).
Para la etiqueta div que es muy utilizada, se puede hacer de esta manera:
%div.code#message Hola mundo!
Sin embargo es más cómodo usar la abreviación: si se omite la etiqueta, Haml asume que se trata de un div:
.code#message Hola Mundo!
¡Facilísimo!
Haml:
.content Hola Mundo!
XHTML:
<div class='content'>Hola Mundo!</div>
Un típico parcial de Rails como este:
RHTML:
<div class='item' id='<%= item.id %>'>
<%= item.body %>
</div>
se puede convertir a Haml de esta sencilla manera:
Haml:
.item{:id => item.id}= item.body
Por último este horrendo Rhtml:
<div id='content'>
<div class='left column'>
<h2>Bienvenido a nuestro sitio!!</h2>
<p>
<%= print_information %>
</p>
</div>
<div class="right column">
<%= render :partial => "sidebar" %>
</div>
</div>
¡Vamos a convertir ese monstruo en un haiku Haml!
#content
.left.column
%h2 Bienvenido a nuestro sitio!!
%p= print_information
.right.column= render :partial => "sidebar"
Como se puede ver, el código Haml es mucho más conciso y expresivo; donde básicamente cada caracter "extraño" tiene un significado específico; más aún, en la mayoría de los casos son significados muy intuitivos (indentación para denotar jerarquía) o familiares (clases e id).
Este tutorial básico de Haml da una idea de la capacidad de este pequeño lenguaje. El autor recomienda seguir este tutorial, convertir algunos rhtml a Haml, cosa que debe tomar alrededor de 20 minutos, y emplearlo como base para evaluar Haml.
¡Haml NO es perfecto!
El código en Haml es obviamente más lento de generar que el equivalente en rhtml. Los creadores de Haml han hecho esfuerzos importantes por mejorar su rendimiento, al grado que es apenas más lento que rhtml y mucho más rápido que Markaby, el competidor más cercano. Desde luego, se promueve el incremento de productividad como un factor que sobrepasa la aparente lentitud del interpretador.
Otra desventaja es que Haml es muy, muy estricto con la indentación del código. Para esto conviene tener un editor que entienda Haml y auxilie en la conservación de las indentaciones. Editores que hagan esto incluyen a Vim (con un plugin), Textmate, jEdit y Eclipse.
En general recomendamos ampliamente darle una oportunidad a Haml; aún si se determina que no es la mejor herramienta para algún proyecto en particular, el enfoque, la simplicidad del código, y la facilidad de aprender, harán pasar un rato agradable a cualquier programador.