Sono riuscito a farlo funzionare mantenendo il testo sorgente in un attributo sull’html, e poi nella funzione di callback addTagDecorateCallback(), lo restituisco semplicemente per ottenere il testo originale.
Ecco un po’ di codice per chiunque voglia sapere cosa ho fatto.
In assets/javascripts/lib/discourse-markdown/snapblocks-discourse.js, dove inizializza i tag bbcode, ho fatto in modo che memorizzasse il testo originale all’interno di un attributo snapblocks-source in modo da poterlo recuperare in seguito.
Nel file assets\\javascripts\\discourse\\initializers\\snapblocks-discourse.js, aggiungo il codice per gestire le citazioni.
// assets\\javascripts\\discourse\\initializers\\snapblocks-discourse.js
import {
addBlockDecorateCallback, // block bbcode tags
addTagDecorateCallback, // inline bbcode tags
} from "discourse/lib/to-markdown";
function initializeSnapblocks(api, siteSettings) {
addTagDecorateCallback(function () {
// this.element non è un elemento HTML
// ma include tutti gli attributi HTML
const { attributes } = this.element;
// Normalmente controlleresti se la "classe" è la tua classe
// ma tutto ciò di cui ho bisogno qui è "snapblocks-source"
if (attributes["snapblocks-source"]) {
let prefix = "[sb";
// Aggiunta di attributi al tag bbcode (che sono anche memorizzati
// sull'elemento come attributi).
const attrs = [
"blockstyle",
"wrap",
"wrapsize",
"zebra",
"showspaces",
"santa",
];
for (const attr of attrs) {
if (attributes[attr]) {
prefix += ` ${attr}=${attributes[attr]}`;
}
}
prefix += "]";
this.prefix = prefix;
this.suffix = "[/sb]";
// se restituisci del testo, questo verrà utilizzato al posto del testo selezionato
return attributes["snapblocks-source"];
}
});
}
Questo è lo stesso per i tag bbcode di blocco, devi solo usare addBlockDecorateCallback() invece.
Ora, sfortunatamente, dovrò rifare il baking dei post se voglio che i vecchi snippet di snapblocks siano citabili. Questo non gestisce nemmeno se selezioni il testo sull’svg, funziona solo se selezioni del testo prima e/o dopo, oltre ad almeno una parte del testo svg.