Débuts avec Nanoc

Nanoc est un outil de publication de sites statiques écrit en Ruby. Ca permet de structurer facilement un site statique : définir un layout, gérer du contenu (un peu) dynamique, formatter ses pages avec Markdown ou Textile, etc.

Vous êtes invité à suivre les docs Installing nanoc et Getting started si vous voulez essayer nanoc.

En bref dans un environnement RVM-isé:

rvm use 1.9.2@nanoc --create
gem install nanoc adsf
nanoc create_site blah
cd blah
nanoc compile && nanoc view

Et ouvrez dans votre navigateur préféré http://localhost:3000

Evidemment, rien n’interdit en production de gérer ces gems avec bundler dans un Gemfile.

Première chose qui m’a déplu, nanoc transforme tout content/blah.html en output/blah/index.html. Ca fait peut-être plus joli dans la barre d’adresse du navigateur, mais mes fichiers s’appellent tous index.html, ça rend notamment les copies avec scp illisibles. Ce comportement est géré dans une “route” du fichier Rules à la racine de votre site :

route '*' do
item.identifier + 'index.html'

Que vous pouvez changer en :

route '*' do
if item.identifier != "/" && item.attributes[:extension] == "html"
  item.identifier.gsub(%r(/$),'.html')
else
  item.identifier + 'index.html'
end

Je ne sais pas si c’est la méthode recommandée, mais ça fonctionne à première vue.

Autre chose, autrement plus gênant, comment gérer votre contenu vraiment statique (par exemple des images) ? Vous allez vite vous rendre compte si vous mettez une image à la racine de votre site qu’il refuse de compiler, indiquant que blabla.jpg n’est pas un fichier ERB valide. Pour résoudre ça, j’ai choisi de me faire un dossier content/assets/ dont les fichiers seront copiés tels quels dans output/assets/, sans compilation ni filtrage. Voici les règles à insérer dans votre fichier Rules (attention, l’ordre ayant une importance, chacune a été placée au dessus de la règle “*” correspondante). Pour la règle de compilation :

compile '/assets/*' do
# don't filter or layout

Et pour celle de routage :

route '/assets/*' do
item.identifier.gsub(%r(/$),'.')+item.attributes[:extension]

A suivre…