Ir al contenido
Suscribete

Empezando con nanoc

Guardado en: Web, ruby
08:33 09/01/2010

Nanoc es un generador de páginas estáticas escrito en Ruby. Nanoc crea ficheros HTML a partir de plantillas escritas en ERB, HAML u otros lenguajes.

No necesitas nada especial en el servidor para usar nanoc, ya que las plantillas se procesan en tu ordenador. Basta con subir los ficheros estáticos generados a un servidor web y el sitio ya estará accesible.

Creando un sitio

Lo primero que tenemos que hacer es instalar nanoc y otras gemas que vamos a necesitar.

$ sudo gem install nanoc3 rack mime-types

Una vez instalado todo el siguiente paso es crear nuestro primer sitio web.

$ nanoc3 create_site mi_sitio

Esto nos genera la siguiente salida:

      create  config.yaml
      create  Rakefile
      create  Rules
      create  content/index.yaml
      create  content/index.html
      create  layouts/default.yaml
      create  layouts/default.html
Created a blank nanoc site at 'mi_sitio'. Enjoy!

El comando anterior crea un nuevo proyecto de nanoc en la carpeta ‘mi_primer_sitio’, pero aún no hay ningún fichero que podamos abrir con un navegador web. Para ello debemos indicar a nanoc que compile nuestro proyecto en un sitio estático.

$ nanoc3 compile
Loading site data...
Compiling site...
      create  [0.01s]  output/index.html

Site compiled in 0.01s.

Si echamos un vistazo al directorio output vemos que se ha creado un nuevo fichero llamado index.html. El contenido de este fichero se genera a partir de un contenedor o fichero de layout y un fichero de plantilla.

Los ficheros que genera nanoc no están pensados para abrirse directamente con el navegador, sino para ser servidos mediante un servidor web. Esto es importante, ya que nanoc por defecto utiliza rutas absolutas para los recursos (imágenes, hojas de estilo, etc…). Si abrimos el fichero directamente con el navegador seguramente veamos el contenido sin estilos aplicados.

Si a esto añadimos que con cada cambio que hagamos debemos recompilar el sitio, el proceso de desarrollo se hace muy tedioso. Para ello nanoc nos permite arrancar un servidor web local que compila automáticamente el sitio cada vez que accedemos a él. Para arrancarlo basta con escribir en el terminal.

mi_sitio$ nanoc3 aco

Con esto abrimos un servidor web en el puerto 3000 de nuestra maquina en el que podremos ver el sitio web compilado. No es necesario compilar manualmente ya que nanoc lo hará por nosotros cada vez que accedamos a este servidor.

Podemos entrar con nuestro navegador favorito en http://localhost:3000/ y veremos el sitio web compilado:

Editando plantillas

Las diferentes plantillas para generar nuestro sitio web estático se almacenan en el directorio content. Si entramos en él, veremos que tiene una estructura similar a esta:

mi_sitio/content$ ls -l
total 16
-rw-r--r--  1 alex  _www  981  4 ene 01:21 index.html
-rw-r--r--  1 alex  _www   17  4 ene 01:21 index.yaml

index.html es el fichero que contiene el contenido de la plantilla, e index.yaml es donde se almacenan los metadatos de la misma.

Vamos a modificar el título de la página. Para ello modificamos el fichero index.html y cambiamos el contenido del tag <h1> por lo siguiente:

<h1>Mi primer sitio con nanoc</h1>

Ahora abrimos el fichero index.yaml y dejamos su contenido como sigue:

--- 
title: Mi primer sitio con nanoc

Accedemos de nuevo a http://localhost:3000/ para comprobar que ha modificado el sitio con nuestros cambios.

Creando una nueva página

Crear una nueva página en nanoc es muy simple:

$ nanoc3 create_item nombre_pagina

Por ejemplo, vamos a crear una página en la que metamos información acerca de nosotros mismos

mi_sitio$ nanoc3 create_item acerca_de
      create  content/acerca_de.yaml
      create  content/acerca_de.html
An item has been created at /acerca_de/.

Si ahora apuntamos nuestro navegador a http://localhost:3000/acerca_de/ veremos que se ha creado una nueva página en blanco. Si modificamos el fichero content/acerca_de.html se actualizará el contenido de la página que acabamos de crear.

Entendiendo el layout

