David Novella

Un site statique fait en Swift

Alors qu’il existe Hugo, Eleventy, Astro et une douzaine d’autres générateurs de sites statiques bien maintenus, j’ai monté ce site avec Publish, de John Sundell. C’est une décision discutable, alors je l’explique.

La raison, en plus de ne rien vouloir faire avec WordPress

Publish me laisse définir le site comme une struct :

struct DavidNovella: Website {
    enum SectionID: String, WebsiteSectionID {
        case apps
        case blog
    }

    var url = URL(string: "https://davidnovella.es")!
    var name = "David Novella"
    var language: Language { .spanish }
}

Et le thème comme des fonctions qui renvoient du HTML, avec le compilateur qui surveille :

func makeItemHTML(for item: Item<Site>,
                  context: PublishingContext<Site>) throws -> HTML {
    HTML(
        .lang(context.site.language),
        .head(for: item, on: context.site),
        .body {
            SiteHeader(currentPath: item.path)
            Wrapper {
                H1(item.title)
                Div(item.body).class("content")
            }
        }
    )
}

Pas de gabarits à doubles accolades ni d’erreurs qui n’apparaissent qu’à la génération. Si j’invente un champ de métadonnées, cela ne compile pas. C’est la même sensation que travailler avec SwiftUI, appliquée au HTML.

Les inconvénients

Autant les dire :

  • Publish n’a pas été mis à jour depuis un moment. La dernière version étiquetée est la 0.9.0. Elle compile sans problème avec Swift 6.4, mais n’attendez pas de correctifs.
  • La communauté est petite. Comparé à Hugo, il y a ici peu d’écrits et peu de thèmes à copier.
  • L’écosystème de plugins est minimal. Ce dont vous aurez besoin, il faudra probablement l’écrire vous-même — même si écrire un PublishingStep demande étonnamment peu de code.

Conclusion

Comme exercice pour créer un site que je puisse maintenir sans grand effort, je crois que c’est un bon début. Plus tard, je verrai s’il me faut passer à un autre outil de génération ou faire un fork de Publish pour y changer deux ou trois choses.