Frammenti di testo/markdown inseribili e gestiti centralmente

Mi chiedevo se esistesse un modo per definire una stringa di testo in un unico punto e inserirla nei post con un breve riferimento.

È un po’ come la funzionalità nativa Admin -> Personalizza -> Contenuto testuale, ma per le mie variabili personalizzate che possono essere inserite nei post.

Il mio caso d’uso era aggiungere un disclaimer per i miei link di affiliazione. Con l’aumento del numero di link di affiliazione in molti post e argomenti, ho notato che anche i disclaimer si moltiplicavano. Di tanto in tanto mi piace apportare miglioramenti ai disclaimer, e questo diventa sempre più gravoso man mano che il numero cresce.

Sto anche valutando di rendere i miei link di affiliazione più generici, in modo da avere un unico link centralmente gestito per ogni prodotto, ad esempio, che appare più volte. Se quel link di prodotto cambia, devo modificarlo solo in un punto.

Ovviamente potrei eseguire una sorta di ricerca e sostituzione a livello di Rails, ma non è né così pulito/sicuro né “online”.

Quindi volevo un luogo dove definire e mantenere una stringa di testo in un unico punto, in modo che le modifiche vengano immediatamente riflesse ovunque venga utilizzata alla prossima visualizzazione della pagina.

Leggi oltre per la soluzione di @Johani!:

3 Mi Piace

Un’opzione possibile è utilizzare un componente del tema.

Questo va inserito in header.html

<script type="text/discourse-plugin" version="0.8">
var disclaimer = settings.Disclaimer_text,
  disclaimer_selector = 'div[data-theme="disclaimer"]';

$.fn.disclaimer = function() {
  if (!this.length) {
    return;
  } else {
    this.each(function() {
      $(this).html(disclaimer);
    });
    return this;
  }
};

api.decorateCooked($elem => $elem.children(disclaimer_selector).disclaimer());

// crea un pulsante nell'editor
let currentLocale = I18n.currentLocale();

I18n.translations[currentLocale].js.disclaimer_button = "Aggiungi disclaimer";
I18n.translations[currentLocale].js.composer.disclaimer_prompt = ""; // lascia vuoto

api.onToolbarCreate(function(toolbar) {
  toolbar.addButton({
    trimLeading: true,
    id: "disclaimer-button",
    group: "insertions",
    icon: "exclamation-circle", // modifica l'icona
    title: "disclaimer_button",
    perform: function(e) {
      return e.applySurround(
        '<div data-theme="disclaimer">',
        "</div>",
        "disclaimer_prompt"
      );
    }
  });
});
</script>

e questo va inserito nel file settings.yml del tuo componente

Disclaimer_text:
  default: "Lorem ipsum dolor sit amet, ei purto complectitur has, per at quas senserit. Et malis libris eos, vix id pericula dissentiet, aliquid apeirian pro eu. Sed ex viderer inciderint, vitae officiis dissentiet eos no. Omnes percipit singulis in has, ne nam nibh tation inciderint. Quas nulla ei sit, ex eam rebum voluptaria. Id eam altera similique. Ex justo assentior persequeris mea, ei hinc paulo ubique mei. <br><br>Cu nam epicurei torquatos, et accusam accommodare vim. Vis sint saperet officiis et. Ad consequat posidonium mea, et duo paulo quidam maluisset, vel an electram expetendis. An vis repudiare tincidunt, mentitum convenire eloquentiam ut vis, summo partiendo pro ad."
  description:
    en: Inserisci il testo del disclaimer desiderato. Usa &lt;br&gt; per andare a capo.

Avrai quindi un pulsante nell’editor che appare così:

e cliccando sul pulsante verrà aggiunto

<div data-theme="disclaimer"></div>

che verrà convertito in whatever hai impostato nelle impostazioni del componente

e il risultato finale sarà simile a questo

e puoi usare

[data-theme="disclaimer"] {

}

in CSS per stilizzarlo come preferisci.

21 Mi Piace

That’s awesome! Thanks @Johani

Added to Tips’n’Tricks.

2 Mi Piace

Hi @merefield - funnily enough I was looking for similar functionality - inserting a standard snippet of text - but rather than a button I wanted a trigger string that would expand out to a piece of markdown. (OK, I suppose alternatively I could modify the button to a dropdown with a few options)

This is probably not a core Discourse feature but a plugin.

Ideal behaviour:

  • I type :stub: (I don’t mind about using something instead of the delimiting : characters, but wondered if hooking into the emoji interface might work since that has the kind of ‘completion’ type behaviour that I’d like)

  • Discourse replaces :stub: with

    > This article is a stub - please improve it by  **editing**  and  **adding links**  and  **detail**  (it’s a ‘wiki’ so any user can edit and add information) or by  **commenting**  below.
    
  • which is rendered as

    This article is a stub - please improve it by editing and adding links and detail (it’s a ‘wiki’ so any user can edit and add information) or by commenting below

  • and there should be somewhere in the UI to configure these snippets, a bit like the Custom Emoji interface

5 Mi Piace

Great idea for a plugin! Would you be ok for the text to appear only in the preview and the final cooked view?

4 Mi Piace

Anche il suggerimento di @pacharanero sarebbe fantastico per noi. Nel nostro caso, sarebbero solo per il personale, quindi non vorremmo che nulla venisse mostrato nella barra degli strumenti dell’editor, ma inserire un breve codice per inserire il blocco di aggiornamento automatico sarebbe fantastico :+1:

1 Mi Piace

Per ora, un modo non-Discourse e non gestito centralmente per ottenere questo comportamento oggi è utilizzare un gestore di appunti multipiattaforma come CopyQ e impostare la sezione ‘Comandi/Scorciatoie globali’ in modo da poter inserire testo arbitrario negli appunti.

Questi snippet possono quindi essere gestiti nell’interfaccia utente di CopyQ, assegnati a un tasto di scelta rapida o apparire nel menu contestuale di CopyQ. Non è bello come un plugin integrato in Discourse, ma ha il vantaggio di funzionare su tutte le applicazioni, ed esiste già!

(Nota che questo dovrebbe essere configurato su ciascuno dei computer che si desidera utilizzare in questo modo. È possibile esportare e importare questi comandi e scorciatoie globali su file, per consentire la configurazione delle stesse impostazioni su più macchine o in un team)

Andrebbe benissimo per me. Penso che, a differenza di DiscoTOC e Placeholders, dovrebbe essere correttamente renderizzato nel riquadro di anteprima, ma nell’editor potrebbe semplicemente mostrare qualsiasi frase di attivazione :slug: fosse stata scelta.

Grazie per la risposta. La soluzione CopyQ non fa quello che sto cercando (almeno, non credo).\n\nAd esempio, vorrei inserire uno snippet in un post (ad esempio, :slug:) e poi, ogni volta che questo viene renderizzato, renderizza il contenuto corrente per questo slug (che potrebbe contenere markdown). Se cambio il contenuto di questo slug, tutti i post che lo utilizzano verrebbero immediatamente aggiornati per avere il nuovo contenuto (il post stesso contiene solo lo slug e il contenuto viene inserito al momento del rendering).\n\nMi andrebbe bene anche se la ricerca non conoscesse l’esistenza del contenuto (e mostrare solo la versione finale elaborata va bene per me).\n\nSaluti

Ecco un approccio diverso…

1 Mi Piace