تمكنت من تشغيله عن طريق الاحتفاظ بالنص المصدر في سمة على عنصر HTML، ثم في دالة الاستدعاء addTagDecorateCallback()، أقوم فقط بإرجاع ذلك للحصول على النص الأصلي.
إليك القليل من التعليمات البرمجية لأي شخص يريد معرفة ما فعلته.
في assets/javascripts/lib/discourse-markdown/snapblocks-discourse.js حيث يقوم بتهيئة علامات bbcode، جعلته يخزن النص الأصلي داخل سمة snapblocks-source حتى أتمكن من استرداده لاحقًا.
في ملف assets\\javascripts\\discourse\\initializers\\snapblocks-discourse.js، أضيف التعليمات البرمجية للتعامل مع الاقتباس.
// assets\\javascripts\\discourse\\initializers\\snapblocks-discourse.js
import {
addBlockDecorateCallback, // علامات bbcode للكتل
addTagDecorateCallback, // علامات bbcode المضمنة
} from "discourse/lib/to-markdown";
function initializeSnapblocks(api, siteSettings) {
addTagDecorateCallback(function () {
// this.element ليس عنصر HTML
// ولكنه يتضمن جميع سمات HTML
const { attributes } = this.element;
// عادةً ما تتحقق مما إذا كانت "الفئة" هي فئتك
// ولكن كل ما أحتاجه هنا هو "snapblocks-source"
if (attributes["snapblocks-source"]) {
let prefix = "[sb";
// إضافة سمات إلى علامة bbcode (والتي يتم تخزينها أيضًا
// على العنصر كسمات).
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]";
// إذا قمت بإرجاع نص، فسيتم استخدامه بدلاً من النص المحدد
return attributes["snapblocks-source"];
}
});
}
هذا هو نفس الشيء بالنسبة لعلامات bbcode للكتل، ما عليك سوى استخدام addBlockDecorateCallback() بدلاً من ذلك.
للأسف، سأضطر إلى إعادة خبز المشاركات إذا أردت أن تكون مقتطفات snapblocks القديمة قابلة للاقتباس. هذا أيضًا لا يتعامل مع الحالة التي تحدد فيها النص الموجود على SVG، بل يعمل فقط إذا حددت بعض النص قبله و/أو بعده بالإضافة إلى جزء على الأقل من نص SVG.