Ciao! Se è la prima volta che capiti su questo sito, ti consiglio di consultare la pagina principale di questo cosiddetto Giardino Digitale per scoprire meglio cos’è e come navigarlo.
Lo stato di questa nota è al momento: 🟢 Completa.
Stai creando un tuo Giardino Digitale in cui vuoi inserire una funzionalitĂ presente nel mio? Sei nel posto giusto!
Man mano che modifico le impostazioni di questo Giardino Digitale discostandomi dal template di default, segno qua tutto ciò che faccio, anche con l’obiettivo di facilitare il lavoro al me del futuro nel caso in cui ci sia bisogno di ricreare da zero il repository.
Nel caso in cui non ti fosse chiaro quello che spiego qua in questa nota, puoi direttamente consultare il codice sorgente del sito andando sul repository.
1 - Punto di partenza
Come punto di partenza c’è, ovviamente, la creazione del giardino digitale a partire dal template di default che Quartz offre. La versione di Quartz che sto usando al momento in cui sto scrivendo questa nota è la 5.0.0. Eventualmente, nel futuro, aggiornerò Quartz a versioni successive e, se si dovesse rompere qualcosa, specificherò qua come sistemarlo.
Le istruzioni su come costruire e impostare inizialmente un giardino digitale si trovano nella home page di Quartz.
Qua sotto riporto un paio di problemini che ho riscontrato durante l’installazione di Quartz:
Attenzione: errore nel cloning del repository
Se durante il cloning del repository (cioè dopo aver eseguito il comando git clone https://github.com/jackyzha0/quartz.git) esce il seguente messaggio
error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL (err 8)error: 40 bytes of body are still expectedfetch-pack: unexpected disconnect while reading sideband packetfatal: early EOFfatal: fetch-pack: invalid index-pack output
Se durante l’installazione di Quartz, dopo aver eseguito il comando npm i, esce un errore del tipo
added 526 packages, and audited 528 packages in 9s173 packages are looking for funding run npm fund for details3 vulnerabilities (2 moderate, 1 high)To address all issues, run: npm audit fixRun npm audit for details.
allora eseguire il comando npm audit fix per risolvere.
2 - Configurazione
Ecco quindi tutte le modifiche che ho applicato al sito per personalizzarlo.
2.1 - Configurazione generale
Nel file quartz.config.yaml ho configurato queste impostazioni generali:
pageTitle: 🪴 Giardino Digitale di Rexus752: titolo del Giardino Digitale che compare sulla sinistra di ogni nota.
locale: it-IT: per impostare la lingua in italiano.
baseUrl: rexus752.dev: URL del sito (anche se in realtĂ nella mia configurazione non serve a qualcosa in particolare).
La prima parte del file quartz.config.yaml risulta così:
Per i body (cioè il testo normale come questo che stai leggendo) uso il typeface Inter, ossia lo stesso che GNOME usa di default a partire dalla versione 47 e che io reputo uno dei migliori sulla piazza al momento (è anche completamente gratuito!).
Per il codice, uso il typeface Fira Code, studiato appositamente per creare legature, cioè unioni tra due o più glifi (simboli, lettere, ecc.). Per esempio, se scrivo due volte di fila =, Fira Code mi mostra un unico segno: ==.
Per usare questi font, ho modificato il file quartz.config.yaml in questo modo:
Il mio Giardino Digitale contiene note divise per cartelle a seconda dell’argomento di cui trattano. Ogni cartella ha una nota associata e le relative sotto-cartelle e sotto-note comprese in quell’argomento.
Per esempio, la cartella Matematica contiene la nota Matematica.md che fa da introduzione a quell’argomento e le sue sotto-cartelle come Teoria degli insiemi che a sua volta avrà la sua nota principale:
đź“‚ Matematica/
├── 🗒 Matematica.md
├── 🗒 Analisi.md
└── 📂 Teoria degli insiemi/
└── 🗒 Teoria degli insiemi.md
Per ovviare a questo problema, Quartz offre già a priori una soluzione: nella cartella desiderata, si può rinominare la sua “nota associata” in _index.md o index.md in modo da sostituirla alla nota della cartella. Il titolo della nota lo prende dalla proprietà title inserita nel frontmatter della nota.
Quindi, nella cartella Matematica, la nota Matematica.md diventa _index.md e, quando nell’Esplora sul lato della pagina cliccherò su Matematica, non mi porterà alla pagina della cartella, ma a quella della nota Matematica.md.
Il risultato è il seguente:
đź“‚ Matematica/
├── 🗒 _index.md
├── 🗒 Analisi.md
└── 📂 Teoria degli insiemi/
└── 🗒 _index.md
Per modificare il codice SCSS, Quartz mette a disposizione il file custom.scss nella cartella quartz/styles per scriverci le proprie modifiche. In nome del sacro principio della modularità del codice, ho inserito questa modifica in un file disable-folder-page.scss in una sotto-cartella custom della cartella quartz/styles che, appunto, conterrà tutte le varie modifiche da applicare all’SCSS del sito.
Quindi, nel file disable-folder-page.scss in quartz/styles/custom ci ho scritto questo:
quartz/styles/custom/disable-folder-page.scss
.page-listing { display: none;}
E, per dire a Quartz di leggere questo file, nel file custom.scss nella cartella quartz/styles ci ho scritto ciò:
Per fare in modo che anche nelle folder page (cioè nelle pagine-cartelle come Matematica) escano tutti i componenti come l’indice, ho modificato le impostazioni del layout che si possono trovare in fondo al quartz.config.yaml:
Nel layout delle pagine ho rimosso i backlinks, cambiando in false il valore di enabled tra le opzioni del plugin Backlinks in quartz-config.yaml:
quartz.config.yaml
- source: github:quartz-community/backlinks enabled: false layout: position: right priority: 50
Nel layout delle pagine ho anche rimosso anche i graph view, che per quanto possano essere carini sono comunque inutili:
quartz.config.yaml
- source: github:quartz-community/graph enabled: false layout: position: right priority: 10
2.6 - Icona personalizzata
Nella cartella quartz/static ho sostituito il file icon.png con una mia icona personalizzata, che è appunto l’icona di questo Giardino Digitale:
Questa l’ho creata attraverso il generatore sul sito ufficiale di Obsidian che ti permette di personalizzare la nuova icona di Obsidian adottata nel 2023 con i tuoi colori. Io ho usato gli stessi colori della mia classica immagine di profilo che uso ovunque, ossia quella di Patrick con il cervello esploso:
Ne ho approfittato anche per sostituire con questa icona il file og-image.png, sempre nella cartella quartz/static, che è la foto che compare nelle preview del Giardino Digitale quando si inserisce il link in un messaggio:
Facendo ciò ho anche disabilitato il plugin Custom OG Images nel file quartz.config.yaml, che è il plugin che si occupa di generare delle preview uniche per ogni nota del sito (e che, in realtà , rallenta anche il tempo di build del sito):
Per applicare la modalità scura forzata anche nel syntax highlighting (cioè il colore nel codice) ho modificato le impostazioni del relativo plugin Syntax Highlighting che si possono trovare in quartz.config.yaml, semplicemente scambiando i valori github-light e github-dark:
Teoricamente ci sarebbe da fare la stessa cosa anche per i diagrammi Mermaid ma, dato che non li uso in questo sito, non mi va di cimentarmi inutilmente nel capire come potrebbe essere fatto.
2.8 - Foto centrate
Esattamente come avrai potuto notare con quelle che ho inserito qua sopra, le foto vengono automaticamente centrate nel mezzo della pagina.
Ciò si può fare modificando il codice SCSS del sito aggiungendo un modulo al file custom.scss. Ho aggiunto il file centered-img.scss in quartz/styles/custom e ci ho scritto questo dentro:
quartz/styles/custom/centered-img.scss
img { display: block; margin: auto;}
E, per dire a Quartz di leggere questo file, nel file custom.scss nella cartella quartz/styles ci ho scritto ciò:
All’interno del mio Giardino Digitale, uso diversi callout personalizzati, descritti attraverso codice SCSS e implementati dal plugin Callouts. Tutti i callout che ho aggiunto sono inseriti nel file callouts.scss nella cartella quartz/styles/custom col seguente formato:
Lo aggiungo nel file callouts.scss sostituendo la stringa <URL-encoded SVG> con quella appena copiata.
Qua sotto ho inserito una lista dei callout che uso, ognuno dei quali ha al proprio interno il codice SCSS per impostarlo (clicca sulla freccetta affianco al titolo del callout per espanderlo).
@use "./variables.scss" as *;@use "./custom/callouts.scss";@use "./custom/centered-img.scss";@use "./custom/disable-folder-page.scss";@use "./custom/fix-collapsed-callouts.scss";
2.11 - Stile delle tabelle personalizzate
Le tabelle, nel tema di default di Quartz, sono orribili: non hanno le linee che separano le colonne, sono fin troppo piene di spazi vuoti e le righe si distinguono difficilmente.
Per risolvere questo problema, ho creato un file quartz/styles/custom/table-style.scss:
@use "./variables.scss" as *;@use "./custom/callouts.scss";@use "./custom/centered-img.scss";@use "./custom/disable-folder-page.scss";@use "./custom/fix-collapsed-callouts.scss";@use "./custom/table-style.scss";
2.12 - Icone nei titoli delle note
Attenzione: non aggiornato alla versione v5 di Quartz
Non ho ancora aggiornato l’implementazione delle icone nei titoli delle note alla versione v5 di Quartz, infatti quello che segue qua sotto è la scorsa implementazione che usavo per la versione v4. Ho lasciato comunque qui questa descrizione come promemoria al me del futuro per ricordarmi quello che c’è da fare per implementare queste icone.
In questo Giardino Digitale, ogni nota ha associata una icona colorata in formato SVG. Le icone le prendo da varie fonti, tra cui FontAwesome e Tabler Icons, e le inserisco nella cartella content/_icons con lo stesso nome della nota a cui fa riferimento.
Per modificare il colore delle icone scaricate, prima le formatto usando lo script svg-formatter.py che ho scritto io con le mie manine (e che puoi trovare nella cartella scripts) e poi modifico a mano il codice SVG impostando il colore desiderato nel parametro fill.
Per aggiungere le icone affianco ai titoli delle note, ho modificato il file quartz/components/ArticleTitle.tsx in questo modo:
Piccolo disclaimer: lo so che questa porzione di codice l’ho scritta col culo, ma non sono un web developer e a malapena so destreggiarmi con il TypeScript. Ci sono sicuramente modi più puliti per realizzare quello che voglio fare, ma ci accontentiamo.
Per aggiungere le icone ai titoli delle note anche all’interno dell’Esplora sul lato della pagina, ho chiesto sul server Discord ufficiale di Quartz un aiutino su come farlo ma nessuno mi ha aiutato. Allora ho chiesto un aiutino al mio caro amico Deepseek, che in un quarto d’ora ha saputo aiutarmi a raggiungere il risultato voluto.
Aggiungere nel file quartz/components/scripts/explorer.inline.ts sia nella funzione createFileNode che nella funzione createFolderNode questi pezzi di codice che integrano le icone nei template che Quartz usa per generare le entry dei file e delle cartelle nell’Explorer:
quartz/components/scripts/explorer.inline.ts
function createFileNode(currentSlug: FullSlug, node: FileTrieNode): HTMLLIElement { const template = document.getElementById("template-file") as HTMLTemplateElement const clone = template.content.cloneNode(true) as DocumentFragment const li = clone.querySelector("li") as HTMLLIElement const icon_local = li.querySelector(".file-icon-local") as HTMLImageElement if (icon_local) { icon_local.src = `/_icons/${node.displayName.replaceAll(" ", "-")}.svg` icon_local.alt = "" } const icon_sync = li.querySelector(".file-icon-sync") as HTMLImageElement if (icon_sync) { icon_sync.src = `/digital-garden/_icons/${node.displayName.replaceAll(" ", "-")}.svg` icon_sync.alt = "" } const a = li.querySelector("a") as HTMLAnchorElement a.href = resolveRelative(currentSlug, node.slug) a.dataset.for = node.slug a.textContent = node.displayName if (currentSlug === node.slug) { a.classList.add("active") } return li}function createFolderNode( currentSlug: FullSlug, node: FileTrieNode, opts: ParsedOptions,): HTMLLIElement { const template = document.getElementById("template-folder") as HTMLTemplateElement const clone = template.content.cloneNode(true) as DocumentFragment const li = clone.querySelector("li") as HTMLLIElement const icon_local = li.querySelector(".folder-icon-local") as HTMLImageElement if (icon_local) { icon_local.src = `/_icons/${node.displayName.replaceAll(" ", "-")}.svg` icon_local.alt = "" } const icon_sync = li.querySelector(".folder-icon-sync") as HTMLImageElement if (icon_sync) { icon_sync.src = `/digital-garden/_icons/${node.displayName.replaceAll(" ", "-")}.svg` icon_sync.alt = "" } const folderContainer = li.querySelector(".folder-container") as HTMLElement const titleContainer = folderContainer.querySelector("div") as HTMLElement const folderOuter = li.querySelector(".folder-outer") as HTMLElement const ul = folderOuter.querySelector("ul") as HTMLUListElement // ...}
Aggiungere effettivamente nel template delle entry in quartz/components/Explorer.tsx i tag <img> per inserire le icone:
quartz/components/Explorer.tsx
Per evitare che l’icona faccia allineare il nome della cartella a destra, nel file quartz/components/styles/explorer.scss ho modificato il tipo di display:
quartz/components/styles/explorer.scss
Questo è ciò che ho in mente di fare per migliorare il sito:
Trovare un modo per caricare nel repository anche quelle cartelle che Quartz inserisce di default nel .gitignore come la .obsidian contenente le impostazioni del vault di Obsidian ed eventuali cartelle private contenenti note private (che però io non uso) e templates contenenti template per le note, in modo da avere un backup completo nel repository nel caso in cui dovesse malauguratamente succedere qualcosa.
Ridurre lo spazio vuoto in cima alle pagine del sito.
Quando in una pagina non è presente l’indice sul lato, far continuare
Integrare le icone delle note nel titolo della nota, nell’Explorer e anche nel Breadcrumbs.
Trasformare la “Reader Mode” in una modalità dyslexic-friendly (es. usando il font OpenDyslexic).
Renderizzare il LaTeX nei titoli dell’indice sul lato delle pagine.