Ich konnte es zum Laufen bringen, indem ich den Quelltext in einem Attribut auf dem HTML belassen habe und dann in der Callback-Funktion addTagDecorateCallback() einfach diesen zurückgegeben habe, um den Originaltext zu erhalten.
Hier ist ein kleiner Code für alle, die wissen möchten, was ich getan habe.
In assets/javascripts/lib/discourse-markdown/snapblocks-discourse.js, wo die bbcode-Tags initialisiert werden, habe ich den Originaltext in einem Attribut namens snapblocks-source gespeichert, damit ich ihn später abrufen kann.
In der Datei assets\\javascripts\\discourse\\initializers\\snapblocks-discourse.js füge ich den Code zum Behandeln des Zitierens hinzu.
// 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 ist kein HTML-Element
// aber es enthält alle HTML-Attribute
const { attributes } = this.element;
// Normalerweise würden Sie prüfen, ob die "class" Ihre Klasse ist
// aber alles, was ich hier brauche, ist "snapblocks-source"
if (attributes["snapblocks-source"]) {
let prefix = "[sb";
// Hinzufügen von Attributen zum bbcode-Tag (die auch
// auf dem Element als Attribute gespeichert sind).
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]";
// wenn Sie Text zurückgeben, wird dieser anstelle des ausgewählten Textes verwendet
return attributes["snapblocks-source"];
}
});
}
Das Gleiche gilt für die Block-bbcode-Tags, Sie müssen nur addBlockDecorateCallback() verwenden.
Leider muss ich Beiträge neu backen, wenn ich möchte, dass alte Snapblocks-Snippets zitierfähig sind. Dies behandelt auch nicht den Fall, wenn Sie den Text auf dem SVG auswählen. Es funktioniert nur, wenn Sie Text davor und/oder danach sowie mindestens einen Teil des SVG-Textes auswählen.