Los layouts (podemos tener varios) se almacenan en el directorio layouts. Si echamos un vistazo al directorio tendremos una estructura similar a esta.

mi_sitio/layouts$ ls -l
total 16
-rw-r--r--  1 alex  _www  875  4 ene 23:51 default.html
-rw-r--r--  1 alex  _www    8  4 ene 23:51 default.yaml

Esta estructura nos resultará familiar del contenido del directorio content.

Por defecto el fichero default.yaml viene vacío, así que de momento vamos a centrarnos en el contenido de default.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>A Brand New nanoc Site - <%= @item[:title] %></title>
    <link rel="stylesheet" type="text/css" href="/style.css" media="screen">
  </head>
  <body>
    <div id="main">
<%= yield %>
    </div>
    <div id="sidebar">
      <h2>Documentation</h2>
      <ul>
        <li><a href="http://nanoc.stoneship.org/tutorial/">Tutorial</a></li>
        <li><a href="http://nanoc.stoneship.org/manual/">Manual</a></li>
      </ul>
      <h2>Community</h2>
      <ul>
        <li><a href="http://groups.google.com/group/nanoc/">Discussion Group</a></li>
        <li><a href="http://groups.google.com/group/nanoc-es/">Spanish Discussion Group</a></li>
        <li><a href="http://projects.stoneship.org/trac/nanoc/">Wiki</a></li>
      </ul>
    </div>
  </body>
</html>

