Aggiungi tag di citazione markdown personalizzati

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.

3 Mi Piace