Un site statique

Ce site n’a ni base de données, ni serveur qui calcule les pages à chaque visite. Les textes sont des fichiers Markdown. Le générateur Hugo les transforme une fois pour toutes en pages HTML, que l’hébergeur n’a plus qu’à envoyer.

Site dynamique (ex. WordPress)Site statique (Hugo)
Page construiteà chaque visiteune fois, à la publication
Côté serveurPHP et base de donnéesde simples fichiers
Surface d’attaqueplus largetrès réduite
Hébergementun serveur à maintenirn’importe quel hébergeur de fichiers

Le chemin d’une page

content/projets/mushaf.md            le texte, en Markdown
        │
        ▼  hugo
public/projets/mushaf/index.html     la page finale

Chaque type de page a son gabarit (template) dans le dossier layouts/ : home.html pour l’accueil, list.html pour les listes, page.html pour les articles.

Deux styles qui se répondent

Les pages de navigation imitent un terminal : l’accueil est une session où l’on tape cat profil.txt, tree projets/ et ls -t blog/. Quand on ouvre un article, on change d’outil : le texte est mis en page avec LaTeX.css, qui reprend la police et la typographie de LaTeX.

Pour que le passage de l’un à l’autre reste doux, les deux partagent la même couleur de fond, en mode clair comme en mode sombre. Seule la police change.

Une recherche façon fzf

Appuie sur / : une fenêtre s’ouvre, comme fzf dans un terminal. La liste de toutes les pages est écrite dans le HTML au moment de la génération ; le navigateur n’a plus qu’à la filtrer pendant la frappe.

La recherche est « floue » : les lettres tapées doivent apparaître dans l’ordre, mais pas forcément côte à côte. Ainsi, cmp trouve compilateur-c. Une correspondance gagne des points quand les lettres se suivent ou commencent un mot :

if (idx.length && idx[idx.length - 1] === i - 1) score += 4; // lettres consécutives
if (debutDeMot(norm[i - 1])) score += 6;                     // début de mot

Sans JavaScript, rien ne casse : tous les liens sont déjà dans les pages.

Hébergement

Le site est publié sur Cloudflare Pages : à chaque git push, Cloudflare lance hugo et met en ligne le dossier public/.