Agregar etiquetas personalizadas de marcado Markdown en BBCode

Pude hacer que funcionara manteniendo el texto de origen en un atributo de HTML y, luego, en la función de devolución de llamada addTagDecorateCallback(), simplemente lo devuelvo para obtener el texto original.

Aquí hay un poco de código para cualquiera que quiera saber lo que hice.

En assets/javascripts/lib/discourse-markdown/snapblocks-discourse.js, donde inicializa las etiquetas bbcode, hice que almacene el texto original dentro de un atributo snapblocks-source para poder recuperarlo más tarde.

En el archivo assets\\javascripts\\discourse\\initializers\\snapblocks-discourse.js, agrego el código para manejar las citas.

// assets\\javascripts\\discourse\\initializers\\snapblocks-discourse.js

import {
  addBlockDecorateCallback, // etiquetas bbcode de bloque
  addTagDecorateCallback, // etiquetas bbcode en línea
} from "discourse/lib/to-markdown";

function initializeSnapblocks(api, siteSettings) {
  addTagDecorateCallback(function () {
    // this.element no es un elemento HTML
    // pero incluye todos los atributos HTML
    const { attributes } = this.element;

    // Normalmente comprobarías si la "clase" es tu clase
    // pero todo lo que necesito aquí es "snapblocks-source"
    if (attributes["snapblocks-source"]) {
      let prefix = "[sb";

      // Añadiendo atributos a la etiqueta bbcode (que también se almacenan
      // en el elemento como atributos).
      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 devuelves texto, este se usará en lugar del texto seleccionado
      return attributes["snapblocks-source"];
    }
  });
}

Esto es lo mismo para las etiquetas bbcode de bloque, solo tienes que usar addBlockDecorateCallback() en su lugar.

Ahora, desafortunadamente, tendré que volver a hornear las publicaciones si quiero que los fragmentos antiguos de snapblocks sean citables. Esto tampoco maneja si seleccionas el texto en el svg, solo funciona si seleccionas algún texto antes y/o después, así como al menos parte del texto del svg.

3 Me gusta