Extraits de texte/Markdown insérables, maintenus centralement

Je me demandais s’il existait un moyen de définir un bloc de texte à un seul endroit et de l’insérer dans les publications avec une référence unique et courte.

C’est un peu comme la fonctionnalité intégrée Admin -> Personnaliser -> Contenu textuel, mais pour mes propres variables personnalisées qui peuvent être insérées dans les publications.

Mon cas d’utilisation consistait à ajouter un avertissement pour mes liens d’affiliation. À mesure que le nombre de liens d’affiliation augmentait à travers de nombreuses publications et sujets, j’ai constaté que mes avertissements proliféraient avec eux. J’aime occasionnellement apporter des améliorations aux avertissements, et cela devient plus fastidieux à mesure que le nombre augmente.

Je songe également à rendre mes liens d’affiliation plus génériques, afin d’avoir un lien centralisé pour chaque lien de produit, par exemple, qui apparaît à plusieurs endroits. Si ce lien de produit change, je n’ai à le modifier qu’à un seul endroit.

Bien sûr, je pourrais peut-être effectuer une recherche et un remplacement de type Rails, mais ce n’est ni aussi propre ni aussi sûr, ni « en ligne ».

Je voulais donc un endroit pour définir et maintenir une chaîne de texte à un seul endroit, avec des changements immédiatement reflétés partout où elle est utilisée lors de la prochaine visualisation de page.

Lisez la suite pour la solution de @Johani !

3 « J'aime »

Une option possible consiste à utiliser un composant de thème.

Cela s’insère dans 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());

// créer un bouton dans l'éditeur
let currentLocale = I18n.currentLocale();

I18n.translations[currentLocale].js.disclaimer_button = "Ajouter un avertissement";
I18n.translations[currentLocale].js.composer.disclaimer_prompt = ""; // laisser vide

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

et cela doit être ajouté dans le fichier settings.yml de votre composant

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: Entrez le texte d'avertissement souhaité. Utilisez &lt;br&gt; pour les sauts de ligne.

Vous aurez alors un bouton dans l’éditeur qui ressemble à ceci :

et cliquer sur ce bouton ajoutera

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

ce qui sera converti en ce que vous avez défini dans les paramètres du composant

et le résultat final ressemble à ceci

Vous pouvez ensuite utiliser

[data-theme="disclaimer"] {

}

en CSS pour le styliser comme vous le souhaitez.

21 « J'aime »

That’s awesome! Thanks @Johani

Added to Tips’n’Tricks.

2 « J'aime »

Bonjour @merefield - curieusement, je cherchais une fonctionnalité similaire : insérer un extrait de texte standard. Mais plutôt qu’un bouton, je souhaitais une chaîne déclencheuse qui s’étendrait en un bloc de markdown. (Bon, je suppose qu’alternativement, je pourrais modifier le bouton en un menu déroulant avec quelques options)

Cela relève probablement d’un plugin et non d’une fonctionnalité de base de Discourse.

Comportement idéal :

  • Je tape :stub: (je n’ai rien contre l’utilisation d’autres caractères que les délimiteurs :, mais je me demandais si l’interface des émojis ne pourrait pas fonctionner, puisqu’elle offre ce type de comportement de ‘complétion’ que je recherche)

  • Discourse remplace :stub: par

    > Cet article est une ébauche - veuillez l'améliorer en **éditant**, en **ajoutant des liens** et en **ajoutant des détails** (c'est un « wiki », donc n'importe quel utilisateur peut modifier et ajouter des informations) ou en **commentant** ci-dessous.
    
  • ce qui est rendu sous la forme

    Cet article est une ébauche - veuillez l’améliorer en éditant, en ajoutant des liens et en ajoutant des détails (c’est un « wiki », donc n’importe quel utilisateur peut modifier et ajouter des informations) ou en commentant ci-dessous

  • et il devrait y avoir un endroit dans l’interface utilisateur pour configurer ces extraits, un peu comme l’interface des émojis personnalisés

5 « J'aime »

Excellente idée pour un plugin ! Serait-il possible que le texte n’apparaisse que dans l’aperçu et dans la vue finale mise en forme ?

4 « J'aime »

La suggestion de @pacharanero serait également fantastique pour nous. Dans notre cas, ce serait uniquement pour le personnel, donc nous ne voudrions rien voir apparaître dans la barre d’outils de l’éditeur, mais pouvoir entrer un code court pour insérer le bloc à mise à jour automatique serait incroyable :+1:

1 « J'aime »

Pour l’instant, une manière non-Discourse et non-gérée centralement d’obtenir ce comportement aujourd’hui est d’utiliser un gestionnaire de presse-papiers multiplateforme comme CopyQ et de configurer la section ‘Commandes/Raccourcis globaux’ afin de pouvoir insérer du texte arbitraire dans le presse-papiers.

Ces extraits peuvent ensuite être gérés soit dans l’interface utilisateur de CopyQ, assignés à une touche de raccourci, soit apparaître dans le menu contextuel de CopyQ. Ce n’est pas aussi agréable qu’un plugin intégré à Discourse, mais cela a l’avantage de fonctionner dans toutes les applications, et cela existe déjà !

(Notez que cela devrait être configuré sur chacun des ordinateurs que vous souhaiteriez utiliser de cette manière. Vous pouvez exporter et importer ces commandes et raccourcis globaux dans un fichier, pour permettre la configuration des mêmes paramètres sur plusieurs machines ou au sein d’une équipe)

Cela me conviendrait tout à fait. Je pense que contrairement à DiscoTOC et Placeholders, il faudrait le rendre correctement dans le volet d’aperçu, mais dans l’éditeur, il pourrait simplement afficher la phrase déclencheuse choisie, par exemple :slug:.

Merci pour votre réponse. La solution CopyQ ne fait pas ce que je recherche (je ne pense pas, du moins).

Par exemple, j’aimerais saisir un extrait dans un article (par exemple, :slug:) et ensuite, chaque fois qu’il est rendu, il affiche le contenu actuel de ce slug (qui pourrait contenir du markdown). Si je change le contenu de ce slug, alors tous les articles l’utilisant seraient immédiatement mis à jour pour avoir le nouveau contenu (l’article lui-même ne contient que le slug et le contenu est inséré lors du rendu).

Cela me conviendrait que la recherche ne connaisse pas l’existence du contenu (et que seule la version finale cuite soit affichée me convient).

Cordialement

Voici une approche différente…

1 « J'aime »