Editor a blocchi

Lo stesso documento si scrive in due modi: come sorgente Markdown, o a blocchi in stile Notion. I due editor non sono mai montati insieme — è un invariante imposto dal codice e verificato da un test.

Nell’editor a blocchi le direttive e il frontmatter sono blocchi veri: si creano, si modificano e si eliminano come qualunque altro, dal menu slash, dalla maniglia del blocco, o trascinandoli. Ogni componente del registro ha il suo blocco, :value è contenuto in linea, e il frontmatter è un blocco a sé.

L’annidamento è l’indentazione

Tutto ciò che è indentato sotto un blocco componente ne diventa il contenuto, e quel blocco viene riscritto come contenitore. Non c’è niente da dichiarare in anticipo: un blocco inserito dal menu slash nasce foglia, e diventa contenitore nel momento in cui qualcosa gli finisce sotto.

Il frontmatter diventa un modulo

In modalità blocchi il frontmatter si modifica come un modulo, dal pulsante ⓘ della barra, e all’editor arriva il corpo da solo.

Non è una comodità: l’editor a blocchi non ha modo di rappresentare un blocco di frontmatter, e farlo passare per il suo convertitore Markdown lo trasformerebbe in un paragrafo o in una riga orizzontale. Il modulo appartiene alla modalità blocchi soltanto — in modalità Markdown il blocco è lì nel testo, e un secondo modo di modificarlo sarebbe due verità sullo stesso dato.

L’ordine delle chiavi e le virgolette vengono conservati: version: "1.0" resta una stringa e non diventa il numero uno.

Il prezzo: la conversione è a mano

Il convertitore Markdown dell’editor a blocchi non conosce questi tipi e sfugge quello che non riconosce, quindi entrambe le direzioni sono scritte a mano, blocco per blocco, delegando all’editor solo i blocchi ordinari. Markdown → blocchi divide il sorgente sulle direttive trovate; blocchi → Markdown ridisegna le nostre e chiama il convertitore per il resto. Il corpo di un contenitore viene analizzato ricorrendo nel nostro stesso divisore, non consegnandolo all’editor, che ne farebbe testo letterale.

Cosa si perde, e perché non è un difetto da correggere

La conversione a blocchi è lossy in entrambe le direzioni — l’API della libreria si chiama letteralmente blocksToMarkdownLossy. Far girare un documento attraverso i blocchi trasforma la matematica $$ e qualunque altra cosa senza un blocco equivalente in paragrafi normali, e la cosa si vede subito nell’anteprima.

È inerente alla libreria, non un bug di ReactiveNET. Chi lavora su un documento pieno di matematica o di direttive esotiche lo tratta come sorgente Markdown, ed è per questo che i due editor esistono entrambi.

Un paragrafo che contiene una direttiva in linea viene ricostruito a mano, perché l’editor scarterebbe il nodo: dentro quel paragrafo la formattazione dei caratteri si perde. È il posto più stretto in cui pagare il prezzo.