Formulaires de remplacement

:discourse2: Summary Placeholder Forms will let you build dynamic documentation, by creating a form that replaces any occurrence of a =PATTERN= in your post with the value from a text or selectable input field.
:eyeglasses: Preview Preview on Discourse Theme Creator
:hammer_and_wrench: Repository Link https://github.com/discourse/discourse-placeholder-theme-component
:open_book: New to Discourse Themes? Beginner’s guide to using Discourse Themes

Install this theme component

Features

Add placeholders to posts in this format:

[wrap=placeholder key=NAME description="Your name"][/wrap]
[wrap=placeholder key=COUNTRY default=US defaults=FR,DE,US,CN,AU,CA][/wrap]

Your email: =NAME=-=COUNTRY=@example.com

And this will result in:

This is used in mailing list

Your email: =ZNAME=-=ZCOUNTRY=@example.com

As seen above, text inside the wrapper will be used as a long description.

[wrap=placeholder key=NAME description="Your name"]
This is used in mailing list
[/wrap]

Available keys

  • key: The key that should be replaced in your post
  • default/defaults: default value(s)
  • description: a placeholder text for the input

Examples

# create a new plugin
rails g plugin =PLUGIN_NAME=
cd plugins/=PLUGIN_NAME=

We use it to create runbooks, howtos and reusable templates (it will work in code blocks). Please share your use cases!

Settings

Translation Default
toolbar.builder Add Placeholder
builder.errors.no_key A key is required.
builder.title Add Placeholder
builder.insert Insert
builder.key.label Key
builder.key.description The =Key= to be replaced in the post.
builder.description.label Description
builder.description.description Description displayed on input with no value set.
builder.values.label Default value(s)
builder.values.description Optional value(s) for your placeholder, if multiple values are defined, a select will be used.

:discourse2: Hosted by us? Theme components are available to use on our Standard, Business, and Enterprise plans.

Last edited by @JammyDodger 2024-06-13T22:28:45Z

Check documentPerform check on document:
65 « J'aime »

The big issue with math handling like this, is that you need to eval() and eval is unsafe, so you need to use some lib which provide a safe eval with a limited subset of the real eval. I’m unsure we want all this complexity for such a rare case.

6 « J'aime »

I tried ! and that would be a neat composer-preview-redux-in-OP kind of thing but… :pensive: I must be missing something, if I understand correctly the Reply Template component takes the raw and looks for “replacers”, but the Placeholder Forms component decorates the cooked?

What I’m trying to do is ease my users into adding some quizz Q&As in a topic, with minimal technical friction, clicks or even key strokes, :heavy-sigh: :roll_eyes:

[wrap=placeholder key="question" description="question"][/wrap]
[wrap=placeholder key="réponse" description="réponse"][/wrap]

[wrap=template key="template-spoiler" action="reply" tagsList="#qui, #quand, #où, #comment"]

## Question
=question=
### Réponse
[spoiler]
=réponse=
[/spoiler]
---
*Étiquette(s) ?*
[/wrap]

which gives

so far so good, but unfortunately, the placeholders =question= and =réponse= are kept in the composer when hitting the template button

Yes I’m not sure what I was thinking when I wrote this… I probably had a different use case in mind, but can’t remember.

It can’t work this way for sure. I will think a little bit about this… Both theme components were experiments at the time and might deserve better treatment as people have been using it quite frequently.

7 « J'aime »

Thank you !

happy lets go GIF by Shalita Grant

3 « J'aime »

:grin: I don’t know what’s cookin’ in the chef kitchen, but as I usually stuff myself with pistachios or whatnot while waiting, I managed to make it work (for my specific use of course as I’ve almost no idea of what I’m doing, but hey… :sweat_smile: )

4 « J'aime »

Ideally I would like to be able to let admin define their own replacers, but eval is risky (and not even possible with a secure csp) so I’m not sure how I could achieve this…

3 « J'aime »

First of all - great and really helpful theme component.

