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 visite | une fois, à la publication |
| Côté serveur | PHP et base de données | de simples fichiers |
| Surface d’attaque | plus large | très réduite |
| Hébergement | un serveur à maintenir | n’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/.