Como podemos ver se trata de un fichero HTML normal y corriente, salvo por dos detalles. El primero lo encontramos en el </p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>4 </pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"> <span style="color: #009900;"><<span style="color: #000000; font-weight: bold;">title</span>></span>A Brand New nanoc Site - <span style="color: #009900;"><%<span style="color: #66cc66;">=</span> @item<span style="color: #66cc66;">[</span>:<span style="color: #000066;">title</span><span style="color: #66cc66;">]</span> %><<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>></span></pre></td></tr></table></div> <p>¿Recordais que antes modificamos el fichero <code>index.yaml</code>? Bien. El contenido de ese fichero se carga en las plantillas como variables del objeto <code>@item</code>. En este caso estamos cogiendo el contenido de <code>title</code> dentro de <code>index.yaml</code> y lo estamos escribiendo en el layout como parte del título de la página.</p> <p>El segundo detalle que nos llama la atención está en la linea 9</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>8 9 10 </pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"> <span style="color: #009900;"><<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"main"</span>></span> <span style="color: #009900;"><%<span style="color: #66cc66;">=</span> yield %></span> <span style="color: #009900;"><<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>></span></pre></td></tr></table></div> <p>La llamada a <code>yield</code> se sustituirá con el contenido de la página sobre la que estemos aplicando el layout. En este caso, coge el contenido de <code>content/index.html</code> y lo coloca ahí.</p> <h3>Más información</h3> <p>Puedes ampliar información sobre nanoc en el <a href="http://nanoc.stoneship.org/tutorial/">tutorial oficial</a>, sobre el que he basado este articulo.</p> <p>Otro buen tutorial es <a href="http://nanoc2.jottit.com/">Maquetación ágil con nanoc 2.1</a>, de Ale Muñoz. Está escrito sobre una versión antigua, pero trata la herramienta de forma más profunda.</p> <p>Por último y para profundizar del todo en nanoc, es de lectura obligada el <a href="http://nanoc.stoneship.org/manual/">manual oficial</a>.</p> </div> <div class="post-pie estirar"> <div class="izq"> <a href="http://antarticonorte.com/blog/2010/01/09/empezando-con-nanoc/#respond" title="Comment on Empezando con nanoc">Sin comentarios</a> </div> <div class="drcha"><a href="http://antarticonorte.com/blog/2010/01/09/empezando-con-nanoc/trackback/" rel="trackback">TrackBack</a></div> </div> </div> <div class="modulo" id="comments"> <h2 class="t estirar"> <span class="izq">Comentarios</span> <a href='http://antarticonorte.com/blog/2010/01/09/empezando-con-nanoc/feed/'><img src="/blog/wp-content/themes/antarticonorte/img/ico-rss.gif" class="drcha" alt="RSS"/></a> </h2> <p class="sincomentarios">No hay comentarios.</p> </div> <div class="modulo"> <h2 class="t">Deja un comentario</h2> <form action="http://antarticonorte.com/blog/wp-comments-post.php" method="post" id="commentform"> <p><input type="text" name="author" id="author" value="" size="22" tabindex="1" /> <label for="author">Nombre <small>(necesario)</small></label></p> <p><input type="text" name="email" id="email" value="" size="22" tabindex="2" /> <label for="email">Correo electronico (no se publicará) <small>(necesario)</small></label></p> <p><input type="text" name="url" id="url" value="" size="22" tabindex="3" /> <label for="url">Website</label></p> <!--<p><small><strong>XHTML:</strong> You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped=""> </small></p>--> <p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea></p> <p><input name="submit" type="submit" id="submit" tabindex="5" value="Enviar comentario" /> <input type="hidden" name="comment_post_ID" value="161" /> </p> </form> </div> </div> <!-- contenido --> <div id="lateral"> <!-- begin sidebar --> <div id="about" class="modulo"> <h2 class="t">Sobre mí</h2> <div class="modulo-inner estirar"> <img alt="Alejandro Fernández" src="http://antarticonorte.com/blog/wp-content/themes/antarticonorte/img/alex.jpg" class="drcha"/> <p class="table"> <strong>Alejandro Fernández</strong> <em>Webero</em> de profesión y <a href="http://flickr.com/photos/antarticonorte/">fotógrafo</a> de afición. Escribo con más o menos acierto sobre lo que caiga en mis manos y me interese. </p> <p>Si crees tener algo que pueda interesarme: <a href="mailto:antarticonorte@gmail.com">Contacta</a></p> </div> </div> <div class="modulo" id="search"> <h2 class="t">Buscar</h2> <form class="modulo-inner" id="searchform" method="get" action="http://antarticonorte.com/blog"> <input type="text" name="s" id="s" size="15" /> <input type="submit" value="Buscar" /> </form> </div> <div id="categories-106747071" class="modulo widget_categories"><h2 class="t">Categorías</h2> <div class="modulo-inner"> <ul> <li class="cat-item cat-item-21"><a href="http://antarticonorte.com/blog/category/curro/" title="View all posts filed under Curro">Curro</a> </li> <li class="cat-item cat-item-1"><a href="http://antarticonorte.com/blog/category/fotografia/" title="View all posts filed under Fotografía">Fotografía</a> </li> <li class="cat-item cat-item-19"><a href="http://antarticonorte.com/blog/category/fotografia/lightroom-en-dos-patas/" title="View all posts filed under Lightroom en dos patás">Lightroom en dos patás</a> </li> <li class="cat-item cat-item-15"><a href="http://antarticonorte.com/blog/category/personal/" title="View all posts filed under Personal">Personal</a> </li> <li class="cat-item cat-item-48"><a href="http://antarticonorte.com/blog/category/ruby/rails-ruby/" title="View all posts filed under rails">rails</a> </li> <li class="cat-item cat-item-41"><a href="http://antarticonorte.com/blog/category/ruby/" title="View all posts filed under ruby">ruby</a> </li> <li class="cat-item cat-item-7"><a href="http://antarticonorte.com/blog/category/web/" title="View all posts filed under Web">Web</a> </li> <li class="cat-item cat-item-37"><a href="http://antarticonorte.com/blog/category/wtf/" title="View all posts filed under wtf">wtf</a> </li> </ul> </div> </div><div id="archives-2" class="modulo widget_archive"><h2 class="t">Archivo</h2> <div class="modulo-inner"> <ul> <li><a href='http://antarticonorte.com/blog/2010/01/' title='January 2010'>January 2010</a></li> <li><a href='http://antarticonorte.com/blog/2009/02/' title='February 2009'>February 2009</a></li> <li><a href='http://antarticonorte.com/blog/2009/01/' title='January 2009'>January 2009</a></li> <li><a href='http://antarticonorte.com/blog/2008/09/' title='September 2008'>September 2008</a></li> <li><a href='http://antarticonorte.com/blog/2008/07/' title='July 2008'>July 2008</a></li> <li><a href='http://antarticonorte.com/blog/2008/06/' title='June 2008'>June 2008</a></li> <li><a href='http://antarticonorte.com/blog/2008/05/' title='May 2008'>May 2008</a></li> <li><a href='http://antarticonorte.com/blog/2008/02/' title='February 2008'>February 2008</a></li> <li><a href='http://antarticonorte.com/blog/2008/01/' title='January 2008'>January 2008</a></li> </ul> </div> </div><div id="linkcat-24" class="modulo widget_links"><h2 class="t">Gentecilla</h2> <div class="modulo-inner"> <ul class='xoxo blogroll'> <li><a href="http://lacomunidad.elpais.com/danogor/posts" rel="friend co-worker">El mochilista</a></li> <li><a href="http://www.jmocana.eu/" rel="friend co-worker">Jose María Ocaña</a></li> <li><a href="http://lagaviotaasesina.blogspot.com/" rel="friend co-worker">La Gaviota asesina</a></li> <li><a href="http://www.rosajc.com/" rel="friend co-worker">Rosa JC</a></li> <li><a href="http://blogs.parasaber.com/visiones/" rel="friend co-worker">Visiones</a></li> </ul> </div> </div> <div id="linkcat-2" class="modulo widget_links"><h2 class="t">Links</h2> <div class="modulo-inner"> <ul class='xoxo blogroll'> <li><a href="http://antarticonorte.deviantart.com" rel="me" title="Galería de deviantart (un poco abandonada..)">Galería en Deviantart</a></li> <li><a href="http://flickr.com/photos/antarticonorte" rel="me" title="Galería de fotos en flickr">Galería en flickr</a></li> <li><a href="http://visionesdelmundo.blogspot.com" title="Blog colectivo de fotógrafos idos de la olla">Visiones del mundo</a></li> </ul> </div> </div> <div id="flickr" class="modulo widget_flickr"> <h2 class="t">Flickr</h2> <div class="modulo-inner"> <ul class="estirar"> <li><a href='http://www.flickr.com/photos/antarticonorte/4827351127/'><img alt='El monstruo del pelo' title='El monstruo del pelo' src='http://farm5.static.flickr.com/4143/4827351127_345c8641e1_s.jpg' /></a></li><li><a href='http://www.flickr.com/photos/antarticonorte/4827350615/'><img alt='Mi Trek' title='Mi Trek' src='http://farm5.static.flickr.com/4076/4827350615_7fcc93c93a_s.jpg' /></a></li><li><a href='http://www.flickr.com/photos/antarticonorte/4827899698/'><img alt='Sidra va' title='Sidra va' src='http://farm5.static.flickr.com/4100/4827899698_e4fc0f2f71_s.jpg' /></a></li><li><a href='http://www.flickr.com/photos/antarticonorte/4827899200/'><img alt='Llanes' title='Llanes' src='http://farm5.static.flickr.com/4135/4827899200_f637343dd2_s.jpg' /></a></li><li><a href='http://www.flickr.com/photos/antarticonorte/4827288943/'><img alt='Helados bicicleteros' title='Helados bicicleteros' src='http://farm5.static.flickr.com/4102/4827288943_5d5abf0f3a_s.jpg' /></a></li><li><a href='http://www.flickr.com/photos/antarticonorte/4821276073/'><img alt='Orbea' title='Orbea' src='http://farm5.static.flickr.com/4118/4821276073_17c9db1345_s.jpg' /></a></li><li><a href='http://www.flickr.com/photos/antarticonorte/4821235109/'><img alt='Merecido descanso' title='Merecido descanso' src='http://farm5.static.flickr.com/4120/4821235109_1ba94e913c_s.jpg' /></a></li><li><a href='http://www.flickr.com/photos/antarticonorte/4821853286/'><img alt='El viejo y el mar' title='El viejo y el mar' src='http://farm5.static.flickr.com/4080/4821853286_6d6ca2eb2a_s.jpg' /></a></li></ul> <p><a href="http://www.flickr.com/photos/antarticonorte/">Ver galería completa</a></p> <!-- End of Flickr Badge --> </div> </div> <!-- end sidebar --> </div> </div><!-- contenedor --> <div id="pie"> <div id="pie-inner"> <p>Todos los articulos están bajo licencia Creative Commons <a href="http://creativecommons.org/licenses/by-nc-sa/2.5/es/">by-nc-sa</a> a no ser que se indique lo contrario.</p> <p>Powered by <a href="http://wordpress.org">Wordpress</a></p> </div> </div> <script type="text/javascript"> var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); </script> <script type="text/javascript"> var pageTracker = _gat._getTracker("UA-6699836-1"); pageTracker._initData(); pageTracker._trackPageview(); </script> </body> </html>