David Novella

Un sito statico fatto con Swift

Pur esistendo Hugo, Eleventy, Astro e una dozzina di altri generatori di siti statici ben mantenuti, ho messo su questo sito con Publish, di John Sundell. È una decisione discutibile, quindi la spiego.

Il motivo, oltre al non voler avere niente a che fare con WordPress

Publish mi lascia definire il sito come una 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 }
}

E il tema come funzioni che restituiscono HTML, con il compilatore che sorveglia:

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")
            }
        }
    )
}

Niente template con doppie graffe né errori che saltano fuori solo in fase di generazione. Se mi invento un campo di metadati, non compila. È la stessa sensazione di lavorare con SwiftUI, applicata all’HTML.

Gli inconvenienti

Conviene dirli:

  • Publish non viene aggiornato da un po’. L’ultima versione con tag è la 0.9.0. Compila senza problemi con Swift 6.4, ma non aspettarti correzioni.
  • La comunità è piccola. Rispetto a Hugo, qui c’è scritto poco e ci sono pochi temi da cui copiare.
  • L’ecosistema di plugin è minimo. Quello che ti serve, probabilmente dovrai scrivertelo — anche se scrivere un PublishingStep richiede sorprendentemente poco codice.

Conclusione

Come esercizio per creare un sito che riesca a mantenere con poco sforzo, credo sia un buon inizio. Più avanti vedrò se mi toccherà passare a un altro strumento di generazione o se farò un fork di Publish per cambiare qualcosa.