J’ai réussi à le faire fonctionner en conservant le texte source dans un attribut sur le HTML, puis dans la fonction de rappel addTagDecorateCallback(), je le retourne simplement pour obtenir le texte original.
Voici un peu de code pour ceux qui veulent savoir ce que j’ai fait.
Dans assets/javascripts/lib/discourse-markdown/snapblocks-discourse.js, là où il initialise les balises bbcode, j’ai fait en sorte qu’il stocke le texte original dans un attribut snapblocks-source afin que je puisse le récupérer plus tard.
Dans le fichier assets\\javascripts\\discourse\\initializers\\snapblocks-discourse.js, j’ajoute le code pour gérer la citation.
// assets\\javascripts\\discourse\\initializers\\snapblocks-discourse.js
import {
addBlockDecorateCallback, // balises bbcode de bloc
addTagDecorateCallback, // balises bbcode en ligne
} from "discourse/lib/to-markdown";
function initializeSnapblocks(api, siteSettings) {
addTagDecorateCallback(function () {
// this.element n'est pas un élément HTML
// mais il inclut tous les attributs HTML
const { attributes } = this.element;
// Normalement, vous vérifieriez si la "classe" est votre classe
// mais tout ce dont j'ai besoin ici est "snapblocks-source"
if (attributes["snapblocks-source"]) {
let prefix = "[sb";
// Ajout d'attributs à la balise bbcode (qui sont également stockés
// sur l'élément sous forme d'attributs).
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]";
// si vous retournez du texte, il sera utilisé à la place du texte sélectionné
return attributes["snapblocks-source"];
}
});
}
C’est la même chose pour les balises bbcode de bloc, il suffit d’utiliser addBlockDecorateCallback() à la place.
Malheureusement, je devrai réanalyser les messages si je veux que les anciens extraits snapblocks soient citables. Cela ne gère pas non plus le cas où vous sélectionnez le texte sur le SVG, cela ne fonctionne que si vous sélectionnez du texte avant et/ou après, ainsi qu’au moins une partie du texte SVG.