But I think I found a bug. If I use a placeholder in a code snippet, that contains backticks (`), it is not working. An example is a SQL code snippet:

DELETE FROM `=TABLENAME=`
WHERE id NOT IN(
        SELECT
            id FROM (
                SELECT
                    id FROM `=TABLENAME=`
                ORDER BY
                    id DESC
                LIMIT 20
) subquery);

TABLENAME gets never replaced (if there is a TABLENAME placeholder).

Ce serait génial si cela incluait également des conditions de type Jinja2. Ainsi, par exemple, quelqu’un pourrait créer une clé red et la mapper à l’icône :red_circle:, orange serait mappé à :orange_circle:. Mais je peux m’en passer bien sûr, mais cela aurait été génial d’avoir ces conditions de test.

J’adore vraiment ce composant. :star_struck:


« Et vous vivez vraiment de la =NOUN_1= ? Quelle vie =ADJECTIVE_1= ! »

« J’en vis et j’en vis et j’en vis et j’en vis », dit =PERSON_1=. « C’est mon frère et ma sœur, et mes tantes, et mes =NOUN_2=, et ma nourriture et ma boisson, et mon (=ADJECTIVE_2=) =VERBING_1=. C’est ma =NOUN_3=, et je n’en veux pas d’autre. Ce qu’elle n’a pas ne vaut pas la peine d’être =VERBING_2=, et ce qu’elle ne sait pas ne vaut pas la peine d’être =VERBING_3=. Seigneur ! les =NOUNS_1= que nous avons eus ensemble ! Que ce soit en hiver ou en été, au printemps ou en automne, elle a toujours son =NOUN_4= et ses =NOUNS_2=. Quand les =NOUNS_3= sont là en février, et que mon =NOUN_4= et mon sous-sol débordent de =NOUN_5= qui ne me servent à rien, et que le =COLOR_1= =NOUN_6= coule devant ma meilleure fenêtre =NOUN_7= ; ou encore quand tout cela tombe =ADVERB_1= et montre des taches de =NOUN_8= qui sentent le =FOOD_1=, et que les =NOUNS_5= et les =NOUNS_6= obstruent les canaux, et que je peux =VERB_1= sur l’=MOISTURE= =NOUN_9= sur la plupart des =NOUN_10= et trouver de la =FOOD_2= fraîche à manger, et des choses =ADJECTIVE_3= que les gens ont laissées tomber des =NOUNS_7= ! »


Original tiré de la version Standard Ebooks de The Wind in the Willows, disponible en lecture en ligne (rechercher By it and with it).

10 « J'aime »

Bonjour :wave:

Merci pour ce composant :heart: Il correspond parfaitement à ce que j’essaie de réaliser actuellement. En fait, ma première pensée a été qu’il serait formidable s’il pouvait être combiné avec le composant Reply Template. Mais malheureusement, ce n’est pas possible, comme l’expliquent les messages précédents. :confused:


J’ai trouvé une solution de contournement pour l’utiliser comme modèle, cela fonctionne avec lien vers de nouveaux sujets et lien vers de nouveaux messages personnels.

Voici comment je l’ai fait :

  1. Créez un formulaire de remplacement (pour rester simple, j’utilise l’exemple dans le message d’origine)

Votre email : =NAME=-=COUNTRY=@example.com


  1. Créez un lien vers un nouveau sujet :
    J’ai configuré dans le lien :
  2. catégorie
  3. titre
  4. corps

Si vous souhaitez ajouter des lignes vides, utilisez \ pour qu’elles ne cassent pas le lien ou pour les rendre invisibles, vous pouvez utiliser   qui ajoutera un espace dans la nouvelle ligne. Cela fera partie du modèle et créera une ligne vide,

<a href="https://meta.discourse.org/new-topic?category==CATEGORY=&title=This is a topic created by =NAME=&body=Hello :wave:
&nbsp;
This is a test topic... Let's see the placeholder form.
\
Your email: =NAME=-=COUNTRY=@example.com">Use template as new topic</a>

  1. Créez un aperçu du sujet

Catégorie sélectionnée

=CATEGORY=

Titre du sujet

This is a topic created by =NAME=

Corps du sujet

Hello :wave:

This is a test topic… Let’s see the placeholder form.

Your email: =NAME=-=COUNTRY=@example.com


  1. Créez un bouton “Utiliser le modèle comme nouveau sujet” (dans l’exemple ci-dessus, il s’agit d’un lien, vous pouvez en faire un bouton)

Créez un élément [wrap] à partir de ce texte. Cela le rend disponible pour le cibler avec CSS et le styliser. Je l’ajoute ci-dessous.

<a href="https://meta.discourse.org/new-topic?category==CATEGORY=&title=This is a topic created by =NAME=&body=Hello :wave:
&nbsp;
This is a test topic... Let's see the placeholder form.
\
Your email: =NAME=-=COUNTRY=@example.com">[wrap=template-button]Use template as new topic[/wrap]</a>

Stylisation de [wrap=template-button]
quelque chose comme :arrow_down_small:

Common / CSS

[data-wrap="template-button"] {
  background: var(--tertiary);
  color: var(--secondary);
  border-radius: var(--d-button-border-radius);
  padding: 0.5em 0.65em;
  transition: background 0.25s;
  &:focus,
  &:hover {
    background: var(--tertiary-hover);
    color: var(--secondary);
  }
}

Le bouton modèle ressemblera à ceci :arrow_down_small:

template-button


Démo

Use template as new topic


J’espère que ce petit tutoriel aidera ceux qui ont besoin de quelque chose de similaire :slightly_smiling_face:

Modification : J’ai mis en place un sélecteur de catégorie qui permet de créer des sujets dans différentes catégories.


Voir la version brute de ce message…

8 « J'aime »

C’est incroyable Don, merci. Cela répond très bien à l’un de mes besoins :slight_smile:

2 « J'aime »

Quelque chose à noter est que les blocs de code causent parfois des problèmes :

usermod -aG sudo =USERNAME=

Dans ce cas, highlight.js suppose qu’il s’agit de Java et convertit le bloc de code en :


  usermod -
  <span class="hljs-type">aG</span> 
  <span class="hljs-variable">sudo</span> 
  <span class="hljs-operator">=</span>
  USERNAME=

Je suis capable de le corriger en signalant qu’il s’agit en fait d’une commande shell :

    ```shell
    usermod -aG sudo =USERNAME=
    ```

Ce qui donne :

usermod -aG sudo =USERNAME=

Si tout le reste échoue, text empêche highlight.js de modifier les espaces réservés.

Une solution plus générale (que Meta Discourse doit utiliser) consiste à changer le paramètre langue de code par défaut de auto à plaintext ou quelque chose de similaire. :wink:


Ce n’est pas que cela importe beaucoup, mais utiliser java est un moyen d’éviter que l’espace réservé ne se développe lorsque vous voulez écrire sur les espaces réservés.

1 « J'aime »

Pouvez-vous vérifier le lien de prévisualisation ? Il semble être cassé pour moi.

1 « J'aime »

C’est une fonctionnalité incroyable, et je peux en voir de nombreuses utilisations.
Cependant, dans notre réponse, est-il possible de masquer le =(nom)= jusqu’à ce que l’utilisateur commence à taper dans la zone de texte ? Je pense que les utilisateurs (surtout les nouveaux) pourraient ne pas comprendre son but, ou que cela ressemble à un formatage incorrect.

Je pense que j’en ai un qui fonctionne à nouveau (:crossed_fingers: :slight_smile:)

https://discourse.theme-creator.io/theme/Discourse/placeholder-forms

Je l’ai également ajouté à try.discourse.org pour que vous puissiez jouer plus concrètement avec. :+1:

1 « J'aime »

Peut-être pourriez-vous saisir une valeur par défaut qui s’affichera à la place.

1 « J'aime »

Ça a marché ! Merci !

2 « J'aime »

Ce contournement ne semble plus fonctionner.

Existe-t-il d’autres options pour combiner reply-template et placeholder-forms ?

4 messages ont été déplacées vers un nouveau sujet : Les liens ne fonctionnent pas dans les formulaires de remplacement