Eingebbare, zentral verwaltete Text-/Markdown-Schnipsel

Ich habe mich gefragt, ob es eine Möglichkeit gibt, einen Textabschnitt an einer einzigen Stelle zu definieren und ihn mit einer einzigen, kurzen Referenz in Beiträgen einzufügen.

Es ist ähnlich wie die Standardfunktion „Admin → Anpassen → Textinhalt", jedoch für meine eigenen benutzerdefinierten Variablen, die in Beiträgen eingefügt werden können.

Mein Anwendungsfall war das Hinzufügen eines Haftungsausschlusses für meine Affiliate-Links. Da die Anzahl der Affiliate-Links in vielen Beiträgen und Themen wuchs, stellte ich fest, dass sich auch meine Haftungsausschlüsse entsprechend vermehrten. Gelegentlich möchte ich Verbesserungen an den Haftungsausschlüssen vornehmen, was mit zunehmender Anzahl immer mühsamer wird.

Ich erwäge auch, meine Affiliate-Links allgemeiner zu gestalten, sodass ich für jeden Produktlink, der mehrfach vorkommt, einen zentral verwalteten Link habe. Wenn sich dieser Produktlink ändert, muss ich ihn nur an einer einzigen Stelle aktualisieren.

Offensichtlich könnte ich eine Art Rails-Such-und-Ersetzen-Funktion verwenden, doch das ist nicht so sauber/sicher noch „online".

Daher wollte ich einen Ort, an dem ich einen Textstring definieren und pflegen kann, sodass Änderungen sofort an allen Stellen sichtbar werden, an denen er verwendet wird, beim nächsten Seitenaufruf.

Lesen Sie weiter für die Lösung von @Johani!:

3 „Gefällt mir“

Eine mögliche Option ist die Verwendung einer Theme-Komponente.

Dieser Code gehört 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());

// Erstellen einer Composer-Schaltfläche
let currentLocale = I18n.currentLocale();

I18n.translations[currentLocale].js.disclaimer_button = "Haftungsausschluss hinzufügen";
I18n.translations[currentLocale].js.composer.disclaimer_prompt = ""; // leer lassen

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

Und dieser Teil gehört in die settings.yml-Datei Ihrer Komponente:

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: Geben Sie den gewünschten Haftungsausschlusstext ein. Verwenden Sie &lt;br&gt; für Zeilenumbrüche.

Anschließend erscheint im Composer eine Schaltfläche, die so aussieht:

Beim Klicken auf die Schaltfläche wird folgendes eingefügt:

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

Dieser wird dann in den Text umgewandelt, den Sie in den Einstellungen der Komponente festgelegt haben:

Das Endergebnis sieht dann so aus:

Zusätzlich können Sie im CSS folgendes verwenden, um das Element nach Belieben zu gestalten:

[data-theme="disclaimer"] {

}
21 „Gefällt mir“

That’s awesome! Thanks @Johani

Added to Tips’n’Tricks.

2 „Gefällt mir“

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 „Gefällt mir“

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

4 „Gefällt mir“

Der Vorschlag von @pacharanero wäre auch für uns fantastisch. In unserem Fall wäre dies nur für Mitarbeiter, daher möchten wir nichts in der Editor-Symbolleiste anzeigen lassen, aber die Eingabe eines kurzen Codes zum Einfügen des automatisch aktualisierenden Blocks wäre erstaunlich :+1:

1 „Gefällt mir“

Für den Moment ist eine nicht-Discourse- und nicht-zentral verwaltete Methode, dieses Verhalten heute zu erreichen, die Verwendung eines plattformübergreifenden Zwischenablage-Managers wie CopyQ und die Konfiguration des Abschnitts „Befehle/Globale Verknüpfungen“, sodass Sie beliebigen Text in die Zwischenablage einfügen können.

Diese Snippets können dann entweder in der CopyQ-Benutzeroberfläche verwaltet, einer Tastenkombination zugewiesen oder im CopyQ-Menü der rechten Maustaste angezeigt werden. Es ist nicht ganz so schön wie ein Discourse-integriertes Plugin, aber es hat den Vorteil, dass es in allen Anwendungen funktioniert und bereits existiert!

(Beachten Sie, dass dies auf jedem der Computer eingerichtet werden müsste, die Sie auf diese Weise nutzen möchten. Sie können diese Befehle und globalen Verknüpfungen in eine Datei exportieren und importieren, um dieselben Einstellungen auf mehreren Rechnern oder in einem Team einzurichten)

Das wäre für mich absolut in Ordnung. Ich denke, dass es im Gegensatz zu DiscoTOC und Placeholders richtig in der Vorschau gerendert werden müsste, aber im Composer könnte einfach die gewählte Trigger-Phrase :slug: angezeigt werden.

Danke für die Antwort. Die CopyQ-Lösung tut nicht das, was ich suche (glaube ich zumindest).

Ich möchte zum Beispiel einen Schnipsel in einem Beitrag eingeben (z. B. :slug:), und dann wird, wann immer dieser gerendert wird, der aktuelle Inhalt für diesen Slug gerendert (der Markdown enthalten kann). Wenn ich den Inhalt dieses Slugs ändere, werden alle Beiträge, die ihn verwenden, sofort aktualisiert, um den neuen Inhalt zu haben (der Beitrag selbst enthält nur den Slug und der Inhalt wird beim Rendern eingefügt).

Es wäre mir auch recht, wenn die Suche den Inhalt nicht kennen würde (und nur die endgültige, “gekochte” Version anzuzeigen, ist für mich in Ordnung).

Viele Grüße

Hier ist ein anderer Ansatz…

1 „Gefällt mir“