Après la superbe trilogie « écrire une page web de nos jours », voici enfin la suite tant attendue.
Pour rappel :
- Ecrire une page web de nos jours
- Ecrire une page web de nos jours, suite de aventures
- Ecrire une page web de nos jours, troisième partie
Mais quelle suite pouvait-on donner alors ? Avec ces trois épisodes nous avons touché du bout des doigts la création d'une page web aujourd'hui. Bon, on en est resté au strict minimum avec haml, git, markdown, ruby, gem, guard, rake, sass, coffeescript, bundler, redcarpet, gollum, etc. Evidement pas question d'en rester là !
Voici un petit résumé tout de même :
- le html c'est surfait
- le css c'est tellement 2012
- ruby c'est indispensable
- gem say bien
- markdown ça enlarge ta capacité à écrire
- javascript c'est pour les boutonneux, coffeescript c'est pour les vrais
Pfiou, on en avait vu des choses tout de même !
L'ensemble était orienté "simple page web". Mais les simples pages, say trop nul, il en faut deux ! (ou plus...) Et c'est ainsi qu'est né Web Log Today ! Voyons donc désormais comment écrire un blog de nos jours !
Présentation
Web Log Today (wlt
) est né d'un besoin très simple : remplacer mon vieux blog dotclear par un ensemble beaucoup plus sympa :
- site / blog statique (pas besoin d'un langage côté serveur)
- markdown comme langage principal de contenu
- génération simple de flux atom, sitemap, etc
- gestion (bien qu'un peu sommaire pour le moment) de tags
- gestion de billets mais aussi de pages statiques
- utilisation de templates pour ne pas se répéter tout le temps
- que des technos cool (mais pour le coup elles sont presque toutes dans la version "écrire une page web de nos jours")
Au final, ça donne quelque chose dans le même genre que jekyll avec quelques différences :
- haml est utilisé aussi bien comme langage de template que comme générateur de html
- sass est utilisé par défaut pour les css
- coffeescript est utilisé par défaut pour le javascript
- uniquement markdown est supporté côté contenu, et on ne peux pas utiliser de template dans les contenus
Sinon c'est un peu le même principe, il y a pas mal de ressemblances entre autre sur les headers des fichiers (pour indiquer le layout à utiliser, le titre, les tags, etc).
Installation
La majeur partie de Web Log Today est la commande wlt
. Cette commande est basée sur sub et ça c'est juste très pratiques. Pour la suite, je pars du principe que vous allez l'installer dans ~/.wlt
.
Dépendances
Récupération des sources
git clone https://github.com/eunomie/wlt.git ~/.wlt cd ~/.wlt
Récupération des dépendances
bundle
Mise à disposition
Pour bash :
echo 'eval "$(<wltpath>/bin/wlt init -)"' >> ~/.bash_profile exec bash
Pour zsh :
echo 'eval "$(<wltpath>/bin/wlt init -)"' >> ~/.zshenv source ~/.zshenv
Et voilà, wlt
est dispo !
Mise à jour
Evidemment, c'est juste trop facile !
cd ~/.wlt && git pull && bundle
Un petit apparté sur le côté git : le but est de garder la branche master
toujours installable. Il devrait donc être possible en permanence de faire un pull
depuis le master sans craindre le moindre problème. Les développements futurs seront +
Usage
Le principe global est plutôt simple. wlt
va lire des informations dans des dossiers spécifiques, va les compiler en css, js et html afin d'en générer un site statique. De manière globale le principe est :
convention over configuration
La majorité des choses repose donc sur certaines conventions, en premier lieu les fichiers et répertoires.
_site
Ce répertoire contient l'ensemble des fichiers générés. Il s'agit réellement de votre site web, il suffit de le copier sur votre serveur pour le rendre disponible.
_posts
Le répertoire _posts
contient logiquement les billets de votre blog. Il s'agit de fichiers markdown dont le titre a la structure suivante :
yyy-mm-dd-title-of-the-blog-post.md
yyyy
: année de publicationmm
: mois de publicationdd
: jour de publicationtitle-of-the-blog-post
: nom du fichier, en général le titre du billet sans accent ni espace ni caractère spéciaux
Le fichier html généré sera :
yyyy/mm/dd/title-of-the-blog-post.html
_pages
Vous pouvez définir des fichiers statiques qui ne sont pas des billets de blog. Ces fichiers se trouvent dans le répertoire _pages
et sont des fichiers markdown. Le nom du fichier markdown sera le nom du fichier html généré. Par exemple index.md
deviendra index.html
.
Certaines fichiers un peu plus spéciaux peuvent être présents, voir la partie spécifique.
_css
Contient l'ensemble des fichiers sass destinés à être compilés en css. Les fichiers "racines" sont spécifiés dans la configuration (voir plus loin). Le fichier généré est le nom du fichier sass avec l'extension css. Par exemple application.sass
donnera application.css
Vous pouvez utiliser toutes les fonctionnalités de sass, entre autre les @import
vous permettant de factoriser vos css.
Si vous avez des fichiers css
à inclure, et donc ne nécessitant pas une compilation, se référer à la partie publique.
Note : il est bien sur possible d'avoir plusieurs fichiers css de sortie.
_js
Contient l'ensemble des fichiers coffeescript destinés à être compilés en javascript. Les fichiers à compilés sont à spécifier dans la configuration.
Le fichier généré est le nom du fichier coffeescript avec l'extension js. Par exemple application.coffee
donnera application.js
.
Pour le moment il n'y a pas de mécanismes permettant de concaténer plusieurs fichiers coffeescript en un. Dans un premier temps ce n'est pas réellement nécessaire car le but était de faire un site/blog simple et non une application web. Néanmoins un système type sprockets pourra être envisagé par la suite.
Si vous avez des fichiers js
à inclure, et donc ne nécessitant pas une compilation, se référer à la partie publique.
Note : il est bien sur possible d'avoir plusieurs fichiers javascript de sortie.
_layouts
Contient l'ensemble des fichiers haml de templates. Il peut s'agir aussi bien de fichiers "racines" fournissant l'html de base que de fichiers partiels (à charger avec render :partial => "..."
) ou des fichiers "intermédiaires".
Les contenus (pages, posts) déclarent dans leur entête le template à utiliser. Un template peut également faire appel à un template parent. Ceci permet par exemple d'avoir un premier template correspondant à tout ce qui tourne autour du contenu généré par le markdown, et un autre dédié à la page en elle-même. Pour plus d'explications, je vous suggère juste d'aller voir les exemples.
_pub
Ce répertoire est probablement le plus simple. Tout ce qui est contenu dedans sera copié à la racine du site. Il permet donc d'inclure des fichiers css, des javascript, des images, des ressources diverses, des fichiers html générés par d'autres moyens, etc.
config.yaml
Le fichier config.yaml
contient les paramètres nécessaire à la génération du site. Il s'agit de paramètres "systèmes" (par exemple l'url, le chemin de déploiement) ou simplement des paramètres destinés à être factorisés (comptes, infos twitter, etc).
Voici un exemple de fichier, commenté :
# URL du site généré (les liens sont tous absolus)
site_url: http://log.winsos.net
# URL de déploiement, via rsync
deploy_to: ...@www.....lan:/var/www/log/
# Titre des pages
title: CrEv's log
# Informations twitter cards, opengraph, etc
# Nom de l'auteur
name: Plop Plop
# Twitter site / creator -> twitter cards
twitter_site: _crev_
twitter_creator: _crev_
# Description par défaut si non fournie
default_description: My personal weblog
# Divers comptes, permettant d'être affichés dans une page about dans les templates par défaut
accounts:
twitter: https://twitter.com/_crev_
gplus: https://plus.google.com/112813954986166280487
github: http://github.com/eunomie
coderwall: https://coderwall.com/crev
linkedin: http://fr.linkedin.com/in/yvesbrissaud
# Assets, description des css/js à générer (nom des fichiers sans extension)
assets:
css: [application, cv]
js: [application]
A part le premier (site_url
) qui est réellement conseillé, le reste est toujours optionnel et dépend de vos templates. Ceci n'est donc qu'un exemple et vous pouvez en rajouter autant que vous voulez. Ils seront donc accessible de partout via les objets ruby.
Headers
Chaque fichier markdown et haml peut débuter par un entête ajouter quelques méta données. Selon les cas (pages, billet, template) les paramètres ne sont pas forcément tous obligatoire. Voici les paramètres dans le cas d'un billet de blog.
Tout d'abord l'entête doit toujours débuter à la première ligne du fichier, par ---
et termine par une ligne contenant uniquement ---
.
Ce qui est entre ces lignes est du yaml.
Voici donc les données les plus courantes :
layout
: nom du fichier haml qui va recueillir la sortie de markdowntags
: tableau contenant les tags relatif au billettitle
: Titre clair, avec accents et autresauthor
: Nom de l'auteuremail
: email de l'auteur. L'email n'est pas affiché, il est utilisé pour afficher le gravatar correspondanttwitter
: compte twitter de l'auteur. Optionnel, il peut être défini dans la configurationpublished
: sifalse
permet de ne pas généré la sortie. Cela permet de versionner certains contenus avant qu'ils soit publiés
Par exemple :
---
layout: post
tags: [web_log_today]
title: Web Log Today est juillet
author: Yves
email: plopplop@....com
twitter: _crev_
published: false
---
Note : vous pouvez rajouter sans aucun problème des métadonnées propres. Elles seront accessibles via les objets ruby comme détaillé plus bas. Cela peut vous permettre d'améliorer vos templates, votre site, en posant le maximum de données dans les fichiers markdown ce qui permet de rendre la saisie plus agréable.
Fichiers spéciaux
Deux fichiers un peu plus spéciaux peuvent être présent dans le répertoire _pages
et un dans le répertoire _layouts
.
Le premier est simplement le fichier atom.xml.haml
. Comme son nom l'indique il permet de générer un fichier atom.xml
et donc permet d'offrir à vos lecteurs un flux à placer dans un quelconque lecteur. Par défaut il permet de générer un flux basé sur les articles de blogs uniquement.
Le deuxième, un peu dans le même veine, est le fichier sitemap.xml.haml
. Il permet de générer un fichier sitemap.xml
listant l'ensemble des ressources html de votre site.
Enfin le fichier tags.haml
peut être présent dans le répertoire _layouts
afin d'afficher tous les billets d'un tag commun. Contrairement à tous les autres cas, ce fichier aura de multiples sorties, un fichier par tag, présent dans le répertoire tags
.
Objets ruby
Les fichiers haml peuvent accéder à un certain nombre de propriétés et méthodes. L'ensemble n'est pas parfaitement unifié mais cela fonctionne plutôt bien. C'est un point qui sera amélioré par la suite.
Voici les propriétés les plus importantes accessibles dans les fichiers haml :
name
: nom du fichier@contents
: propriétés globales du contenuconfig
: yaml du fichier du configurationlist
: ensemble des postslist_lasts(number)
: ensemble des posts, au plusnumber
list_by_date
: ensemble des posts organisés par année, mois, jouraccount?(name)
: vérifie la présence d'un comptename
dans la configurationaccount(name)
: valeur du comptename
dans la configurationtag
: tag courant, dans le cadre detags.haml
urls
: l'ensemble des urls des billets et pages
link_to(url)
: transforme une url relative en url absolue en utilisant la configurationgravatar?
: teste la présence d'un email pour afficher un gravatargravatar
: url de l'image gravatarpublished?
: présence du paramètrepublished
dans l'entêtepublished
: valeur du paramètrepublished
de l'entête outrue
date
: date, dans le cas d'un billet<...>?
: teste la présence de<...>
dans l'entête<...>
: valeur de<...>
dans l'entête@scope
: En gros idem que tout cela, mais spécifiquement au contenu markdown. Cela permet d'avoir accès aux valeurs de l'entête du contenu ainsi que celles de l'entête du hamlcontent
: contenu html à insérer (généré à partir du markdown ou à partir du haml)
D'autres propriétés existent, mais entre ça et les exemples ça devrait permettre de commencer ;-)
Et donc, comment que ça marche en pratique ?
Quelques petites commandes au niveau de wlt
:
wlt assets
Compilation des css et javascript.
wlt build
Vide le répertoire de sortie et génère l'intégralité des données.
wlt clean
Vide le répertoire de sortie
wlt gollum
Lance gollum afin de visualiser et éditer les fichiers markdown du projet. Attention, seuls les fichiers ajoutés à git sont gérés.
wlt serve
Compile l'ensemble des données en changeant l'url de destination et le rend disponible sur http://localhost:4000
wlt scaffold
Permet de générer une version de base, simple ou déjà relativement complexe, facilitant le démarrage avec wlt
.
Les deux commandes sont wlt scaffold basic
et wlt scaffold full
.
La version basique contient le strict minimum pour bien commencer :
- fichier css de base
- fichier js de base
- une page d'index listant tous les billets
- un template pour les billets
- un header contenant les infos twitter, opengraph, etc
- un atom, un sitemap
- un fichier rake et un fichier guard
La version complète rajoute :
- un css déjà correct (couleurs, mise en page, etc)
- tags, pages
- quelques partiels
Getting started
Pour finir, voici un mini tuto pour prendre en main wlt
.
Créer un répertoire destiné à recevoir vos sources, dans notre cas
mon_supair_blog
mkdir mon_supair_blog cd mon_supair_blog
On échafaude en version basique (pour la version full je vous laisse regarder)
Attention,
wlt scaffold
nécessite un répertoire vide.wlt scaffold basic
Vous vous retrouvez donc avec tout ce qu'il faut pour commencer.
Vous pouvez déjà voir le rendu tout de suite :
wlt serve
Puis rendez-vous sur http://localhost:4000
Et voilà, votre blog est en route !
Créer un dépôt git (utile pour plein de raisons, entre autre pour l'édition)
git init git add . git ci -m "Initial scaffold"
Un peu de configuration
Editez le fichier
config.yaml
. La configuration est plutôt simple et claire.Editez le fichier
_pub/robots.txt
pour changer l'adresse du fichier sitemap.Si vous voulez utiliser le déploiement via rake ajoutez une clé
deploy_to
. Vous pouvez voir l'usage dans le fichierRakefile
.Editez le contenu, ajoutez un post, etc.
Si vous voulez éditer un contenu existant (et versionné dans git) le plus simple est d'utiliser gollum :
wlt gollum
Puis rendez-vous sur http://localhost:4567/pages
Vous pouvez aussi éditer le fichier markdown à la main.
Si vous voulez créer un nouveau post, facile :
touch _posts/2013-01-29-web-log-today-say-cool.md git add _posts/2013-01-29-web-log-today-say-cool.md git ci -m "Add new post" wlt gollum
Ha oui, faites attention à un point : gollum commit dans git lorsque vous enregistrez.
Un peu plus loin ?
wlt serve & guard
Comme ça, vous pouvez éditez vos fichiers, et voir le rendu en même temps sans relancer les commandes à la main.
Publication
Si votre serveur permet de faire du rsync, facile :
rake deploy
Et voilà, c'est dispo !
Alors, trop facile, non ?
Mot de la fin
Et voilà, c'est la fin de la prez. Alors, vous voyez bien que le html c'est surfait !
Comme quoi, on part d'un besoin tout bête, faire une page web tout simple, et on arrive à un générateur de site et blog statique top moumoute à base de ruby, markdown et plein de trucs trop cool.
Ha oui, le tout est sous licence BSD, donc faites vous plaisir.
Il reste pas mal de taff, par exemple améliorer vraiment la partie ruby, enfin les objets utilisés côté haml surtout. Et rajouter des tests aussi, j'aimerais bien le blinder de rspec.
Donc voilà, je ne sais pas comment ce petit soft évoluera, la principal étant qu'il répond à mon propre besoin.
Il ne manquerait pas un truc ?
Ha oui, l'url à laquelle trouver tout cela : https://github.com/eunomie/wlt